var api = {
	$: function(id)
	{
		//DESCRIPTION: Returns a document object reference like getElementById()
		//USAGE: $(id:String [,path:Object]) : Object
		//EXAMPLE: $('id',top.guiData)
		//NOTE: if no path is passed it is now assumed that the document is the content document
		return gebi = document.getElementById(id);
	},

	$$: function $$(id)
	{
		var nodes = [];
		if(document.all)
		{
			//IE & OPERA??? wtf
			nodes = document.all(id);
			if (!nodes[0])
				nodes = [nodes];   
		}
		else
		{
			//FIREFOX
			var elem = document.getElementsByTagName('body')[0].getElementsByTagName('*');
			for(var i=0;i<elem.length;i++)
				if(elem[i].id == id)
					nodes.push(elem[i]);
		}
		return nodes;
	},
	
	getPosition: function(elem,refElem)
	{
		if (!elem){throw new Error ("API.getPosition: elem is null or undefined.");}
		var curleft = 0;
		var curtop = 0;
		if (typeof(refElem) == "undefined"){refElem = elem.parentElement;}
		while (elem && elem !== refElem)
		{
			curleft += elem.offsetLeft;
			curtop += elem.offsetTop;
			try {
				elem = elem.offsetParent;
			}
			catch (e) {
				//not sure why, but reading the offsetParent sometimes throws an error if it's null, so quit the loop
				break;
			}
			if (elem)
			{
				curleft -= elem.scrollLeft;
				curtop -= elem.scrollTop;
			}
		}
		if (refElem && elem !== refElem){throw new Error ("API.getPosition: "+refElem.id+" is not an ancestor of "+elem.id);}
		return {x:curleft,y:curtop};
	},

	getOffset: function(element,which,refElement)
	{
		//DESCRIPTION: Returns offset integer values for left, top, width, height, right, bottom for document objects
		//USAGE: getOffset(element:Object, which:String, refElement:Object) : Integer
		//EXAMPLE: getOffset(myElem, 'left', null)
		var result;
		var pos = API.getPosition(element,refElement);
		switch(which)
		{
			case 'left':
			case 'l':
				result = pos.x;
				break;
				
			case 'top':
			case 't':
				result = pos.y;
				break;
							
			case 'width':
			case 'w':
				result = element.offsetWidth;
				break;
			
			case 'height':
			case 'h':
				result = element.offsetHeight;
				break;
				
			case 'right':
			case 'r':
				result = element.offsetWidth + pos.x;
				break;
				
			case 'bottom':
			case 'b':
				result = element.offsetHeight + pos.y;
				break;
			default: //get all of them and return an array
				result = [pos.x,pos.y,element.offsetWidth,element.offsetHeight,element.offsetWidth + pos.x,element.offsetHeight + pos.y];
				break;
		}
		
		return result;
	},
	
	setVisible: function(element,vis)
	{
		//DESCRIPTION: Changes document object style for visibility
		//USAGE: setVisibile(element:Object,v:Boolean) : Void
		//EXAMPLE: setVisible(myElem, true)  OR  setVisible(myElem, true, myElem, true, myElem, true)
		for(var a=arguments.length-1; a>0 ;a-=2)//using reverse loop for speed
		{
			if (arguments[a-1])
				arguments[a-1].style.visibility = arguments[a] ? 'inherit' : 'hidden';
		}
	},
	
	setDisplay: function(element,prop)
	{
		//DESCRIPTION: Changes document object style for display
		//USAGE: setDisplay(element:Object,prop:String) : Void
		//EXAMPLE: setDisplay(myElem, 'block')  OR   setDisplay(myElem1, 'block', myElem2, 'block',myElem3, 'block')
		for(var a=arguments.length-1; a>0 ;a-=2)//using reverse loop for speed
		{
			arguments[a-1].style.display = arguments[a];	
		}
	},
	
	getRenderedStyle: function(element, rule)
	{	
		//DESCRIPTION: Returns requested style value of an element as it is displayed on screen. This value is compiled from all classes inherited by the element along with any in-line styles applied to the element.
		//USAGE: getRenderedStyle(elem:Object, rule:Object) : String
		//EXAMPLE: getRenderedStyle(document.getElementById("container"), "font-size");
		var result = null;
		if(element.currentStyle)//IE
		{
			rule = rule.replace(/\-(\w)/g, function (strMatch, group1){return group1.toUpperCase();});
			result = element.currentStyle[rule];
		}
		else if(document.defaultView && document.defaultView.getComputedStyle)//Mozilla
		{
			result = document.defaultView.getComputedStyle(element, "").getPropertyValue(rule);
		} 
		return result;
	},
	
	createNode: function(type,id)
	{
		//DESCRIPTION: Creates and returns a new node
		//USAGE: createNode(type:String,id:String[,path:Object]) : Object
		//EXAMPLE: createNode('div','xxx',top.guiData)
		var newNode =  document.createElement(type);
		if(id) { newNode.setAttribute('id',id);	}
		return newNode;
	},
	
	addEvent: function(element,handler,func)
	{
		var result = null;
		if (element && func)
		{
			if (typeof(func) == "string"){func = new Function("e", func);}
			if (element.addEventListener)
			{
				element.addEventListener(handler, func, false);{result = func;}
			}
			else if (element.attachEvent)
			{
				if (element.attachEvent("on" + handler, func)){result = func;}
			}
		}
		return result;
	},
	
	removeEvent: function(element,handler,func)
	{
		if (element && func && typeof(func) != "string")
		{
			if (element.removeEventListener)
			{
				element.removeEventListener(handler, func, false);
			}
			else if (element.detachEvent)
			{
				element.detachEvent("on" + handler, func);
			}
		}
	},
	
	attachStyleSheet: function(href)
	{
		//DESCRIPTION: Attaches an external style sheet to a document
		//USAGE: attachStyleSheet(href:String[,path:Object]) : Void
		//EXAMPLE: attachStyleSheet('css/css.css',top.guiData)
		if(!API.getStyleSheet(href,path))
		{
			var newStyleSheet = API.createNode('style','',path);
			newStyleSheet.type = 'text/css';
			document.getElementsByTagName('head')[0].appendChild(newStyleSheet);
			
			newStyleSheet.styleSheet.addImport(href);
		}
	},
	
	getStyleSheet: function(href)
	{
		//DESCRIPTION: finds and returns the path of an external style sheet
		//USAGE: getStyleSheet(href:String[,path:Object]) : String
		//EXAMPLE: getStyleSheet('css/css.css',top.guiData)
		var doc = document;
		for(var i=0;i<doc.styleSheets.length;i++)
		{
			if(doc.styleSheets[i].href == href)
			{ 
				return doc.styleSheets[i]; 
			}
		}
		return null;
	}
};



//--- COMMON SHORTCUTS 
var $ = api.$;
var $$ = api.$$;











