var undefined;

Node = new Object();

Node.ELEMENT_NODE					= 1;
Node.ATTRIBUTE_NODE					= 2;
Node.TEXT_NODE						= 3;
Node.CDATA_SECTION_NODE				= 4;
Node.ENTITY_REFERENCE_NODE		  	= 5;
Node.ENTITY_NODE				  	= 6;
Node.PROCESSING_INSTRUCTION_NODE  	= 7;
Node.COMMENT_NODE				  	= 8;
Node.DOCUMENT_NODE					= 9;
Node.DOCUMENT_TYPE_NODE			  	= 10;
Node.DOCUMENT_FRAGMENT_NODE		  	= 11;
Node.NOTATION_NODE				  	= 12;

var EMPTY_STRING= "";
var SPACE 		= " ";
var STAR		= "*";

var OBJECT		= "object";
var ARRAY		= "array";
var STRING		= "string";
var NUMBER		= "number";
var BOOLEAN		= "boolean";

var MOUSE_DOWN	= "mousedown";
var MOUSE_UP	= "mouseup";
var CLICK		= "click";
var DBL_CLICK	= "dblclick";
var MOUSE_MOVE	= "mousemove";
var MOUSE_OVER	= "mouseover";
var MOUSE_ENTER = "mouseenter";
var MOUSE_OUT	= "mouseout";
var KEY_DOWN	= "keydown";
var KEY_UP		= "keyup";
var KEY_PRESS	= "keypress";
var UP			= "up";
var DOWN		= "down";
var LEFT		= "left";
var RIGHT		= "right";

var PX			= "px";

var HTML		= "html";
var BODY		= "body";
var DIV			= "div";
var SPAN		= "span";
var H1			= "h1";
var H2			= "h2";
var H3			= "h3";
var H4			= "h4";
var H5			= "h5";
var H6			= "h6";
var P			= "p";
var INPUT		= "input";
var SELECT		= "select";
var TEXTAREA	= "textarea";
var UL			= "ul";
var LI			= "li";
var A			= "a";
var TABLE		= "table";
var THEAD		= "thead";
var TBODY		= "tbody";
var TR			= "tr";
var TD			= "td";

var NONE		= "none";
var BLOCK		= "block";

var ACTIVE		= "active";
var HOVER		= "hover";
var FOCUSED		= "focused";
var UNFOCUSED	= "unfocused";


/**
 *	Array convenience method to check for membership.
 *
 *	@param object element
 *	@returns boolean
 */
Array.prototype.contains = function (element) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == element) {
			return true;
		}
	}
	return false;
};

/**
 *	Array convenience method to remove element.
 *
 *	@param object element
 *	@returns boolean
 */
Array.prototype.remove = function (element) {
	var result = false;
	var array = [];
	for (var i = 0; i < this.length; i++) {
		if (this[i] == element) {
			result = true;
		} else {
			array.push(this[i]);
		}
	}
	this.clear();
	for (var i = 0; i < array.length; i++) {
		this.push(array[i]);
	}
	array = null;
	return result;
};

/**
 *	Array convenience method to clear membership.
 *
 *	@param object element
 *	@returns void
 */
Array.prototype.clear = function () {
	this.length = 0;
};

function getURL(url) {
	window.location = url;
}

function show(target) {
	target.style.display = BLOCK;
}

function hide(target) {
	target.style.display = NONE;
}

function toggle(target) {
	if (isShowing(target)) {
		hide(target);
	} else {
		show(target);
	}
}

function isShowing(target) {
	return !(NONE == target.style.display);
}

function setVisible(target,visible) {
	if (visible) {
		target.style.visibility = "visible";
	} else {
		target.style.visibility = "hidden";
	}
}

function position(target,x,y) {
	setLocation(target,x,y);
}

function setLocation(target,x,y) {
	target.style.left	= x + PX;
	target.style.top	= y + PX;
}

function getX(target) {
	return parseInt(target.style.left);
}

function setX(target,x) {
	target.style.left = x+PX;
}

function getY(target) {
	return parseInt(target.style.top);
}

function setY(target,y) {
	target.style.top = y+PX;
}

function getWidth(target) {
	return parseInt(target.style.width);
}

function setWidth(target,w) {
	target.style.width = w + PX;
}

function getHeight(target) {
	return parseInt(target.style.height);
}

function setHeight(target,h) {
	target.style.height = h + PX;
}

function getBackgroundPositionX(n) {
	var bgPos = n.style.backgroundPosition;
	bgPos = bgPos.replace(/(\d+)/i,"$1");
	return parseInt(bgPos);
}

function getBackgroundPositionY(n) {
	var bgPos = n.style.backgroundPosition;
	bgPos = bgPos.replace(/\d+px\s+(\d+)/i,"$1");
	return parseInt(bgPos);
}

function setBackgroundPosition(n,x,y) {
	n.style.backgroundPosition = x + PX + SPACE + y + PX;
}

function remove(target) {
	target.parentNode.removeChild(target);
}

function add(target) {
	document.body.appendChild(target);
}

function trim(s) {
	s = s.replace(/^\s*/g,EMPTY_STRING).replace(/\s*$/g,EMPTY_STRING);
	return s;
}

function setOpacity(target,percent) {
	// e.g.: percent == 40	
	if (isType(target.style.opacity,STRING)) {
		target.style.opacity = EMPTY_STRING + (percent/100);
	} else if (isType(target.style.mozOpacity,STRING)) {
		target.style.mozOpacity = EMPTY_STRING + (percent/100);
	}
}

function getElementsWithClassName(root,className) {
	var tags = root.getElementsByTagName( STAR );
	var resultSet = [];
	for (var i = 0; i < tags.length; i++) {
		if (isClass(tags[i],TAB_CLASS_NAME)) {
			resultSet[resultSet.length] = tags[i];
		}
	}
	return resultSet;
}

function getFirstChildByTagName(target,tagName) {
	var cn = target.childNodes;
	tagName = tagName.toLowerCase();
	for (var i = 0; i < cn.length; i++) {
		if (cn[i].nodeName.toLowerCase() == tagName) {
			return cn[i];
		}
	}
	return null;
}

function getLastChildByTagName(target,tagName) {
	var cn = target.childNodes;
	tagName = tagName.toLowerCase();
	for (var i = cn.length-1; i >= 0; i--) {
		if (cn[i].nodeName.toLowerCase() == tagName) {
			return cn[i];
		}
	}
	return null;
}

function getDescendantsByTagAndClassName(root,tagName,className) {
	var resultSet = [];
	var elems = root.getElementsByTagName(tagName.toLowerCase());
	for (var i = 0; i < elems.length; i++) {
		if (isClass(elems[i],className)) {
			resultSet[resultSet.length] = elems[i];
		}
	}
	return resultSet;
}

function getDescendantsByAttributeValue(root,name,value) {
	var resultSet = [];
	var elems = root.getElementsByTagName( STAR );
	for (var i = 0; i < elems.length; i++) {
		if (value == elems[i].getAttribute(name)) {
			resultSet[resultSet.length] = elems[i];
		}
	}
	return resultSet;
}

function getDescendantsByTagNameAndAttributeValue(root,tagName,name,value) {
	var resultSet = [];
	var elems = root.getElementsByTagName( tagName );
	for (var i = 0; i < elems.length; i++) {
		if (value == elems[i].getAttribute(name)) {
			resultSet[resultSet.length] = elems[i];
		}
	}
	return resultSet;
}

function getDescendantsByTagNameExceptClassName(root,tagName,className) {
	var resultSet = [];
	var elems = root.getElementsByTagName(tagName.toLowerCase());
	for (var i = 0; i < elems.length; i++) {
		if (isClass(elems[i],className)) {
			continue;
		} else {
			resultSet[resultSet.length] = elems[i];
		}
	}
	return resultSet;
}

function getChildrenByTagAndClassName(root,tagName,className) {
	var resultSet = [];
	var elems = root.childNodes;
	for (var i = 0; i < elems.length; i++) {
		if (elems[i].nodeType != 1)
			continue;
		if (isClass(elems[i],className) && isNodeName(elems[i],tagName)) {
			resultSet[resultSet.length] = elems[i];
		}
	}
	return resultSet;
}

function isNodeName(target,tagName) {
	tagName = tagName.toLowerCase();
	return target.nodeName.toLowerCase() == tagName;
}

function isType(target,type) {
	return typeof target == type;
}

function isNodeType(target,nodeType) {
	return target.nodeType == nodeType;
}

function isId(target,id) {
	if (isType(id,STRING)) {
		return target.id == id;
	} else if (isType(id,OBJECT)) {
		for (var i = 0; i < id.length; i++) {
			if (target.id == id[i]) {
				return true;
			}
		}
	}
	return false;
}

function isClass(target,className) {
	if (!target.className)
		return false;
	if (isType(className,STRING)) {
		return target.className.indexOf(className) > -1;
	} else if (isType(className,OBJECT)) {
		for (var i = 0; i < className.length; i++) {
			if (target.className.indexOf(className[i]) > -1) {
				return true;
			}
		}
	}
	return false;
}

function setClassAsHover(target) {
	removeClass(target,ACTIVE);
	addClass(target,HOVER);
	
}

function setClassAsActive(target) {
	removeClass(target,HOVER);
	addClass(target,ACTIVE);
}

function setClassAsNormal(target) {
	removeClass(target,HOVER);
	removeClass(target,ACTIVE);
}

function setClassAsFocused(target) {
	removeClass(target,UNFOCUSED);
	addClass(target,FOCUSED);
}

function setClassAsUnFocused(target) {
	removeClass(target,FOCUSED);
	addClass(target,UNFOCUSED);
}


function addClass(target,k) {
	var cn = target.className;
	if (cn && cn.indexOf(k) > -1) {
		return;
	}
	if (cn && cn.length > 0) {
		k = SPACE + k;
		cn += k;
	} else {
		cn = k;
	}
	target.className = cn;
}

function removeAllClasses(target) {
	target.className = "";
}

function removeClass(target,k) {
	var cn = target.className;
	if (!cn) {
		return;
	}
	//cn = cn.replace(/^\s/g,EMPTY_STRING).replace(/\s$/g,EMPTY_STRING);
	cn = trim(cn);
	var index;
	if ((index = cn.indexOf(k)) > -1) {
		cn = cn.substring(0,index)+cn.substring(index+k.length);
	}
	target.className = cn;
}

function toggleClass(target,k) {
	if (isClass(target,k)) {
		removeClass(target,k);
	} else {
		addClass(target,k);
	}	
}

function findAncestorWithClassName(target,className) {
	var parent = target;
	while (parent = parent.parentNode) {
		if (isClass(parent,className)) {
			return parent;
		}
	}
	return null;
}

function findAncestorWithTagName(target,tagName) {
	var parent = target;
	while (parent = parent.parentNode) {
		if (isNodeName(parent,tagName)) {
			return parent;
		}
	}
	return null;
}

function findAncestorOrSelfWithTagName(target,tagName) {
	if (isNodeName(target,tagName))
		return target;
	var parent = target;
	while (parent = parent.parentNode) {
		if (isNodeName(parent,tagName)) {
			return parent;
		}
	}
	return null;
}

function findAncestorOrSelfByNodeType(target,nodeType) {
	if (isNodeType(target,nodeType))
		return target;
	var parent = target;
	while (parent = parent.parentNode) {
		if (isNodeType(parent,nodeType)) {
			return parent;
		}
	}
	return null;
}

function findAncestorOrSelfWithClassName(target,className) {
	if (isClass(target,className))
		return target;
	var parent = target;
	while (parent = parent.parentNode) {
		if (isClass(parent,className)) {
			return parent;
		}
	}
	return null;
}

function findPreviousSiblingByTagName(target,tagName) {
	var sibling = target;
	tagName = tagName.toLowerCase();
	while (sibling = sibling.previousSibling) {
		if (isNodeName(sibling,tagName)) {
			return sibling;
		}
	}
	return null;
}

function findNextSiblingByTagName(target,tagName) {
	var sibling = target;
	tagName = tagName.toLowerCase();
	while (sibling = sibling.nextSibling) {
		if (isNodeName(sibling,tagName)) {
			return sibling;
		}
	}
	return null;
}

function findAncestorWithId(target,id) {
	var parent = target;
	while (parent = parent.parentNode) {
		if (parent.id.indexOf(id) > -1) {
			return parent;
		}
	}
	return null;
}

function findAncestorWithTagName(target,tagName) {
	var parent = target;
	while (parent = parent.parentNode) {
		if (isNodeName(parent,tagName)) {
			return parent;
		}
	}
	return null;
}

function getActualX(n) {
	var docEl = document.documentElement;
	var body  = document.body;
	//alert(n.naturalHeight);
}

function getActualY(n) {
	var docEl = document.documentElement;
	var body  = document.body;

}

function getScrollX() {
	var docEl = document.documentElement;
	var body  = document.body;
	return (window.scrollX)	  ? window.scrollX :
		   (docEl.scrollLeft) ? docEl.scrollLeft :
		   (body.scrollLeft)  ? document.body.scrollLeft : 0;
}
	
function getScrollY() {
	var docEl = document.documentElement;
	var body  = document.body;
	return (window.scrollY)	 ? window.scrollY :
		   (docEl.scrollTop) ? docEl.scrollTop :
		   (body.scrollTop)	 ? body.scrollTop : 0;
}

function getViewportWidth() {
	var docEl = document.documentElement;
	var body  = document.body;
	return (window.innerWidth) ? window.innerWidth : 
		   (docEl.clientWidth) ? docEl.clientWidth : 
		   (body.clientWidth)  ? body.clientWidth : 0;
}
	
function getViewportHeight() {	
	var docEl = document.documentElement;
	var body  = document.body;
	return (window.innerHeight) ? window.innerHeight :
		   (docEl.clientHeight) ? docEl.clientHeight :
		   (body.clientHeight)	? body.clientHeight : 0;	
}

function getScreenX() {
	return window.screenX;
}

function getScreenY() {
	return window.screenY;
}

function getScreenWidth() {
	return screen.width;
}

function getScreenHeight() {
	return screen.height;
}

function getBrowserWidth() {
	return window.outerWidth;
}

function getBrowserHeight() {
	return window.outerHeight;
}

function getOffsetLeft(n) {
	var result = n.offsetLeft;
	for (var parent = n; parent = parent.offsetParent; parent != null) {
		result += parent.offsetLeft;
	}
	return result;
}

function getOffsetTop(n) {
	var result = n.offsetTop;
	for (var parent = n; parent = parent.offsetParent; parent != null) {
		result += parent.offsetTop;
	}
	return result;
}

function var_dump(n) {
	document.write("<style type=\"text/css\"> " +
		"body { font:10px/1.3 \"Lucida Grande\" } " +
		"</style>");
	for (var p in n) {
		document.write("<b>"+p+"</b>"+
			"<span style=\"color:red;\"> = </span>"+n[p]+"<br>");
	}
}

var MAC		= "Mac";
var WIN		= "Win";
var OPERA	= "Opera";
var CAMINO	= "Camino";
var WEB_KIT = "AppleWebKit";
var GECKO	= "Gecko";
var MSIE	= "MSIE";
var MSIE_50 = MSIE+" 5.0";
var MSIE_55 = MSIE+" 5.5";
var MSIE_6	= MSIE+" 6";

var isMac,isWin,isOpera,isCamino,isSafari,isGecko,isIE5Mac,isIEWin,isIE50Win,
		isIE55Win,isIE6Win;

function UADetect() {
	var UA = navigator.userAgent;
	//document.write(UA);
	if (UA.indexOf(MAC) != -1)
		isMac = true;
	else if (UA.indexOf(WIN) != -1)
		isWin = true;
	
	if (UA.indexOf(OPERA) != -1)
		isOpera = true;
	else if (UA.indexOf(CAMINO) != -1)
		isCamino = true;
	else if (UA.indexOf(WEB_KIT) != -1)
		isSafari = true;
	else if (UA.indexOf(GECKO) != -1)
		isGecko = true;
	else if (isMac && UA.indexOf(MSIE) != -1)
		isIE5Mac = true;
	else if (isWin && UA.indexOf(MSIE) != -1 && !isOpera) {
		isIEWin = true;
		if (UA.indexOf(MSIE_50) != -1)
			isIE50Win = true;
		else if (UA.indexOf(MSIE_55) != -1)
			isIE55Win = true;
		else  if (UA.indexOf(MSIE_6) != -1)
			isIE6Win = true;
	}
}

function UAWarning() {

	if (isIEWin || isGecko) {
			
		return;
	}
	
	var c = new Cookie("rackspace.ua.warning","true");
	
	if (Cookie.pageHasCookieWithNameAndValue(c)) {
			
		return;
	}
	
	Cookie.set(c);
}

//UADetect();
//UAWarning();

/**
 *	@param Event evt
 *	@param string msg
 *	@return void
 */
function confirmAction(evt,msg) {
	evt = new Evt(evt,true);
	if (!confirm(msg)) {
		evt.cancel();
	}
}

function closePopupRefresh(URL) {
	window.close();
	window.opener.location.href = URL;
}

function createCookie(name,value,days) {
	if (days) {
		var date = new Date();
		date.setTime(date.getTime()+(days*24*60*60*1000));
		var expires = "; expires="+date.toGMTString();
	}
	else var expires = "";
	document.cookie = name+"="+value+expires+"; path=/";
}

function readCookie(name) {
	var nameEQ = name + "=";
	var ca = document.cookie.split(';');
	for(var i=0;i < ca.length;i++) {
		var c = ca[i];
		while (c.charAt(0)==' ') c = c.substring(1,c.length);
		if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
	}
	return null;
}

function eraseCookie(name) {
	createCookie(name,"",-1);
}

