var Common = function ()
{
	this.vShowLoading = false;

	this.tLoading = 'Loading data...';
	this.tNoDataFound = 'No data found!';
	this.vPicPath = '/admin/images/toolbar/';
	this.vPicSpacer = '/admin/images/spacer.gif'
	this.vPicWidth = 18;

	this.vError = '';
	this.vMainClassName = '';

	this.vId = null;
	this.vIdElement = null;
	this.vControlId = null;

//	this.vJSDebug = true;
	this.vJSDebug = false;
	this.vDebugLog = '';
	this.vDebugLastTime;
	this.vDebugStartTime;
}

Common.prototype.fError = function ()
{
	alert('Class Tree Error: ' + this.vError);
}

Common.prototype.fLockControl = function ()
{
	if (!this.vControlLocked)
	{
		this.vControlLocked = true;

		if (this.vControlIdElement)
		{
			this.vControlIdElement.className = this.vMainClassName + 'LockTree';
			if (this.vShowLoading)
			{
				var tDiv = document.createElement('DIV');
				tDiv.id = this.vTreeLoadingId;
				tDiv.className = this.vMainClassName + 'loading';
				tDiv.innerHTML = this.tLoading;
				document.body.appendChild(tDiv);
			}
		}
		else
		{
			if (this.vShowLoading)
			{
				var tDiv = document.createElement('DIV');
				tDiv.id = this.vTreeLoadingId;
				tDiv.className = this.vMainClassName + 'loading';
				tDiv.innerHTML = this.tLoading;
				document.body.appendChild(tDiv);
			}
		}
	}
}

Common.prototype.fLockElements = function ()
{
	if (this.vControlIdElement)
	{
		for (var i in this.vControlsElements)
			this.vControlsElements[i].fLockControl();

		var hh = this.vControlIdElement.getElementsByTagName('INPUT');
		for (var i=0; i<hh.length; i++)
		{
			hh[i].setAttribute('oldDisabled', hh[i].getAttribute('disabled'));
			hh[i].setAttribute('disabled', 1);
		}

		hh = this.vControlIdElement.getElementsByTagName('TEXTAREA');
		for (var i=0; i<hh.length; i++)
		{
			hh[i].setAttribute('oldDisabled', hh[i].getAttribute('disabled'));
			hh[i].setAttribute('disabled', 1);
		}

		this.vControlIdElement.className = this.vMainClassName + 'tablocked';
	}
}

Common.prototype.fLockElements = function ()
{
	if (this.vControlIdElement)
	{
		for (var i in this.vControlsElements)
			this.vControlsElements[i].fLockControl();

		var hh = this.vControlIdElement.getElementsByTagName('INPUT');
		for (var i=0; i<hh.length; i++)
		{
			hh[i].setAttribute('oldDisabled', hh[i].getAttribute('disabled'));
			hh[i].setAttribute('disabled', 1);
		}

		hh = this.vControlIdElement.getElementsByTagName('TEXTAREA');
		for (var i=0; i<hh.length; i++)
		{
			hh[i].setAttribute('oldDisabled', hh[i].getAttribute('disabled'));
			hh[i].setAttribute('disabled', 1);
		}
	}
}

Common.prototype.fUnLockElements = function ()
{
	this.vControlLocked = false;

	if (this.vControlIdElement)
	{
		for (var i in this.vControlsElements)
			this.vControlsElements[i].fUnLockControl();

		var hh = this.vControlIdElement.getElementsByTagName('INPUT');
		for (var i=0; i<hh.length; i++)
			hh[i].disabled = hh[i].getAttribute('oldDisabled');

		hh = this.vControlIdElement.getElementsByTagName('TEXTAREA');
		for (var i=0; i<hh.length; i++)
			hh[i].disabled = hh[i].getAttribute('oldDisabled');
	}
}


Common.prototype.fGetObjCount = function (Obj)
{
	var counter = 0;
	for (var i in Obj)
		counter++;
	return counter;
}


Common.prototype.fGetControlCount = function ()
{
	var counter = 0;
	

	for (var i in this.vControls)
		if ((this.vControls[i]['visible'] != 0) && (i != 'new') && (i != 'tree') && (i != 'edit'))
			counter++;
	return counter;
}

Common.prototype.fSerialize = function ()
{
	var o = arguments[0];

//	this.tData = '';

	if(o.length)
	{
		//Array-mode
		for(var i = 0; i < o.length; i++)
		{
			this.ParseProp(o, i);
		}
	}
	else
	{
		//Object-mode
		for(property in o)
		{
			this.fParseProp(o, property);
		}
	}
	this.tData = this.tData.substr(0,(this.tData.length-1));

	return this.tData;
}

Common.prototype.fParseProp = function ()
{
	var o = arguments[0];
	var p = arguments[1];

	if(typeof o[p] != 'function')
	{
		switch(typeof o[p])
		{
			case 'number':
				var len = String(o[p]).length;
				this.tData += 'n:'+p+':'+len+':'+o[p];
				break;

			case 'string':
				var len = o[p].length;
				this.tData += 's:'+p+':'+len+':'+o[p];
				break;

			case 'boolean':
				var b = (o[p]) ? 1 : 0;
				this.tData += 'b:'+p+':'+b;
				break;

			case 'object':
				if (o[p] != null)
				{
//					alert(o[p] + ' ' + typeof o[p]);
					var objdata = this.fSerialize(o[p]);
					var len = objdata.length;

					var type = o[p].constructor.toString();

					var sindex = type.indexOf(' ') + 1;
					var sindex2 = type.indexOf('(');

					type = type.substring(sindex,sindex2);

					this.tData += 'o:' + type + ':' + p + ':' + len + ':' + objdata;
				}
				break;
		}
		this.tData += ':';
	}
}


Common.prototype.fUnserialize = function ()
{
	var data = arguments[0];
	var o = arguments[1];

	if(data[0] != 's' && data[0] != 'b' && data[0] != 'o' && data[0] != 'n')
		return o;

	var i;

	for(i = 0; i < data.length; i++)
	{
		var mode = GetNextString();

		var d = null;
		var propname;
		if(mode == 's')
		{
			//string-mode
			propname = GetNextString();
			var len = Number(GetNextString());
			d = data.substr(i, len);
			i += len;
		}
		else if(mode == 'n')
		{
			//Number mode
			propname = GetNextString();
			var len = Number(GetNextString());
			d = Number(data.substr(i, len));
			i += len;
		}
		else if(mode == 'b')
		{
			propname = GetNextString();
			d = (data[this.ti] == 1) ? true : false;
			i++;
		}
		else if(mode == 'o')
		{
			var type = GetNextString();

			propname = GetNextString();

			var len = Number(GetNextString());
			var odata = data.substr(i, len);

			eval('d = new ' + type);
			d = this.fUnserialize(odata, d);
			i += len;
		}

		o[propname] = d;
	}
	return o;

	function GetNextString()
	{
		var n = data.indexOf(':',i);
		var strdata = data.substring(i,n);

		i += strdata.length + 1;

//		alert(strdata);
		return strdata;
	}
}

Common.prototype.fGetNextString = function ()
{
	var data = arguments[0];
	var i = arguments[1];

	var n = data.indexOf(':', i);
	var strdata = data.substring(i, n);

	i += strdata.length + 1;

	alert(strdata);
	return strdata;
}


Common.prototype.fSetCookie = function ()
{
//name, value, expires, path, domain, secure

	var curCookie = arguments[0] + "=" + escape(arguments[1]) + ((arguments[2]) ? "; expires=" +
	expires.toGMTString() : "") +
		((arguments[3]) ? "; path=" + arguments[3] : "") +
		((arguments[4]) ? "; domain=" + arguments[4] : "") +
		((arguments[5]) ? "; secure" : "")
	if ((arguments[0] + "=" + escape(arguments[1])).length <= 4000)
		document.cookie = curCookie
	else
		if (confirm("Cookie exceed 4KB!"))
			document.cookie = curCookie
}

Common.prototype.fGetCookie = function ()
{
//	name
	var prefix = arguments[0] + "="
	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
	return unescape(document.cookie.substring(cookieStartIndex + prefix.length, cookieEndIndex))
}

Common.prototype.a = function ()
{
	if (this.vJSDebug)
	{
		var dd = new Date;

		if (!this.vDebugStartTime)
			this.vDebugStartTime = dd.getTime();

		this.vDebugLog += '+' + ((dd.getTime() - this.vDebugStartTime) / 1000) + (this.vDebugLastTime?(' + ' + (dd.getTime() - this.vDebugLastTime) / 1000):' + 0') + ' ' + arguments[0] + ' ' + '\n';
		this.vDebugLastTime = dd.getTime();
//		this.vDebugLog += ;
	}
}

Common.prototype.sl = function ()
{
	if (this.vJSDebug)
	{
		alert(this.vDebugLog);
		this.vDebugLog = '';
		this.vDebugStartTime = '';
	}
}

Common.prototype.fFixDomClone = function (o, copy) {
	var dom_events =
	['onblur', 'onfocus', 'oncontextmenu', 'onload',
	'onresize', 'onscroll', 'onunload', 'onclick',
	'ondblclick', 'onmousedown', 'onmouseup', 'onmouseenter',
	'onmouseleave', 'onmousemove', 'onmouseover',
	'onmouseout', 'onchange', 'onreset', 'onselect',
	'onsubmit', 'onkeydown', 'onkeyup', 'onkeypress',
	'onabort', 'onerror'];
    if (!(o && copy)) { return; }

    for (var i = 0;i < dom_events.length;i++)
    {
		var event = dom_events[i];
		if (event in o) { copy[event] = o[event]; }
    }

    if ('value' in o) { copy.value = o.value; }

    // recur
	var o_kids = o.childNodes;
	var c_kids = copy.childNodes;
	for (i = 0;i < o_kids.length;i++)
	{
	    this.fFixDomClone(o_kids[i], c_kids[i]);
	}
}