SportpostSelectorsController = function(app) {
	var selectors = this;

	selectors.app = app;
	selectors.selectorsByBlock = new Array();
	
	
	$("div.selector").not(".selector_activated").each(function(){
		new Selector ($(this), selectors);
	}).addClass("selector_activated");
	
	$(document).bind("activateContext", function(event, context){
		$("div.selector", context).not(".selector_activated").each(function(){
			new Selector ($(this), selectors);
		}).addClass("selector_activated");
	})
	
	return selectors;
}

Selector = function (elem, controller){
	var selector = this;
	selector.elem = elem;
	selector.elem.data("selector", selector);

	selector.controller = controller;
	$(selector.elem).data("selector", selector);

	if (typeof(selector.elem[0].onclick) == "function"){

		selector.value = selector.elem.attr("active_value");
		selector.createPopup();
		selector.elem.find(".ico").css("visibility", "visible");
		
		selector.busy = false;

		selector.blockId = selector.elem.attr("block_id") || "";

		selector.dependent_selector = false;
		var dependent_selector_id = selector.elem.attr("dependent_selector");
		if (dependent_selector_id != undefined && dependent_selector_id != ""){
			selector.dependent_selector = $("#" + dependent_selector_id)
		}

		if (selector.blockId != "") {
			if (selector.controller.selectorsByBlock[selector.blockId] == undefined) {
				selector.controller.selectorsByBlock[selector.blockId] = new Array()
			}
			var index = selector.elem.attr("index");
			if (index != undefined && index != "") {
				selector.controller.selectorsByBlock[selector.blockId][parseInt(index, 10)] = selector;
			} else {
				selector.controller.selectorsByBlock[selector.blockId].push(selector);
			}
		}
		
		if (typeof (selector.controller.closeOpenedSelectors) != "function") {
			selector.controller.closeOpenedSelectors = function(){
				$(document).trigger("closeOpenedSelectors");
			}
			$(document).bind("click", selector.controller.closeOpenedSelectors);
		}
		
		selector.enable(!selector.elem.hasClass("disabled"));
	}
}

Selector.prototype.createPopup = function(){
	var selector = this;
	
	selector.itemsList = selector.elem[0].onclick();
	
//	selector.elem.parent(".corners").css("z-index", 90);
	
	selector.popup = $("<div></div>");
	selector.popup.addClass("selector-popup");
	
	selector.items = $("<ul></ul>");
	selector.activeText = selector.elem.find("span.text");

	var ie6 = ($.browser.msie && $.browser.version.split(".")[0] < 7);
	
	for (var i in selector.itemsList){
		var itemText = selector.itemsList[i][0];
		var itemValue = selector.itemsList[i][1];
		
		var itemClass = "";
		if (itemValue == "") {
			itemClass = "hidden";
		}
		var baseUrl = selector.elem.attr('baseUrl') || "";
		var link = '<a href="' + baseUrl + '/' + itemValue + '">' + itemText + '</a>';

		var item = $('<li class="' + itemClass + '">' + link + "</li>");
		item.attr("item_value", itemValue);
		if (itemText == selector.activeText.text()) {
			item.addClass("active");
		}
		item.click(function(){
			selector.clickItem(this);
			return false;
		}).addClass("clickable");
		
		if (ie6) {
			item.hover(function(){
				$(this).addClass("hover");
			}, function(){
				$(this).removeClass("hover");
			});
		}
		
		item.appendTo(selector.items);
	};
	selector.setValue(selector.value);
	
	
	var footer = $('<div class="selector-footer"><div class="footer-corner-left"></div><div class="footer-corner-right"></div><div class="footer-content"></div></div>');

	selector.items.appendTo(selector.popup);
	footer.appendTo(selector.popup);
	selector.popup = selector.popup.appendTo(selector.elem);
	
	selector.elem.click(function(){
		selector.open();
		return false;
	});
	
	if (selector.itemsList.length == 0) {
		selector.enable(false);
	}
}

Selector.prototype.open = function(){
	var selector = this;

	var busy = selector.busy || (selector.blockId != "") ? $("#" + selector.blockId).data("busy-updating") : false;
	if (!busy && selector.enabled) {
		if (!selector.elem.hasClass("open")) {
			selector.elem.addClass("open").css("position", "relative");	
			selector.popup.css("display", "block");
		
			selector.closePopup = selector.closePopup || function() {
				selector.close();
			};
			$(document).trigger("closeOpenedSelectors");
			$(document).bind("closeOpenedSelectors", selector.closePopup);
		} else {
			selector.close();
		}
	}
}

Selector.prototype.close = function(){
	var selector = this;

	if (!selector.busy) {
		selector.elem.removeClass("open").css("position", "static");	
		selector.popup.css("display", "none");
		$(document).unbind("closeOpenedSelectors", selector.closePopup);
	}
}

Selector.prototype.clickItem = function(item){
	var selector = this;

	var busy = selector.busy || (selector.blockId != "") ? $("#" + selector.blockId).data("busy-updating") : false;
	if (!busy && selector.enabled) {
		var item = $(item);
		if (!item.hasClass("active")){

			item.addClass("active");
			var newValue = item.attr("item_value");

			var proceed = true;
			var onselect = selector.elem.attr("onSuccessSelect");
			if (onselect && onselect != "" && typeof(window[onselect]) == "function") {
				proceed = window[onselect](selector, newValue);
			}

			if (proceed) {
				var fallbackValue = selector.setValue(newValue);
				
				var breakHashOnSelector = false;
				if (selector.elem.hasClass("break-hash-building")) {
					breakHashOnSelector = true;
				}
				
				if (selector.blockId != "") {
					selector.controller.app.updater.load({
						blockId: selector.blockId,
						selector: selector,
						breakHashOnSelector: breakHashOnSelector, 
						error: function(){
							selector.setValue(fallbackValue);
						}
					});
				}
			}
		}
		selector.close();
	}
}

Selector.prototype.setValue = function(value){
	var selector = this;

	var items = selector.items.find("li");		
	if (value == undefined || $.trim(value) == "") {
		value = items.eq(0).attr("item_value");
	}

	if (value != selector.value) {
		var item = items.filter("li[item_value=" + value + "]");
		
		if (item.length) {
			var previousActiveValue = selector.value;
			items.removeClass("active");
			item.addClass("active");
			selector.activeText.text(item.text());
			selector.value = value;

//			disable dependent selector when first (default) option was chosen			
			if (selector.dependent_selector && selector.dependent_selector.length && selector.dependent_selector.data("selector")) {
				var enable_dependent = (items.eq(0)[0] != item[0]);
				var dependent_selector = selector.dependent_selector.data("selector");
				dependent_selector.enable(enable_dependent);
				if (!enable_dependent) {
					dependent_selector.setValue('all');
				} else {
					dependent_selector.setValue('week');
				}
			}
			
			selector.elem.trigger("change", selector.value);
		}
		return previousActiveValue || false;
	} else {
		return true
	}
}

Selector.prototype.enable = function(enable){
	var selector = this;
	
	if (enable) {
		selector.enabled = true;
		selector.elem.removeClass("disabled").addClass("clickable");
	} else {
		selector.enabled = false;
		selector.elem.addClass("disabled").removeClass("clickable");
	}
}