registerEvent(window, "load", function(){
    var elements = getElementsByClassName("img_flip", "IMG");
    for(var i=0; i<elements.length; i++){
        registerEvent(elements[i], "mouseover", imageFlipOver);
    }
    elements = getElementsByClassName("sidebar_popup", "A");
    for(var i=0; i<elements.length; i++){
        registerEvent(elements[i], "click", sidebarPopup);
    }
    elements = getElementsByClassName("new_window", "A");
    for(var i=0; i<elements.length; i++){
        registerEvent(elements[i], "click", newWindow);
    }
    elements = getElementsByClassName("links", "SELECT");
    for(var i=0; i < elements.length; i++){
        registerEvent(elements[i], "change", quickLinksChange);
    }
    elements = getElementsByClassName("script");
    for(var i=0; i<elements.length; i++){
        elements[i].className = elements[i].className.replace(/\bscript\b/g, "").replace(/^\s+|\s+$/g, "");
    }
});

function imageFlipOver(event){
    var img = event.target || window.event.srcElement;
    img.src = img.src.replace(/([-_])i\.([^\.]+)$/i, "$1r.$2");
    unregisterEvent(img, "mouseover", imageFlipOver);
    registerEvent(img, "mouseout", imageFlipOut);
}
function imageFlipOut(event){
    var img = event.target || window.event.srcElement;
    img.src = img.src.replace(/([-_])r\.([^\.]+)$/i, "$1i.$2");
    unregisterEvent(img, "mouseout", imageFlipOut);
    registerEvent(img, "mouseover", imageFlipOver);
}

function sidebarPopup(event){
    var ev = event || window.event;
    var a = ev.currentTarget || ev.srcElement;
    
    if(a.tagName == "IMG")
        a = a.parentElement;
    
    window.open(a.href, "sidebar_popup", "menubar=no,location=no,resizable=yes,scrollbars=yes,status=no,height=350,width=550");
    
    preventDefault(ev);
}
function newWindow(event){
    var ev = event || window.event;
    var a = ev.currentTarget || ev.srcElement;
    
    if(a.tagName == "IMG")
        a = a.parentElement;
    
    window.open(a.href, "_blank");
    
    preventDefault(ev);
}
function quickLinksChange(event){
    var ev = event || window.event;
    var o = ev.currentTarget || ev.srcElement;
    var loc = o.options[o.selectedIndex].value;
    if(loc != "")
        document.location = loc;
}

function preventDefault(ev){
    if(ev.preventDefault)
        return ev.preventDefault();
    ev.returnValue = false;
}

function getElementsByClassName(className, tag, elm){
	var re = new RegExp("(^|\\s)" + className + "(\\s|$)");
	var tag = tag || "*";
	var elm = elm || document;
	var elements = elm.getElementsByTagName(tag);
	var ret = [];
	for(var i=0; i< elements.length; i++){
		if(re.test(elements[i].className)){
			ret.push(elements[i]);
		}
	}
	return ret;
}

function registerEvent(oElement, sEvent, handler){
	sEvent = sEvent.toLowerCase();
	if(sEvent.indexOf("on") == 0)
		sEvent = sEvent.substring(2, sEvent.length);
	if(oElement.addEventListener){
		oElement.addEventListener(sEvent, handler, false);
	} else if(oElement.attachEvent){
		oElement.attachEvent(oElement.attachEvent("on" + sEvent, handler));
	}
}
function stopPropagation(ev){
    ev = ev || window.event;
    if(ev.stopPropagation)
        ev.stopPropagation();
    else
        ev.cancelBubble = true;
}
function unregisterEvent(oElement, sEvent, handler){
	sEvent = sEvent.toLowerCase();
	if(sEvent.indexOf("on") == 0)
		sEvent = sEvent.substring(2, sEvent.length);
	if(oElement.removeEventListener){
		oElement.removeEventListener(sEvent, handler, false);
	} else if(oElement.detachEvent){
		oElement.detachEvent(oElement.detachEvent("on" + sEvent, handler));
	}
}

function getCurrentStyle(HTMLElement, sProp, sPseudo){
	if(HTMLElement.currentStyle)
		return HTMLElement.currentStyle[sProp];
	else
		return getComputedStyle(HTMLElement, sPseudo ? sPseudo : null).getPropertyValue(sProp);
}

function MethodCall(obj, oMethod, arArgs){
	/*
	For use when it is necessary to pass a method pointer or a function pointer with arguments
	set properties: obj, method, and args.
	pass in the dispatch method.
	*/
	var me = new Object;
	me.obj = obj ? obj : new Object;
	me.method = oMethod;
	me.args = arArgs;
	me.dispatch = function (arg1, arg2, arg3, arg4){
		var ret;
		
		if(me.args)
			ret = me.method.apply(me.obj, me.args);
		else
			ret = me.method.call(me.obj, arg1, arg2, arg3, arg4)
		
		return ret;
	}
	return me;
}

function getElement(id, bThrowError){
    var ret = document.getElementById(id);
    if(ret != null)
        return ret;
    
    if(typeof PAGE_CONTROLS == "undefined")
    	return null;
    if(!PAGE_CONTROLS || !PAGE_CONTROLS[id]){
        if(bThrowError)
            throw "Couldn't get element " + id + ".  Page control or page control array not defined";
        else
            return null;
    }
        
    ret = document.getElementById(PAGE_CONTROLS[id]);
    if(bThrowError && ret == null)
        throw "Couldn't get element " + id + ".  Element not found.";
    return ret;
}
