// $Id: jsbase.js,v 1.0 2005/10/12 $

<!-- Start Hiding the Script


  
/*********** button stuff *****************/

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_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_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];}
}

function MM_openBrWindow(theURL,winName,features) { //v2.0
  window.open(theURL,winName,features);
}

/*********** checkboxing ************/
function checkAll(checked){
    for (var i = 0; i < document.forms[0].elements.length; ++i) {
        if (document.forms[0].elements[i].type=="checkbox" && document.forms[0].elements[i].id=="remote"){
            document.forms[0].elements[i].checked = checked;
        }
    }
}
/*********** checkboxing by regex ************/
function setCheckedByIdRegex(checked,regex){
    for (var i = 0; i < document.forms[0].elements.length; ++i) {
        if (document.forms[0].elements[i].type=="checkbox" >=0){
           	var elem=document.forms[0].elements[i];
           	if(elem.id.match(regex))            
        	   document.forms[0].elements[i].checked = checked;
        }
    }
}

/**** unobstrusive scripts registered by window.onload *******/ 
var genericId=1;
var genericIdPrefix="#genericID";
function getNewGenericId(){
	return genericIdPrefix + (++genericId);
}
/**		
 *  @author Stadlmann
 * fast remove method
 */
Array.prototype.remove = function(from, to) {
	  var rest = this.slice((to || from) + 1 || this.length);
	  this.length = from < 0 ? this.length + from : from;
	  return this.push.apply(this, rest);};
eventobj=new Array();
/**
 * @author Stadlmann
 * EventManager for multiple event registration. 
 * The manager registers itself to all gotten events and dispatches those to its handlers.
 * Whenever an event is used directly in HTML (e.g onclick attribute),
 * the event will be registered and dynamically called, but the scope of 
 * "this" will not be the eventSource object
 * 
 * Advantage: Multiple handlers can be registered per object and event without cross browser
 * 		      problems
 *  
 * Interface for a EventHandler, called by the manager:
 *       eventSource that has been clicked 
 *       eventArguments provided  
 *  
 * @param sourceObject Object that will be eventSource
 * @param eventName Name of event
 * @param eventHandler a function with interface (eventSource, eventArgs). 
 */
function addEventHandler(sourceObject, eventName,eventHandler){
	var isNewHandler=false;//new event of an object, assume we already have this event of the obj
	if(sourceObject==null||eventName==null||typeof eventHandler!='function') return false;
	if (eventobj[sourceObject.id]==null)eventobj[sourceObject.id]=new Array();//array of maps
	if(eventobj[sourceObject.id][eventName]==null){
		eventobj[sourceObject.id][eventName]=new Array();	
		isNewHandler=true;
	}
	var registered=eval("sourceObject."+eventName);
	//register the original event, to avoid loss
	if(isNewHandler && typeof registered=='function') eventobj[sourceObject.id][eventName][eventobj[sourceObject.id][eventName].length]=registered;
	eventobj[sourceObject.id][eventName][eventobj[sourceObject.id][eventName].length]=eventHandler;
    if(isNewHandler){ // dispatcher event is not yet registered
    	//create event handler for event, which dispatches the event to all registered handlers
    	var gEvent=function(event){
    	    var toReturn=true;
		    if(this.id != null && eventobj[this.id]!=null && eventName != null){
		    	for(var i=0;i<eventobj[this.id][eventName].length;i++){
		    		try{
		    			toReturn=eventobj[this.id][eventName][i](this,event) && toReturn;
		    		}catch(e){toReturn=false;}
		    	}
		    	return (toReturn==true);
			}else 
				return false;
		}// function	
        eval("sourceObject."+eventName+"=gEvent"); //dynamically assign handler of anonymous function
	}//if newhandler
	
	
return true;
}


/**
 *  @author Stadlmann
 * Adds a function to be executed with the window onload event
 * this can be used instead of the <body onload="function()">,
 * and allows adding of multiple functions to the onload event.
 */
function addLoadEvent(funct) {
	var oldOnLoad= window.onload;
	if(typeof window.onload != 'function') {
		window.onload= funct;
	} else{
		window.onload= function() {
			oldOnLoad();
			funct();
		}
	}
}

/*
 * Adds the given function as onClick handler to the element.
 * an Eventmanager helps to dispatch the event to all registered handlers, to know the button clicked.
 * note: first eventhandler parameter is the eventSource, that has been clicked, 
 *       second the eventargs provided by js
 * @param element to add the handler to
 * @param funct handler to add
 * @return true when added
 */
function addOnClick(element,funct){
	if(element == null || funct==null) return false;
	return addEventHandler(element,"onclick",funct);
}

/**
* @author Stadlmann
* client side button click event handler, used to avoid double clicks
* @return
*/
function onButtonClickAvoidMultiSubmit(button){
 	var disabled=isDisabledButton(button);
	if(!disabled) disableButton(button,3000);
	 button.style.cursor="wait";							
	 return !disabled;
}

function isDisabledButton(button){
	return (button.style.cursor=="wait");
}

/**
 *  @author Stadlmann
 * disables a button for a given milliseconds period, by setting its style
 * When milliseconds is set to null or less than 1,
 * the button is not enabled again.   
 * if there is a onmouseout event defined, this is blocked when disabled
 * 
 * @param button the button to be disabled
 * @param milliseconds the time the button should be disabled
 */
 var disabledButtons=new Array();
function disableButton(button,milliseconds){
	if(button.onmouseout != null) {
		var oldMouseOut=button.onmouseout;
		button.onmouseout=function(){
			if(!isDisabledButton(button))oldMouseOut();//disable onmouseout event if button disabled 
	    }
	}
	 button.style.cursor="wait";
	 disabledButtons[button.id]=button;
	 if(milliseconds>0)setTimeout("enableButton(disabledButtons['"+button.id+"'])",milliseconds);
}
/**
 *  @author Stadlmann
 * enabled a disabled button and calls the onmouseout function if defined
 */
function enableButton(button){
	if(button !=null && button.style != null) button.style.cursor="";
	if(button.onmouseout != null) button.onmouseout();//do whatever the button does on mouseout usually
}

/**
 *  @author Stadlmann
 * avoid double click on buttons, by setting wait cursor and ignoring events.
 * registers a onclick handler to each input of type image, to control clicks  
 */
function registerImageButtonMultiClickHandlers(){
	 if (!document.getElementsByTagName || !document.getElementById)  return false;
	 inputElements=document.getElementsByTagName("input"); //select all inputs to handle double click avoid
	 for(var i=0;i< inputElements.length; i++){
		 if(inputElements[i].getAttribute("type")=="image"){
			   addOnClick(inputElements[i],onButtonClickAvoidMultiSubmit);	
	     }
	 }
  return true;
}
 /**
  *  @author Stadlmann
  * avoid double click on menu links, by setting wait cursor and ignoring events.
  * registers a onclick handler to each input of type a, to control clicks  
  */
 function registerHrefMultiClickHandlers(){ 
		
		 if(document.getElementsByTagName !=null || document.getElementById !=null){
			 inputElements=document.getElementsByTagName("a"); //select all inputs to handle double click avoid
		 	 for(var i=0;i< inputElements.length; i++){
		 		 if(inputElements[i].getAttribute("href").indexOf(".do")>0){ //an action link
		 			 if(inputElements[i].id==null||inputElements[i].id=="") inputElements[i].id=getNewGenericId();
		 			   addOnClick(inputElements[i],onButtonClickAvoidMultiSubmit);	
		 	     }
		 	 }
		 }
   return true;
 }
 
 
/*
 * Add function to avoid doubleClicks to window onLoad immediately
 */
 addLoadEvent(registerImageButtonMultiClickHandlers); 
 addLoadEvent(registerHrefMultiClickHandlers); 
// Stop Hiding script --->