/* ---------------------------
   ---- ELEMENT FUNCTIONS ----
   --------------------------- */

/* Quick Get Element By ID */
function $(obj) {
	var to_get = document.getElementById(obj);
	if( to_get )
		return to_get;
}

/* Get Elements By ClassName */
function getElementsByClassName(oElm, strTagName, strClassName){
    var arrElements = (strTagName == "*" && document.all)? document.all : oElm.getElementsByTagName(strTagName);
    var arrReturnElements = new Array();
    strClassName = strClassName.replace(/\-/g, "\\-");
    var oRegExp = new RegExp("(^|\\s)" + strClassName + "(\\s|$)");
    for(var i = 0, oElement; oElement = arrElements[i]; i++){
        if(oRegExp.test(oElement.className))
            arrReturnElements.push(oElement);
    }
    return (arrReturnElements)
}

/* Add Class Name to Element */
function addClassName (elem, className) {
    removeClassName (elem, className);
    elem.className = (elem.className + " " + className).trim();
}

/* Remove Class Name from Element */
function removeClassName (elem, className) {
    elem.className = elem.className.replace(className, "").trim();
}

/* Check if Element Contains Class Name */
function hasClassName (elem, className ) {
	if( elem.className )
		elem.className.indexOf(className) >= 0 ? has = true : has = false;
	else
		has = false;
	return has;
}


/* Whitespace Checker for DOM */
var wspace = {
	testF : function(elem){
		var wspace = /[^\t\n\r ]/
		if(!wspace.test(elem.data)){ return elem.nextSibling; }else{ return elem; }
	},
	testB : function(elem){
		var wspace = /[^\t\n\r ]/
		if(!wspace.test(elem.data)){ return elem.previousSibling; }else{ return elem; }
	}
}



/* ---------------------------
   ----- EVENT FUNCTIONS -----
   --------------------------- */

/* Add Event Listeners */
function addEvent( obj, type, fn ) {
	if (obj.addEventListener) {
		obj.addEventListener( type, fn, false );
		EventCache.add(obj, type, fn);
	}
	else if (obj.attachEvent) {
		obj["e"+type+fn] = fn;
		obj[type+fn] = function() { obj["e"+type+fn]( window.event ); }
		obj.attachEvent( "on"+type, obj[type+fn] );
		EventCache.add(obj, type, fn);
	}
	else {
		obj["on"+type] = obj["e"+type+fn];
	}
}
var EventCache = function(){
	var listEvents = [];
	return {
		listEvents : listEvents,
		add : function(node, sEventName, fHandler){
			listEvents.push(arguments);
		},
		flush : function(){
			var i, item;
			for(i = listEvents.length - 1; i >= 0; i = i - 1){
				item = listEvents[i];
				if(item[0].removeEventListener){
					item[0].removeEventListener(item[1], item[2], item[3]);
				};
				if(item[1].substring(0, 2) != "on"){
					item[1] = "on" + item[1];
				};
				if(item[0].detachEvent){
					item[0].detachEvent(item[1], item[2]);
				};
				item[0][item[1]] = null;
			};
		}
	};
}();

/* Remove Event Listeners */
function removeEvent( obj, type, fn ) {
	if ( obj.detachEvent ) {
		obj.detachEvent( 'on'+type, obj[type+fn] );
		obj[type+fn] = null;
	} else
		obj.removeEventListener( type, fn, false );
} 
addEvent(window,'unload',EventCache.flush);



/* -------------------------------
   ----- PROTOTYPE FUNCTIONS -----
   ------------------------------- */

/* Trim String Whitespace */
String.prototype.trim = function() {
    return this.replace( /^\s+|\s+$/, "" );
}

/* Convert HTML Collections to Actual Arrays */
function $c(array){
	var nArray = [];
	for (var i=0;i<array.length;i++) nArray.push(array[i]);
	return nArray;
}




/* -------------------------------
   ----- COSMETIC FUNCTIONS ------
   ------------------------------- */

/* Repair PNG Files for IE */
function correctPNG() {
	for(var i=0; i<document.images.length; i++) {
		var img = document.images[i]
		var imgName = img.src.toUpperCase()
		if (imgName.substring(imgName.length-3, imgName.length) == "PNG") {
			var imgID = (img.id) ? "id='" + img.id + "' " : ""
			var imgClass = (img.className) ? "class='" + img.className + "' " : ""
			var imgTitle = (img.title) ? "title='" + img.title + "' " : "title='" + img.alt + "' "
			var imgStyle = "display:inline-block;" + img.style.cssText 
			if (img.align == "left") imgStyle = "float:left;" + imgStyle
			if (img.align == "right") imgStyle = "float:right;" + imgStyle
			if (img.parentElement.href) imgStyle = "cursor:hand;" + imgStyle		
			var strNewHTML = "<span " + imgID + imgClass + imgTitle
			+ " style=\"" + "width:" + img.width + "px; height:" + img.height + "px;" + imgStyle + ";"
			+ "filter:progid:DXImageTransform.Microsoft.AlphaImageLoader"
			+ "(src=\'" + img.src + "\', sizingMethod='image');\"></span>" 
			img.outerHTML = strNewHTML
			i = i-1
		}
	}
	// Added IE Loads
	rolloversIE.init();
}

/* Show Rollovers for Any Image, including PNG */
var rolloversIE = {
	init : function() {
		var spans = $c(document.getElementsByTagName('span'));
		for( var i = 0, span; span = spans[i]; i++ ) {
			rolloversIE.preload(span);
		}
	},
	preload : function(e) {
		if( hasClassName(e, 'rollover') ) {
			var img = new Image, filter = e.style.filter;
			var src = filter.substring( filter.indexOf("src='") + 5, filter.indexOf("',"));
			img.src = src.substring(0, src.length - 4) + '_over' + src.substring(src.length - 4, src.length);
			addEvent(e,'mouseover',rolloversIE.show);
			addEvent(e,'mouseout',rolloversIE.hide);
		}
	},
	show : function(e) {
		var filter = this.style.filter;
		var src = filter.substring( filter.indexOf("src='") + 5, filter.indexOf("',"));
		var ext = src.substring(src.length - 4, src.length);
		var name = src.substring(0, src.length - 4);
		this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader" + "(src=\'" + name + '_over' + ext + "\', sizingMethod='image')";
	},
	hide : function(e) {
		var filter = this.style.filter;
		var src = filter.substring( filter.indexOf("src='") + 5, filter.indexOf("',"));
		this.style.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader" + "(src=\'" + src.replace('_over','') + "\', sizingMethod='image')";
	}
}

var rollovers = {
	obj : Object,
	init : function() {
		var overs = $c(document.getElementsByTagName('img'));
		for( var i = 0, over; over = overs[i]; i++ ) {
			rollovers.preload(over);
		}
	},
	preload : function(e) {
		if( hasClassName(e, 'rollover') ) {
			var img = new Image, src = e.src;
			img.src = src.substring(0, src.length - 4) + '_over' + src.substring(src.length - 4, src.length);
			addEvent(e,'mouseover',rollovers.show);
			addEvent(e,'mouseout',rollovers.hide);
		}
	},
	show : function(e) {
		var ext = this.src.substring(this.src.length - 4, this.src.length);
		var name = this.src.substring(0, this.src.length - 4);
		this.src = name + '_over' + ext;
	},
	hide : function(e) {
		this.src = this.src.replace('_over','');
	}
}
   
/* Add a PNG "Frame" to any image */
function pngFrame(dir) {
	for( var i = 0, img; img = document.getElementsByTagName('img')[i]; i++ ) {
		if( img.className.indexOf('frame') > -1 ) {
			img.style.background = "url(" + img.src + ")";
			img.src = png_frame;
		}
	}
}



/* ---------------------------
   ------ LOAD FUNCTIONS -----
   --------------------------- */

if( navigator.userAgent.indexOf('MSIE') > 0 )
	addEvent(window,'load',correctPNG);		// Fix Transparent PNGs for IE
addEvent(window,'load',pngFrame);			// Apply PNG Frame to Images
addEvent(window,'load',rollovers.init);		// Add Rollovers to Images