oFilter = function() {
	if($('#filter').size() > 0) {
		this.init_DOM();
	}
}

oFilter.prototype = {
	init_DOM: function() {
		this.jFilter = $('#filter');
		this.iFilter_height = this.jFilter[0].offsetHeight;
		this.jCheckbox = this.jFilter.find('input:checkbox');
		this.jSelect = this.jFilter.find('select');
		this.jSlider = this.jFilter.find('.slider');
		this.jObj_block = $('#objects');
		this.jCatalog_table = $('#catalog table');
		this.jSort_links = this.jCatalog_table.find('thead tr th a');
		this.jObjects = this.jCatalog_table.find('tbody tr');

		this.jHead = $('#head');
		this.jMain_navigation = $('#main_navigation');

/*@cc_on
		this.is_IE6 = /MSIE (6).+Win/.test(navigator.userAgent);
@*/

		this.jSort_links.after('<span class="arrow not_display">&uarr;</span>');

		this.init();
	},

	init: function() {
		oThis = this;

		this.hide_description();

		this.jSelect.each(function() {
			new oSelect($(this), oThis.jObjects);
		});

		this.jCheckbox.each(function() {
			new Checkbox($(this), oThis.jObjects);
		});

		this.jSlider.each(function() {
			new oSlider($(this), oThis.jObjects);
		});

		this.jSort_links.each(function() {
			new oSort($(this), oThis.jObjects);
		});

		new oSearch();

		this.check_width();
	},

	scroll_filter: function() {
		var
			iScroll = document.documentElement.scrollTop,
			iFilter_top = this.jHead[0].offsetHeight + this.jMain_navigation[0].offsetHeight + 37,
			iTop;

		/* Изъебство для Safari, который не понимает document.documentElement.scrollTop */
		if(iScroll == 0) {
			iScroll = document.body.scrollTop;
		}

		if(iScroll > iFilter_top) {
			if(!this.is_IE6) {
				this.jFilter.addClass('scrolling');
			}
			else {
				this.jFilter[0].style.top = iScroll - iFilter_top + 'px';
			}
		}
		else {
			this.jFilter.removeClass('scrolling');

			if(this.is_IE6) {
				iTop = 0;
				this.jFilter[0].style.top = 0;
			}
		}
	},

	check_width: function() {
		var
			ePage = $('#page')[0];
			jDescription_cell = this.jCatalog_table.find('tr .description');

		if(ePage.offsetWidth < 1100) {
			jDescription_cell.addClass('not_display');
		}
		else {
			jDescription_cell.removeClass('not_display');
		}
	},

	hide_description: function() {
		var oThis = this;

		$(window).resize(function() {
			oThis.check_width();
		}).scroll(function() {
			oThis.scroll_filter();
		});
	}
}


oSort = function(jPtr, jObjects) {
	this.jPtr = jPtr;
	this.jSortable_items = jObjects;
	this.jArrow = this.jPtr.siblings('.arrow');
	this.jArrows = this.jArrow.parents('thead').find('th .arrow');

	this.attach_events();
}

oSort.prototype = {
	attach_events: function() {
		var oThis = this;

		this.sortable_parent = this.jSortable_items.parents('tbody');

		this.jPtr.click(function() {
			//В функцию передаем номер столбца, по которому сортируем.
			oThis.sorting();

			return false;
		});
	},

	sorting: function(ptr_number) {
		var
			oThis = this,
			ptr_number = this.jPtr.parents('th').prevAll().size()
			aItems = $.makeArray(this.jSortable_items),
			aItems_values = [],
			bIs_number = false,
			aSorted = [];

		this.toggle_rows();

		for(var i=0; i<aItems.length; i++) {
			//В массив запихиваем текст из ячейки, по которой сортируем.
			var sText = $(aItems[i]).find('td').eq(ptr_number).text().replace('«', '');

			//Если в ячейке содержится число, делаем из текста нормальное число.
			if(!isNaN(sText)) {
				sText = parseInt(sText);
				bIs_number = true;
			}

			aItems_values.push(Array(sText, i));
		}

		if(bIs_number) {
			aSorted = aItems_values.sort(
				function(a, b) {
					if(oThis.jPtr.parents('th').hasClass('asc')) {
						// Подавляем ошибки в IE, который думает, что в эту функцию можно передавать только числа, а массивы нельзя
						window.onerror = null;
						return a[0] - b[0];
					}
					else {
						window.onerror = null;
						return b[0] - a[0];
					}
				}
			);
		}
		else {
			aSorted = aItems_values.sort();

			if(!oThis.jPtr.parents('th').hasClass('asc')) {
				aSorted = aSorted.reverse();
			}
		}

		this.rebuild_DOM(aSorted);
	},

	toggle_rows: function() {
		var jParent = this.jArrow.parents('th');

		if(this.jArrow.hasClass('not_display')) {
			jParent.removeClass('asc');
			this.jArrow.html('&uarr;');
		}

		this.jArrows.addClass('not_display');
		this.jArrow.removeClass('not_display');
		jParent.toggleClass('asc');

		if(jParent.hasClass('asc')) {
			this.jArrow.html('&uarr;');
		}
		else {
			this.jArrow.html('&darr;');
		}
	},

	rebuild_DOM: function(aItems_values_sorted) {
		for(var x=0; x<aItems_values_sorted.length; x++) {
			this.sortable_parent.append(this.jSortable_items[aItems_values_sorted[x][1]]);
		}
	}
}


oSearch = function() {
	this.init_DOM();
}

oSearch.prototype = {
	init_DOM: function() {
		this.default_val = 'фильтр по названию объекта';
		this.jSearch = $('#search');
		this.jSubmit = $('#filter input:submit');
		this.jSearch_field = this.jSearch.find('input.text');
		this.jExample_link = this.jSearch.find('a.example');
		this.jCatalog_tems = $('#catalog table tr');

		this.init();
	},

	init: function() {
		if (this.jCatalog_tems.size() > 0) {
			this.random_example();
		}

		this.attach_events();
		this.get_submit();
		this.set_default();
		this.example();
	},

	set_default: function() {
		this.jSearch_field[0].value = this.default_val;
	},

	remove_default: function() {
		if($.trim(this.jSearch_field.val()) == this.default_val) {
			this.jSearch_field.val('');
		}
	},

	get_submit: function() {
		var oThis = this;

		this.jSubmit.click(
			function() {
				oThis.remove_default();
			}
		);
	},

	attach_events: function () {
		var oThis = this;

		this.jSearch_field.keypress(
			function() {
				clearTimeout(oThis.timer);
				oThis.find_substring();
			}
		).focus(
			function() {
				oThis.remove_default();
			}
		).blur(
			function() {
				if($.trim(oThis.jSearch_field.val()) == '') {
					oThis.set_default();
				}
			}
		);
	},

	random_example: function () {
		var
			items = this.jCatalog_tems.find('h3'),
			amount = items.size(),
			rand_number = Math.floor(Math.random() * amount);

		this.jExample_link.text(items.eq(rand_number).text());
		this.jExample_link[0].href = items.eq(rand_number).find('a')[0].href;
	},

	example: function () {
		var oThis = this;

		this.jExample_link.click(function () {
			oThis.jSearch_field.val($(this).text());

			clearTimeout(oThis.timer);
			oThis.find_substring();
		});
	},

	find_substring: function () {
		var oThis = this;

		this.timer = setTimeout(function() {
			//console.log(oThis.jSearch_field.val());
		}, 250);
	}
}


oSelect = function(jPtr, jObjects) {
	this.jPtr = jPtr;
	this.jOption = this.jPtr.find('option');
	this.jSortable_items = jObjects;

	this.init();
}

oSelect.prototype = {
	init: function() {
		this.replace();
		//this.attachEvents();
	},

	replace: function(){
		this.jSelect_custom = this.jPtr.parent().find('.control_select');
		this.jArrow = this.jSelect_custom.find('.arrow');
		this.jSelect_content = this.jSelect_custom.find('.content');
		this.jCustomSelect = this.jSelect_content.prepend('<ul></ul>');
		var jUL = this.jCustomSelect.find('ul');

		this.jOption.each(function() {
			if($(this).is(':selected')) {
				jUL.append('<li class="selected">' + $(this).text() + '</li>');
			}
			else {
				jUL.append('<li>' + $(this).text() + '</li>');
			}
		});

		this.show_select();
		this.select_option();
		this.close();
	},

	show_select: function() {
		var oThis = this;
		this.jSelect_content.click(function(evt) {
			oThis.jSelect_custom.toggleClass('show_options');

			evt.stopPropagation();
		});

		this.jArrow.hover(
			function() {
				oThis.jSelect_content.find('li.selected').addClass('hover');
			},
			function() {
				oThis.jSelect_content.find('li.selected').removeClass('hover');
			}
		).click(function(evt) {
			oThis.jSelect_custom.toggleClass('show_options');

			evt.stopPropagation();
		});
	},

	select_option: function() {
		var jSelect_list = this.jSelect_content.find('ul');
		var oThis = this;

		jSelect_list.find('li').each(function(i) {
			$(this).click(
				function() {
					jSelect_list.find('li.selected').removeClass('selected');
					oThis.jOption.removeAttr('selected');
					oThis.jOption[i].selected = 'selected';
					$(this).addClass('selected');
				}
			)
			.hover(
				function() {
					$(this).addClass('hover');
				},
				function() {
					$(this).removeClass('hover');
				}
			);
		});
	},

	close: function() {
		var oThis = this;
		$(document).click(function() {
			oThis.jSelect_custom.removeClass('show_options');
		});
	}
}


Checkbox = function(jPtr, jObjects){
	this.jPtr = jPtr;
	this.jSortable_items = jObjects;
	//this.fOnChange = fOnChange;

	this.init();
}

Checkbox.prototype = {

	init : function(){
		this.replace();
		this.attachEvents();
	},

	replace : function(){
		this.jCustomCheckbox = $('<span class="checkbox"></span>');
		this.jLabel = this.jPtr.siblings('label');

		if(this.jPtr.is(":checked")){
			this.bChecked = true;
			this.check(true);
		}

		this.jPtr.kalinkaHide();
		this.jCustomCheckbox.insertAfter(this.jPtr);
	},

	attachEvents : function(){
		var
			that = this,
			jClickable_elements = new Array(this.jCustomCheckbox, this.jLabel);

		/*for(var i=0; i<jClickable_elements.length; i++) {
			jClickable_elements[i].click(
				function(){
					that.attachEvents_action($(this).siblings('input:checkbox')[0].id);
				}
			);
		}*/

		this.jCustomCheckbox.parent('.clickable_parent').click(
			function(){
				that.attachEvents_action();
			}
		);
	},

	attachEvents_action: function() {
		if(!this.bDisabled){
			this.toggle();
		}
	},

	toggle : function(){
		//console.log(this.bChecked);
		if(this.bChecked){
			this.uncheck(true);
		}
		else{
			this.check(true);
		}

		//this.filter_objects();
	},

	check : function(bManualCall){
		this.bChecked = true;
		this.jPtr.attr("checked", true);
		this.jCustomCheckbox.addClass("checkbox_checked");
		if(!bManualCall){
			this.callback();
		}
	},

	uncheck : function(bManualCall){
		this.bChecked = false;
		this.jPtr.attr("checked", false);
		this.jCustomCheckbox.removeClass("checkbox_checked");
		if(!bManualCall){
			this.callback();
		}
	},

	enable : function(){
		this.bDisabled = false;
		this.jPtr.attr("disabled", false);
		this.jCustomCheckbox.removeClass("checkbox_disabled");
	},

	disable : function(){
		this.bDisabled = true;
		this.jPtr.attr("disabled", true);
		this.jCustomCheckbox.addClass("checkbox_disabled");
	},

	callback : function(){
		if(
			this.fOnChange &&
			typeof this.fOnChange === "function"
		){
			this.fOnChange({
				bChecked : this.bChecked
			});
		}
	},

	filter_objects: function() {
		var
			oThis = this,
			sClass = this.jCustomCheckbox.parents('li').attr('class');

		this.jSortable_items.each(function() {
			if($(this).hasClass(sClass)) {
				if(oThis.bChecked) {
					$(this).removeClass('not_display');
				}
				else {
					$(this).addClass('not_display');
				}
			}
		});
	}
}



oSlider = function(jPtr, jObjects) {
	this.jPtr = jPtr;
	//this.fOnChange = fOnChange;
	this.jMax = this.jPtr.find('input.square');

	this.init();
}

oSlider.prototype = {

	init: function(){
		this.replace();
		//this.attachEvents();
	},

	replace: function() {
		this.jPtr.prepend('<div class="slider_control"><div class="left_part"></div><div class="handler"><span class="arrow"></span><div class="value"><p><span>' + this.iMax + '</span>&nbsp;м&sup2;</p></div></div></div>');

		this.init_DOM();
	},

	init_DOM: function() {
		this.jSlider = this.jPtr.find('.slider_control');
		this.jHandler = this.jSlider.find('.handler');
		this.jValue = this.jHandler.find('.value p span');
		this.jHandler_width = this.jHandler[0].offsetWidth;
		this.jHandler_width_half = this.jHandler_width/2;
		this.iSlider_width = this.jSlider[0].offsetWidth;
		this.jLeft_part = this.jSlider.find('.left_part');

		this.get_values();
	},

	get_values: function() {
		var oThis = this;
		//this.jObjects = $('#catalog table tr td.square.max');
		this.slider = $('#filter .slider .inner');
		this.iCurrent;
		this.iMin;
		this.iMax;

		this.iCurrent = parseInt(this.slider.find('input[name=square]').val());
		this.iMin = parseInt(this.slider.find('input:hidden[name=min_square]').val());
		this.iMax = parseInt(this.slider.find('input:hidden[name=max_square]').val());
		/*
		this.jObjects.each(function() {
			var iValue = parseInt($(this).text());
			if(!oThis.iMin) {
				oThis.iMin = iValue;
			}
			if(!oThis.iMax) {
				oThis.iMax = iValue;
			}
			oThis.iMin = iValue < oThis.iMin ? iValue : oThis.iMin;
			oThis.iMax = iValue > oThis.iMax ? iValue : oThis.iMax;
		});

		//this.jMin.val(this.iMin);
		*/
		this.jMax.val(this.iMax);

		this.get_step();

		if(this.iCurrent > 0) {
			var displacement = (this.iCurrent - this.iMin) / this.iStep;
			this.set_value(displacement);
			this.displace(displacement);
		}
		else {
			this.set_value();
		}

		this.drag();
	},

	get_step: function() {
		this.iStep = (this.iMax - this.iMin) / this.iSlider_width;
	},

	set_value: function(displacement) {
		var oThis = this;
		this.iCurrent_value = Math.round(this.iStep * displacement) + this.iMin;

		if(!displacement && displacement !== 0) {
			this.iCurrent_value = this.iMax;
		}

		this.jValue.text(this.iCurrent_value);
		this.jMax.val(this.iCurrent_value);

		//this.timer = setTimeout(function() {oThis.filter_objects();}, 250);
	},

	filter_objects: function() {
		var oThis = this;

		this.jObjects.each(function() {
			if($(this).hasClass('max') && parseInt($(this).text()) > oThis.iCurrent_value) {
				$(this).parents('tr').addClass('not_display');
			}
			else {
				$(this).parents('tr').removeClass('not_display');
			}
		});
	},

	drag: function() {
		var oThis = this;

		this.is_drag = false;
		this.MouseX = 0;

		this.jHandler.mousedown(
			function(evt){
				oThis.start_drag(evt);
				return false;
			}
		);

		$(document)
			.mousemove(
				function(evt){
					if(oThis.is_drag) {
						return oThis.drag_handle(evt);
					}
				}
			)
			.mouseup(
				function(){
					oThis.stop_drag();
				}
			);
	},

	start_drag: function(evt) {
		this.startX = evt.pageX;

		this.popup_left = this.jHandler[0].offsetLeft + this.jHandler_width_half;

		this.is_drag = true;
	},

	drag_handle: function(evt) {
		var
			currentX = evt.pageX,
			deltaX = currentX - this.startX,
			displacement = Math.round(this.popup_left + deltaX);

		this.displace(displacement);

		evt.stopPropagation();
		return false;
	},

	displace: function(displacement) {
		if(displacement < this.iSlider_width && displacement >= 0) {
			this.jHandler[0].style.left = displacement + 'px';
			this.jLeft_part[0].style.width = displacement + 'px';

			//clearTimeout(this.timer);
			this.set_value(displacement);
		}
	},

	stop_drag: function(evt) {
		this.is_drag = false;
	}
}


$(function() {
	new oFilter();
});