/*********************************************************
File name: persistform.gs
Created by: gonsalo@janeladigital.com
Notes if any:

	please insert the attribute "persist" on the form tag with the name of the cookie
	and use a direfent cookie for each form
	EX:
	<form method="get" persist="FormCookie">
	
	
Changelog:
4-1-2010: first release
**********************************************************/

/*********************************************************
Purpose: extend primitive types
**********************************************************/
Array.prototype.remove = function(oObj){for(var i = 0; i < this.length; i++)if (oObj == this[i]){this.splice(i,1);break;};}
String.prototype.trim = function(){return this.replace(/(^\s*)|(\s*$)/g, '');}
Array.prototype.contains = function(oObj){for(var i = 0; i < this.length; i++)if (oObj == this[i])return true;return false;}

/*********************************************************
Function Name: window.onload
Purpose:
load saved form data
**********************************************************/
var _FormPersist_OldOnload = window.onload;
window.onload = function()
{
	if(_FormPersist_OldOnload)//if a previous function was associated, call it
		_FormPersist_OldOnload();
	persistForms(loadPersistedData)
}
/*********************************************************
Function Name: window.onunload
Purpose:
save forma data
**********************************************************/
var _FormPersist_OldOnUnload = window.onbeforeunload;
window.onbeforeunload = function()
{
	if(_FormPersist_OldOnUnload)//if a previous function was associated, call it
		_FormPersist_OldOnUnload();
	persistForms(savePersistedData)
}

function persistForms(oFunc)
{
	var oForms = document.getElementsByTagName('FORM');
	for(var i = 0 ; i < oForms.length;i++)//for each form
	{
		var oForm = oForms[i];
		
		for(var j=0;j<oForm.attributes.length;j++)//for each attribute
		{
			var oAttrib = oForm.attributes[j]	
			if(oAttrib.nodeName.toLowerCase().indexOf('persist') != -1)//if attribute is "persist"
			{
				oFunc(oForm,oAttrib.nodeValue)
			}
		}
	}
}

/*********************************************************
Function Name: loadPersistedData
Purpose:
loads the data for a simgle fform
**********************************************************/
function loadPersistedData(oForm,sCookieName)
{
	var oInputs = getPersistableFormElements(oForm)
	for(var i = 0 ; i < oInputs.length;i++)//for each form element
	{
		var oInput = oInputs[i];
		switch(oInput.tagName)//get specific code
		{
			case 'SELECT':
				{
					var sCookie = getPersistableCookie(sCookieName+'.'+oInput.name);
					for(var j=0; j<oInput.options.length; j++)//evaluate options
					{
						if(oInput.options[j].value == sCookie)//select correct
						{
							oInput.selectedIndex = j;
							break;	
						}
					}
				}
				break;
			case 'TEXTAREA':
				oInput.value = getPersistableCookie(sCookieName+'.'+oInput.name);
				break;
			case 'INPUT':
				{
					switch(oInput.type)	//get specific code
					{
						case 'text':
							oInput.value = getPersistableCookie(sCookieName+'.'+oInput.name);
							break;
						case 'hidden':
							oInput.value = getPersistableCookie(sCookieName+'.'+oInput.name)||oInput.value;
							break;
						case 'password':
							oInput.value = getPersistableCookie(sCookieName+'.'+oInput.name);
							break;
						case 'radio':
							oInput.checked = !!(getPersistableCookie(sCookieName+'.'+oInput.name) == oInput.value);
							break;
						case 'checkbox':
							{
								var sCookie = getPersistableCookie(sCookieName+'.'+oInput.name);
								var oPairs = sCookie.split(',');
								oInput.checked = oPairs.contains(oInput.value);
							}
							break;
					}
					
				}
				break;
			
		}	
	}
}

/*********************************************************
Function Name: savePersistedData
Accepts:oForm,sCookieName
Returns:
Purpose:
**********************************************************/
function savePersistedData(oForm,sCookieName)
{
	var oInputs = getPersistableFormElements(oForm)
	for(var i = 0 ; i < oInputs.length;i++)//for each form element
	{
		var oInput = oInputs[i];
		switch(oInput.tagName)//get specific code
		{
			case 'SELECT':
				setPersistableCookie(sCookieName+'.'+oInput.name,oInput.value);
				break;
			case 'TEXTAREA':
				setPersistableCookie(sCookieName+'.'+oInput.name,oInput.value);
				break;
			case 'INPUT':
				{
					switch(oInput.type)	//get specific code
					{
						case 'text':
							setPersistableCookie(sCookieName+'.'+oInput.name,oInput.value);
							break;
						case 'hidden':
							if(oInput.value)
								setPersistableCookie(sCookieName+'.'+oInput.name,oInput.value);
							break;
						case 'password':
							setPersistableCookie(sCookieName+'.'+oInput.name,oInput.value);
							break;
						case 'radio':
							if(oInput.checked)
								setPersistableCookie(sCookieName+'.'+oInput.name,oInput.value);
							break;
						case 'checkbox':
							{
								var sCookie = getPersistableCookie(sCookieName+'.'+oInput.name);
								var oPairs = sCookie.split(',');
								oPairs.remove(oInput.value);
								if(oInput.checked)
									oPairs.push(oInput.value);
								setPersistableCookie(sCookieName+'.'+oInput.name,oPairs.join(','));
							}
							break;
					}
					
				}
				break;
			
		}	
	}
}


/*********************************************************
Function Name: getPersistableFormElements
Purpose:
	Sub select form inputs
**********************************************************/
function getPersistableFormElements(oForm)
{
	var aNodes = new Array();
	var aStack = new Array(oForm);
	while(aStack.length != 0)//for every node in stack
	{
		var oNode = aStack.pop();
		
		if(oNode.hasChildNodes) //append childs to stack
			for(var i = 0 ; i < oNode.childNodes.length; i++)//add child nodes to the stack
				aStack.push(oNode.childNodes[i]);
				
		if(oNode.nodeType != 1) // only html elements
			continue;
		
		if(oNode.tagName != 'INPUT' && oNode.tagName != 'SELECT' && oNode.tagName != 'TEXTAREA')//only form elements
			continue;
			
		if(oNode.tagName == 'INPUT' && (oNode.type == 'button' || oNode.type == 'submit' || oNode.type == 'file' || oNode.type == 'image'|| oNode.type == 'reset'))//discard some inputs
			continue;
		aNodes.push(oNode);
	}
	return aNodes;
}




function setPersistableCookie(sName, sValue)
{
	var oDate = new Date();
	var nNextYear = oDate.getTime()+ (365 * 24 * 60 * 60 * 1000);
	oDate.setTime(nNextYear);
	document.cookie = sName + '=' + sValue + ';expires='+oDate.toGMTString()+';path=/';
}


function getPersistableCookie(sName)
{
	sName = sName.toLowerCase().trim();
	var oCrumbles = document.cookie.split(';');
	for(var i=0; i<oCrumbles.length;i++)//for each name=value pair in cookie
	{
		
		var oPairs = oCrumbles[i].split('=');
		var sPairName = oPairs[0].toLowerCase().trim();
		
		if(sPairName == sName)//if correct return
		{
			if(oPairs.length>1)
				return oPairs[1];
			else
				return "";
		}
	}
	return "";
}
