function MM_preloadImages() { //v3.0
  var d=document; if(d.images){ if(!d.MM_p) d.MM_p=new Array();
    var i,j=d.MM_p.length,a=MM_preloadImages.arguments; for(i=0; i<a.length; i++)
    if (a[i].indexOf("#")!=0){ d.MM_p[j]=new Image; d.MM_p[j++].src=a[i];}}
}

function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}

function MM_swapImgRestore() { //v3.0
  var i,x,a=document.MM_sr; for(i=0;a&&i<a.length&&(x=a[i])&&x.oSrc;i++) x.src=x.oSrc;
}

function MM_findObj(n, d) { //v4.01
  var p,i,x;  if(!d) d=document; if((p=n.indexOf("?"))>0&&parent.frames.length) {
    d=parent.frames[n.substring(p+1)].document; n=n.substring(0,p);}
  if(!(x=d[n])&&d.all) x=d.all[n]; for (i=0;!x&&i<d.forms.length;i++) x=d.forms[i][n];
  for(i=0;!x&&d.layers&&i<d.layers.length;i++) x=MM_findObj(n,d.layers[i].document);
  if(!x && d.getElementById) x=d.getElementById(n); return x;
}

function MM_swapImage() { //v3.0
  var i,j=0,x,a=MM_swapImage.arguments; document.MM_sr=new Array; for(i=0;i<(a.length-2);i+=3)
   if ((x=MM_findObj(a[i]))!=null){document.MM_sr[j++]=x; if(!x.oSrc) x.oSrc=x.src; x.src=a[i+2];}
}

/**
 * global.js 
 * by Garrett Smith 
 * Provides functionality for extending custom classes.
 *
 * ElementWrapper is a simple wrapper class.
 *
 * EventQueue provides Event Listener Functionality.
 */


/** Provides functionality for extending classes. 
 *  
 */
Function.prototype.extend = function(souper) {
	this.prototype = new souper;
	this.prototype.constructor = this;
	this.souper = souper;
	this.prototype.souper = souper;
};
/** Generic Element Wrapper 
 *  
 */
ElementWrapper = function ElementWrapper(el){
	if(arguments.length == 0) return;
	this.el = el;
	this.id = el.id;
	if(!ElementWrapper.list[this.id])
		ElementWrapper.list[this.id] = this;
};

ElementWrapper.list = new function(){};

ElementWrapper.getWrapper = function(id){
	return ElementWrapper.list[id];
};


/** EventQueue class Provides Event Listener Functionality.
 *
 * Instance Methods: 
 *
 *   addEventListener(etype, pointer)
 *   
 * 
 */
EventQueue = function EventQueue(eventObj){
	if(arguments.length == 0) return;
	this.souper = EventQueue.souper;
	this.souper(eventObj);
	
	this.addToPool();
};

EventQueue.extend(ElementWrapper);

EventQueue.prototype.addEventListener = function(etype, pointer){
	var list = this.eventHandlerList(etype);
	return list[list.length++] = pointer;
};

EventQueue.prototype.eventHandlerList = function(etype){
	
	if(!this[etype])
		this[etype] = new EventQueue.EventHandler(this, etype);
	
	return this[etype];
};

EventQueue.prototype.removeEventListener = function(etype, pointer){
	var list = this[etype];
	var len = list.length;
	if(len == 0) return null;
	
	var newList = new Array(len-1);
	var rtn = null;
	for(var i = 0; i < len; i++)
		if(list[i] != pointer)
			newList[i] = list[i];
		else rtn = pointer;
		
	this[etype] = newList;
	return rtn;
};
	

EventQueue.prototype.handleEvent = function(e){
	
	var rtn = true;
	for(var i = 0, len = this[e].length; i < len; i++){
			this.tempFunction = this[e][i];
			if(rtn != false)	
				rtn = this.tempFunction();
		}
	return rtn;
};
	
EventQueue.prototype.addToPool = function(){
	if(!EventQueue.list[this.id])
		EventQueue.list[this.id] = this;
};


/** EventQueue.EventHandler is private to EventQueue class.
 *  Instantiation and method calls are made automatically from
 *  EventQueue constructor and instance methods. 
 */
EventQueue.EventHandler = function EventHandler(wrapper, etype){
	this.etype = etype;
	this.length = 0;
	this.id = wrapper.id;
	wrapper.el[etype] = new Function("return EventQueue.fireEvent('"+wrapper.id+"', '"+etype+"')");
};

EventQueue.fireEvent = function(id, e){	
	var wrapper = EventQueue.list[id];
	if(!wrapper) return false;
	var r = wrapper.handleEvent(e);
	return r;
	
};
EventQueue.EventHandler.prototype.toString = function toString(){
	return this.id +"." +this.etype;
};

EventQueue.list = new Object;
