/****************************************************/
// Javascript Base Helper Functions
// @copyright Fonqi, 23. oct 2008 
/****************************************************/

Base = {};

Base.ToggleElement = function(id)
{
    var hide = false;
	var element = Base.Get(id);
	if(element.style.display == "")
		hide = true;
	if(hide)
	{
		element.style.display = "none";	
	}
	else
	{
		element.style.display = "";
	}
}

Base.Hide = function(_element)
{
	var element = Base.Get(_element);
	if(Base.Exists(element.length))
	{
		for(i=0; i< element.length; i++)
		{
			element[i].style.display = "none";
		}		
	}
	else
		element.style.display = "none";
}

Base.Display = function(_element)
{
	var element = Base.Get(_element);
	if(Base.Exists(element.length))
	{
		for(i=0; i< element.length; i++)
		{
			element[i].style.display = "";
		}		
	}
	else
		element.style.display = "";
}

Base.HideElement = function(id)
{
	Base.Hide(id);
}

Base.DisplayElement = function(id, displayType)
{
	Base.Display(id);
}

Base.Trace = function(message)
{	
    var alertDiv = document.getElementById("tracerDiv");
	var alertsContainer = document.getElementById("alertsContainer");
    if(alertDiv == null)
	{
        alertDiv = document.createElement('div');	
		alertsContainer = document.createElement('div');
		var closeButton = document.createElement('a');
		var clearButton = document.createElement('a');
		closeButton.innerHTML = "X";		
		closeButton.href = "javascript:Base.ToggleElement('#alertsContainer')";
		closeButton.style.lineHeight = "0.6";
		closeButton.style.cursor = "pointer";
		closeButton.style.textDecoration ="none";
		closeButton.style.color ="#666";
		closeButton.style.border = "1px solid #666"
		closeButton.style.minWidth = "2px";
		closeButton.style.minHeight = "5px";
		closeButton.style.padding = "2px";
		closeButton.style.position = "absolute";
		closeButton.style.left= "4px";
		closeButton.style.top= "4px";	
		alertDiv.appendChild(closeButton);
		
		clearButton.innerHTML = "clear";
		clearButton.href = "javascript:Base.Clear('#alertsContainer')";
		clearButton.style.lineHeight = "0.6";
		clearButton.style.cursor = "pointer";
		clearButton.style.textDecoration ="none";
		clearButton.style.color ="#666";
		clearButton.style.border = "1px solid #666"
		clearButton.style.minWidth = "2px";
		clearButton.style.minHeight = "5px";
		clearButton.style.padding = "2px";
		clearButton.style.position = "absolute";
		clearButton.style.left= "24px";
		clearButton.style.top= "4px";	
		clearButton.innerHTML = "clear";		
		alertDiv.appendChild(clearButton);	
		
		alertsContainer.style.borderTop = "1px solid #666";
		alertsContainer.style.marginTop = "20px";
		alertDiv.appendChild(alertsContainer);
		alertsContainer.setAttribute('id', "alertsContainer");
	}
    alertDiv.setAttribute('id', "tracerDiv");	
    alertsContainer.innerHTML += "<p>"+message+"</p>";
    alertDiv.style.position = "absolute";
    alertDiv.style.right = "0px";
    alertDiv.style.top = "0px";
	alertDiv.style.backgroundColor = "#CCC";
	alertDiv.style.padding = "5px";
	alertDiv.style.font = "11px arial, helvetica";
	alertDiv.style.border = "1px solid #999";
	alertDiv.style.minWidth = "100px";
	alertDiv.style.minHeight = "8px";
	alertDiv.style.opacity = "0.7";
	alertDiv.style.filter = "alpha(opacity=70)";
	alertDiv.style.zIndex = "9999";
    document.getElementsByTagName("body")[0].appendChild(alertDiv);
}

Base.IsValueInArray = function(value, array)
{
    for(var i = 0;i<array.length;i++)
    {
        if(array[i] == value)
        {
            return true;
        }
    }
    return false;
}

/*
Retrieves a htmlelement based on the selector
the '#' prefix gets an element by Id
the '.' prefix gets an arragy of elements by classname
the '$' prefix gets an array of elements by name
no prefix gets an element by id
*/
Base.Get = function(elementSelector)
{	
	if(typeof elementSelector != "string")
		return elementSelector;
	
	if(elementSelector.indexOf("#")==0)
		return document.getElementById(elementSelector.substr(1, elementSelector.length-1));
		
	else if(elementSelector.indexOf(".")== 0)
	{
		var cssClass = elementSelector.substr(1, elementSelector.length-1);
		var returnElements = new Array();
		var allElements = document.getElementsByTagName("*");
		for(i=0;i<allElements.length;i++)
		{
			if(allElements[i].className==cssClass)
				returnElements.push(allElements[i]);
		}
		return returnElements;
	}
	
	else if(elementSelector.indexOf("$")== 0)
	{
		var name = elementSelector.substr(1, elementSelector.length-1);
		var returnElements = new Array();
		var allElements = document.getElementsByTagName("*");
		for(i=0;i<allElements.length;i++)
		{
			if(allElements[i].name == name)
				returnElements.push(allElements[i]);
		}
		return returnElements;
	}
	else if(elementSelector.indexOf("<")== 0 && (elementSelector.indexOf(">") == elementSelector.length-1))
	{
		var tagName = elementSelector.substr(1, elementSelector.length-2);		
		return document.getElementsByTagName(tagName);
	}
	else
		return document.getElementById(elementSelector);
}

Base.GetChildren = function(_element, _selector)
{
	var element = Base.Get(_element);
	if(_selector.indexOf("#") == 0)
	{
		Base.Trace(element.childNodes.length);
		for(i = 0; i < element.childNodes.length; i++)
		{			
			if(element.childNodes[i]["id"] == _selector.substr(1, _selector.length-1))
			{
				return element.childNodes[i];
			}			
		}
		return null;
	}
	else if(_selector.indexOf("$") == 0)
	{
		var name = _selector.substr(1,_selector.length-1);
		var returnElements = new Array();
		var allElements = element.childNodes;
		for(i = 0; i < allElements.length; i++)
		{
			if(allElements[i].name == name)
				returnElements.push(allElements[i]);
		}
		return returnElements;
	}	
	else if(_selector.indexOf("<") == 0 && (_selector.indexOf(">") == _selector.length-1))
	{
		var returnElements = new Array();
		var tagName = _selector.substr(1, _selector.length-2);
		var allElements = element.childNodes;
		for(i = 0; i < allElements.length; i++)
		{
			Base.Trace(allElements[i]["nodeName"].toLowerCase());
			if(allElements[i]["nodeName"].toLowerCase() == tagName)
				returnElements.push(allElements[i]);
		}
		return returnElements;
	}
	else
		return Base.GetChildren(_element, "#"+_selector);
}

Base.AddCSSClass = function(_element, _class)
{
	var element = Base.Get(_element);
	if(Base.Exists(element.className) && !element.className.indexOf(_class) >= 0)
	{
		element.className = element.className+" "+_class+" ";
	}
}

Base.SetCSSClass = function(_element, _class)
{
	var element = Base.Get(_element).className = _class+" ";
}

Base.RemoveCSSClass = function(_element, _class)
{	
	var element = Base.Get(_element);
	if(Base.Exists(element.className) && element.className.indexOf(_class) >= 0)
		element.className = element.className.replace(_class, "");
}

Base.Clear = function(_element)
{
	var element = Base.Get(_element);	
	if(Base.Exists(element.value))
	{
		element.value = "";
		return;
	}
	else if(Base.Exists(element.innerHTML))
	{
		element.innerHTML = "";
		return;
	}
	
}

Base.Set = function(_element, _value)
{
	var element = Base.Get(_element);	
	if(Base.Exists(element.value))
	{
		element.value = _value;
		return;
	}
	else if(Base.Exists(element.innerHTML))
	{
		element.innerHTML = _value;
		return;
	}
}

/*
Prints all properties in an object (and their current values)
*/
Base.Inspect = function(obj) 
{
	var str = "";
	for ( var prop in obj )
	{
		str += "prop: " + prop + " = '" + obj[prop] + "'<br />";
	}
	Base.Trace(str);
}

Base.TransferStyle = function(fromObj, toObj)
{
	var styleObj;
	var from = Base.Get(fromObj);
	var to = Base.Get(toObj);
	if (from.currentStyle)
	{
		styleObj = from.currentStyle;
	}
	else if (window.getComputedStyle)
	{
		styleObj = document.defaultView.getComputedStyle(from, null);
	}
		
	for ( var prop in styleObj )
	{
		if(prop.toString() != 'cssText')
			to.style[prop] = styleObj[prop];
	}
}

Base.GetStyleObj = function(_element)
{
	var styleObj = null;
	var from = Base.Get(_element);	
	if (from.currentStyle)
		styleObj = from.currentStyle;
	else if (window.getComputedStyle)
		styleObj = document.defaultView.getComputedStyle(from, null);
	return styleObj;
}


Base.GetXPos = function(element)
{
	var element = Base.Get(element);
	var curleft = 0;
	if(element.offsetParent)
	{
		while(1) 
		{
			curleft += element.offsetLeft;
			if(!element.offsetParent)
		  		break;
			element = element.offsetParent;
		}
	}
	else if(element.x)
		curleft += element.x;
	return curleft;
}

Base.GetYPos = function(element)
{
	var element = Base.Get(element);
	var curtop = 0;
	if(element.offsetParent)
	{
		while(1)
		{
			curtop += element.offsetTop;
				if(!element.offsetParent)
					break;
				element = element.offsetParent;
		}
	}
	else if(element.y)
		curtop += element.y;
	return curtop;
}

Base.SetXPos = function(element, xPos)
{
	var element = Base.Get(element);	
	element.style.position = "absolute";
	element.style.left = xPos+"px";
}

Base.SetYPos = function(element, yPos)
{
	var element = Base.Get(element);	
	element.style.position = "absolute";
	element.style.top = yPos+"px";
}

Base.SetAlpha = function(_element, _alpha)
{
	var alpha = _alpha;
	var element = Base.Get(_element);
	//element.style["-ms-filter"] = "progid:DXImageTransform.Microsoft.Alpha(Opacity="+alpha+")";
	if(Base.Browser().Name=="IE")
		element.style["filter"] = "alpha(opacity="+alpha+")";
	else
		element.style["opacity"] = _alpha/100;
}

Base.GetAlpha = function(_element)
{
	var element = Base.Get(_element);
	retur = 100;
	if(Base.Browser().Name=="IE")
	{
		if(element.style["filter"] != "")
			retur = element.style["filter"].replace("alpha(opacity=", "").replace(")","");
	}
	else
	{
		if(element.style["opacity"] != "")
			retur = element.style["opacity"];
	}
	return retur;
}

Base.GetHeight = function(element)
{
	return parseInt(Base.Get(element).offsetHeight);	
}

Base.GetWidth = function(element)
{
	return parseInt(Base.Get(element).offsetWidth);	
}

Base.Now = function()
{
	var date = new Date();
	var retur = date.getDate()+"-"+(date.getMonth()+1)+"-"+date.getFullYear() +" "+date.getHours()+":"+date.getMinutes();
	return retur;
}

Base.HitTest = function(_element)
{
	var element = Base.Get(_element);
	Base.AttachEvent("mouseover", _element, Base.GetMousePos);
	if(Base.MousePos.X < Base.GetXPos( _element))
		Base.Trace(Base.MousePos.X);
}

Base.MousePos = {X:0, Y:0};
Base.GetMousePos = function()
{
	var evt = arguments[0];
	Base.MousePos.X = Base.GetMouseX(evt)
	Base.MousePos.Y = Base.GetMouseY(evt);
}

Base.GetMouseX = function(evt) 
{
	if (!evt) evt = window.event; 
	if (evt.pageX) 
		return evt.pageX; 
	else if (evt.clientX)
		return evt.clientX + (document.documentElement.scrollLeft ?  document.documentElement.scrollLeft : document.body.scrollLeft);
	else return 0;
}

Base.GetMouseY = function(evt) 
{
	if (!evt) evt = window.event; 
	if (evt.pageY) return evt.pageY; 
	else if (evt.clientY)
		return evt.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop); 
	else return 0;
}

Base.AttachEvent = function(evType, _element, fn)
{
	var element = Base.Get(_element);
	if (element.addEventListener)
	{
		element.addEventListener(evType, fn, false);
		return true;			
	}
	else if (element.attachEvent)
	{
		return element.attachEvent("on"+evType, fn);
	} 
	else
	{
		return false;
	}
}

Base.DetachEvent = function(evType, _element, fn)
{
	if (_element.addEventListener)
	{
		_element.removeEventListener(evType, fn, false);
		return true;			
	}
	else if (_element.attachEvent)
	{
		return _element.detachEvent("on"+evType, fn);
	} 
	else
	{
		return false;
	}
}

Base.GetFunctionName = function(fn)
{
	var fnName = fn.toString();
    fnName =  fnName.substr('function '.length); // trim off "function "
    fnName =  fnName.substr(0, fnName.indexOf('('));  // trim off everything after the function name
    return fnName;
        
}

Base.OnPageLoad = function(func) 
{
	Base.AttachEvent('load', window, func);
}

Base.IsDefined = function(variable)
{
	return(typeof variable != "undefined")
}

Base.Exists = function(variable)
{
	return(typeof variable != "undefined" && typeof variable != null)
}

Base.IsStringEmpty = function(str)
{
	return(str.replace(/^\s+/, '').length<1);
}

Base.IsEmail = function(str)
{
	return (str.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1);
}

Base.Request = function(value)
{	
	//var queryStr = new Array();
	var queryStr = location.href.split('?');	
	if(queryStr.length<2)
		return null;		
	var requestObj = new Object();
	var level1 = new Array();	
	level1 = queryStr[1].split('&');
	for(i = 0; i<level1.length;i++)
	{
		level2 = level1[i].split('=');
		requestObj[level2[0]] = level2[1];
	}	
	return requestObj[value];	
}

Base.BrowserObj = null;
Base.Browser = function()
{
	if(Base.BrowserObj == null)
		Base.BrowserObj = new BrowserObj();
	return Base.BrowserObj;
}

BrowserObj.prototype.Name = null;
BrowserObj.prototype.VersionNumber = null;
BrowserObj.Version = null;
function BrowserObj()
{
	this.Name = navigator.appName.toLowerCase();
	this.VersionNumber = parseInt(navigator.appVersion);
	if(this.Name == "netscape")
		this.Version = "N";
	else if(this.Name == "microsoft internet explorer")
	{
		this.Name = "IE";
		this.Version = "IE";
	}
	this.Version += this.VersionNumber;
}


/****************************************************/
