function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

function insertAfter(newElement,targetElement) {
  var parent = targetElement.parentNode;
  if (parent.lastChild == targetElement) {
    parent.appendChild(newElement);
  } else {
    parent.insertBefore(newElement,targetElement.nextSibling);
  }
}

function toggleBlockElementVisibility(elementList){
	elemsArray = elementList.split(",");
	for(i = 0; i < elemsArray.length; i++){
		var elem = elemsArray[i];
		var currElem = $(elem);
		if(currElem){
			var currStyle = currElem.style.display;
			if("block" == currStyle){
				currElem.style.display = "none";
			} else {
				currElem.style.display = "block";
			}
		}
	}
}

function toggleElement(elemId){
	if($(elemId)){
		var whatState = $(elemId).style.visibility;
		whatState = whatState == 'visible' ? 'hidden' : 'visible';
		$(elemId).style.visibility = whatState;
	}
}

function toggleVisibility(elementList){
	elemsArray = elementList.split(",");
	for(i = 0; i < elemsArray.length; i++){
		toggleElement(elemsArray[i]);
	}
}

function centerElement(elem){
	if($(elem)){
		var dims = getWindowDimensions();
		$(elem).style.left = ((dims.width - $(elem).offsetWidth) / 2) + "px";
		$(elem).style.top = (((dims.height - $(elem).offsetHeight) / 2) - 100) + "px";
	}
}

function setFocus()
{
	if(document.forms[0]){
	    if(document.forms[0].elements[0]){
        	document.forms[0].elements[0].focus();
        }
	}
}

function addClass(element,value) {
  if (!element.className) {
    element.className = value;
  } else {
    element.className+= " ";
    element.className+= value;
  }
}

function getNextElement(node) {
  if(node.nodeType == 1) {
	return node;
  }
  if (node.nextSibling) {
    return getNextElement(node.nextSibling);
  }
  return null;
}

function openNewWindow(URLtoOpen, windowName, windowFeatures) {
	newWindow=window.open(URLtoOpen, windowName, windowFeatures); 
}

function openWin(urlToOpen, windowName, width, height){
	var useTop = 0;
	var useLeft = 0;
	var screenHeight = screen.height;
	var screenWidth = screen.width;		
	var useWidth = 1000;
	var useHeight = 800;
	
	if(width){
		useWidth = width;
	}
	if(height){
		useHeight = height;
	}
	
	if(screenHeight > useHeight && screenWidth > useWidth){
		useTop = (screenHeight - useHeight)/2;
		useLeft = (screenWidth - useWidth)/2;
	}
	if(!windowName) windowName = '_blank';
	var varFeatures = 'scrollbars=yes,menubar=no,left=' + useLeft + ',top=' + useTop + ',height='+useHeight+',width='+useWidth+',resizable=yes,toolbar=no,location=no,status=no';
	openNewWindow(urlToOpen,windowName,varFeatures);
}

function getPosition(obj) {
//	var curleft = curtop = 0;
//	if (obj.offsetParent) {
//		curleft = obj.offsetLeft
//		curtop = obj.offsetTop
//		while (obj = obj.offsetParent) {
//			curleft += obj.offsetLeft
//			curtop += obj.offsetTop
//		}
//	}
//	return {left: curleft, top: curtop};

//  Try using prototype for positioning
	var relCoords = Position.cumulativeOffset(obj);
	return {left: relCoords[0], top: relCoords[1]};
}

function setPosition(posWhat, relativeTo, orientation, offset){
	var relElem = $(relativeTo);
	var posElem = $(posWhat);
	if(relElem){
		var relCoords = getPosition(relElem);
		var top = relCoords.top; //default top to top of elem passed in
		var left = relCoords.left; //default left to left of elem passed in
		if(orientation.indexOf("h") > -1){
			// horizontal menu add height of element
			top = relCoords.top + relElem.offsetHeight;
			// if aligned right (r) then do that here for horizontal menu too
			if(orientation.indexOf("r") > -1){
				left = relCoords.left + relElem.offsetWidth - posElem.offsetWidth;
			}
		}else{
			//vertical (v) menus - top stays default
			if(orientation.indexOf("r") > -1){
				left = relCoords.left - 10 + relElem.offsetWidth;
			}else{
				left = relCoords.left - posElem.offsetWidth;
			}
		}
		if(offset){
			if(offset.hAdjust){
				left = left + offset.hAdjust;
			}
			if(offset.vAdjust){
				top = top + offset.vAdjust;
			}
		}
		if(((left + posElem.offsetWidth) > getWindowDimensions().width) && (orientation == "hl" || orientation == "vr")){
			// If menu will go off the right of the page, re-orient the menu
			if(orientation == "hl"){
				setPosition(posWhat, relativeTo, "hr",offset);
			}
			if(orientation == "vr"){
				setPosition(posWhat, relativeTo, "vl",offset);
			}
			return;
		}
		posElem.style.top = top + "px";
		posElem.style.left = left + "px";
	}
}

function connectPopupToElement(params, bidirectional){
	params = params || {};
	var bidirectional = bidirectional || false;
	setPosition(params.popupId, params.connectTo, params.orientation, params.offset);

	if(params.onclick){
		$(params.connectTo).onclick = params.onclick;
	}else{
		$(params.connectTo).onmouseover = function() { showElements([params.popupId]); };
		$(params.connectTo).onmouseout = function() { hideElements([params.popupId]); };
	}

	if(bidirectional){
		// Setup up mouse events on the popup as well - this is 
		// necessary when using this function to making a simple popup
		// Without using the other "menuing" stuff
		$(params.popupId).onmouseover = function() { showElements([params.popupId]); };
		$(params.popupId).onmouseout = function() { hideElements([params.popupId]); };
	}
}

function hideElem(whichDiv){
	elem = $(whichDiv);
	if(!elem) return;
	elem.style.visibility = "hidden";
}

function showElem(whichDiv){
	elem = $(whichDiv);
	if(!elem) return;
	elem.style.visibility = "visible";
}

function showElements(elements){
	var i = 0;
	for(i; i < elements.length; i++){
		if($(elements[i])){
			$(elements[i]).style.visibility = "visible";
		}
	}
}

function hideElements(elements){
	var i = 0;
	for(i; i < elements.length; i++){
		if($(elements[i])){
			$(elements[i]).style.visibility = "hidden";
		}
	}
}

function hideBlockDiv(whichDiv){
	elem = $(whichDiv);
	if(!elem) return;
	elem.style.display = "none";
}

function showBlockDiv(whichDiv){
	elem = $(whichDiv);
	if(!elem) return;
	elem.style.display = "block";
}

function closeAndClearDiv(whichDiv){
	elem = $(whichDiv);
	if(!elem) return;
	purgeEventHandlers(elem);
	elem.innerHTML = "&nbsp;";
}

function getScreenDimensions(inHeight, inWidth){
	var useTop = 0;
	var useLeft = 0;
	var screenHeight = screen.height;
	var screenWidth = screen.width;
	if(screenHeight > inHeight && screenWidth > inWidth){
		useTop = (screenHeight - inHeight)/2;
		useLeft = (screenWidth - inWidth)/2;
	}
	return { top: useTop, left: useLeft };
}

// Element Positioning and Connecting Stuff - can be used by non "menuing" stuff
function getWindowDimensions() {
	var myWidth = 0, myHeight = 0;
	if( typeof( window.innerWidth ) == 'number' ) {
		//Non-IE
	    myWidth = window.innerWidth;
		myHeight = window.innerHeight;
	} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
		//IE 6+ in 'standards compliant mode'
	    myWidth = document.documentElement.clientWidth;
		myHeight = document.documentElement.clientHeight;
	} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
		//IE 4 compatible
	    myWidth = document.body.clientWidth;
		myHeight = document.body.clientHeight;
	}
	return {width: myWidth, height: myHeight};
}

function getScrollXY() {
	var scrOfX = 0, scrOfY = 0;
	if( typeof( window.pageYOffset ) == 'number' ) {
		//Netscape compliant
	    scrOfY = window.pageYOffset;
		scrOfX = window.pageXOffset;
	} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
		//DOM compliant
	    scrOfY = document.body.scrollTop;
		scrOfX = document.body.scrollLeft;
	} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
		//IE6 standards compliant mode
	    scrOfY = document.documentElement.scrollTop;
		scrOfX = document.documentElement.scrollLeft;
	}
	return {scrollX: scrOfX, scrollY: scrOfY };
}
		
function encodeNameAndValue(sName, sValue) {
    var sParam = encodeURIComponent(sName);
    sParam += "=";
    sParam += encodeURIComponent(sValue);
    return sParam;				
}
	    
function getRequestBody(oForm) {
	//array to hold the params
	var aParams = new Array();
	            
	//iterate over each element in the form
	for (var i=0 ; i < oForm.elements.length; i++) {
	//get reference to the field
		var oField = oForm.elements[i];
	    //different behavior based on the type of field
	    switch (oField.type) {
	    	//buttons - we don't care
	        case "button":
	        case "submit":
	        case "reset":
	        break;
	      	
	      	//checkboxes/radio buttons - only return the value if the control is checked.
	        case "radio":
	        case "checkbox":
	        if (!oField.checked) {
	        	break;
	        } //End: if
	        
	        //text/hidden/password all return the value
	        case "text":
	        case "hidden":
	        case "password":
	        aParams.push(encodeNameAndValue(oField.name, oField.value));			
	        break;
	                    
	        //everything else
	        default:
	                    
	        switch(oField.tagName.toLowerCase()) {
	        	case "select":
	            aParams.push(encodeNameAndValue(oField.name, oField.options[oField.selectedIndex].value));
	            break;
	            
	            default:	
	            aParams.push(encodeNameAndValue(oField.name, oField.value));
	        }
	    }							
	            
	}
	return aParams.join("&");
}

function coverUpDiv(divToDisable){
	var coverup;
		
	coverup = $('coverup');
    var toCover = $(divToDisable);
   
	var coords = getPosition(toCover);
	
	// coverup.setAttribute("class", "disabledDiv");
    coverup.style.width = toCover.offsetWidth + "px" ;
    coverup.style.height = toCover.offsetHeight + "px" ;
    coverup.style.left = coords.left + "px";
    coverup.style.top = coords.top + "px";
    coverup.style.zIndex = 50;
    coverup.style.display = "block";
}
			
function coverUpPage(){
	var coverup = $("coverup");
	// var wrapper = $("outer");	
	// var wrapperHeight = wrapper.offsetHeight + 50;
	// coverup.style.height = "" + wrapperHeight + "px";
	var screenHeight = screen.height;
	coverup.style.height = "" + screenHeight + "px";
	coverup.style.display = "block";
}

function unCoverPage(){
	var coverup = $("coverup");
	coverup.style.display = "none";
}
                            
function maxOutDiv(divId, bottomOffset, rightOffset) {
	var useBottomOffset = bottomOffset || 10;
	var useRightOffset = rightOffset || 10;
	var pos = getPosition($(divId));
	var winDims = getWindowDimensions();
	var newHeight = winDims.height - pos.top - useBottomOffset;
	var newWidth = winDims.width - pos.left - useRightOffset;
	$(divId).style.overflow = "auto";
	$(divId).style.height = newHeight + "px";
	$(divId).style.width = newWidth + "px";
}
			
function showProcessingMessage(){
	var coverupMessage = $("coverupMessage");
	coverupMessage.style.display = "block";
}

function urlDecode(str){
    str=str.replace(new RegExp('\\+','g'),' ');
    return unescape(str);
}
function urlEncode(str){
    str=escape(str);
    str=str.replace(new RegExp('\\+','g'),'%2B');
    return str.replace(new RegExp('%20','g'),'+');
}

var END_OF_INPUT = -1;

var base64Chars = new Array(
    'A','B','C','D','E','F','G','H',
    'I','J','K','L','M','N','O','P',
    'Q','R','S','T','U','V','W','X',
    'Y','Z','a','b','c','d','e','f',
    'g','h','i','j','k','l','m','n',
    'o','p','q','r','s','t','u','v',
    'w','x','y','z','0','1','2','3',
    '4','5','6','7','8','9','+','/'
);

var reverseBase64Chars = new Array();
for (var i=0; i < base64Chars.length; i++){
    reverseBase64Chars[base64Chars[i]] = i;
}

var base64Str;
var base64Count;
function setBase64Str(str){
    base64Str = str;
    base64Count = 0;
}
function readBase64(){    
    if (!base64Str) return END_OF_INPUT;
    if (base64Count >= base64Str.length) return END_OF_INPUT;
    var c = base64Str.charCodeAt(base64Count) & 0xff;
    base64Count++;
    return c;
}

function encodeBase64(str){
    setBase64Str(str);
    var result = '';
    var inBuffer = new Array(3);
    var lineCount = 0;
    var done = false;
    while (!done && (inBuffer[0] = readBase64()) != END_OF_INPUT){
        inBuffer[1] = readBase64();
        inBuffer[2] = readBase64();
        result += (base64Chars[ inBuffer[0] >> 2 ]);
        if (inBuffer[1] != END_OF_INPUT){
            result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30) | (inBuffer[1] >> 4) ]);
            if (inBuffer[2] != END_OF_INPUT){
                result += (base64Chars [((inBuffer[1] << 2) & 0x3c) | (inBuffer[2] >> 6) ]);
                result += (base64Chars [inBuffer[2] & 0x3F]);
            } else {
                result += (base64Chars [((inBuffer[1] << 2) & 0x3c)]);
                result += ('=');
                done = true;
            }
        } else {
            result += (base64Chars [(( inBuffer[0] << 4 ) & 0x30)]);
            result += ('=');
            result += ('=');
            done = true;
        }
        lineCount += 4;
        if (lineCount >= 76){
            result += ('\n');
            lineCount = 0;
        }
    }
    return result;
}
function readReverseBase64(){   
    if (!base64Str) return END_OF_INPUT;
    while (true){      
        if (base64Count >= base64Str.length) return END_OF_INPUT;
        var nextCharacter = base64Str.charAt(base64Count);
        base64Count++;
        if (reverseBase64Chars[nextCharacter]){
            return reverseBase64Chars[nextCharacter];
        }
        if (nextCharacter == 'A') return 0;
    }
    return END_OF_INPUT;
}

function ntos(n){
    n=n.toString(16);
    if (n.length == 1) n="0"+n;
    n="%"+n;
    return unescape(n);
}

function decodeBase64(str){
    setBase64Str(str);
    var result = "";
    var inBuffer = new Array(4);
    var done = false;
    while (!done && (inBuffer[0] = readReverseBase64()) != END_OF_INPUT
        && (inBuffer[1] = readReverseBase64()) != END_OF_INPUT){
        inBuffer[2] = readReverseBase64();
        inBuffer[3] = readReverseBase64();
        result += ntos((((inBuffer[0] << 2) & 0xff)| inBuffer[1] >> 4));
        if (inBuffer[2] != END_OF_INPUT){
            result +=  ntos((((inBuffer[1] << 4) & 0xff)| inBuffer[2] >> 2));
            if (inBuffer[3] != END_OF_INPUT){
                result +=  ntos((((inBuffer[2] << 6)  & 0xff) | inBuffer[3]));
            } else {
                done = true;
            }
        } else {
            done = true;
        }
    }
    return result;
}

var digitArray = new Array('0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f');
function toHex(n){
    var result = ''
    var start = true;
    for (var i=32; i>0;){
        i-=4;
        var digit = (n>>i) & 0xf;
        if (!start || digit != 0){
            start = false;
            result += digitArray[digit];
        }
    }
    return (result==''?'0':result);
}

function pad(str, len, pad){
    var result = str;
    for (var i=str.length; i<len; i++){
        result = pad + result;
    }
    return result;
}

function encodeHex(str){
    var result = "";
    for (var i=0; i<str.length; i++){
        result += pad(toHex(str.charCodeAt(i)&0xff),2,'0');
    }
    return result;
}

function decodeHex(str){
    str = str.replace(new RegExp("s/[^0-9a-zA-Z]//g"));
    var result = "";
    var nextchar = "";
    for (var i=0; i<str.length; i++){
        nextchar += str.charAt(i);
        if (nextchar.length == 2){
            result += ntos(eval('0x'+nextchar));
            nextchar = "";
        }
    }
    return result;
    
}

function purgeEventHandlersFromDiv(whichDiv){	
	var elem = $(whichdiv);
	if(elem){
		purgetEventHandlers(elem);
	}
}

function purgeEventHandlers(node){
	walkTheDOM(node, function (e) {
		var cnt = 0;
		for(cnt; cnt < e.length; cnt++){
			if(typeof e[cnt] === 'function'){
				e[cnt] = null;
			}
		}
	});
}

function walkTheDOM(node, func){
	func(node);
	node = node.firstChild
	while(node){
		walkTheDOM(node, func);
		node = node.nextSibling;
	}
}

function toUpper(element){
	if(element.value){
		element.value = element.value.toUpperCase();
		return;
	}
	return element.toUpperCase();
}
