
/*	We were somewhere around Barstow on the edge of the desert when the drugs began to take hold. */


Chooser = function() {
  this.Constructor();
}

$.extend(Chooser.prototype, {
	SelectedValues: null,		// Массив выбранных значений
	CustomScroll:	null,		// Массив объектов-скроллов для каждого списка
	IsInner:		false,		// внутртенняя страница
	ClickFlag:		false,		// флажок, что мы кликнули, чтобы не посылать щапрос два раза при смене хэша
	JustLoaded:		true,		// только згружено
	PrevQs:			null,		// предыдущий запрос
	DoNotHash:		false,		// флажок - не фигаячить хэш
	
	/**
	 *	Конкструктор
	 */	
	Constructor: function() {
		
		this.CreateValuesArray();
		this.InitElementSelect();
		this.InitChooserReset();
		this.InitChooserSubmit();
		this.InitScroll();
		
		this.IsInner = $('.chooser').is('.inner');
		
		this.ClickFlag = true;
		
		if( $(".chooser .chooser-column A.selected").length ) {
			this.InitFilterListAndButtons();
		}
		this.SelectChoosersByHash();

		__instance = this;
		
		$.address.change(function(event) {
				if( !__instance.ClickFlag && !__instance.JustLoaded ) {
					__instance.SelectChoosersByHash();
				} else {
					__instance.ClickFlag = false;
				}       
		});
		
		var __instance = this;
		$(".chooser-open-close A.close").click(function() {
			__instance.CollapseChooser();
			return false;
		})
		$(".chooser-open-close A.open").click(function() {
			__instance.ExpandChooser();
			return false;
		})
		
		__instance.JustLoaded = false;
	},
	
	InitFilterListAndButtons: function() {
		__instance = this;
		$('.chooser H2').removeClass('unchoosed');	// Покажем кнопочки submit/reset
		$(".chooser .chooser-column A.selected").each(function() {
			__instance.SelectedValues[$(this).parents('.chooser-column').attr('name')] = $(this).attr('href').substring(1);
		});
		$(".chooser .chooser-column").each(function() {
			__instance.DoFilterList( $(this) );		// Фильтруем каждый список, кроме кликнутого сейчас
		});
	},
	
	SelectChoosersByHash: function() {
		var selector_name;
		var selector_value;
		this.DoReset();
		var hash = GetHash(document.location.hash);
		if(hash) {
			var hash_parts = hash.split("\/");
			for( i=0; i<hash_parts.length; i++ ) {
//				var tmp = hash_parts[i].split("=");
//				if(unescape(tmp[0]).substring(0, 7)=="Chooser") {
					selector_name = hash_parts[i].substring(0, 1);
					selector_value = hash_parts[i].substring(1);
					$(".chooser .chooser-column[name="+selector_name+"] A[href=#"+selector_value+"]").addClass('selected');
//				}
			}
		} else {
			if( $(".chooser .chooser-column A[initially_selected]").length ) {
				$(".chooser .chooser-column A[initially_selected]").addClass('selected');
				this.InitFilterListAndButtons();
				if( this.IsInner ) {
					if( !__instance.JustLoaded ) {
						this.DoNotHash = true;
						this.SendRequest();			// Если на внутренней странице - пошлем аякс запрос
					}
				}
			} else {
				$(".links-list .links").html("");
				$(".links-list .path-header").html("").hide();
			}
		}
		if( this.IsInner && selector_name && selector_value ) {
			this.InitFilterListAndButtons();
			this.SendRequest();			// Если на внутренней странице - пошлем аякс запрос
		} 
	},

	CollapseChooser: function() {
		if( !($.browser.msie && $.browser.version=="6.0") ) {
			$('.chooser').slideUp();
		} else {
			$('.chooser').hide();
		}
		$('.chooser-open-close .open').show();				
		$('.chooser-open-close .close').hide();				
		$("H1:first").addClass('light');
	},
	
	ExpandChooser: function() {
		var __instance = this;
		if( !($.browser.msie && $.browser.version=="6.0") ) {
			$('.chooser').slideDown(function() {
				__instance.UpdateScrolls();
			});
		} else {
			$('.chooser').show(function() {
				__instance.UpdateScrolls();
			});
		}
		$('.chooser-open-close .open').hide();				
		$('.chooser-open-close .close').show();				
		$("H1:first").removeClass('light');
	},
	
	/* ------------------------------- служебные -------------------------------------- */
	
	/**
	 *	Создание массива для значений
	 */
	CreateValuesArray: function() {
		this.SelectedValues = new Array();
		var __instance = this;
		$(".chooser .chooser-column").each(function() {
			__instance.SelectedValues[$(this).attr('name')] = 0;
		});
	},
	
	
	/**
	 *	Сброс всех значений в ноль
	 */
	ResetValues: function() {
		var __instance = this;
		for( var Key in __instance.SelectedValues ) {		// обнуляем все элементы массива значений
			__instance.SelectedValues[Key] = 0;
		}
	},
	
	
	/** 
	 *	Выбрано ли хоть одно значение во всем чузере
	 */
	IsFilterChoosed: function() {
		var Choosed = false;
		for( var Key in this.SelectedValues ) {				
			if( this.SelectedValues[Key] ) {				// если хотя бы одно значение выбрано - возвращаем true
				Choosed = true;
				break;
			}
		}
		return Choosed;
	},
	
	UpdateScrolls: function() {
		for( var Key in this.CustomScroll ) {
			this.CustomScroll[Key].OnContentChange();		// Говорим скроллу, чтобы он перерисовал себя в связи с изменившейся длинной списка
		}
	},
	

	/* ------------------------------- инициализации -------------------------------------- */
	
	
	/**
	 *	Инициализация скроллов
	 */
	InitScroll: function() {
		this.CustomScroll = new Array();
		var __instance = this;
		$(".chooser .chooser-column .frame").each(function () {
			__instance.CustomScroll[$(this).parent().attr('id')] = new CustomScroll($(this));		// на каждый список цепляем скролл
		});
	},
	
	
	DoReset: function() {
		this.ResetValues();								// обнуляем значения
		$(".chooser .chooser-column A").removeClass('selected').removeClass('disabled');	// сбрасываем классы ВСЕХ выбранных и спрятанных элементов
		$('.chooser H2 A.reset').parent().parent().addClass('unchoosed');						
		this.UpdateScrolls();			
	},
	
	/** 
	 *	Инициализация кнопки RESET
	 */
	InitChooserReset: function() {
		var __instance = this;
		$('.chooser H2 A.reset').click(function() {
			__instance.DoReset();
			if( __instance.IsInner ) {
				__instance.ClickFlag = true;
				__instance.SendRequest();			// Если на внутренней странице - пошлем аякс запрос
			} 
			return false;
		});
	},
	
	
	/** 
	 *	Инициализация кнопки SUBMIT
	 */
	InitChooserSubmit: function() {
		var __instance = this;
		$('.chooser H2 A.submit').click(function() {
			
			if( $(this).parent().is('.unchoosed') ) return false;
			
			var addPath  = ''						
			for( var Key in __instance.SelectedValues ) {		// с конструячим строку запроса вида y2008/t1/s7 (prefixValue)
				if( __instance.SelectedValues[Key] ) {
					addPath += Key.toLowerCase() + __instance.SelectedValues[Key] + '/';
				}
			}
			
			document.location.href = sHtmlRoot + 'projects/all/' + addPath;		// переход
			
			return false;
		});
	},
	
	
	/** 
	 *	Инициализация выбора элемента списка
	 */
	InitElementSelect: function () {
		var __instance = this;
		$(".chooser .chooser-column A").click(function () {
			if($(this).is(":not(.disabled):not(.selected)")) {
				
				$(this).parent().find('A.selected').removeClass('selected');	// сбрасываем предыдущее выделение
				$(this).addClass('selected');									// добавляем выделенеи текущему
				
				var Value = parseInt($(this).attr('href').substring(1));		// значение
				
				if( !Value || isNaN(Value) || Value == "0" ) {
					Value = 0;
				}

				__instance.SelectedValues[$(this).parents('.chooser-column').attr('name')] = Value;									// сохраним в массив значений
				__instance.OnClicked($(this).parents('.chooser-column').attr('id') );		// действия при клике
				
				if( __instance.IsFilterChoosed() ) {
					$(this).parents('.chooser-column').prevAll('H2').removeClass('unchoosed');	// Покажем кнопочки submit/reset
				} else {
					$(this).parents('.chooser-column').prevAll('H2').addClass('unchoosed');		// Спрячем кнопочки, если ничего не выбрано
				}
				
			}
			return false;
		});
	}, 
	

	/* ------------------------------- события и действия -------------------------------------- */
	
	/** 
	 *	Действия при клике на элемент списка
	 *	El		- элемент списка
	 */
	OnClicked: function( El ) {
		
		this.ClickFlag = true;
		
		if( this.IsInner ) {
			this.SendRequest();			// Если на внутренней странице - пошлем аякс запрос
		} 

		__instance = this;
		$(".chooser .chooser-column:not(#"+El+")").each(function() {
			__instance.DoFilterList( $(this) );		// Фильтруем каждый список, кроме кликнутого сейчас
		});
		
	},
	
	
	
	/** 
	 *	Послать ajax-запрос на обновление списка проектов
	 */
	SendRequest: function() {
		$(".chooser-tip").hide();
		var Qs = "";
		var Hash = "";
		var Header = "";
		$('.chooser-column').each(function() {								// пробежимся по всем столбцам
			var curSel = $(this).find('A.selected');						// выбранный элемент
			if( curSel.is('A') ) {
				var curVal = parseInt(curSel.attr('href').substring(1));	// значение
				if( curVal ) {	
					if( Qs ) Qs += "&";
					if( Hash ) Hash += "/";
					if( Header ) Header += "&nbsp;/ ";
					Qs += "Chooser["+$(this).attr("name") + "]=" + curVal;				// Формируем QueryString
					Hash += $(this).attr("name") + curVal;						// Формируем QueryString
					Header += curSel.html();								// Формируем заголовок. TODO: ПОРЯДОК В КОТОРОМ КЛИКАЛИ
				}
			}
		});
		if( this.PrevQs != Qs ) {
			if( !this.DoNotHash ) {
				$.address.value(Hash);
				//document.location.hash=Hash;
			}
			this.DoNotHash = false;
			$(".links-list .links").load("./?LoadLinks=1&"+Qs);					// Ajax
			if( Header ) {
				$(".links-list .path-header").html( Header );
				$(".links-list .path-header").show();
			} else {
				$(".links-list .path-header").hide();							// скрыть пустой заголовок
				$(".links-list .links").empty();
			}
			this.PrevQs = Qs;
		}
	},
	
	
	/** 
	 *	Фильтрация остальных списков
	 *	Убираем лишние элементы. Самая шаманская функция. Хрен разберешься потом
	 *
	 *	Итак, у нас есть массив вида: 
	 *				CA['YTSC'][2006][5][1][24] ....
	 *				CA['CTYS'][24][5][2006][1] ....
	 *	...и так далее - все существующие проекты во всез возможных вариантах сортировки по все столбцам.
	 *	Этот массив мы сгенерили вначале. Наши все возможные перестановки (transmutations) для столбцов (YSCT, YTSC, TSCY и т.д. - кол-во вариантов n! [(3!) = 6, (4!) = 24])
	 *	Для каждого проекта заполнен каждый вариант, т.е. в случае 4-х фильтров для каждого проекта заполняется 24 элемента массива. 
	 *	Пиздец, конечно. Половину надо бы выкинуть, но лень.
	 *
	 *	Проверка.
	 *	При проверке мы формируем индекс этого массива, по которому нужно проверять в данном случае. Он состоит из трех частей:
	 *		1. префиксы уже выбранных столбцов (порядок не важен)
	 *		2. префикс фильтруемого столбца
	 *		3. остальные префиксы (порядок не важен)
	 *	Так же создаем строчку соответствующих значений: [1][2006].. etc
	 *	В итоге получается строка типа CA['YTSC'][2006][5][1]... Которую надо за-eval-ить. Так оно проще, чем без eval'а.
	 *	Собственно, после этого каждый элемент фильтруемого списка проверяется на наличие в этом массиве и дизейблится в случае отсутствия там
	 *
	 *	Параметры:
	 *	El - список, который фильтруем
	 */
	DoFilterList: function( El ) {

		var curName		= El.attr('name');	// Префикс фильтруемого списка
		var tmpIndex	= "";				// Проверочный индекс в массиве доступности
		var tmpValList	= "";				// Список значений для проверки
		
		for( var Key in this.SelectedValues ) {							// По все префиксам
			if( this.SelectedValues[Key] && Key!=curName ) {			// Все выбранные, кроме текущего
				tmpIndex	+= Key;										// индекс
				tmpValList	+= "["+this.SelectedValues[Key]+"]";		// значения
			}
		}
		
		tmpIndex	+= curName;				// + текущее

		for( var Key in this.SelectedValues ) {							// все остальные
			if( !this.SelectedValues[Key] && Key!=curName ) {
				tmpIndex	+= Key;
			}
		}
				
		eval("var tmpArr = CA['"+tmpIndex+"']"+tmpValList);				// do it, baby!
		
		var Current = 0;
		var Disable = false;
		
		 __instance = this;
		El.find("A:not(:eq(0))").each(function() {						// по всем элементам списка
			Current = parseInt($(this).attr('href').substring(1));
			Disable = false;
			
			Disable = tmpArr ? false : true;							// А оно вообще есть?
			
			if( !Disable ) {
				Disable = tmpArr[Current] ? false : true;				// Если оно есть, то проверим наше наличие там
			}			
			
			if( Disable ) {												// задисейблим нахер
				$(this).addClass('disabled');
				if( Current == __instance.SelectedValues[curName] ) {	// если дизейблим выделенное... есть ощцщение, что такого не может быть...
					$(this).removeClass('selected');					// ...но на всякий случай обработаем. Ну его нафиг :)
					 __instance.SelectedValues[curName] = 0;					// типа, if ( true == false) 
				}
			} else {
				$(this).removeClass('disabled');
			}
		});
		this.CustomScroll[El.attr('id')].OnContentChange();				// пусть скроллер обновит свои размеры
	}
	

	
});