function init()
{
	inputsTextAddClass();
	textareasResizeble();
	commentFormJumping();
	voteSystem();
	comparingImprovements();
	checkAllForCompare();
	confirmDeleteLinks();
	multipleSelectInit();

	someStuff();
}

/**
 * Add a class for all text inputs
 */
function inputsTextAddClass(className)
{
	var className = className || 'text';

	$('input[@type=text]:not(.'+ className +')').addClass(className);
	$('input[@type=password]:not(.'+ className +')').addClass(className);
}

/**
 * Perform a vertical resizing for all textareas
 */
function textareasResizeble(minHeight)
{
	var minHeight = minHeight || 32;

  $('textarea:not(.processed)').each(function()
	{
    var textarea = $(this).addClass('processed'), staticOffset = null;

    var parent = textarea.wrap('<div class="resizable-textarea"></div>')
      .parent().append($('<div class="grippie"></div>').mousedown(startDrag));

    var grippie = $('div.grippie', parent)[0];
    grippie.style.marginRight = (grippie.offsetWidth - textarea[0].offsetWidth) +'px';

    function startDrag(e) {
      staticOffset = textarea.height() - mousePosition(e).y;
      textarea.css('opacity', 0.25);
      $(document).mousemove(performDrag).mouseup(endDrag);
      return false;
    }

    function performDrag(e) {
      textarea.height(Math.max(minHeight, staticOffset + mousePosition(e).y) + 'px');
      return false;
    }

    function endDrag(e) {
      $(document).unbind('mousemove', performDrag).unbind('mouseup', endDrag);
      textarea.css('opacity', 1);
    }
  });
}

/**
 * Event handlers for comment form
 * Show or hide form in the right place
 */
function commentFormJumping()
{
	var speed = 'fast';
	var lastEl = false;
	var formIsVisible = false;
	var anchor_comment = '#add_comment';
	var anchor_comment_parent = 'a.reply';
	var form_comment = '#comment_form';
	var hidden_parent_id = '#comment_reply_to';

	var button = $(anchor_comment);

	if (button.length) {
		button.click(function()
		{
			if (lastEl && lastEl[0].className != 'review' && formIsVisible) {
				$(form_comment).hide();
				formIsVisible = false;
			}

			lastEl = $('div.review').after($(form_comment)[0]);
			$(hidden_parent_id).val(0);

			if (formIsVisible) {
				$(form_comment).slideUp(speed);
				formIsVisible = false;
			}
			else {
				$(form_comment).slideDown(speed);
				formIsVisible = true;
			}

			return false;
		});

		$(anchor_comment_parent).click(function()
		{
			var parent = $(this).parents('div.body');

			if (lastEl && lastEl[0] != parent[0] && formIsVisible) {
				$(form_comment).hide();
				formIsVisible = false;
			}

			lastEl = parent.after($(form_comment)[0]);
			$(hidden_parent_id).val($(this).attr('href').match(/\d$/));

			if (formIsVisible) {
				$(form_comment).slideUp(speed);
				formIsVisible = false;
			}
			else {
				$(form_comment).slideDown(speed);
				formIsVisible = true;
			}

			return false;
		});
	}
}

/**
 * Make a pretty voting system
 */
function voteSystem()
{
	var textPattern = 'Рейтинг: <span>%f</span>';

	var dropdown = $('select.rate_this:not(.processed)');

	if (dropdown.length) {
		dropdown.addClass('processed')
			.wrap('<div class="rate_voting"></div>')
			.after('<div class="slider"><div class="indicator"></div></div>')
			.after('<div class="rating_data"><strong></strong></div>')
			.after('<div class="rating"></div>');

		var totalx = $('div.slider').width();

		dropdown.each(function()
		{
			var steps = this.options.length - 1;
			var currentx = this.selectedIndex * totalx / steps;

			$(this).next().next().addClass(this.className).removeClass('rate_this')
				.next().Slider(
				{
					accept : 'div.indicator',
					fractions : steps,
					values: [
						[currentx, 0]
					],
					onSlide : function(cordx, cordy, x , y)
					{
						//console.info(x, totalx , x * (steps) / totalx);

						var count = Math.round(x * (steps) / totalx);
						var select = this.parentNode.previousSibling.previousSibling.previousSibling;
						if (count < select.options.length) {
							var option = select.options[count];
							if (typeof(option.selected) != typeof(undefinedVar)) {
								option.selected = true;

								$('+div.rating', select).html(textPattern.replace('%f', option.text))
									.next().children()[0].style.width = (count * 10) + '%';
							}
						}
					}
				});
		});
	}
}

/**
 * Add some usefully for comparing table
 */
function comparingImprovements()
{
	var table = 'div.comparing>table';
	var headline = 'td.characteristic.headline';
	var sameness = 'tr.sameness';

	var hide_text = '(Спрятатать одинаковые)';
	var show_text = '(Показать одинаковые)';

	var check_it = $('tr', table).hover(function()
	{
		$('td', this).addClass('hovered');
	}, function()
	{
		$('td', this).removeClass('hovered');
	}).length;

	if (check_it) {
		$(headline, table).append('<span class="toggler">' + hide_text + '</span>');
		$('span.toggler', headline).toggle(function()
		{
			$(sameness).hide();
			$(this).html(show_text);
		}, function()
		{
			$(sameness).show();
			$(this).html(hide_text);
		});
	}
}

/**
 * Add 'check all' option for compare
 */
function checkAllForCompare()
{
	var insertTo = 'div.sortby';
	var titleText = 'Выбрать все';

	var check_it = $(insertTo).prepend('<input type="checkbox" id="check_them_all" title="'+ titleText +'" />');

	if (check_it.length) {
		$('#check_them_all').change(function()
		{
			var checked = this.checked;
			$('input[@type=checkbox]', this.form).each(function() { this.checked = checked; });
		});
	}
}

/**
 * Add confirmation dialog before any deleting
 */
function confirmDeleteLinks()
{
	var links = 'a.action_delete';
	var text = 'Вы уверены? Это действие необратимо!';

	$(links).click(function()
	{
		return confirm(text);
	});
}


function multipleSelectInit()
{
	var text_add = 'Добавить';


	$('select[@multiple]').each(function(number)
	{

		$(this).addClass('multiple_performed')
			.wrap('<div class="multiple_extended clearfix"></div>')
			.before('<div class="multiple_selection"><input type="text" maxlength="255" class="text multiple_choice"><span class="multiple_add">' + text_add + '</span></div><ul class="multiple_options"></ul>')
			.after('<ul class="multiple_items"></ul>');

		var html = '', defined = new Array();
		for (var opts = new Array(), texts = new Array(), i = 0, c = this.options.length; i<c; i++) {
			var o = this.options[i];

			//opts.push({index: i, text: o.text});
			//texts.push(o.text);
			opts[i] = o.text;

			if (o.selected) {
				//html += '<li>' + o.text + '</li>';
				defined.push({index: i, text: o.text});
			}
		}

		/*if (html) {
			$(this.nextSibling).append(html);
		}*/

		// onclick for 'add' button:
		$(this.previousSibling.previousSibling.childNodes[1]).click(function()
		{
			var select = this.parentNode.nextSibling.nextSibling;
			var input = this.previousSibling;
			var text = $.trim(input.value).toLowerCase();

			multipleSelectAction(select, input, text, opts);
		});

		// keypress for selection input:
		$(this.previousSibling.previousSibling.childNodes[0]).autocompleteArray(opts,
		{
			delay: 10
			//,minChars: 1
			//,matchSubset: 1
			,maxItemsToShow: 15
			,onItemSelect: function(){ $('div.multiple_selection input')[0].focus(); }
			//,onFindValue: findValue
			//,autoFill: true
		})
		.keypress(function(e)
		{
			// get key pressed (charCode from Mozilla/Firefox and Opera / keyCode in IE)
			var key = e.charCode ? e.charCode : e.keyCode ? e.keyCode : 0;

			if (key == 13) {
				var select = this.parentNode.nextSibling.nextSibling;
				var input = this;
				var text = $.trim(input.value).toLowerCase();

				multipleSelectAction(select, input, text, opts);

				return false;
			}
		});

		// add all options to list:
		var html = '';
		$.each(opts, function(i, text)
		{
			html += '<li>' + text + '</li>';
		});
		$(this.previousSibling).append(html);

		$('li', this.previousSibling).click(function()
		{
			if (input = this.parentNode.previousSibling.childNodes[0]) {
				input.value = $(this).text();
			}
		}).dblclick(function()
		{
			var select = this.parentNode.nextSibling;
			var input = this.parentNode.previousSibling.childNodes[0];
			var text = $(this).text().toLowerCase();

			multipleSelectAction(select, input, text, opts);
		});

		$('div.multiple_extended li').hover(function()
		{
			$(this).addClass('hovered');
		}, function()
		{
			$(this).removeClass('hovered');
		});


		// add already selected:
		for (i = 0, c = defined.length; i < c; i++) {
			multipleSelectAdd(this.nextSibling, defined[i].index, defined[i].text);
		}
	});
}

function multipleSelectAction(select, input, text, opts)
{
	$.each(opts, function(index, option)
	{
		if (option.toLowerCase() == text && !select.options[index].selected) {
			select.options[index].selected = true;
			multipleSelectAdd(select.nextSibling, index, option);

			input.value = '';
			return;
		}
	});
}

function multipleSelectAdd(el, index, text)
{
	var text_del = '[X]';

	$(el).append('<li class="m_' + index + '">' + text + ' <span>' + text_del + '</span></li>');

	$('li.m_' + index + ' span', el).click(function()
	{
		multipleSelectDelete(this.parentNode.parentNode, this.parentNode.className.replace('m_', ''));
	});
}

function multipleSelectDelete(el, index)
{
	//console.info(index);

	if (option = el.previousSibling.options[index]) {
		option.selected = false;
	}

	$('li.m_' + index, el).remove();
}


/**
 * some garbage
 */
function someStuff()
{
	$('form#add_new_item').css('cursor', 'pointer').click(function() {this.submit()});

	// Fix some firefox troubles
	var tables = ['div.item_info', 'div.review'];

	if ($.browser.mozilla) {
		for (var i = 0, c = tables.length; i < c; i++) {
			$(tables[i]).css('overflow', 'hidden');
		}
	}
}

/**
 ***********************************************************************************
 * SOME PLUGINS AND OTHER STAFF
 ***********************************************************************************
 */

function getWindowSize()
{
  var de = document.documentElement;
  var w = window.innerWidth || self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth;
  var h = window.innerHeight || self.innerHeight || (de&&de.clientHeight) || document.body.clientHeight;
  arrayWindowSize = [w,h];
  return arrayWindowSize;
}

function mousePosition(e)
{
  return { x: e.clientX + document.documentElement.scrollLeft, y: e.clientY + document.documentElement.scrollTop };
};


/*********** init DHTML ******/
//$(document).ready(function(){ init(); });
/*****************************/
