FormValidator = {

status: true,
alert_id: 'comment-form-alert',
alert_message: 'Не заполнены некоторые поля!',

Check: function(event)
{
	FormValidator.status = true;

	$(this).getElements().each(FormValidator.CheckInput);

	var form_alert = $(FormValidator.alert_id);

	if (FormValidator.status)
	{
		if (form_alert) form_alert.hide();
		return true;
	}

	if (form_alert)
	{
		form_alert.update(FormValidator.alert_message).show();
		new Effect.Shake(form_alert, {
			duration: 0.5,
			distance: 10
			});
	}
	else alert(FormValidator.alert_message);

	Event.stop(event);

	return false;
},

CheckInput: function(input)
{
	var label = input.id ? $(input.id + '-label') : null;
	if ((
		input.hasClassName('required') || input.name == 'captcha'
		) && ! /\S/.test(input.value))
	{
		input.addClassName('error');
		FormValidator.status = false;
		if (label) label.addClassName('error');
	}
	else
	{
		input.removeClassName('error');
		if (label) label.removeClassName('error');
	}
}

}; // FormValidator

var CommForm = {

_form: 'entry-comment-form',
_tarea: 'input-comment',
_comm: 'comm',

selection: ''

};


CommForm.find_comm = function(ev)
{
	var el = ev.element();

	while(el && el != document)
	{
		if (el.hasClassName(CommForm._comm+'-row'))
			return el;
		el = el.up();
	}

	return;
}

CommForm.comm_id = function(comm)
{
	if (comm.id && comm.id.substr(0, CommForm._comm.length + 1) == (CommForm._comm + '-'))
	{
		return comm.id.substr(CommForm._comm.length + 1);
	}
	return '';
}

CommForm.author = function(ev)
{
	ev.stop();

	var comm_row = CommForm.find_comm(ev);
	if ( ! comm_row) return;

	var name = comm_row.down('.'+CommForm._comm+'-name');
	var author = name ? name.innerHTML.stripTags().strip() : '';

	CommForm.add_text(
		'[b]2' + author + '[/b]'
		);

	CommForm.scroll_down();
}

CommForm.quote = function(ev)
{
	ev.stop();

	var comm_row = CommForm.find_comm(ev);
	if ( ! comm_row) return;

	var comm_id = CommForm.comm_id(comm_row);

	var name = comm_row.down('.'+CommForm._comm+'-name');
	var post = comm_row.down('.'+CommForm._comm+'-post');

	var quote = CommForm.prepare_quote( CommForm.selection || post.innerHTML );

	var author = name ? name.innerHTML.stripTags().strip() : '';

	CommForm.add_text(
		'[quote'
//		+ ( author ? (' author="'+author+'"') : '' )
//		+ ( comm_id ? (' comm_id="'+comm_id+'"') : '' )
		+ ']\r\n'
		+ '[b]' + author + ' написал:[/b]\r\n\r\n'
		+ quote + '\r\n[/quote]'
		);

	CommForm.scroll_down();
}

CommForm.scroll_down = function()
{
	Effect.ScrollTo(CommForm._form, {
		duration:	0.4,
		offset:	0
		});
	
	$(CommForm._tarea).focus();
}

CommForm.add_text = function(txt)
{
	var tarea = $(CommForm._tarea);
	if ( ! tarea) return;

	if (tarea.value != '')
	{
		tarea.value = tarea.value.replace(/[\r\n]+$/, '');
		tarea.value += '\r\n\r\n';
	}

	tarea.value += txt+'\r\n';
	tarea.scrollTop = tarea.scrollHeight;
}

CommForm.prepare_quote = function(quote)
{
	var replace_bq = new RegExp('\\s*<blockquote[^>]*>(?:.|[\r\n])*?</blockquote>\\s*', 'ig');
	var replace_pp = new RegExp('\\s*</p>\\s*<p>\\s*', 'ig');
	quote = quote.replace(replace_bq, '\r\n');
	quote = quote.replace(replace_pp, '\r\n\r\n');
	quote = quote.stripTags();

	return quote.strip();
}

CommForm.get_selection = function(ev)
{
	CommForm.selection = '';

	var comm_row = CommForm.find_comm(ev);
	if ( ! comm_row) return;

	var comm_post = comm_row.down('.'+CommForm._comm+'-post');
	if ( ! comm_post) return;


	if (window.getSelection)
	{
		var selection = window.getSelection();
		if (selection == '') return;

		var comm_range = document.createRange();
		comm_range.setStart(comm_post, 0);
		comm_range.setEndAfter(comm_post);

		var range = CommForm.create_range(selection);

		if (
			range.compareBoundaryPoints(Range.END_TO_START, comm_range)
			==
			comm_range.compareBoundaryPoints(Range.END_TO_START, range)
			)
		{
			if (range.compareBoundaryPoints(Range.START_TO_START, comm_range) < 0)
				range.setStart(comm_range.startContainer, comm_range.startOffset);
			if (range.compareBoundaryPoints(Range.END_TO_END, comm_range) > 0)
				range.setEnd(comm_range.endContainer, comm_range.endOffset);
			CommForm.selection = range.toString().strip();
		}
	}
	else if (document.selection)
	{
		var range = document.selection.createRange();

		var comm_range = document.selection.createRange();
		comm_range.moveToElementText( comm_post ) ;

		if (
			range.compareEndPoints('StartToEnd', comm_range) < 0
			&&
			range.compareEndPoints('EndToStart', comm_range) > 0
			)
		{
			if (range.compareEndPoints('StartToStart', comm_range) < 0)
				range.setEndPoint('StartToStart', comm_range);
			if (range.compareEndPoints('EndToEnd', comm_range) > 0)
				range.setEndPoint('EndToEnd', comm_range);
			CommForm.selection = range.text.strip();
		}
	}
}

CommForm.clear_selection = function()
{
	CommForm.selection = '';
}

CommForm.create_range = function(selection)
{
	if (selection.getRangeAt) return selection.getRangeAt(0);

	var range = document.createRange();
	range.setStart(selection.anchorNode,selection.anchorOffset);
	range.setEnd(selection.focusNode,selection.focusOffset);
	return range;
}

document.observe('dom:loaded', function(){

	$A(['comment_form', 'register_member_form']).each(function(f){
		if ($(f)) $(f).observe('submit', FormValidator.Check)
		});

	$$('.comm-quote').each(function(el){
		el
			.observe('click', CommForm.quote)
			.observe('mouseover', CommForm.get_selection)
			.observe('mouseout', CommForm.clear_selection);
	});

	$$('.comm-name').each(function(el){
		el.observe('click', CommForm.author);
	});
});
