/* AutoFilling Form $Id: af.js,v 1.1 2009/03/23 12:00:00 leonid Exp $ */
/*
 * js-functions for AutoFilling
 *
 * (c) InfoCentre Ltd.
 * leonid@infosite.ru
 */

var sAFPrefix = 'icaf_';
var aElemsList2Restore = Array();
var aElemsList2Save = Array();
var bAFIsInit = false;

var sAFCookieDomain = '';
var sAFCookiePath   = '/';


/* Cookie functions */

function af_SetCookie (name, value, ttlsec, domain, path, secure)
{
	if (ttlsec)
	{
		var date = new Date();
		date.setTime(date.getTime()+(ttlsec*1000));
		var expires = date.toGMTString();
	}

	var str = name + "=" + escape(value) +
		((path) ? "; path=" + path : "") +
		((domain) ? "; domain=" + domain : "") +
		((expires) ? "; expires=" + expires : "") +
		((secure) ? "; secure" : "");

	document.cookie = str;
}

function af_GetCookie(name)
{
	var prefix = name + "=";

	var cookieStartIndex = document.cookie.indexOf(prefix);

	if (cookieStartIndex == -1)
	{
		return null;
	}

	var cookieEndIndex = document.cookie.indexOf(";", cookieStartIndex + prefix.length);
	if (cookieEndIndex == -1)
	{
		cookieEndIndex = document.cookie.length;
	}

	var len = prefix.length;	

	return unescape(document.cookie.substring(cookieStartIndex + len, cookieEndIndex));
}
  
/* String trim extention functions */

if ('undefined' == typeof String.prototype.ltrim) {
  String.prototype.ltrim = function() {
    return this.replace(/^\s+/, '');
  };
}

if ('undefined' == typeof String.prototype.rtrim) {
  String.prototype.rtrim = function() {
    return this.replace(/\s+$/, '');
  };
}

if ('undefined' == typeof String.prototype.trim) {
  String.prototype.trim = function() {
    return this.replace(/^\s+/, '').replace(/\s+$/, '');
  };
}

/* Simple actions functions */

function af_GetValueByFormElem(sFormElemName, sFormName)
{
	var sTmpVal;
	if (sFormName)
	{
		if (document.forms[sFormName] && document.forms[sFormName].elements[sFormElemName])
		{
			sTmpVal = document.forms[sFormName].elements[sFormElemName].value;
			sTmpVal = sTmpVal.trim();
			if (sTmpVal.length)
			{
				return sTmpVal;
			}
		}
	}
	else
	{
		var bReturn = 0;
		if (document.forms && document.forms.length)
		{
			for(var f=0;f<document.forms.length;f++)
			{
				if (document.forms[f].elements[sFormElemName])
				{
					if (document.forms[f].elements[sFormElemName].value)
					{
						sTmpVal = document.forms[f].elements[sFormElemName].value;
						sTmpVal = sTmpVal.trim();
						if (sTmpVal.length)
						{
							var sReturnValue = sTmpVal;
							bReturn = 1;
						}
					}
				}
			}
		}

		if (bReturn)
		{
			return sReturnValue;
		}
	}
}

function af_SetValueByFormElem(sFormElemName, sFormElemVal, sFormName, sRewriteDefault)
{
	if (sFormName)
	{
		if (document.forms[sFormName] && document.forms[sFormName].elements[sFormElemName])
		{
			if (sRewriteDefault=='leave' || !document.forms[sFormName].elements[sFormElemName].value.length)
			{
				document.forms[sFormName].elements[sFormElemName].value = sFormElemVal;
			}
		}
	}
	else
	{
		if (document.forms && document.forms.length)
		{
			for(var j=0;j<document.forms.length;j++)
			{
				if (document.forms[j].elements[sFormElemName])
				{
					if (sRewriteDefault=='leave' || !document.forms[j].elements[sFormElemName].value.length)
					{
						document.forms[j].elements[sFormElemName].value = sFormElemVal;
					}
				}
			}
		}
	}
}

function af_SetValue2Storage(sElemName, sElemVal, iCookieTTLSec)
{
	return af_SetCookie(sAFPrefix + sElemName, escape(sElemVal), iCookieTTLSec, sAFCookieDomain, sAFCookiePath);
}

function af_GetValueFromStorage(sElemName)
{
	var sVal = af_GetCookie(sAFPrefix + sElemName);
	
	if (sVal && sVal!==null) {
		return unescape(sVal);
	}
}

function af_SaveData() 
{
	if (aElemsList2Save && aElemsList2Save.length)
	{
		for(var k=0;k<aElemsList2Save.length;k++)
		{
			// 0=>sFieldFormName, 1=>sFieldDataName, 2=>sFormName, 3=>sTTLSec
			var aTmp = aElemsList2Save[k];

			var sVal = af_GetValueByFormElem(aTmp[0], aTmp[2]);
			if (sVal)
			{
				if (aTmp[1])
				{
					af_SetValue2Storage(aTmp[1], sVal, aTmp[3]);
				}
				else
				{
					af_SetValue2Storage(aTmp[0], sVal, aTmp[3]);
				}
			}
		}
	}
}

function af_RestoreData() 
{
	if (aElemsList2Restore && aElemsList2Restore.length)
	{
		for(var k=0;k<aElemsList2Restore.length;k++)
		{
			// 0=>sFieldFormName, 1=>sFieldDataName, 2=>sFormName, 3=>sRewriteDefault
			var aTmp = aElemsList2Restore[k];

			var sVal;
			if (aTmp[1])
			{
				sVal = af_GetValueFromStorage(aTmp[1]);
			}
			else
			{
				sVal = af_GetValueFromStorage(aTmp[0]);
			}
			
			if (sVal && sVal.length)
			{
				af_SetValueByFormElem(aTmp[0], sVal, aTmp[2], aTmp[3]);
			}
		}
	}
}

/* Rewrite OnLoad and OnUnload actions, if necessary */

function af_LoadReplace()
{
	if (window.onload && typeof(window.onload)=='function')
	{
		af_CurrOnLoad = window.onload;
		window.onload = function() {
			af_RestoreData();
			af_CurrOnLoad();
		};
	}
	else
	{
		window.onload = function() {
			af_RestoreData();
		};
	}
	return true;
}

function af_UnloadReplace()
{
	if (window.onunload && typeof(window.onunload)=='function')
	{
		af_CurrOnUnload = window.onunload;
		window.onunload = function() {
			af_CurrOnUnload();
			af_SaveData();
		};
	}
	else
	{
		window.onunload = function() {
			af_SaveData();
		};
	}
}

function af_Init()
{
	if (!bAFIsInit)
	{
		/* Starts rewrite OnLoad and OnUnload actions */
		af_LoadReplace();
		af_UnloadReplace();
		bAFIsInit = true;
	}
}

/* Main actions functions */

/************************



************************/

function af_SaveValue(sFieldFormName, sFieldDataName, sFormName, sTTLSec)
{
	af_Init();
	if (sFieldFormName)
	{
		sFieldFormName = sFieldFormName.trim();
	}
	if (sFieldDataName)
	{
		sFieldDataName = sFieldDataName.trim();
	}
	if (sFormName)
	{
		sFormName = sFormName.trim();
	}
	if (sTTLSec)
	{
		sTTLSec = parseInt(sTTLSec, 10);
	}

	aElemsList2Save.push(Array(sFieldFormName, sFieldDataName, sFormName, sTTLSec));
}

function af_RestoreValue(sFieldFormName, sFieldDataName, sFormName, sRewriteDefault)
{
	af_Init();
	if (sFieldFormName)
	{
		sFieldFormName = sFieldFormName.trim();
	}
	if (sFieldDataName)
	{
		sFieldDataName = sFieldDataName.trim();
	}
	if (sFormName)
	{
		sFormName = sFormName.trim();
	}
	if (sRewriteDefault)
	{
		sRewriteDefault = sRewriteDefault.trim();
		if (sRewriteDefault != 'leave')
		{
			sRewriteDefault = 'rewrite';
		}
	}
	else
	{
		sRewriteDefault = 'rewrite';
	}

	aElemsList2Restore.push(Array(sFieldFormName, sFieldDataName, sFormName, sRewriteDefault));
}
