function $(v) { return(document.getElementById(v)); }
function $C(args){
	var aL = args.length;
	var node = null;

	if(aL>=1)
	{
		node = C(args[0]);
		if(aL>=2)
		{
			for(var arg in args[1])
			{
				setAttribute(node, arg, args[1][arg]);
			}
		}

		for(var i=2; i < aL; i++)
		{
			if(typeof(args[i]) == 'string')
				node.appendChild(document.createTextNode(args[i]));
			else
				node.appendChild($C(args[i]));
		}
	}
	return node;
}
function getEventSource(e)
{
	e = e || window.event;
	
	return (e.target) ? e.target: e.srcElement;
}
function mouseCoordinates(ev){
		ev = ev || window.event;
		if(ev.pageX || ev.pageY)
			return {x:ev.pageX, y:ev.pageY};
		return {x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
				  y:ev.clientY + document.body.scrollTop  - document.body.clientTop};
	}
function require(requireObject){

	var path = requireObject.path ? requireObject.path : "";
	
	var files = requireObject.files;

	for(var i=0; i<files.length; i++){

		document.write('<scr' + 'ipt type="text/javascript" src="' + path + files[i] + '.js"></scr' + 'ipt>');
		
	}

}

function preventDefaultEvent(e){
	if(e.preventDefault) e.preventDefault();
	else e.returnValue=false;
}

function hasElementAttribute(node,attr){
	if(isExplorer()){
		return node.attributes[attr].specified;
	}else{
		return node.hasAttribute(attr);
	}
}

function isSelfOrDescendant(node, ancestor){

	return (node == ancestor || isDescendant(node, ancestor));
	
}

function removeElement(elementId){

	if($(elementId))
		$(elementId).parentNode.removeChild($(elementId));
	
}

function isDescendant(node, ancestor){
	while(node.parentNode)
	{	
		if(node.parentNode == ancestor)
			return true;
			
		node = node.parentNode;
	}
	return false;
}
function getElementsWithAttribute(rootNode,attName,attValue,deep){
	var resultNodes = new Array();
	if(rootNode.childNodes){
		for(var i = 0; i < rootNode.childNodes.length; i++){
			var curNode = rootNode.childNodes[i];
			
			if((curNode.getAttribute && attName!='class' && curNode.getAttribute(attName) == attValue)
			|| (attName == 'class' && curNode.className == attValue)
			)
				resultNodes.push(curNode);
				
			if(deep){
				var deepFound = getElementsWithAttribute(curNode,attName,attValue,deep);
				for(var j = 0; j < deepFound.length; j++){
					resultNodes.push(deepFound[j]);
				}
			}
			
		}
	}
	return resultNodes;
}

function C(){
	var newElement = null;
	if(arguments.length>0)
	{
		newElement=document.createElement(arguments[0]);
		
		for(var i = 1; i + 1 < arguments.length; i += 2)
		{
			setAttribute(newElement, arguments[i], arguments[i+1]);
		}
	}
	return newElement;
}

function setAttribute(element, attributeName, attributeValue)
{
	if(attributeName == "class" || attributeName == "classname")
		element.className = attributeValue;
	else if(attributeName == "style"){
		element.setAttribute("style", attributeValue);
		element.style.cssText = attributeValue;
	}else if(attributeName == "innerHTML"){
		element.innerHTML = attributeValue;
	}else
		element.setAttribute(attributeName, attributeValue);
}

function getAttribute(element, attributeName)
{
	if(attributeName == "class")
		return element.className;
	else if(attributeName == "style"){
		if(element.style.cssText != undefined)
			return element.style.cssText;
		else
			return element.getAttribute("style");
	}else if(attributeName == "innerHTML"){
		return element.innerHTML;
	}else
		return element.getAttribute(attributeName);
}

function SA()
{
	if(arguments.length>0)
	{
		var curElement=document.getElementById(arguments[0]);
		
		for(var i=1;i+1<arguments.length;i+=2)
		{
			setAttribute(curElement, arguments[i], arguments[i+1]);
		}
	}
}

function appendNodes(parentNode, children)
{
	for(var i = children.length - 1; i >= 0; i--)
	{
		parentNode.appendChild(children[i]);
	}
}

function cloneNodes(nodesToClone)
{
	var clonedNodes = new Array(nodesToClone.length);

	for(var i=0; i<nodesToClone.length; i++){
	
		clonedNodes.push( nodesToClone[i].cloneNode(true) );
	
	}
	
	return clonedNodes;

}


function getScrollPosition(elm) {

	var scrollPosition = {x:elm.scrollLeft, y:elm.scrollTop};

  var mOffsetParent = elm.parentNode;

  while(mOffsetParent)
  {
  	if(mOffsetParent.scrollTop)
  	{
  	  scrollPosition.x += mOffsetParent.scrollLeft;
  	  scrollPosition.y += mOffsetParent.scrollTop;
  	}
    mOffsetParent = mOffsetParent.parentNode;
  }
 
  return scrollPosition;
}

function getOffsetPosition(elm)
{
	var offsetPosition = {x:elm.offsetLeft, y:elm.offsetTop};
	
  var mOffsetParent = elm.offsetParent;

  while(mOffsetParent)
  {
    offsetPosition.x += mOffsetParent.offsetLeft;
    offsetPosition.y += mOffsetParent.offsetTop;
    mOffsetParent = mOffsetParent.offsetParent;
  }
  return offsetPosition;
}

function getViewportHeight()
{
	if (self.innerHeight){
		return self.innerHeight;
	}else if (document.documentElement && document.documentElement.clientHeight){
		return document.documentElement.clientHeight;
	}else if (document.body){
		return document.body.clientHeight;
	}
}
function getViewportWidth()
{
	if (self.innerHeight){
		return self.innerWidth;
	}else if (document.documentElement && document.documentElement.clientWidth){
		return document.documentElement.clientWidth;
	}else if (document.body){
		return document.body.clientWidth;
	}
}

function setEvent(el,evtType,evtFunc)
{
	if(el.attachEvent)
		el.attachEvent("on"+evtType,evtFunc);
	else
		el.addEventListener(evtType, evtFunc, false);	
}
function unsetEvent(el,evtType,evtFunc)
{
	if(el.detachEvent)
		el.detachEvent("on"+evtType,evtFunc);
	else
		el.removeEventListener(evtType, evtFunc, false);
}

function trim(str){
	return str.replace(/^\s*|\s*$/g,"");
}

function overlapSize(el1,el2){
	
	var top1 = getOffsetTop(el1);
	var top2 = getOffsetTop(el2);
	var left1 = getOffsetLeft(el1);
	var left2 = getOffsetLeft(el2);
	
	var overlapVertical = 
		Math.min(top1 + el1.offsetHeight, top2 + el2.offsetHeight) - Math.max(top1, top2);
		
	var overlapHorizontal = 
		Math.min(left1 + el1.offsetWidth, left2 + el2.offsetWidth) - Math.max(left1, left2);
		
	if(overlapVertical>0 && overlapHorizontal >0)
		return overlapVertical * overlapHorizontal;
	else
		return 0;
	
}

function overlap(el1,el2){
	
	var top1 = getOffsetTop(el1);
	var top2 = getOffsetTop(el2);
	var left1 = getOffsetLeft(el1);
	var left2 = getOffsetLeft(el2);
	
	var overlapVertical = 
		Math.max(top1, top2) <
		Math.min(top1 + el1.offsetHeight, top2 + el2.offsetHeight);
		
	var overlapHorizontal = 
		Math.max(left1, left2) <
		Math.min(left1 + el1.offsetWidth, left2 + el2.offsetWidth);
		
	return overlapVertical && overlapHorizontal;
	
}

function isIn(x, y, element){
	
	var top = getOffsetTop(element);
	var left = getOffsetLeft(element);
	
	var overlapVertical = 
		y >= top && y < top + element.offsetHeight;
		
	var overlapHorizontal = 
		x >= left && x < left + element.offsetWidth;
		
	return overlapVertical && overlapHorizontal;
	
}

function isArray(obj) {
   if (!obj.constructor || obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}

function unclip(element){

	var elementPosition = getOffsetPosition(element);
	var ancestorPosition = 
	{
		y: (document.documentElement && document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop),
		x: (document.documentElement && document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft)
	};

	if(elementPosition.x < ancestorPosition.x)
		element.style.left = ancestorPosition.x;
	else if(elementPosition.x + element.offsetWidth > ancestorPosition.x + getViewportWidth()){
		element.style.left = getViewportWidth() + ancestorPosition.x - element.offsetWidth;
	}

	if(elementPosition.y < ancestorPosition.y)
		element.style.top = ancestorPosition.y;
	else if(elementPosition.y + element.offsetHeight > ancestorPosition.y + getViewportHeight())
		element.style.top = getViewportHeight() + ancestorPosition.y - element.offsetHeight + "px";

}
function enableTextSelection(){
  if (document.all)
    document.onselectstart =
      function () { return true; };
  if (document.layers) {
    document.captureEvents(Event.MOUSEDOWN);
    document.onmousedown =
      function (evt) {
        return true;
      };
  }
  document.onmousedown =
    function () { return true; };
}

function disableTextSelection(){
  if (document.all)
    document.onselectstart =
      function () { return false; };
  if (document.layers) {
    document.captureEvents(Event.MOUSEDOWN);
    document.onmousedown =
      function (evt) {
        return false;
      };
  }
  document.onmousedown =
    function () { return false; };
}