﻿/*
	Rasekhoon Panel Controler
	© rasekhoon.com
	Moein Laghaei [April 2008]
*/



// initialize panel controler and set global variables;
// @page:		String; [Name of page that load panel controler]
function panel_init(page)// :null;
{
	_global = new Object();
	
	_global.lPanels = new Object();
	_global.lPanelsCount = 0;
	
	_global.cPanels = new Object();
	_global.cPanelsCount = 0;
	
	_global.rPanels = new Object();
	_global.rPanelsCount = 0;
	
	_global.page = page;
	_global[page] = new Object();
};


// Configure all panels in container
// @container:	String; [Identify of a panel container]
function panel_configure(container)// :null;
{
	var _panels = new Array();
	var _container = document.getElementById(container);
	
	if(!_container) return false;
	
	var _divs = _container.getElementsByTagName("DIV");
	var _tmp = document.createElement("DIV");
	
	var _type = container.substr(0, container.indexOf("_"), 0).toLowerCase();

	while(_divs.length != 0)
	{
		_panels.push(_divs[0].id);
		_tmp.appendChild(_divs[0]);
	}
	
	var _divs = _tmp.getElementsByTagName("DIV");
	
	while(_divs.length != 0)
	{
		_container.appendChild(_divs[0]);
	}

	_container.type = _type;

	// read addition configuration from cookies
	
	var _value = getCookie(_global.page);
	decodeCookie(_value);

	for(var i=0; i<_panels.length; i++)
	{

		if(_global[_global.page][_type+"_"+_panels[i]] == undefined)
		{
			_global[_global.page][_type+"_"+_panels[i]] = new Object();
			_global[_global.page][_type+"_"+_panels[i]].closed = 0;
			_global[_global.page][_type+"_"+_panels[i]].priority = -1;
		}
		
		var c = _global[_global.page][_type+"_"+_panels[i]].closed;
		var p = _global[_global.page][_type+"_"+_panels[i]].priority;

		panel_add(_type, _panels[i], c, p);
	}

	
	panel_doPriority(_type);
	
	for(var i in _global[_type+"Panels"])
	{
		panel_show(i, _type);
		if(_global[_type+"Panels"][i].closed){ panel_close(i, _type)};
	}
};


// Add a panel in a global object;
// @type:		String; [type of a panel; "left" or "center" or "right"]
// @id: 		String; [Identify of a panel]
// @closed:		Boolean; [Identify of a panel status that close or open]
// @priority:	Number; [Priority of a panel]
function panel_add(type, id, closed, priority)// :null;
{
	var _tmp = new Object();
	_tmp.id = id;
	_tmp.type = type;
	
	if(priority == -1)
	{
		_tmp.priority = _global[type+"PanelsCount"]+1;
	}
	else
	{
		_tmp.priority = priority;
	}
	
	_tmp.closed = closed;
	_tmp.element = document.getElementById(id);
	
	if(_tmp.element)
	{
		_global[type+"Panels"][id] = _tmp;
		_global[type+"PanelsCount"]++;
		
		_global[_global.page][type+"_"+id].closed = _tmp.closed;
		_global[_global.page][type+"_"+id].priority = _tmp.priority;
	}

};


// Toggle a panel
// @element:	Object; [Html Element]
function panel_toggle(element)// :null;
{
	// find parent div element
	var _element;
	var _tmp = element;
	var _tagName = _tmp.tagName.toUpperCase();
	
	while(_tagName != "DIV")
	{
		_tmp = _tmp.parentNode;
		_tagName = _tmp.tagName.toUpperCase();
	}
	
	var _type = _tmp.parentNode.type;
	
	if(!_global[_type+"Panels"][_tmp.id].closed) // must be close;
	{
		panel_close(_tmp.id, _type);
	}
	else // must be open
	{
		panel_open(_tmp.id, _type);
	}
};


// Sort panels by priority and type;
// @type:		String; [type of a panel; "left" or "center" or "right"]
function panel_doPriority(type)// :null;
{
	var _container = document.getElementById((type+"_pc"));
	var _divs = _container.getElementsByTagName("DIV");
	var _tmp = document.createElement("DIV");

	// sort panels by priority
	for(var i=_global[type+"PanelsCount"]; i>=1; i--)
	{
		for(var j in _global[type+"Panels"])
			if(_global[type+"Panels"][j].priority == i)
			{
				_tmp.appendChild(_global[type+"Panels"][j].element);
			}
	}
	
	var _divs1 = _tmp.getElementsByTagName("DIV");
	var _array = new Array();
	
	for(var i=_divs1.length-1; i>=0; i--)
		for(var j in _global[type+"Panels"])
			if(_divs1[i].id == j)
				_array.push(i);

	for(var i in _array)
		_container.appendChild(_divs1[_array[i]]);

	codeCookie();
};


// Hide a panel;
// @id:			String; [Identify of a panel]
// @type:		String; [type of a panel; "left" or "center" or "right"]
function panel_hide(id, type)// :null;
{
	var _element = _global[type+"Panels"][id].element;
	_element.style.display = "none";
};


// Show a panel;
// @id:			String; [Identify of a panel]
// @type:		String; [type of a panel; "left" or "center" or "right"]
function panel_show(id, type)// :null;
{
	var _element = _global[type+"Panels"][id].element;
	_element.style.display = "block";
};


// Close a panel;
// @id:			String; [Identify of a panel]
// @type:		String; [type of a panel; "left" or "center" or "right"]
function panel_close(id, type)// :null;
{
	var _element = _global[type+"Panels"][id].element;
	var _close_btn = _element.getElementsByTagName("IMG")[0];

	var _path = _close_btn.src
	var _extension = _path.substr(_path.lastIndexOf("_")+1, _path.length).toLowerCase();
	var _newPath = replaceAll(_path, _extension, "open.gif");
	_close_btn.src = _newPath;
	
	var _divs = _element.getElementsByTagName("DIV");
	_divs[0].style.display = "none";
	
	_global[type+"Panels"][id].closed = 1;
	_global[_global.page][type+"_"+id].closed = 1;
	
	codeCookie();
};


// Open a panel;
// @id:			String; [Identify of a panel]
// @type:		String; [type of a panel; "left" or "center" or "right"]
function panel_open(id, type)// :null;
{
	var _element = _global[type+"Panels"][id].element;
	var _close_btn = _element.getElementsByTagName("IMG")[0];

	var _path = _close_btn.src
	var _extension = _path.substr(_path.lastIndexOf("_")+1, _path.length).toLowerCase();
	var _newPath = replaceAll(_path, _extension, "close.gif");
	_close_btn.src = _newPath;
	
	var _divs = _element.getElementsByTagName("DIV");
	_divs[0].style.display = "block";
	
	_global[type+"Panels"][id].closed = 0;
	_global[_global.page][type+"_"+id].closed = 0;
	
	codeCookie();

};


// Direct a panel in down or up;
// @direction:	String; ["down" or "up"]
// @element:	Object; [Html Element]
function panel_move(direction, element)// :null;
{
	// find parent div element
	var _element;
	var _tmp = element;
	var _tagName = _tmp.tagName.toUpperCase();
	
	while(_tagName != "DIV")
	{
		_tmp = _tmp.parentNode;
		_tagName = _tmp.tagName.toUpperCase();
	}

	var _type = _tmp.parentNode.type;


	if(direction == "up")
	{
		if(_global[_type+"Panels"][_tmp.id].priority == 0) return false;
		
		for(var i in _global[_type+"Panels"])
		{
			if(_global[_type+"Panels"][i].priority == _global[_type+"Panels"][_tmp.id].priority - 1)
			{
				_global[_type+"Panels"][i].priority += 1;
				_global[_global.page][_type+"_"+i].priority += 1;
				
				_global[_type+"Panels"][_tmp.id].priority -= 1;
				_global[_global.page][_type+"_"+_tmp.id].priority -= 1;
				
				panel_doPriority(_type);
				return true;
			}
		}
		
	}
	else if(direction == "down")
	{
		if(_global[_type+"Panels"][_tmp.id].priority == _global[_type+"PanelsCount"]) return false;

		for(var i in _global[_type+"Panels"])
		{
			if(_global[_type+"Panels"][i].priority == _global[_type+"Panels"][_tmp.id].priority + 1)
			{
				_global[_type+"Panels"][i].priority -= 1;
				_global[_global.page][_type+"_"+i].priority -= 1;

				_global[_type+"Panels"][_tmp.id].priority += 1;
				_global[_global.page][_type+"_"+_tmp.id].priority += 1;
				
				panel_doPriority(_type);
				return true;
			}
		}
	}
	
};




//------------------------- Library Methods


// Replace a sub string with another sub string in a string;
// @_str:		String; [Master String]
// @_oldChar:	String; [Sub string that will remove]
// @_newChar:	String; [Sub string that will replace]
function replaceAll(_str, _oldChar, _newChar)// :String;
{
	return _str.split(_oldChar).join(_newChar);
};

function trimString(_str) 
{
	while (_str.charAt(0) == " ")
		_str = _str.substring(1);
	while (_str.charAt(_str.length - 1) == " ")
		_str = _str.substring(0, _str.length - 1);
	return _str;
};



//------------------------- Cookie Methods


function decodeCookie(cookieValue)
{
	if(cookieValue == null || trimString(cookieValue) == "") return false;
	
	var _array = cookieValue.split("$");
	for(var i=0; i<_array.length; i++)
	{
		_global[_global.page][_array[i].split(":")[0]] = new Object();
		_global[_global.page][_array[i].split(":")[0]].closed = Number(_array[i].split(":")[1].substr(0,1));
		_global[_global.page][_array[i].split(":")[0]].priority = Number(_array[i].split(":")[1].substr(1,2));
	}
};

function codeCookie()
{
	var _str = "";
	for(var i in _global[_global.page])
	{
		_str += i + ":" + _global[_global.page][i].closed + _global[_global.page][i].priority + "$";
	}
	
	_str = _str.substr(0, _str.length-1);
	setCookie(_global.page, _str);
};


// Get Cookie;
// @name:		String; [Cookie name]
function getCookie(name)// :Number;
{
	var arg = name + "=";
	var alen = arg.length;
	var clen = document.cookie.length;
	var i = 0;
	while (i < clen)
	{
		var j = i + alen;
		if (document.cookie.substring(i, j) == arg)
		return getCookieValue(j);
		i = document.cookie.indexOf(" ", i) + 1;
		if (i == 0) break;
	}  
	return null;
};


// Set Cookie;
// @name:		String; (Cookie name)
// @value:		String; (Cookie value)
function setCookie(name, value)// :null;
{
	var expDate = new Date();
	expDate.setTime(expDate.getTime() +  (24 * 60 * 60 * 1000 * 365)); 
	document.cookie = name + "=" + value + ("; expires=" + expDate.toGMTString());
};


// Delete Cookie;
// @name:		String; (Cookie name)
function deleteCookie(name)// :null;
{
	var exp = new Date();  
	exp.setTime (exp.getTime() - 1);  
	var cval = getCookie(name);  
	document.cookie = name + "=" + cval + "; expires=" + exp.toGMTString();
};


// Get Cookie Value from an offset;
// @offset:		Number; (Offset of cookie value)
function getCookieValue(offset)// :Number;
{
	var endstr = document.cookie.indexOf (";", offset);
	if (endstr == -1)
	endstr = document.cookie.length;
	return unescape(document.cookie.substring(offset, endstr));
};
