                       
String.prototype.pad_left=function(filler,length){
    var v = this.toString();
    while(v.length<length) { v = filler+v; }
    return v;
}
 
                       
function str_repeat(str, repeat) {
  var output = '';
  for (var i = 0; i < repeat; i++) {
    output += str;
  }
  return output;
}


var MAX_DEPTH = 10;
function print_r(obj, indent, depth) {
  var ws = '    '; //four whitespaces
  var output = '';
  indent = (!indent) ? 0 : indent;
  depth = (!depth) ? 0 : depth;
  if (depth > MAX_DEPTH) {
    return str_repeat(ws, indent) + '*Maximum Depth Reached*\n';
  }
  if (typeof(obj) == 'object') {
    output += (indent == 0) ? typeof(obj) + '\n(\n' : '';
    indent++;
    var child = '';
    for (var key in obj) {
      try {
        child = obj[key];
      }
      catch (e) {
        child = '*Unable To Evaluate*';
      }
      output += str_repeat(ws, indent) + '['+key+'] => ';
      if (typeof(child) == 'object') {
        indent++;
        output += typeof(child) + '\n';
        output += str_repeat(ws, indent) + '(\n';
        output += print_r(child, indent, depth+1);
        output += str_repeat(ws, indent) + ')\n';
        indent--;
      }
      else {
        output += child + '\n';
      }
    }
    indent--;
    output += (indent == 0) ? ')\n' : '';
    return output;
  }
  else {
    return str_repeat(ws, indent) + obj + '\n';
  }
}


function disableSelection(element) {
    element.onselectstart = function() {
        return false;
    };
    element.unselectable = "on";
    element.style.MozUserSelect = "none";
    //element.style.cursor = "default";
}

function swapDisplay(obj){
    obj.style.display=obj.style.display=='none'?'inline':'none';
    return obj.style.display;
}

function swapDIVHide(obj){
    if(obj.style.display=='none')
    {
     obj.style.display = 'inline';
     obj.style.visibility='visible';
    } else
    {
      obj.style.display = 'none';
      obj.style.visibility='hidden';
    }
}

function fancyToggle(obj,effect) {
    if(obj.style.display=='none')
    {
        Effect.SlideDown(obj, { duration: 0.5 });
    } else
    {
        Effect.SlideUp(obj, { duration: 0.5 });     
    }
}

function openModalWindow(url, name, w,h, mode,close,elementid) {
    
    if(close==undefined) close = true;
    var elem = createBodyChild('div', name,'');
    switch(mode) {
        case 'div': {
            var indiv = document.createElement('div');
            indiv.setAttribute('id', name+'indiv' );       
           // indiv.style.width = '100%';
            indiv.style.height = (h-20)+'px';
            //indiv.style.border = '2px solid black';
            elem.appendChild(indiv);
            if(elementid) 
                indiv.innerHTML = $(elementid).innerHTML;
            else AJAXLoadInto(indiv.id,url,indiv.id,function(){},false);    
            break;}
        case 'iframe':
        default: {
            var inframe = document.createElement('iframe');
            inframe.src = url;
            inframe.style.width = '100%';
            inframe.style.height = (h-20)+'px';
            inframe.style.border = '0px';
            elem.appendChild(inframe);
            break;
        }
    }
    
    var adialog = new YAHOO.widget.Dialog(name, 
                                    { width : w+"px",
                                      height: h+"px",
                                      close: true,
                                    
                                      /*draggable: true,*/
                                      fixedcenter : close,
                                      visible : false, 
                                      modal : true,
                                      constraintoviewport : true/*,
                                      buttons : [ { text:"Submit", handler:handleSubmit, isDefault:true },
                                                  { text:"Cancel", handler:handleCancel } ] */   
                                     } );
    YAHOO.util.Dom.setStyle($(name), "overflow", "auto");

    adialog.render();
    adialog.show();
    adialog.center();
    return adialog;
}

function openWindow(url, name, windowFeatures, w, h, alignment)
{
        if (navigator.appVersion.indexOf('Chrome')>0) h=h+1; //Chrome includes the url bar in the height calculation
        
        if(alignment == "CENTER")
        {
         temp_wnd=window.open(url,name,windowFeatures+',height='+h+',width='+w+',top='+(screen.availHeight-h)/2+',left='+(screen.availWidth-w)/2);
        } else
        {
        temp_wnd=window.open(url,name,windowFeatures+',height='+h+',width='+w+',top='+0+',left='+0);
        if(alignment == "LEFT")
        {
                temp_wnd.moveTo(0,0);
                temp_wnd.resizeTo(w,screen.availHeight);
                top.moveTo(w,0);
                top.resizeTo(screen.availWidth-w,screen.availHeight);
        } else
        if(alignment == "RIGHT")
        {
                temp_wnd.moveTo(screen.availWidth-w,0);
                temp_wnd.resizeTo(w,screen.availHeight);
                top.moveTo(0,0);
                top.resizeTo(screen.availWidth-w,screen.availHeight);
        } else
        if(alignment == "TOP")
        {
                temp_wnd.moveTo(0,0);
                temp_wnd.resizeTo(screen.availWidth,h);
                top.moveTo(0,h);
                top.resizeTo(screen.availWidth,screen.availHeight-h);
        } else
        if(alignment == "BOTTOM")
        {
                temp_wnd.moveTo(0,screen.availHeight-h);
                temp_wnd.resizeTo(screen.availWidth,h);
                top.moveTo(0,0);
                top.resizeTo(screen.availWidth,screen.availHeight-h);
        }
        }
        temp_wnd.focus();
}

function getOptionIndex(value,options)
{
   for (var i = 0; i < options.length; i ++) {
      if (options[i].value == value) 
        return i;
    }
    return -1;
}

//UM stuff: can be moved to a dedicated file

function um_convert(from_um,from_val,to_um)
{
 var scales = new Array();
 scales["scale_weight"] = {"mg":0.000001,"cg":0.00001,"gr":0.001,"kg":1,"ql":100,"t":1000};
 scales["scale_length"] = {"mm":0.001,"cm":0.01,"m":1,"km":1000};
 scales["scale_volume"] = {"ml":0.001,"cl":0.01,"l":1,"hl":100};
 scales["scale_area"] = {"mm²":0.001,"cm²":0.01,"m²":1,"a":10,"ha":100,"km²":1000};
 
 for (var scalename in scales)
 {
 	scale = scales[scalename];
 	if(scale[from_um]!=null && scale[to_um]!=null)
 	{
 	//	var bn_from_val = new BigNumber(from_val);
 	//	var bn_scale_from = new BigNumber(scale[from_um]);
 	//	var bn_scale_to = new BigNumber(scale[to_um]);
 		
 		//bn_from_val.precision = 3;
 		num = (from_val*scale[from_um])/scale[to_um];
 		return(num.toFixed(4));
 		//return(bn_from_val.multiply(bn_scale_from).divide(bn_scale_to));
 	}
 }
 
 return "!ERROR";
}


//Measure control stuff

function convert(base_control_id)
{
 var old_um = document.getElementById(base_control_id+'_oldum').value;
 var new_um = document.getElementById(base_control_id+'_um').options[document.getElementById(base_control_id+'_um').selectedIndex].value;
 var old_val = document.getElementById(base_control_id+'_value').value;
 var new_value = um_convert(old_um,old_val,new_um);
 //alert('old:'+old_val+' '+old_um+' new:'+new_value+' '+new_um);
 document.getElementById(base_control_id+'_value').value = new_value;
 document.getElementById(base_control_id+'_oldum').value = new_um;
 rebuild_valstring(base_control_id);
}

function rebuild_valstring(base_control_id)
{
       document.getElementById(base_control_id).value=
       document.getElementById(base_control_id+'_value').value
        +' '+
 	   document.getElementById(base_control_id+'_um').options[document.getElementById(base_control_id+'_um').selectedIndex].value;     
}

function SelectAllList(CONTROL){
for(var i = 0;i < CONTROL.length;i++){
CONTROL.options[i].selected = true;
}
}

function DeselectAllList(CONTROL){
for(var i = 0;i < CONTROL.length;i++){
CONTROL.options[i].selected = false;
}
}

function isIE()
{
	var browser = navigator.appName;  
    return(browser == "Microsoft Internet Explorer");
}

function createRequestObject() {  
       var ro;  
       if(isIE()){  
           ro = new ActiveXObject("Microsoft.XMLHTTP");  
       }else{  
           ro = new XMLHttpRequest();  
       }  
       return ro;  
   }  

     
    
   function sndReq(module,action,args_string,handleFunc,script_path) 
   { 
   	   if(script_path==undefined) script_path='/index.php';
       
       var http = createRequestObject();  
       url = script_path+'?module='+module+'&action='+action+'&'+args_string;
       //alert(url);
   	   http.open('get', url );  
       http.setRequestHeader('X_REQUESTED_WITH','XMLHttpRequest');
   	   http.onreadystatechange = handleFunc;  
     
       http.send(null);  
       return http;
   }  
   function sndReqUrl(url,handleFunc) 
   { 
	   //alert(url);
       var http = createRequestObject();  
	   http.open('get', url ); 
	   http.setRequestHeader('X_REQUESTED_WITH','XMLHttpRequest');
       http.onreadystatechange = handleFunc;  
       http.send(null);  
       return http;
   }  
   function postReq(args,handleFunc,script_path) 
   { 
        if(script_path==undefined) script_path='/index.php';
        var http = createRequestObject();  
        http.open("POST",script_path,true);
        http.setRequestHeader('X_REQUESTED_WITH','XMLHttpRequest');
        http.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
        http.onreadystatechange = handleFunc;  
        http.send(args);  
        return http;
   }  
   
   function syncReq(module,action,args_string,script_path)
   {
   if(script_path==undefined) script_path='/index.php';        
	var http = createRequestObject();  
   	http.open('get', script_path+'?module='+module+'&action='+action+'&'+args_string,false);  
   	http.setRequestHeader('X_REQUESTED_WITH','XMLHttpRequest');
    http.send(null);  
    return http.responseText;
   }
   
   function syncReqUrl(url)
   {
    var http = createRequestObject();  
       http.open('get', url,false);  
       http.setRequestHeader('X_REQUESTED_WITH','XMLHttpRequest');
    http.send(null);  
    return http.responseText;
   }
   
   function postSyncReq(args, script_path)
   {
	if(script_path==undefined) script_path='/index.php';      
    var http = createRequestObject();  
   	http.open("POST",script_path,false);         
   	http.setRequestHeader('X_REQUESTED_WITH','XMLHttpRequest');
    http.setRequestHeader("Content-Type","application/x-www-form-urlencoded; charset=UTF-8");
    
    /*for(var i=0; i<args.length;i++) {
        args[i] = encodeURIComponent(args[i]);
    } */
    http.send(args);  
    return http.responseText;
   }
 
 
   
   function formHasField(form,fieldName)
   {
   	fobj = $(form);
   	for(var i = 0;i < fobj.elements.length;i++)
		if(fobj.elements[i].name==fieldName) return true;
    return false;
   }
   
   function getFormValues(fobj,returnAs)
    {
     
       var str = "";              
       var valueArr = {};
       var val = "";
       var cmd = "";

       var name,value;  
       for(var i = 0;i < fobj.elements.length;i++)
       {
           
           if(!(fobj.elements[i].disabled) && (name = fobj.elements[i].name) && name!='') {
               switch(fobj.elements[i].type)
               {
                   case "textarea": {
                       if(window.CKEDITOR)
                            if(CKEDITOR.instances[fobj.elements[i].id])       
                                fobj.elements[i].value = CKEDITOR.instances[fobj.elements[i].id].getData();
                   }
                      case "password":
                   case "text":
                   case "hidden":
                   case "button":
                   case "submit":
                        str += name +
                        "=" + encodeURIComponent( value = fobj.elements[i].value ) + "&";
                        valueArr[ name ] = value;
                        break;

                   case "select-one":
                        if(fobj.elements[i].selectedIndex!=-1)
                        {
                            str += name +
                            "=" + ( value = fobj.elements[i].options[fobj.elements[i].selectedIndex].value )+ "&";
                            valueArr[ name ] = value;    
                        }
                        break;
                   case "select-multiple":
                        var selected = [];
                        for (var j = 0; j <fobj.elements[i].options.length; j++) 
                            if (fobj.elements[i].options[ j ].selected) 
                                selected.push(fobj.elements[i].options[ j ].value)
                        str += name +
                        "=" + selected.join(';') + "&";    
                        valueArr[ name ] = selected;             
                        break;
                   case "checkbox":
                        str += name +     
                        "=" + encodeURIComponent( value = fobj.elements[i].checked?'1':'0') + "&"; 
                        valueArr[ name ] = value; 
                        break;   
                         
                   case "radio":
                        if(fobj.elements[i].checked)
                        str += name +     
                        "=" + encodeURIComponent( value = fobj.elements[i].value ) + "&"; 
                        valueArr[ name ] = value;  
                        break; 
                    case '': break; //IE hack see In IE, the formElement.elements property is a circular reference back to the form itself, instead of an array of objects (like the W3C standard calls for)    
                    default:
                        alert(i+') common.js getFormValues found an unknown input type:' + name);
                        //YAHOO.log( YAHOO.lang.dump( fobj.elements[i] ) );
                    break;      
               }
           } else if(fobj.elements[i].rawFileName) {
                
           }

       }

       str = str.substr(0,(str.length - 1));

       switch(returnAs) {
            case 'hash': {return valueArr; break; }
            default:
                return str;
                break;
       }

    }
    
    
    function uploadFormRawFiles(fobj)
    {
     
       var str = "";              
       var valueArr = [];
       var val = "";
       var cmd = "";
       var observeArr = [];
       
       var name,value,fname,rawid;  
       for(var i = 0;i < fobj.elements.length;i++)
       {
           
           if(rawid = fobj.elements[i].rawFileName) {    
               if( fname = $(rawid+'progressReport').selectedFileName && !$(rawid+'progressReport').DontUploadWithForm ) {
                   document[rawid].upload(); 
                   var status_id = rawid+'status';
                   $(status_id).value = 'RUNNING';   //the upload method takes some msecs to kick in and set it, so we set it here too
                   observeArr.push(status_id);
                   
               }
           }

       }
                    
       return observeArr;
    }
     

   
   function attachWaitOverlay(obj,classname)
   {
         // classname = 'MIS_footer';
           dimensions = Element.getDimensions(obj);
        // alert('w:'+dimensions.width+' h:'+dimensions.height);        
        var ovdiv = document.createElement('div');
            ovdiv.className = classname==undefined?'overlay':classname;
            ovdiv.style.width = dimensions.width+'px';
            ovdiv.style.height = dimensions.height+'px';
        
        obj.appendChild(ovdiv);
        position = Position.cumulativeOffset(obj);
        //alert('x:'+position[0]+' h:'+position[1]);        
        ovdiv.style.left = position[0]+'px';;
        ovdiv.style.top = position[1]+'px';;    
        obj.attachedOverlay = ovdiv;
   }
   
   function detachWaitOverlay(obj)
   {
      obj.removeChild(obj.attachedOverlay);
   }
   
   function addRollover(obj)
   {
    var osrc = obj.src;
    var dot = osrc.lastIndexOf('.');
    var filename = osrc.substr(0,dot);
    var extension = osrc.substr(dot,osrc.length-dot);
   	$(obj).onmouseover = function(){this.src=filename+'_over'+extension;};
    $(obj).onmouseout = function(){this.src=osrc;};
    $(obj).onmouseover();
   }
   
   function addCSSRollover(obj,RollOverClass,event)
   {
    if($(obj).hasCSSRollover || $(obj).noCssRollover) return;
    $(obj).old_className = obj.className;
    $(obj).rollOver_className = RollOverClass;
    $(obj).className = RollOverClass; 
    
    $(obj).onmouseover_old = $(obj).onmouseover;
    $(obj).onmouseout_old = $(obj).onmouseout;
    $(obj).hasCSSRollover = true;
    $(obj).onmouseover = function(event){if(!this.noCssRollover) this.className = this.rollOver_className; $(obj).onmouseover_old(event);};
    $(obj).onmouseout = function(event){  
        if(!this.noCssRollover) 
            { this.className = this.old_className; }
        if($(obj).onmouseout_old)
            { $(obj).onmouseout_old(event);}
        };
   }
   function SaveRowClass(row)
   {
         if($(row)) { 
        if(!$(row).className_old)
            $(row).className_old = $(row).className;
         }
   }
   function RestoreRow(row)
   {
        if($(row)) {
            if($(row).className!='hiddenclass')
                $(row).className = $(row).className_old; 
             $(row).noCssRollover = false; 
        }   
   }
   function HighlightRow(row)
   {
         if($(row)) { 
            $(row).className = 'lister_selected_row';
            $(row).noCssRollover = true;
        }
   }
   
   //fform specific: ou can pass the control id or instance, or a form name + control name
   	function preparecontrol(control,formname,controlname)
   	{                                                                                     
        var controlArr = [$(control)];
        
        //if(!control) control = document[formname][controlname];      
        //if(control instanceof Array) controlArr = control;    //to treat radio buttons right
        //else controlArr.push(control);
                                   
   	 for(var i=0;i<controlArr.length;i++) {
         
         switch(controlArr[i].type)
   	     {
            case "radio":
   	 	    case "checkbox":
   	 				    controlArr[i].checked_old = controlArr[i].checked;
   	 				    break;
   	 	    case "select-one":
                        controlArr[i].selectedValue_old = getListboxSelectedValue(controlArr[i]);
                        break;  
            case "select-multiple":
                        controlArr[i].selectedValues_old = getMultiboxSelectedValues(controlArr[i]);    
   	 				    break;
   	 	    case "textarea":
   	 				    controlArr[i].height_old = controlArr[i].style.height;
   	 	    default:		
                        controlArr[i].value_old = controlArr[i].value;
	 				    break;
   	     }
   	     controlArr[i].orig_css_className = controlArr[i].className==undefined?"":controlArr[i].className;
   	     if(controlArr[i].onprepare!=undefined)
   	     controlArr[i].onprepare();
     }
   	}
   //---------------------------------------------------------------------------------------------
    function ismodified(control)
   	{
   	 switch($(control).type)
   	 {
        case "radio":
   	 	case "checkbox":
   	 				YAHOO.log($(control).checked+' CB '+$(control).checked_old);    
                    return($(control).checked != $(control).checked_old);
   	 				break;
   	 	case "select-one":
                        return(getListboxSelectedValue(control) != $(control).selectedValue_old);
                        break;
        case "select-multiple":
   	 				return(getMultiboxSelectedValues(control) != $(control).selectedValues_old);
   	 				break;
   	 	default:
                    YAHOO.log($(control).value+' DEF '+$(control).value_old);
                    return($(control).value != $(control).value_old);
					break;
   	 }	
   	}
   //---------------------------------------------------------------------------------------------	
   	function updatecontrol(control)
   	{
   	 $(control).onchange();
   	}
   	//---------------------------------------------------------------------------------------------
	function revert(control)
	{
   	 switch($(control).type)
   	 {
        case "radio":
   	 	case "checkbox":
   	 		    $(control).checked = $(control).checked_old;
   	 			break;   	 	
   	 	case "select-one":
   	 			$(control).selectedIndex = getListboxValueIndex(control,$(control).selectedValue_old);
   	 			break;
        case "select-multiple":
                var arr = $(control).selectedValues_old.split(';');
                for (var i = 0; i < $(control).options.length; i++) 
                    $(control).options[ i ].selected = (arr.indexOf( $(control).options[ i ].value ) != -1);
                break;
   	 	default:
   	 		    $(control).value = $(control).value_old;
				break;
   	 }
   	 updatecontrol(control);
   	 if($(control).onrevert!=undefined)
   	 $(control).onrevert();
   	}
    //----------------------------------------
    function disablecontrol(control)
    {
        if(!$(control)) return;
        $(control).disabled = true;
        $(control).className = $(control).orig_css_className + ' control_disabled';
        if($('CB_'+$(control).id)) disablecontrol(  $('CB_'+$(control).id) );
        /*switch($(control).type)
        {
            case "checkbox":
                    $(control).checked = $(control).checked_old;
                    break;            
            case "select-one":
                    $(control).selectedIndex = getListboxValueIndex(control,$(control).selectedValue_old);
                    break;
            default:
                    $(control).value = $(control).value_old;
                break;
        }  */
    }
    function enablecontrol(control)
    {
        if(!$(control)) return;
        $(control).disabled = false;
        $(control).className = $(control).orig_css_className;
        if($('CB_'+$(control).id)) enablecontrol(  $('CB_'+$(control).id) );      
        /*switch($(control).type)
        {
            case "checkbox":
                    $(control).checked = $(control).checked_old;
                    break;            
            case "select-one":
                    $(control).selectedIndex = getListboxValueIndex(control,$(control).selectedValue_old);
                    break;
            default:
                    $(control).value = $(control).value_old;
                break;
        }  */
    }   
    
    //---------------------------------------------------------------------------------------------       
    function activatecontrol(control)
    {
        //ie has a bug with listbox so we disable it 
        if(!(isIE() && $(control).type=='select-one')) 
            $(control).className = $(control).orig_css_className + ' control_active'; 
                   
    }
    //---------------------------------------------------------------------------------------------       
    function blurcontrol(control)
    {
        var modified = ismodified(control);
        if(modified)    {
           $(control).className = $(control).orig_css_className + ' modifiedControl';    
        }    else {
           $(control).className = $(control).orig_css_className;
        }            
    }
	//---------------------------------------------------------------------------------------------
	function base_oncontrolchange(control)
	{
		var modified = ismodified(control);
        if(modified)	{
			$(control).className = $(control).orig_css_className + ' modifiedControl';	
		}	else {
			$(control).className = $(control).orig_css_className;
		}
        setParentModifiedStatus(control,modified);
	}
	
     function selectAll(selectBox,selectAll) {
            // have we been passed an ID
            if (typeof selectBox == "string") {
                selectBox = document.getElementById(selectBox);
            }

            // is the select box a multiple select box?
            if (selectBox.type == "select-multiple") {
                for (var i = 0; i < selectBox.options.length; i++) {
                    selectBox.options[i].selected = selectAll;
                }
            }
        }
	//----------
   function scrollToElement(element) { 
      
      Effect.ScrollTo(element, { duration:'1', offset:-100 }); // works in v1.8.2   
      return;
       
      /*element = $(element); 
      var sh = document.viewport.getScrollOffsets();
      var eh = element.cumulativeOffset(); 
      
      var view_scroll = sh[1];
      var view_height = document.viewport.getHeight();  
      var element_y = eh[1];
      var element_height = element.getHeight();
      
      var target_scroll = element_y + element_height/2 - view_height/2;
      //if(target_scroll>body_height)... find a reliable way of figuring out body height
      
      //alert(target_scroll); return; 
      
        
       var delta = target_scroll-view_scroll; 
       
        
       return; 
       var pixels_per_sec = 500;
       var max_secs = 2;
       var frames_per_sec = 160;
       var accel = 3;
       
       var secs = Math.abs(delta)/pixels_per_sec;
       if(secs > max_secs) secs = max_secs;
       var frames = Math.ceil(secs*frames_per_sec);
       var i = 1; 
       
       new PeriodicalExecuter(function(pe) { 
          //step = Math.pow(((1 / frames) * i), accel) * delta;
          pos = delta-(Math.pow(((1 / frames) * (frames-i)), accel) * delta);
          ssh = document.viewport.getScrollOffsets(); 
          old_scroll = ssh[1];
          window.scrollTo(0, view_scroll+pos);
          ssh = document.viewport.getScrollOffsets(); 
          if ( (i++==frames) || ssh[1]==old_scroll) { 
            window.scrollTo(0, target_scroll); 
            pe.stop();
            
          } 
       }, secs/frames_per_sec);      */
              
   } 
 
	function clearInnerHTML(target)
	{
		var x = $(target);
		if(x)
            while(x.firstChild)
                x.removeChild(x.firstChild);
	}
	
	function AJAXLoadInto(target,url,containerName,callbackfunction,scrollAfter)
	{
		if(scrollAfter==undefined) scrollAfter = true;
        window[containerName] = new Object();

		window[containerName].handle = function() {
			ro = window[containerName].ro;
			if(ro.readyState == 4) { 
				var d=document.createElement("div");
				var text = ro.responseText;
				var x = $(target);
				d.innerHTML = text.stripScripts(); 
				clearInnerHTML(x);
				x.appendChild(d); 
				//if(isIE())	FF bug in js execution order
				text.evalScripts();
                if(callbackfunction!=undefined) callbackfunction(d.innerHTML); 
                
                if(scrollAfter) 
                    scrollToElement(target);
			}
		}  
		
		attachWaitOverlay($(target));
		window[containerName].ro = 0;
		window[containerName].ro = sndReqUrl(url,window[containerName].handle);  		
	}
	     
function getMultiboxSelected(id)
{         
    var selected=[];
    for (var i = 0; i < $(id).options.length; i++) 
        if ($(id).options[ i ].selected) 
            selected.push($(id).options[i]);
    return selected;
}
     
function getMultiboxSelectedValues(id)
{
    var s = [];
    var arr = getMultiboxSelected(id); 
    arr.each(function(item) {
        s.push(item.value);
    });
    return s.join(';');
}

function getMultiboxSelectedFilters(id)
{
    var s = [];
    var arr = getMultiboxSelected(id); 
    arr.each(function(item) {
        s.push(item.filter);
    });
    return s;
}
            
function getListboxSelected(id)
{
    if($(id).selectedIndex!=undefined)
    if($(id).selectedIndex!=-1)
        return $(id).options[$(id).selectedIndex];
    return undefined;
}

function getListboxSelectedValue(id)
{
	var obj = getListboxSelected(id); 
    if(obj!=undefined)  return obj.value;
    return undefined;
}

function getListboxValueIndex(id, value)
{
    for (var i=0; i< $(id).options.length; i++)
        if($(id).options[i].value == value) return i;
    return -1;
}

function ListboxClear(lb){
  if(lb.options==undefined) return undefined;
  for (var i=lb.options.length-1; i>=0; i--){
    lb.options[i] = null;
  }
  lb.selectedIndex = -1;
}

function ListboxAddItem(object, oParams)
{
    var opt = document.createElement('OPTION');
    object.options.add(opt);
    opt.text = oParams.caption;
    opt.value = oParams.value;
    opt.selected = oParams.selected;
    if(oParams.className) opt.className = oParams.className;
    if(oParams.disabled) opt.disabled = oParams.disabled;
    opt.filter = oParams.filter==undefined?"":oParams.filter; //custom
}
 
function filterListbox(object,filter,firstFill,NullOpenFilter,filterBy,caseInSensitive)
{
    
   //YAHOO.log('filter: '+filter);
   if(!object) return undefined;
   if(object.valuelist==undefined) return undefined;
   if(filter==undefined) filter='';
   if(object.type=='select-one')
        var old_value = getListboxSelectedValue(object);
   else var old_values = getMultiboxSelectedValues(object);
     YAHOO.log(object.name+YAHOO.lang.dump(old_values));
   var value_to_be_filtered;
   ListboxClear(object);         
   for (var i = 0; i < object.valuelist.length; i ++) {
    if(filterBy=='value') value_to_be_filtered = object.valuelist[i].value;
    if(filterBy=='caption') value_to_be_filtered = object.valuelist[i].caption;
    if(filterBy=='filter') value_to_be_filtered = object.valuelist[i].filter;
    if(caseInSensitive) {         
        if(is_array(filter)) filter.each(function(s,index) {
            filter[index] = filter[index].toUpperCase();       
        });
        else filter = filter.toUpperCase();  
        value_to_be_filtered = value_to_be_filtered.toUpperCase();  
    }
    
    if( firstFill || 
        value_to_be_filtered==undefined || 
        value_to_be_filtered=='' || 
        (!is_array(filter) && value_to_be_filtered.indexOf(filter)>=0) ||     //this may require a cycle to check if value_to_be_filtered contains any of the elements of filter, if filter is an array.
        (NullOpenFilter && filter=='') ||
        (is_array(filter) && filter.indexOf(value_to_be_filtered)>=0)
        )
        ListboxAddItem(object, object.valuelist[i] );
   }
   if(object.type=='select-one') {
       if(old_value!=undefined) { object.selectedIndex = getListboxValueIndex(object,old_value);}    
   }    else if(old_values!='') {
            for (var i = 0; i < object.options.length; i++) 
                object.options[ i ].selected = old_values.indexOf( object.options[ i ].value )>=0;
   }
}

//hack for IE not refreshing correctly the contents - unused
function refreshWindow()
{
   	if(isIE())
   	{
		obj = document.body;
   		var oldclass = obj.className;	
		obj.className = oldclass;
   	}
}

function is_array(input){
    return typeof(input)=='object'&&(input instanceof Array);
  }



function number_format(number, decimals, dec_point, thousands_sep) {
	var a = number;
	var b = decimals;
	var c = dec_point;
	var d = thousands_sep;
    if(c==undefined) c=',';
	if(d==undefined) c='.';
    // number_format(number, decimals, comma, formatSeparator)
	a = Math.round(a * Math.pow(10, b)) / Math.pow(10, b);
	e = a + '';
	f = e.split('.');
	if(!f[0]) f[0] = '0';
	if(!f[1]) f[1] = '';
	if(f[1].length < b){
		g = f[1];
		for(i = f[1].length + 1; i <= b; i++) {
			g += '0';
		}
		f[1] = g;
	}
	if(d != '' && f[0].length > 3) {
		h = f[0];
		f[0] = '';
		for(j = 3; j < h.length; j += 3) {
			i = h.slice(h.length - j, h.length - j + 3);
			f[0] = d + i +  f[0] + '';
		}
		j = h.substr(0, (h.length % 3 == 0) ? 3 : (h.length % 3));
		f[0] = j + f[0];
	}
	c = (b <= 0) ? '': c;
	return f[0] + c + f[1];
}


//assigns the boolean status to the first parent item which has a setModifiedStatus() function defined
function setParentModifiedStatus(obj,status)
{
 var found = false;
 cursor = obj;
 while(cursor.parentNode && !found)
    if(cursor.parentNode.setModifiedStatus)
        {
            cursor.parentNode.setModifiedStatus(status,obj);
            found = true;
        } else { cursor = cursor.parentNode; }
 return found;
}

function callNearestOuterFunction(obj,functionName)
{
 var found = false;
 var params = new Array();
 var strparams = new Array();
 cursor = obj;
 while(cursor && !found)
    if(typeof cursor[functionName] == 'function')
        {
           for (var i = 2; i < callNearestOuterFunction.arguments.length; i++){
               strparams.push('params['+(i-2)+']');
               params.push(callNearestOuterFunction.arguments[i]);
           } 
           
           var command = 'cursor[functionName]('+strparams.join(',')+');';
           eval(command);
           found = true;
        } else { cursor = cursor.parentNode; }
 return found;
}


//calls hide() on every element which have a css class
function switchAll(cssClass)
{
    var Collection = document.getElementsByClassName(cssClass);
        for (var i=0; i<Collection.length; i++) {
                Collection[i].toggle();
        }
}

		
function doTooltip(e, msg) {
  if ( typeof Tooltip == "undefined" || !Tooltip.ready || msg=="") return;
  Tooltip.show(e, "<div class=tp1>"+msg+"</div>");
}

function divdoTooltip(e, msg, classname) {    
  if ( typeof Tooltip == "undefined" || !Tooltip.ready || msg=="") return;     
  Tooltip.show(e, "<div class="+classname+">"+msg+"</div>");
}

function hideTip() {
  if ( typeof Tooltip == "undefined" || !Tooltip.ready ) return;
  Tooltip.hide();
}

function distance(x,y,x1,y1)
{
    return Math.sqrt( Math.pow(x-x1,2) + Math.pow(y-y1,2));
}

function urldecode( str ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: urldecode('Kevin+van+Zonneveld%21');
    // *     returns 1: 'Kevin van Zonneveld!'
    
    var ret = str;
       
    ret = ret.replace(/\+/g, '%20');
    ret = decodeURIComponent(ret);
    ret = ret.toString();
 
    return ret;
}

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}

function createBodyChild(lsTag, id, innerHTML){
        var elem = $(id); 
        if(!elem) elem = document.createElement(lsTag);
        elem.setAttribute('id', id);
        elem.innerHTML = innerHTML;
        document.body.appendChild(elem);
        return elem;
}

function rawurldecode( str ) {
    // Decodes URL-encodes string  
    // 
    // version: 904.317
    // discuss at: http://phpjs.org/functions/rawurldecode
    // +   original by: Brett Zamir (http://brettz9.blogspot.com)
    // +      input by: travc
    // +      input by: Brett Zamir (http://brettz9.blogspot.com)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: rawurldecode('Kevin+van+Zonneveld%21');
    // *     returns 1: 'Kevin+van+Zonneveld!'
    // *     example 2: rawurldecode('http%3A%2F%2Fkevin.vanzonneveld.net%2F');
    // *     returns 2: 'http://kevin.vanzonneveld.net/'
    // *     example 3: rawurldecode('http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a');
    // *     returns 3: 'http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a'
    // *     example 4: rawurldecode('-22%97bc%2Fbc');
    // *     returns 4: '-22—bc/bc'
    var histogram = {};
    var ret = str.toString(); 

    var replacer = function(search, replace, str) {
        var tmp_arr = [];
        tmp_arr = str.split(search);
        return tmp_arr.join(replace);
    };

    // The histogram is identical to the one in urlencode.
    histogram["'"]   = '%27';
    histogram['(']   = '%28';
    histogram[')']   = '%29';
    histogram['*']   = '%2A';
    histogram['~']   = '%7E';
    histogram['!']   = '%21';

    for (replace in histogram) {
        search = histogram[replace]; // Switch order when decoding
        ret = replacer(search, replace, ret) // Custom replace. No regexing
    }

    // End with decodeURIComponent, which most resembles PHP's encoding functions
    ret = ret.replace(/%([a-fA-F][0-9a-fA-F])/g, function (all, hex) {return String.fromCharCode('0x'+hex);}); // These Latin-B have the same values in Unicode, so we can convert them like this
    ret = decodeURIComponent(ret);

    return ret;
}



if(!isIE)
{
    HTMLElement.prototype.__defineSetter__("outerHTML", function (sHTML) {
       var r = this.ownerDocument.createRange();
       r.setStartBefore(this);
       var df = r.createContextualFragment(sHTML);
       this.parentNode.replaceChild(df, this);
       return sHTML;
    });
}


function shouldCancelbackspace(e) {  
     var key;  
     var readOnly = false;
     
     if(e){  
         key = e.which? e.which : e.keyCode;  
         if(key == null || ( key != 8 && key != 13)){ // return when the key is not backspace key.  
            return false;  
         }  
     }else{  
        return false;  
     }  
   
     if (e.srcElement) { // in IE  
         tag = e.srcElement.tagName.toUpperCase();  
         type = e.srcElement.type;  
         readOnly =e.srcElement.readOnly;  
         if( type == null){ // Type is null means the mouse focus on a non-form field. disable backspace button  
         return true;  
         }else{  
         type = e.srcElement.type.toUpperCase();  
     }  
   
     } else { // in FF  
         tag = e.target.nodeName.toUpperCase();  
         type = (e.target.type) ? e.target.type.toUpperCase() : "";  
     }  
     // we don't want to cancel the keypress (ever) if we are in an input/text area  
     if ( tag == 'INPUT' || type == 'TEXT' ||type == 'TEXTAREA')  
     {  
         if(readOnly == true ) // if the field has been dsabled, disable the back space button  
            return true;  
            
         if( ((tag == 'INPUT' && type == 'RADIO') || (tag == 'INPUT' && type == 'CHECKBOX'))  
         && (key == 8 || key == 13) ){  
         return true; // the mouse is on the radio button/checkbox, disable the backspace button  
     }  
         return false;  
     }  
       
     // if we are not in one of the above things, then we want to cancel (true) if backspace  
     return (key == 8 || key == 13);  
 }
 
 
 
 
 //form validation functions
 
function Val_Null(val, validationValue) {
    return !(Val_NotNull(val,validationValue));
}
function Val_NotNull(val,validationValue) 
{
    return (val != null) && (val != '');
}

function Val_Regex(val,validationValue) 
{
    var match = false;
    var cmd = 'match = val.match('+validationValue+');';
    YAHOO.log(cmd);
    eval(cmd);
    return match;
}

function findPos(obj) {
    //find coordinates of a DIV
    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};
}

function Ylog(v) {
    YAHOO.log( YAHOO.lang.dump(v) );
}


