/*======================= copyrights ============================
    FiberCMS
    version 2.0
    Copyright (c) Carlo Meijer 2008
    All rights reserved
  ======================= file info =============================
    @name common.js
    @desc javascript common functions
    creation date June 25 2008
  ===============================================================
*/

// function listen(obj, event, func, first)
// {
// /*	if(typeof(window.addEventListener) == 'function')
// 		obj.addEventListener(event, func, false);
// 	else
// 		obj.attachEvent('on'+event, func);*/
// 	if(typeof(first) == 'undefined')
// 		first = false;
// 	var oldEvent = null;
// 	eval('if(typeof(obj.on'+event+') == "function") oldEvent = obj.on'+event+';');
// 	var newEvent = function(e)
// 	{
// 		if(first)
// 			func.call(this, e);
// 		if(typeof(oldEvent) == 'function')
// 			oldEvent.call(this, e);
// 		if(!first)
// 			func.call(this, e);
// 	}
// 	eval('obj.on'+event+' = newEvent;');
// }

var listen = function(obj, event, func, first)
{
	if(typeof(obj['listen_'+event]) != 'object') obj['listen_'+event] = [obj['on'+event]];
	if(first)
		obj['listen_'+event] = [func].concat(obj['listen_'+event]);
	else
		obj['listen_'+event][obj['listen_'+event].length] = func;
	obj['on'+event] = function(e)
	{
		for (var i = 0; i < obj['listen_'+event].length; i++)
		{
			var func = obj['listen_'+event][i];
			if(typeof(func) == 'function')
				func.call(obj, e);
		}
	};
}

var unlisten = function(obj, event, func)
{
	if(typeof(obj['listen_'+event]) == 'object')
		for(var i = 0; i < obj['listen_'+event].length; i++)
			if(obj['listen_'+event][i] == func)
				obj['listen_'+event][i] = undefined;
}

var listen_native = function(obj, event, func)
{
	if(obj.attachEvent)
		obj.attachEvent('on'+event, func);
	else if(obj.addEventListener)
		obj.addEventListener(event, func, true);
}

var unlisten_native = function(obj, event, func)
{
	if(obj.detachEvent)
		obj.detachEvent('on'+event, func);
	else if(obj.removeEventListener)
		obj.removeEventListener(event, func, true);
}

function formSubmit(form)
{
	if((typeof(form.onsubmit) != 'function') || (form.onsubmit.call(form) != false))
		form.submit();
}

function setSelect(select, array)
{
	for(i = select.length-1; i >= 0; i--)
		select.remove(i);
	for(i = 0; i < array.length; i++)
	{
		if(typeof(array[i].name) == 'undefined')
			continue;
		else if(typeof(array[i].value) == 'undefined')
			continue;
		else if(typeof(array[i].selected) == 'undefined')
			continue;
		var row = document.createElement('OPTION');
		try { select.add(row, null); }
		catch(e) { select.add(row); }
		row.text = array[i].name;
		row.value = array[i].value;
		row.selected = array[i].selected;
	}
}

function slidePick(object, html, position)
{
	/* NOTE requires tween */
	this.object = object;
	if(this.object.pick)
	{
		this.object.pick.close();
		return;
	}
	this.object.pick = this;
	var cls = this;
	if(typeof(position) != 'string')
		position = 'down';
	if(typeof(this.object.tween) != 'object')
		new tween(object);
	var objpos = this.object.tween.getPosition();
	var objdim = this.object.tween.getDimensions(1);
	this.layer = document.body.appendChild(document.createElement('DIV'));
	new tween(this.layer);
	this.layer.tween.resizePower = 2;
	this.layer.style.position = 'absolute';
	this.layer.style.visibility = 'hidden';
	this.layer.innerHTML = html;
	var elems = this.layer.getElementsByTagName('*');
	for(var i = 0; i < elems.length; i++)
		if((elems[i].tagName.toUpperCase() == 'A') || elems[i].onclick)
			listen(elems[i], 'click', function(){cls.close();});
	var dim = this.layer.tween.getDimensions(1);
	this.layer.style.overflow = 'hidden';
	switch(position)
	{
		case 'down':
			this.layer.tween.setDimensions(dim.width, 0);
			this.layer.tween.setPosition(objpos.x,objpos.y+objdim.height);
			this.layer.style.visibility = 'visible';
			this.layer.tween.resize(dim.width, dim.height, 300);
			break;
		case 'right':
			this.layer.tween.setDimensions(0, dim.height);
			this.layer.tween.setPosition(objpos.x+objdim.width,objpos.y);
			this.layer.style.visibility = 'visible';
			this.layer.tween.resize(dim.width, dim.height, 300);
			break;
		case 'up':
			this.layer.tween.setDimensions(dim.width, 0);
			this.layer.tween.setPosition(objpos.x,objpos.y);
			this.layer.style.visibility = 'visible';
			this.layer.tween.resize(dim.width,dim.height, 300);
			this.layer.tween.onresize = function()
			{
				var newdim = cls.layer.tween.getDimensions(1);
				cls.layer.tween.setPosition(objpos.x,objpos.y-newdim.height);
			};
			break;
		case 'left':
			this.layer.tween.setDimensions(0, dim.height);
			this.layer.tween.setPosition(objpos.x,objpos.y);
			this.layer.style.visibility = 'visible';
			this.layer.tween.resize(dim.width,dim.height, 300);
			this.layer.tween.onresize = function()
			{
				var newdim = cls.layer.tween.getDimensions(1);
				cls.layer.tween.setPosition(objpos.x-newdim.width,objpos.y);
			}
			break;
	}
	this.layer.tween.onresizefinish = function(){cls.layer.style.width='';cls.layer.style.height='';}

	this.close = function()
	{
		var cls = this;
		this.layer.style.visibility = 'hidden';
		this.layer.pick = null;
		this.object.pick = null;
		window.setTimeout(function(){cls.layer.parentNode.removeChild(cls.layer);},100);
	}
}

function myParent(obj, tag)
{
	do if(obj.tagName && (obj.tagName.toLowerCase() == tag.toLowerCase()))
		return obj;
	while(obj = obj.parentNode);
	return false;
}

function curCSS(obj, attr)
{
	var ret;

	if (attr.match(/^\s*float\s*$/i))
		attr = 'styleFloat';

	var camelCase = attr.replace(/\-(\w)/g, function(all, letter){return letter.toUpperCase();});
	var cssStyle = attr.replace(/([A-Z])/g, '-$1').toLowerCase();

	if (obj.style && obj.style[camelCase])
		ret = obj.style[camelCase];
	else if(document.defaultView)
	{
		var computedStyle = document.defaultView.getComputedStyle(obj, null);
		if (computedStyle)
			ret = computedStyle.getPropertyValue(attr.match(/^styleFloat$/i) ? 'float' : cssStyle);
	}
	else if (obj.currentStyle)
	{
		ret = obj.currentStyle[cssStyle] || obj.currentStyle[camelCase];
		// convert currency to pixels
		if (!/^[0-9]+p[tx]$/i.test(ret) && !/^[0-9]/i.test(ret))
		{
			// Remember the original values
			var left = obj.style.left;
			var rsLeft = obj.runtimeStyle.left;

			// Put in the new values to get a computed value out
			obj.runtimeStyle.left = obj.currentStyle.left;
			try { obj.style.left = ret || 0; }
			catch(e) { obj.style.left = 0; }
			ret = obj.style.pixelLeft + "px";

			// Revert the changed values
			obj.style.left = left;
			obj.runtimeStyle.left = rsLeft;
		}
	}
	return ret;
}

var mouseXpos;
var mouseYpos;

listen(document, 'mousemove', function(e)
{
	if(!e)
	{
		if(window.event)
			e = window.event;
		else
			return;
	}
	if(e.pageX != undefined)
	{
		mouseXpos = e.pageX;
		mouseYpos = e.pageY;
	}
	else if(e.clientX != undefined)
	{
		mouseXpos = e.clientX;
		mouseYpos = e.clientY;
		if(document.body && (document.body.scrollLeft || document.body.scrollTop))
		{
			mouseXpos += document.body.scrollLeft;
			mouseYpos += document.body.scrollTop;
		}
		else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop))
		{
			mouseXpos += document.documentElement.scrollLeft;
			mouseYpos += document.documentElement.scrollTop;
		}
	}
});

var windowWidth;
var windowHeight;
var scrollXpos;
var scrollYpos;

function _onresize()
{
	windowWidth = 0;
	windowHeight = 0;
	if (typeof( window.innerWidth ) == 'number')
	{
		windowWidth = window.innerWidth;
		windowHeight = window.innerHeight;
	}
	else if (document.documentElement && document.documentElement.clientWidth)
	{
		windowWidth = document.documentElement.clientWidth;
		windowHeight = document.documentElement.clientHeight;
	}
	else if (document.body && document.body.clientWidth)
	{
		windowWidth = document.body.clientWidth;
		windowHeight = document.body.clientHeight;
	}
}
listen(window, 'resize', _onresize);
_onresize();
function _onscroll()
{
	scrollXpos = 0;
	scrollYpos = 0;
	if(document.documentElement && (document.documentElement.scrollTop || document.documentElement.scrollLeft))
	{
		scrollXpos = document.documentElement.scrollLeft;
		scrollYpos = document.documentElement.scrollTop;
	}
	else if (document.body && (document.body.scrollTop || document.body.scrollLeft))
	{
		scrollXpos = document.body.scrollLeft;
		scrollYpos = document.body.scrollTop;
	}
}
listen(window, 'scroll', _onscroll);
_onscroll();

function escapeTemplate(string) // equivalent to php function
{
	string = string.replace('&', '&amp;');
	string = string.replace('"', '&quot;');
	string = string.replace('\'', '&#039;');
	string = string.replace('<', '&lt;');
	string = string.replace('>', '&gt;');
	string = string.replace('{', '&#123;');
	string = string.replace('}', '&#125;');
	return string;
}

function stripEscapeTemplate(string)
{
	string = string.replace('&#125;', '}');
	string = string.replace('&#123;', '{');
	string = string.replace('&gt;', '>');
	string = string.replace('&lt;', '<');
	string = string.replace('&#039', '\'');
	string = string.replace('&quot;', '"');
	string = string.replace('&amp;', '&');
	return string;
}

function strip_tags(html)
{
	return html.replace(/<(\/?)([^\s>]*)(=\s*`[^`]*?(`|\Z)|=\s*"[^"]*?("|\Z)|=\s*\'[^\']*?(\'|\Z)|[^>])*?(>|\Z)/ig, '');
}

function xmlHttp()
{
	if (typeof(XMLHttpRequest) != "undefined")
		return new XMLHttpRequest();
	else if (window.ActiveXObject)
	{
		var aVersions = [
			"MSXML2.XmlHttp.5.0",
			"MSXML2.XmlHttp.4.0",
			"MSXML2.XmlHttp.3.0",
			"MSXML2.XmlHttp",
			"Microsoft.XmlHttp"];
		for (var i = 0; i < aVersions.length; i++)
		{
			try
			{
				var obj = new ActiveXObject(aVersions[i]);
				return obj;
			}
			catch (e){}
		}
	}
	return false;
}

function execJS(elem)
{	/* NOTE: THAT GODFORSAKEN BROWSER WANTS YOU TO PUT SCRIPTS INSIDE A BODY TAG */
	var blocks = elem.getElementsByTagName('SCRIPT');
	for (var i = 0; i < blocks.length; i++)
	{
		var newBlock = document.createElement('SCRIPT');
		newBlock.type = 'text/javascript';
		if(blocks[i].src)
			newBlock.src  = blocks[i].src;
		else
			newBlock.text = blocks[i].text;
		document.body.appendChild(newBlock);
	}
}

var ttDiv = null;

function tooltip(obj, text)
{
	if(ttDiv) return;
	if(typeof(obj.tween) != 'object')
		new tween(obj);
	ttDiv = document.body.appendChild(document.createElement('DIV'));
	ttDiv.className = 'tooltip';
	//ttDiv.appendChild(document.createTextNode(text));
	ttDiv.innerHTML = text;
	listen(obj, 'mouseout', ttHide);
	ttPos();
}

function ttHide()
{
	if(!ttDiv) return;
	ttDiv.parentNode.removeChild(ttDiv);
	ttDiv = null;
}

function ttPos()
{
	if(!ttDiv) return;
	ttDiv.style.position = 'absolute';
	ttDiv.style.left = (mouseXpos + 10) + 'px'
	ttDiv.style.top = (mouseYpos + 10) + 'px';
}
listen(document, 'mousemove', ttPos);

var select_do = {
	
	off: function()
	{
		if(document.all) // IE behavior
		{
			this.dragStart = document.ondragstart;
			this.selectStart = document.onselectstart;
			document.ondragstart = function(){return false;};
			document.onselectstart = function(){return false;};
		}
		else // others
		{
			this.MozUserSelect = document.body.style.MozUserSelect;
			document.body.style.MozUserSelect = 'none';
	
			this.mouseDown = document.onmousedown;
			document.onmousedown = function(e)
			{
				if(e && e.preventDefault)
				{
		//			var t = e.target;
		//			if(t.nodeName.toLowerCase() == 'img')
						e.preventDefault();
				}
				return false;
			};
		}
	},

	restore: function()
	{
		if(document.all)
		{
			document.ondragstart = this.dragStart;
			document.onselectstart = this.selectStart;
		}
		else
		{
			document.body.style.MozUserSelect = this.MozUserSelect;
			document.onmousedown = this.mouseDown;
		}
	}
}
