var Selection = new Object ();

/*
// Returns true if the passed value is found in the array. Returns false if it is not.
Array.prototype.inArray = function (value)
{
	var i;
	for (i=0; i < this.length; i++)
	{
		// Matches identical (===), not just similar (==).
		if (this[i] === value)
			return true;
	}
	return false;
};
*/

Selection.initialize = function (_functionName)
{
	this.func = _functionName;
	
	// Cleanning array
	if (isSet (this.filters))
	{
		var len = this.filters.length;
		for (var i=0; i < len; i++)
			this.filters.pop();
	}
	else // Creating new array
		this.filters = new Object();
};

Selection.set = function (key, value)
{
	this.filters[key] = value;
};

Selection.get = function (key)
{
	return this.filters[key];
};

Selection.remove = function (key)
{
	if (isSet (this.filters[key]))
		delete this.filters[key];
};

Selection.is_selected = function (_element)
{
	if (_element.className.indexOf ("selected") > -1)
		return true;
	
	return false;
};

Selection.select = function (_element, _key)
{
	if (_element.className == "")
		_element.className = "selected";
	else
		_element.className += " selected";
	
	if (isSet (_key))
	{
		var value = isSet (_element.getAttribute ("value")) ? _element.getAttribute ("value") : _element.innerHTML;
		this.set (_key, value);
	}
};

Selection.unselect = function (_element)
{
	if (! this.is_selected (_element))
		return false;
	
	if (_element.className.indexOf ("selected ") > -1)
		_element.className = _element.className.replace ("selected ", "");
	else if (_element.className.indexOf (" selected") > -1)
		_element.className = _element.className.replace (" selected", "");
	else
		_element.className = _element.className.replace ("selected", "");	
	
	return true;
};

Selection.unselect_all = function (_ulElement, _tagName)
{
	if (! isSet (_tagName))
		_tagName = "A";
		
	var a_elements = _ulElement.getElementsByTagName(_tagName);
	
	for (var i=0; i < a_elements.length; i++)
		this.unselect (a_elements[i]);
};

Selection.exec_function = function (_key, _element)
{
	eval (this.func+"('"+_key +"', _element);"); // e.g: execute_after_selected ('folder', clicked_element);
};

Selection.make_dropdown_alive = function (_aElement, _key)
{
	var dropper = _aElement;
	var rel_id = dropper.getAttribute ("rel");
	
	if (! isSet (rel_id))
		return false;
	
	//submenu (UL element)
	var rel_element = document.getElementById (rel_id);
	
	var a_rel = rel_element.getElementsByTagName ("A");
	for (var i=0; i < a_rel.length; i++)
	{
		if (a_rel[i].innerHTML == dropper.innerHTML)
		{
			Selection.unselect_all (rel_element);
			this.select (a_rel[i], _key);
			break;
		}
	}
	
	rel_element.onclick = function (e)
	{
		// getting clicked_element
		if (e == null) e = window.event; // necessary for many browsers (for using `window.event`)	
		var clicked_element = getElement (e);
		
		if (clicked_element.tagName != "A")
			return;
		
		if (getNextSibling(clicked_element))
			return false;
		
		// Checking than clicked_element is not already selected
		if (Selection.is_selected (clicked_element))
			return false;
		
		// unselecting all
		Selection.unselect_all (rel_element);
		
		// Set clicked element as selected
		dropper.innerHTML = clicked_element.innerHTML;
		Selection.select (clicked_element, _key);
		
		// for sub-categories -> select the sub-category too
		if (clicked_element.parentNode.parentNode != rel_element)
		{
			var a = getProvSibling(clicked_element.parentNode.parentNode);
			if (a.tagName == "A")
				Selection.select (a);
		}
		
		if (isSet (Selection.func))
			Selection.exec_function (_key, clicked_element);
		
		return false;
	};
	
	_aElement.onclick = function ()
	{
		return false;
	}
};

Selection.make_menu_alive = function (_ulElement, _key)
{
	if (! isSet (this.filters[_key]))
	{
		var anchors = _ulElement.getElementsByTagName ("A");
		for (var i=0; i < anchors.length; i++)
		{
			var a = anchors[i];
			if (this.is_selected (a))
			{
				var value = isSet (a.getAttribute ("value")) ? a.getAttribute ("value") : a.innerHTML;
				this.set (_key, value);
				
				break;
			}
		}
	}
	else
	{
		var anchors = _ulElement.getElementsByTagName ("A");
		for (var i=0; i < anchors.length; i++)
		{
			var a = anchors[i];
			var value = isSet (a.getAttribute ("value")) ? a.getAttribute ("value") : a.innerHTML;
			if (value == this.filters[_key])
				this.select (a, _key);
		}
	}
	
	_ulElement.onclick = function (e)
	{
		// getting clicked_element
		if (e == null) e = window.event; // necessary for many browsers (for using `window.event`)	
		var clicked_element = getElement (e);
		
		if (clicked_element.tagName != "A")
			return;
		
		// Checking than clicked_element is not already selected
		if (Selection.is_selected (clicked_element))
			return false;
		
		// unselecting all
		Selection.unselect_all (_ulElement);
		
		// Set clicked element as selected
		Selection.select (clicked_element, _key);
		
		if (isSet (Selection.func))
			Selection.exec_function (_key, clicked_element);
		
		return false;
	};
};

Selection.make_table_menu_alive = function (_tableElement, _key)
{
	_tableElement.onclick = function (e)
	{
		// getting clicked_element
		if (e == null) e = window.event; // necessary for many browsers (for using `window.event`)	
		var clicked_element = getElement (e);
		
		if (clicked_element.tagName == "TD")
			clicked_element = clicked_element.parentNode;
		
		if (clicked_element.tagName != "TR")
			return;

		// Checking than clicked_element is not already selected
		if (Selection.is_selected (clicked_element))
			return;
		
		// if not selection allowed
		if (clicked_element.parentNode.className.indexOf ("selectionAllowed") == -1)
			return false;
			
		
		// unselecting all
		Selection.unselect_all (_tableElement, "TR");
		
		// Set clicked element as selected
		Selection.select (clicked_element, _key);
		
		if (isSet (Selection.func))
			Selection.exec_function (_key, clicked_element);
		
		return false;
	};
};

Selection.make_divider_alive = function (_divElement, _key)
{
	var ul_divider = _divElement.getElementsByTagName ("UL")[0];
	ul_divider.onmouseover = function (e)
	{
		// getting hovered_element
		if (e == null) e = window.event; // necessary for many browsers (for using `window.event`)	
		var hovered_element = getElement (e);
		
		if (hovered_element.tagName != "A")
			return;
		
		// Checking than hovered_element is not already selected
		if (Selection.is_selected (hovered_element))
			return;
		
		// unselecting all
		Selection.unselect_all (_divElement, "DIV");
		Selection.unselect_all (this);
		
		var rel_id 			= hovered_element.getAttribute ("rel");
		if (! isSet (rel_id))
			return;
		
		var rel_element = document.getElementById (rel_id);
		
		// Set hovered element as selected
		Selection.select (rel_element, _key);
		Selection.select (hovered_element, _key);
		set_opacity (rel_element, 10);
		
		if (isSet (Selection.func))
			Selection.exec_function (_key, hovered_element);
	};
};

