var xCommon = function ()
{
	this.vShowLoading = false;

	this.vControlsElements = [];

	this.vDrag = [];
	this.vDrag['element'] = [];
	this.vDrag['capture'] = [];
	this.vDrag['deltaX'] = [];
	this.vDrag['deltaY'] = [];

	this.tLoading = 'Loading data...';
	this.tB = ' b';
	this.tKb = ' Kb';
	this.tMb = ' Mb';

	this.tNoDataFound = 'No data found!';
	this.vPicPath = '/images/controls/';
	this.vPicSpacer = '/images/spacer.gif';
	this.vPicExt = '.gif';
	this.vPicWidth = 18;

	this.vError = '';
	this.vMainClassName = '';

	this.vId = null;
	this.vIdElement = null;
	this.vControlId = null;

	this.vJSDebug = false;
	this.vDebugLog = '';
	this.vDebugLastTime;
	this.vDebugStartTime;

	this.oOldBodyOnMouseMove = document.onmousemove;
}

xCommon.prototype.fError = function ()
{
	alert('Control Error: ' + arguments[0]);
}

xCommon.prototype.fNotify = function ()
{
	alert(arguments[0]);
}

xCommon.prototype.fDragInit = function ()
{
	var p = this;

	this.vDragIndex = this.vDrag['element'].length + 100;
	this.vDrag['element'][this.vDragIndex] = arguments[0];
	this.vDrag['element'][this.vDragIndex].style.position = 'absolute';
	this.vDrag['element'][this.vDragIndex].setAttribute('xDragIndex', this.vDragIndex);
	this.vDrag['capture'][this.vDragIndex] = arguments[1];
	this.vDrag['capture'][this.vDragIndex].style.cursor = 'move';
	this.vDrag['capture'][this.vDragIndex].setAttribute('xDragIndex', this.vDragIndex);

	this.vDrag['capture'][this.vDragIndex].onmousedown = function ()
	{
		var e = arguments[0];
		if (!e)
			e = event;
		p.fDragStart(e, this.getAttribute('xDragIndex'));
	}

	this.vDrag['capture'][this.vDragIndex].onmouseup = function ()
	{
		var e = arguments[0];
		if (!e)
			e = event;
		p.fDragStop(e, this.getAttribute('xDragIndex'));
	}

	this.vDrag['capture'][this.vDragIndex].onmousemove = function ()
	{
		var e = arguments[0];
		if (!e)
			e = event;
		p.fDragMove(e, this.getAttribute('xDragIndex'));
	}

//	console.debug(this.oOldBodyOnMouseMove);
	document.body.onmousemove = function ()
	{
		var e = arguments[0];
		if (!e)
			e = event;
		p.fDragMove(e, p.vDragActiveIndex);
		if (p.oOldBodyOnMouseMove && p.oOldBodyOnMouseMove != 'undefined')
			p.oOldBodyOnMouseMove(arguments[0]?arguments[0]:event, p.vDragActiveIndex);
	}
}

xCommon.prototype.fDragStart = function ()
{
	var e = arguments[0];
	var i = arguments[1];
	this.vDragActiveIndex = i;
	this.vDrag['deltaX'][i] = e.clientX - this.fGetLeft(this.vDrag['element'][i]);
	this.vDrag['deltaY'][i] = e.clientY - this.fGetTop(this.vDrag['element'][i]);
	this.vfDragActive = true;
}

xCommon.prototype.fDragStop = function ()
{
	this.vfDragActive = false;
}

xCommon.prototype.fDragMove = function ()
{
	if (this.vfDragActive)
	{
		var e = arguments[0];
		var i = arguments[1];
		this.vDrag['element'][i].style.left = e.clientX - this.vDrag['deltaX'][i] + 'px';
		this.vDrag['element'][i].style.top = e.clientY - this.vDrag['deltaY'][i] + 'px';
	}
}

xCommon.prototype.fShowLoading = function ()
{
	if (!this.vControlsElements['Loading'] && this.vIdElement)
	{
		var tDiv = crEl('DIV');
		var tText = document.createTextNode(this.tLoading);
		tDiv.appendChild(tText);
		tDiv.className = 'main_loading';

		if (this.vControlIdElement)
		{
			tDiv.style.position = 'relative';
			tDiv.style.top = (0 - parseInt(this.vControlIdElement.clientHeight / 2)) + 'px';
		}
		else
		{
			tDiv.style.position = 'absolute';
			tDiv.style.top = document.body.scrollTop + 'px';
			tDiv.style.left = document.body.scrollLeft + 'px';
		}

		this.vIdElement.appendChild(tDiv);
		this.vControlsElements['Loading'] = tDiv;
	}
}

xCommon.prototype.fNoShowLoading = function ()
{
//	if (this.vControlsElements['Loading'])
//		document.body.removeChild(this.vControlsElements['Loading']);

	delete this.vControlsElements['Loading'];
}

xCommon.prototype.fLockControl = function ()
{
	if (!this.vControlLocked)
	{
		this.vControlLocked = true;

		if (this.vControlIdElement)
		{
			this.vControlIdElement.className = this.vMainClassName + 'LockTree';
			if (this.vShowLoading)
			{
				var tDiv = crEl('DIV');
				tDiv.id = this.vTreeLoadingId;
				tDiv.className = this.vMainClassName + 'loading';
				tDiv.innerHTML = this.tLoading;
				document.body.appendChild(tDiv);
			}
		}
		else
		{
			if (this.vShowLoading)
			{
				var tDiv = crEl('DIV');
				tDiv.id = this.vTreeLoadingId;
				tDiv.className = this.vMainClassName + 'loading';
				tDiv.innerHTML = this.tLoading;
				document.body.appendChild(tDiv);
			}
		}
	}
}

xCommon.prototype.fLockElements = function ()
{
	if (arguments[0])
		var from = arguments[0];
	else
		var from = this.vControlIdElement;

	if (from)
	{
		for (var i in this.vControlsElements)
			this.vControlsElements[i].fLockControl();

		var hh = from.getElementsByTagName('INPUT');
		for (var i=0; i<hh.length; i++)
		{
			hh[i].setAttribute('oldDisabled', hh[i].getAttribute('disabled'));
			hh[i].setAttribute('disabled', 1);
		}

		hh = from.getElementsByTagName('TEXTAREA');
		for (var i=0; i<hh.length; i++)
		{
			hh[i].setAttribute('oldDisabled', hh[i].getAttribute('disabled'));
			hh[i].setAttribute('disabled', 1);
		}

		from.className = this.vMainClassName + 'tablocked';
	}
}

xCommon.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);
		}
	}
}

xCommon.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');
	}
}


xCommon.prototype.fGetObjCount = function (Obj)
{
	var counter = 0;
	for (var i in Obj)
		counter++;
	return counter;
}

xCommon.prototype.fGetControlCount = function ()
{
	var counter = 0;
	for (var i in this.vControls)
		if ((this.vControls[i]['visible']) && (i != 'new') && (i != 'tree'))
			counter++;
	return counter;
}

xCommon.prototype.fSerialize = function ()
{
	var o = arguments[0];

	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;
}

xCommon.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)
				{
					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 += ':';
	}
}


xCommon.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;

		return strdata;
	}
}

xCommon.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;
}


xCommon.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
}

xCommon.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))
}

xCommon.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();
	}
}

xCommon.prototype.sl = function ()
{
	if (this.vJSDebug)
	{
		alert(this.vDebugLog);
		this.vDebugLog = '';
		this.vDebugStartTime = '';
	}
}

xCommon.prototype.fGetExtFromType = function ()
{
	switch (arguments[0])
	{
		case 'image/pjpeg':
		case 'image/jpeg':
			return 'jpg';
		break;

		case 'image/x-png':
			return 'png';
		break;

		case 'image/gif':
			return 'gif';
		break;

		case 'application/x-shockwave-flash':
			return 'swf';
		break;
	}
}

xCommon.prototype.fFormatSize = function ()
{
	var size = arguments[0] || 0;

	if (size > 1048576)
		size = Math.round(size / 1048576) + this.tMb;
	else if (size > 1024)
		size = Math.round(size / 1024) + '' + this.tKb;
	else
		size = size + this.tB;

	return size;
}

xCommon.prototype.fTruncate = function ()
{
	var s = arguments[0];
	var l = arguments[1];
	var sep = arguments[2] || '...';

	if (s)
	{
		if (s.length > l)
		{
			return s.substring(0, Math.ceil(l / 2)) + sep + s.substring(s.length - Math.ceil(l / 2), s.length);
		}
		else
			return arguments[0];
	}
	else
	{
		return arguments[0];
	}
}

xCommon.prototype.fExplode = function ()
{
	var sep = arguments[0];
	var str = arguments[1];

	var res = [];

	var counter = 0;

	while (str.indexOf(sep, 0) > 0)
	{
		res[counter] = [];
		res[counter]['str'] = str.substr(0, str.indexOf(sep, 0) - sep.length);
		res[counter]['x'] = 1;
		str = str.substr(str.indexOf(sep, 0) + sep.length, str.length);
		counter++;
	}
	if (str != '')
	{
		res[counter] = [];
		res[counter]['str'] = str;
		res[counter]['x'] = 1;
	}

	return res;
}

xCommon.prototype.fPrepareSelect = function ()
{
	var tS = document.getElementsByTagName('SELECT');
	for (var i=0; i<tS.length; i++)
	{
		if (arguments[0] && (tS[i].getAttribute('vOldDisplay') != null) && (tS[i].getAttribute('vOldDisplay') != 'undefined'))
			tS[i].style.display = tS[i].getAttribute('vOldDisplay');
		else if (!arguments[0])
		{
			tS[i].setAttribute('vOldDisplay', tS[i].style.display);
			tS[i].style.display = 'none';
		}
	}

	var tS = document.getElementsByTagName('OBJECT');
	for (var i=0; i<tS.length; i++)
	{
		if (arguments[0] && tS[i].getAttribute('vOldDisplay') != null)
			tS[i].style.display = tS[i].getAttribute('vOldDisplay');
		else if (!arguments[0])
		{
			tS[i].setAttribute('vOldDisplay', tS[i].style.display);
			tS[i].style.display = 'none';
		}
	}

	var tS = document.getElementsByTagName('EMBED');
	for (var i=0; i<tS.length; i++)
	{
		if (arguments[0] && tS[i].getAttribute('vOldDisplay') != null)
			tS[i].style.display = tS[i].getAttribute('vOldDisplay');
		else if (!arguments[0])
		{
			tS[i].setAttribute('vOldDisplay', tS[i].style.display);
			tS[i].style.display = 'none';
		}
	}
}

xCommon.prototype.fGetTop = function()
{
	el = arguments[0];
	var top = 0;
	try {top += el.offsetTop;} catch (e) {}
	if (el && (el.tagName.toLowerCase() != 'body'))
		top += this.fGetTop(el.offsetParent);
	return top;
}

xCommon.prototype.fGetLeft = function()
{
	el = arguments[0];
	var left = 0;
	try {left += el.offsetLeft;} catch (e) {}
	if (el && (el.tagName.toLowerCase() != 'body'))
		left += this.fGetLeft(el.offsetParent);
	return left;
}


xCommon.prototype.fAttachOver = function ()
{
	var el = arguments[0];
	var p = this;
	if (el)
	{
		el.setAttribute('xBaseCssClass', el.className);
		el.onmouseover = function ()
		{
			p.fElementOverOut(this, true);
		}
		el.onmouseout = function ()
		{
			p.fElementOverOut(this, false);
		}
	}
}

xCommon.prototype.fElementOverOut = function ()
{
	arguments[0].className = arguments[0].getAttribute('xBaseCssClass') + (arguments[1]?'_over':'');
}

xCommon.prototype.fEscape = function ()
{
	var html = arguments[0];
	html = html.replace(/&/g, "&amp;");
	html = html.replace(/</g, "&lt;");
	html = html.replace(/>/g, "&gt;");
	html = html.replace(/"/g, "&quot;");
	return html;
}
