
if(!window.EQX || typeof(window.EQX) != 'object')
	window.EQX = {};

EQX.registerNamespace = function(ns)
{
	var rootNS = EQX;
	var aParts = ns.split(".");

	for(var i = 0; i < aParts.length; i++)
	{
		var part = aParts[i];

		if(!rootNS[part] || typeof(rootNS[part]) != 'object')
			rootNS[part] = {};

		rootNS = rootNS[part];
	}
};

EQX.getNamespace = function(ns)
{
	var rootNS = EQX;
	var aParts = ns.split(".");

	for(var i = 0; i < aParts.length; i++)
	{
		var part = aParts[i];
		if(!rootNS[part])
			return null;

		rootNS = rootNS[part];
	}

	return rootNS;
};

EQX.getNamespaceVar = function(ns, varName)
{
	var ns = EQX.getNamespace(ns);
	if(!ns || !ns[varName])
		return null;

	return ns[varName];
};

EQX.aIncluded = [];
EQX.includeEx = function(jsFile)
{
	if(this.aIncluded.contains(jsFile))
		return;

	this.aIncluded.add(jsFile);

	document.write("<scr" + "ipt type='text/javascript' src='" + jsFile + "'></scr" + "ipt>");
//	var o = obj_create('scr' + 'ipt');
//	o.type = 'text/j' + 'avasc' + 'ript';
//	o.src = jsFile;
//	document.body.appendChild(o);
};

EQX.include = function(libName)
{
	this.includeEx(CMSP_URL_CMS + "js.php?lib=" + libName);
};

EQX.extendClass = function(subclass, superclass)
{
	var f = function(){};

	f.prototype = superclass.prototype;
	subclass.prototype = new f();
	subclass.prototype.constructor = subclass;
	subclass.superclass = superclass.prototype;
	if(superclass.prototype.constructor == Object.prototype.constructor)
		superclass.prototype.constructor = superclass;
};

EQX.callEx = function(win, fname, aParams)
{
	var f = win, obj = win;
	var aParts = fname.split(".");

	for(var i = 0; i < aParts.length; i++)
	{
		var part = aParts[i];
		f = f[part];
		if(typeof(f) == 'object')
			obj = f;
	}

	return f.apply(obj, aParams);
};

EQX.call0 = function(fname, aParams)
{
	return this.callEx(top, fname, aParams);
};

EQX.varEx = function(win, vname)
{
	var v = win;
	var aParts = vname.split(".");

	for(var i = 0; i < aParts.length; i++)
		v = v[aParts[i]];

	return v;
};

EQX.var0 = function(vname)
{
	return this.varEx(top, vname);
};

EQX.isArray = function(a)
{
	return a && a.__EQXIsArray;
};







String.prototype.pad = function(len, ch, padLeft)
{
	var s = "";
	for(var i = this.length; i < len; i++)
		s += ch;

	return (padLeft ? s : '') + this + (padLeft ? '' : s);
};


Object.prototype.$indexOf = function(val)
{
	for(var i in this)
	{
		if(this[i] === val)
			return i;
	}

	return null;
};

Object.prototype.$extend = function(oExtension)
{
	for(var p in oExtension)
		this[p] = oExtension[p];

	return this;
};

Object.prototype.$foreach = function(fIterator)
{
	for(var p in this)
	{
		if(p.charAt(0) != '$')
			fIterator(p, this[p]);
	}
};

Object.prototype.$foreachNum = function(fIterator)
{
	for(var p in this)
	{
		if(p.charAt(0) != '$' && typeof(this[p]) == 'number')
			fIterator(p, this[p]);
	}
};



Array.prototype.__EQXIsArray = 1;

Array.prototype.toString = function(sep)
{
	if(!sep) sep = ",";
	var s = "";
	for(var i = 0; i < this.length; i++)
		s += this[i] + "" + sep;

	return s.substring(0, s.length-1);
};

Array.prototype.contains = function(val)
{
	return (this.indexOf(val) >= 0);
};

Array.prototype.indexOf = function(val)
{
	for(var i = 0; i < this.length; i++)
	{
		if(this[i] == val)
			return i;
	}

	return -1;
};

Array.prototype.add = function(val)
{
	this[this.length] = val;
};

Array.prototype.insert = function(idx, val)
{
	if(idx >= 0)
	{
		if(!this.length)
		{
			this.push(val);
			return this;
		}

		this.push(0);
		for(var i = this.length; --i > idx;)
			this[i] = this[i - 1];

		this[idx] = val;
	}

	return this;
};

Array.prototype.rm = function(idx)
{
	this.splice(idx, 1);
	return this;
};

Array.prototype.rmByValue = function(val)
{
	var idx;
	while((idx = this.indexOf(val)) >= 0)
		this.splice(idx, 1);

	return this;
};

Array.prototype.pushUnique = function(val)
{
	this.rmByValue(val);
	this.push(val);
};

Array.prototype.dump = function(idx_from, idx_to)
{
	if(!idx_from) idx_from = 0;
	if(!idx_to) idx_to = this.length - 1;

	var s = "Array length: " + this.length + "\n";
	for(var i = idx_from; i <= idx_to; i++)
		s += "[" + i + "] = " + this[i] + "\n";

	alert(s);
};

Array.prototype.pad = function(len, str, padLeft)
{
	if(len <= this.length)
		return this;

	if(padLeft)
	{
		var alen = this.length;
		var offset = len - alen;
		for(var i = this.length-1; i >= 0; i--)
			this[i + offset] = this[i];
		for(var i = 0; i < offset; i++)
			this[i] = str;
	}
	else
	{
		for(var i = this.length; i < len; i++)
			this[i] = str;
	}

	return this;
};

Array.prototype.maxNum = function()
{
	var a = this.sort(function(a, b){if(isNaN(a)) a = 0; if(isNaN(b)) b = 0; return(a-b);});
	return a[a.length-1];
};

Array.prototype.minNum = function()
{
	var a = this.sort(function(a, b){if(isNaN(a)) a = 0; if(isNaN(b)) b = 0; return(a-b);});
	return a[0];
};




EQX.CommPipe = function(id, winMaster, winSlave)
{
	if(!id)
		id = EQX.CommPipe.generateId();

	this.id = id;
	this.winMaster = winMaster;
	this.winSlave = winSlave;

	EQX.CommPipe.aAllPipes[id] = this;
};

EQX.CommPipe.$extend(
{
	aAllPipes : [],
	lastId : 0,

	generateId : function()
	{
		return ++this.lastId;
	},

	create : function(id, winMaster, winSlave)
	{
		return new EQX.CommPipe(id, winMaster, winSlave);
	},

	get : function(id)
	{
		var pipe = this.aAllPipes[id];
		return (pipe ? pipe : null);
	},

	callPeer : function(win, pipeId, funcName, aParams)
	{
		var pipe = this.get(pipeId);
		if(!pipe) return null;

		return pipe.callPeer(win, funcName, aParams);
	},

	callMaster : function(pipeId, funcName, aParams)
	{
		var pipe = this.get(pipeId);
		if(!pipe) return null;

		return pipe.callMaster(funcName, aParams);
	},

	callSlave : function(pipeId, funcName, aParams)
	{
		var pipe = this.get(pipeId);
		if(!pipe) return null;

		return pipe.callSlave(funcName, aParams);
	}

});


EQX.CommPipe.prototype.$extend(
{

	_call : function(win, funcName, aParams)
	{
		if(!win || !win[funcName])
			return null;

		return win[funcName].apply(win, aParams);
	},

	_getPeerWindow : function(winCaller)
	{
		if(winCaller == this.winMaster || (!this.winMaster && winCaller != this.winSlave))
			return this.winSlave;
		else if(winCaller == this.winSlave || !this.winSlave)
			return this.winMaster;

		return null;
	},

	callPeer : function(winCaller, funcName, aParams)
	{
		var winPeer = this._getPeerWindow(winCaller);
		if(!winPeer) return null;

		return this._call(winPeer, funcName, aParams);
	},

	callMaster : function(funcName, aParams)
	{
		return this._call(this.winMaster, funcName, aParams);
	},

	callSlave : function(funcName, aParams)
	{
		return this._call(this.winSlave, funcName, aParams);
	}

});
