/*
*
*	Dipendenze:
*	
*		Script:
*			<script type="text/javascript" src="/Scripts/mootools.js"></script>
*			<script type="text/javascript" src="/Scripts/mootools-more.js"></script>
*
*/

var fakeSelect = new Class({
	"Implements" : [Events, Options],
	"options" : {
		"fromUL"	: "",
		"formField"	: "",
		"replace"	: true, // se true rimpiazza il name che corrisponde a quello passato, il primo input hidden name nell"area indicata.				
		// se viene passato un id sostituisce l"id indicato
		"get"	: {
			"tag"		: "a",
			"filter"	: false // se impostato come true elimina dalla selezione il valore selezionato
			//"erase"		: ["href"], // attributi da eliminare
		},

		"class"	: "fakeSelect",	// div contenitore del tutto
		
		"substitute" : "", //una volta creata, si sostituisce all"elemento indicato come id o dom
		
		"onOpen"	: function () {},
		"onValue"	: function () {},
		"onClose"	: function () {},
		"check_selected_value" : function(default_value, value, elem, previous_selected) {
			return default_value == value;
		},
		
		"closeTimeout": 3000, // msec alla chiusura automatica del select on mouseout
		"resetValue": null // valore di reset se diverso dal default
	},
	
	"initialize" : function (opzioni) {
		this.setOptions(opzioni);
		this.options['check_selected_value'].bind(this);
		
		var mainDivClass = ("select " + this.options["class"]);
		this.mainDiv = new Element("div", {"class" : mainDivClass});
		this.mainDiv.store("fakeSelect", this);

		this.valueDiv = (new Element("div", {"class" : "selector" })).inject(this.mainDiv);

		this.valueDivLeft = (new Element("div", {"class" : "left" })).inject(this.valueDiv);

		this.valueDivCenter = (new Element("div", {"class" : "center" })).inject(this.valueDiv);

		this.valueDivRight = (new Element("div", { "class" : "right" })).inject(this.valueDiv);

		this.optionsDiv	= (new Element("div", { "class" : "options" })).inject(this.mainDiv);

		this.optionsTween = new Fx.Morph(this.optionsDiv);

		this.option_elements = [];
		this.takeStats();
		
		this.itemSelected = null;
		
		//grazie IE
		try {
			this.optionsDiv.scrollHeight;
			this.optionsDiv.setStyle("width", this.optionsDiv.getElement("*").getCoordinates()["width"]);
		} catch (e) {/**/}
		fakeSelect.Elements.push(this);
	}
});

fakeSelect.implement({
	"takeStats" : function () {
		var ul_element = $(this.options['fromUL']);
		var default_value = ul_element.getAttribute('value');
		
		this.options.resetValue = (this.options.resetValue) ? this.options.resetValue : default_value;
		var sub_div = null;//new Element("div");
		
		var opts_elements = ul_element.getElements('li ' + this.options['get']['tag']);
		opts_elements.each(function(elem, idx) {
			if((!sub_div)||(elem.hasClass('section-name')))
			{
				sub_div = new Element("div", { 'class' : 'sub-container' });
				this.optionsDiv.adopt(sub_div);
			}
			
			var value = elem.getAttribute('value');
			
			var div_option = new Element('div', {"class" : "opt"});
			
			if(elem.hasClass('section-name'))
				div_option.addClass("section-name");
			else if(elem.hasClass('nullelement'))
				div_option.addClass("nullelement");
			
			div_option.adopt(elem);

			this.option_elements.push(div_option);
			sub_div.adopt(div_option);
			//this.optionsDiv.adopt(div_option);
			
			if((!elem.hasClass('nullelement')) && (!elem.hasClass('section-name'))) {
				div_option.addEvent('click', function(ev) {
					this.setValue(elem);
				}.bind(this));
				
				//if (default_value == value) {
				if(this.options.check_selected_value(default_value, value, elem, this.itemSelected)) {
					if(this.itemSelected)
					{
						this.itemSelected.parentNode.removeClass("selected");
					}
					this.itemSelected = elem;
					this.valueDivCenter.set('text', elem.get('text'));

					if (this.options["get"]["filter"]) {
						this.option_elements.slice(idx, 1);
						//this.optionsDiv.removeChild(div_option);
						sub_div.removeChild(div_option);

					} else {
						this.option_elements[idx].addClass('selected');
					}
					
				}
			}
			
			if (this.options['get']['erase']) {
				this.options['get']['erase'].each(function(attr){
					elem.removeAttribute(attr);
				});
			}
		}.bind(this));

 		this.optionsDiv.setStyles({"height" : "0px", "opacity" : "0.0"});
		
		this.valueDiv.addEvent('click', function (ev) {
			if (this.optionsDiv.getStyle('height').toInt() == 0) {
				this.apriSelect(ev);
				this.chiudiAltri(ev);
			} else {
				this.chiudiSelect(ev);
			}

		}.bind(this));
		this.valueDiv.addEvent("click", Event.stop);
		var timer = 0;
		this.mainDiv.addEvent('mouseleave', function() {
			timer = this.chiudiSelect.delay(this.options.closeTimeout, this);
			}.bind(this));

		this.mainDiv.addEvent('mouseenter', function() {
			$clear(timer);
			}.bind(this));			
	
		this.initInput(ul_element);
		
		if (this.options["substitute"]) {
			var subst_el = $(this.options["substitute"]);
			if (subst_el) {
				ul_element.destroy();
				subst_el.setStyle("display", "none");
				this.mainDiv.injectBefore(subst_el);
				subst_el.destroy();
				
			}

		} else {
			this.mainDiv.injectBefore(ul_element);
			ul_element.destroy();
		}
	},
	
	"initInput" : function (ul_element) {
		var inputName = ul_element.get('name');
		this.input = undefined;
		
		if(inputName != '')
		{
//			this.input = new Element('input', { 'type' : 'hidden', 'name' : inputName, 'value' : ul_element.getAttribute('value') });
			this.input = new Element('input', {"type" : "hidden", "name" : inputName});
			if (ul_element.getAttribute('value') != '') {
				this.input["value"] = ul_element.getAttribute('value');
			}
			$(this.options["formField"]).adopt(this.input);
			
			//$(this.options['formField']).inject(this.input);
		}
	},
	
	"setValue" : function (elem) {
		var value = elem.getAttribute('value');
		
		this.resetClasses(elem.getParent('div.opt'));
		
		var text = elem.getElements("show").get("text").join(" ") || elem.get('text');
		this.valueDivCenter.set('text', text);
		if (this.options["formField"] != ''){
			this.sendData(value);
		}
		this.fireEvent('onValue', [value, elem]);
		this.chiudiSelect();
	},
	
	"sendData" : function (value) {
		this.input["value"] =  value;
	},
	
	"resetClasses" : function (elem) {
		this.option_elements.each(function(option_element) {
			option_element.removeClass('selected');
		});

		if (elem) {
			elem.addClass('selected');
		}
	},
	
	"apriSelect" : function (ev) {
//		(new Event(ev)).stopPropagation();

		this.optionsTween.start({
			"height" : this.optionsDiv.scrollHeight,
			"opacity" : "1.0"
		});
		this.fireEvent('onOpen');
	},
	
	"chiudiSelect" : function () {
		this.optionsTween.start({
			"height" : "0px",
			"opacity" : "0.0"
		});
		this.fireEvent('onClose');
	},

	"chiudiAltri" : function () {
		$$('.selector').each(function(selector) {
			if (selector != this.valueDiv) {
				$(selector).getParent().retrieve('fakeSelect').chiudiSelect();
			}
		}.bind(this));
	},
	
	"reset" : function () {
		$each(this.option_elements, function (element) {
			var child = $(element).getChildren('a')['0'];
			if (child.getAttribute('value') == this.options.resetValue) {
				this.setValue(child);
			}			
		}.bind(this));
	}
});


//namespace per chiusura globale su document.click
fakeSelect.Elements = [];
fakeSelect.Elements.closeAll = function (ev) {
	fakeSelect.Elements.each(function (item) {
		item.chiudiSelect();
	});
};

window.addEvent("domready", function () {
	document.addEvent("click", fakeSelect.Elements.closeAll);
});



