/**
 * @author Zozzz <vezox@citromail.hu>
 */
function isElement(object) 
{
    return object && object.nodeType == 1;
}

function isArray(object)
{
    return object && object.constructor === Array;
}  

function isFunction(object)
{
    return typeof object == "function";
}

function isString(object)
{
    return typeof object == "string";
}

function isNumber(object) 
{
    return typeof object == "number";
}

function isUndefined(object)
{
    return typeof object == "undefined";
}

function isObject(object)
{
	return typeof object == "object";
}

function isNull(object)
{
	return object === null;
}

function extend(dest, source)
{
	for(var x in source)
		dest.prototype[x] = source[x];	
}

function $(id)
{
	return document.getElementById(id);
}

function getURLParam(strParamName)
{
	var strReturn 	= "";
	var strHref 	= window.location.href;
	if (strHref.indexOf("?") > -1) 
	{
		var strQueryString 	= strHref.substr(strHref.indexOf("?")).toLowerCase();
		var aQueryString 	= strQueryString.split("&");
		for (var iParam = 0; iParam < aQueryString.length; iParam++) 
		{
			if (aQueryString[iParam].indexOf(strParamName.toLowerCase() + "=") > -1) 
			{
				var aParam 	= aQueryString[iParam].split("=");
				strReturn 	= aParam[1];
				break;
			}
		}
	}
	return unescape(strReturn);
}

function getBrowser()
{
	var name = navigator.appName;
	var ver = navigator.appVersion;
	if(name == 'Microsoft Internet Explorer')
	{
		var r = new RegExp(/MSIE\s(\d{1})/);
		ver = r.exec(ver)[1];
	}
	if(name == 'Opera')
	{
		var r = new RegExp(/\d{1}\.\d{2}/);
		ver = parseFloat(r.exec(ver));
	}
	return { 'name'	: name,
			 'ver'	: ver,
			 'ie'	: (name == 'Microsoft Internet Explorer' ? true : false) && !((window['opera'] && opera.buildNumber)),
			 'ff'	: (name == 'Netscape' ? true : false) && !((window['opera'] && opera.buildNumber)),
			 'op'	: (name == 'Opera' ? true : false)		
			}
}

function setStyle(obj, style)
{
    var valid = ['width','height','top','bottom','backgroundImage','backgroundPosition'];
	for(var i in style)
    {
        if(!isFunction(style[i]) && isString(i))
        {
            obj.style[i] = style[i];
        }		
    }
}

function disableSelection(target)
{
    if (typeof target.onselectstart!="undefined") //IE route
    {
    	var td = target.getElementsByTagName('td');
        for(var i in td)
        {
            td[i].onselectstart=function(){return false};
        }
        target.onselectstart=function(){return false}
    }
    else if (typeof target.style.MozUserSelect!="undefined") //Firefox route
    	target.style.MozUserSelect="none"
    else //All other route (ie: Opera)
    	target.onmousedown=function(){return false}    
}

function enableSelection(target)
{
    if (typeof target.onselectstart!="undefined") //IE route
    	target.onselectstart=function(evt){return true;}
    else if (typeof target.style.MozUserSelect!="undefined") //Firefox route
    	target.style.MozUserSelect="true"
    else //All other route (ie: Opera)
    	target.onmousedown=function(){}    
}

function getMouseCoords(e)
{
	if(window.event)
	{
		var x  = e.clientX + document.documentElement.scrollLeft;
		var y  = e.clientY + document.documentElement.scrollTop;         	
	}
	else
	{
		var x  = e.pageX;
		var y  = e.pageY;
	}
	return {_x:x,_y:y}
}

function getInfo(oo)
{
	var o = null;
	if(isElement(oo)) var o = oo;
	if(isString(oo)) var o = $(oo);
	if(isElement(o)) return{
		left	:intVal(o.offsetLeft),
		top		:intVal(o.offsetTop),
		width	:intVal(o.offsetWidth),
		height	:intVal(o.offsetHeight),
		bottom	:intVal(o.offsetTop)+intVal(o.offsetHeight),
		right	:intVal(o.offsetLeft)+intVal(o.offsetWidth),
		obj		:o
	}
}

function prevSibling(obj)
{
    var ie = getBrowser().ie;
    if(ie)
    {
        return obj.previousSibling;
    }
    else
    {
        if(!isUndefined(obj.previousSibling)) return obj.previousSibling.previousSibling;
    }
}

function nextSibling(obj)
{
    var ie = getBrowser().ie;
    if(ie)
    {
        return obj.nextSibling;
    }
    else
    {
        if(!isUndefined(obj.nextSibling)) return obj.nextSibling.nextSibling;
    }
}

function insertAfter(parent, node, referenceNode)
{
	parent.insertBefore(node, referenceNode.nextSibling);
}

function intVal(p)
{
	if(p===0)return 0;
	p = p.toString();
	if(p.indexOf('0') == 0)
	{
		p = p.replace(/^0/, '');		
	}
	return parseInt(p);
}

function getElementsByClassName(className, tag, elm, returnFirst , noProto)
{
	tag 				= tag || "*";
	elm 				= elm || document;
	var testClass 		= new RegExp("(^|\s+)" + className + "(\s+|$)");
	var elements 		= (tag == "*" && elm.all)? elm.all : elm.getElementsByTagName(tag);
	var returnElements 	= [];
	var current			= null;
	var length = elements.length;
	for(var i=0; i<length; i++)
	{
		current = elements[i];
		if(testClass.test(current.className))
		{
			if(!noProto)DOMElement.proto(current);
			if(returnFirst) return current;
			returnElements.push(current);
		}
	}
	return returnElements;
}

function copyElement(o_from, o_to)
{
    if(!isElement(o_from) || !isElement(o_to)) return null;    
    
    var clone = o_from.cloneNode(true);
    clone.removeAttribute('id');
    o_to.appendChild(clone);
    return clone;
}

function getScroll(elm)
{
	elm = (isElement(elm)) ? elm : document.documentElement;
	return {top: elm.scrollTop, left: elm.scrollLeft};
}

if(isUndefined(JS_DUMP_ENABLE)) var JS_DUMP_ENABLE = true;

function dump(data, refresh)
{
	if(!JS_DUMP_ENABLE) return false;
	var div = document.createElement('div');
    
	setStyle(div, {
        position        : 'absolute',
        left            : '0px',
        top             : '0px',
        backgroundColor : '#333333',
        color           : '#CCCCCC',
        border          : '1px solid #CC3300',
        fontSize        : '10px',
        fontFamily      : 'Verdana',
        textAlign       : 'left',
        maxHeight       : '400px',
        overflow        : 'auto',
        maxWidth        : '300px',
        paddingRight    : '20px'
    });
    
    div.id = 'DEBUG_________DUMP___CONTENT__123456789';
    if(!$(div.id))
    {
        document.getElementsByTagName('body').item(0).appendChild(div);
    }
    if(refresh)
	{
		$(div.id).innerHTML = data+'<br />--------------------------<br />';
	}
	else
	{
		$(div.id).innerHTML += data+'<br />--------------------------<br />';
	}
	$(div.id).scrollTop = parseInt($(div.id).scrollHeight);
}

var create =
{
	input:
	{
		hidden:function(name, value)
		{
			var e = document.createElement('input');
			e.type = 'hidden';
			e.name = name;
			if(value)e.value = value;
			DOMElement.proto(e);
			return e;
		},
		text:function(name, value, cn, style)
		{
			var e = document.createElement('input');
			e.type = 'text';
			e.name = name;
			if(value) e.value = value;
			if(cn) e.className = cn;
			if(style) setStyle(e, style);
			DOMElement.proto(e);
			return e;
		},
		password:function(name, value)
		{
			var e = document.createElement('input');
			e.type = 'password';
			e.name = name;
			if(value)e.value = value;
			DOMElement.proto(e);
			return e;
		}
	},
	
	div:function(id, txt, cn, style, parent, select)
	{
		var e = document.createElement('div');
		if(id) e.id = id;
		if(txt) e.innerHTML = txt;
		if(cn) e.className = cn;
		if(style) setStyle(e, style);
		DOMElement.proto(e);
		if(!select)disableSelection(e);
		if(isElement(parent)) parent.appendChild(e);
		return e;
	},
	
	iframe:function(id, transparent, cn, style, parent, select)
	{
		var e = document.createElement('iframe');
		DOMElement.proto(e);
		if(id) e.id = id;
		if(cn) e.className = cn;
		if(style) e.setStyle(style);
		if(!select)disableSelection(e);
		if(transparent)
		{
			e.setStyle({filter: 'alpha(opacity=0)',	opacity: '0'});
		}
		if(isElement(parent)) parent.appendChild(e);
		return e;
	},
	
	img:function(id, src, cn, style, parent)
	{
		var e = document.createElement('img');
		DOMElement.proto(e);
		e.src = src;
		//var ow = e.width;
		//var oh = e.height;
		if(id) e.id = id;
		if(cn) e.className = cn;
		if(style) e.setStyle(style);
		if(isElement(parent)) parent.appendChild(e);
		return e;
	},
	
	span:function(id, txt, cn, style)
	{
		var e = document.createElement('span');
		if(id) e.id = id;
		if(txt) e.innerHTML = txt;
		if(cn) e.className = cn;
		if(style) setStyle(e, style);
		DOMElement.proto(e);
		disableSelection(e);
		return e;
	},
	
	table:function(id, cn, style, parent)
	{
		var e = document.createElement('table');
		var b = document.createElement('tbody');
		if(id) e.id = id;
		if(cn) e.className = cn;
		if(style) setStyle(e, style);
		if(parent) parent.appendChild(e);
		DOMElement.proto(e);
		disableSelection(e);
		e.appendChild(b);
		return b;
	},
	
	tr:function(id, cn, style, parent)
	{
		var e = document.createElement('tr');
		if(id) e.id = id;
		if(cn) e.className = cn;
		if(style) setStyle(e, style);
		if(isElement(parent)) parent.appendChild(e);
		DOMElement.proto(e);
		disableSelection(e);
		return e;
	},
	
	td:function(id, cn, style, parent)
	{
		var e = document.createElement('td');
		if(id) e.id = id;
		if(cn) e.className = cn;
		if(style) setStyle(e, style);
		if(isElement(parent)) parent.appendChild(e);
		DOMElement.proto(e);
		disableSelection(e);
		return e;
	}
}
