function findPosition(obj) {
	var objleft = objtop = 0;
	if (obj.offsetParent) {
		objleft = obj.offsetLeft;
		objtop = obj.offsetTop;
		while (obj = obj.offsetParent) {
			objleft += obj.offsetLeft;
			objtop += obj.offsetTop;
		}
	}
	return {"left":objleft,"top":objtop};
}

function createFlash(id,url,width,height,bgcolor,align) {
	var d = document.getElementById(id);
	if (d) {
		d.innerHTML = 
			'<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" width="'+width+'" height="'+height+'" align="middle">'+
			'<param name="allowScriptAccess" value="always" />'+
			'<param name="allowFullScreen" value="true" />'+
			'<param name="movie" value="'+url+'" />'+
			'<param name="menu" value="false" />'+
			'<param name="quality" value="high" />'+
			'<param name="wmode" value="transparent" />'+
			'<param name="bgcolor" value="'+bgcolor+'" />'+
			'<embed src="'+url+'" menu="false" quality="high" bgcolor="'+bgcolor+'" width="'+width+'" height="'+height+'" align="middle" allowScriptAccess="always" allowFullScreen="true" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />'+
			'</object>';
			/*
		    '<object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,0,0" width="'+width+'" height="'+height+'" align="'+align+'">'+
			'<param name="allowScriptAccess" value="sameDomain" />'+
			'<param name="allowFullScreen" value="true" />'+
			'<param name="movie" value="'+url+'" />'+
			'<param name="menu" value="false" />'+
			'<param name="quality" value="high" />'+
			'<param name="bgcolor" value="'+bgcolor+'" />'+
			'<embed src="'+url+'" wmode="transparent" menu="false" quality="high" bgcolor="'+bgcolor+'" width="'+width+'" height="'+height+'" align="'+align+'" allowScriptAccess="sameDomain" allowFullScreen="true" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />'+
			'</object>';
			*/
	}
}

function setCookie (name, value) {
	var argv = setCookie.arguments;
	var argc = setCookie.arguments.length;
	var expires = (argc > 2) ? argv[2] : null;
	var path = "/";
	var domain = (argc > 4) ? argv[4] : null;
	var secure = (argc > 5) ? argv[5] : false;
	document.cookie = name + "=" + escape (value) + 
		((expires == null) ? "" : ("; expires=" + expires.toGMTString())) + 
		((path == null) ? "" : ("; path=" + path)) +  
		((domain == null) ? "" : ("; domain=" + domain)) +    
		((secure == true) ? "; secure" : "");
}

function getCookieValue (offset) {
	var endstr = document.cookie.indexOf (";", offset);
	if (endstr==-1) {
		endstr = document.cookie.length;
	}
	return unescape(document.cookie.substring(offset, endstr));
}

function getCookie (name) {  
	var arg = name + "=";
	var i = 0;
	while (i < document.cookie.length) {
		var j = i + arg.length;
		if (document.cookie.substring(i,j)==arg) {
			return getCookieValue(j);
		}
		i = document.cookie.indexOf(" ",i)+1;
		if (i==0) break;   
	}
	return null;
}

/*
var browserDetected = getBrowser();

function getBrowser() {
	if (document.layers) return "NS";
	if (document.all) {
		// But is it really IE?
		// convert all characters to lowercase to simplify testing
		var agt=navigator.userAgent.toLowerCase();
		var is_opera = (agt.indexOf("opera") != -1);
		var is_konq = (agt.indexOf("konqueror") != -1);
		if(is_opera) {
			return "OPR";
		}
		else {
			if(is_konq) {
				return "KONQ";
			}
			else {
				// Really is IE
				return "IE";
			}
		}
	}
	if (document.getElementById) return "MOZ";
	return "OTHER";
}
*/

function showLayer(id,visibility) {
	var e = document.getElementById(id);
/*
	switch( browserDetected ) {
		case 'NS':
			e.visibility = (visibility?'show':'hidden');
			break;
		
		case 'KONQ':  
		case 'IE':
			e.style.display = (visibility?'':'none');
			break;
		
		case 'MOZ':  
		case 'OPR':  
			e.style.visibility = (visibility?'':'hidden');
			break;
	}
*/
	if (e && e.style) {
		e.style.display = (visibility?'block':'none');
	}
}

/*
* Bean helpers
*/
function createHiddenElement(formId,name,value) {
	if (value && value.isArray()) {
	    var cnt = 0;
		for (var idx=0;idx<value.length;idx++) {
			if (value[idx]) {
				createHiddenElement(formId,name+"["+cnt+"]",value[idx]);
				cnt++;
			}
		}
	}
	else if (typeof value=="object") {
		for (attr in value) {
	    	var nm = name+"."+attr;
	    	var vl = value[attr];
			if (typeof vl=="object" || typeof vl=="boolean" || 
				typeof vl=="number" || typeof vl=="string") {
				createHiddenElement(formId,nm,vl);
			}
		}
	}
	else {
	    var form = document.forms[formId];
		var e = document.createElement("input");
		e.type = "hidden";
		e.name = name;
		e.value = value;
		form.appendChild(e);
	}
}

function createHiddenElementsFromListbox(formId,lname,prefix,objects) {
    var form = document.forms[formId];
    var lbx = form.elements[lname];
    var cnt = 0;
    for (var i=0; i<lbx.options.length; i++) {
//		createHiddenElement(formId,prefix,objects[lbx.options.item(i).value]);
		var o = objects[lbx.options.item(i).value];
		if (o) {
			for (attr in o) {
		    	var nm = prefix+"["+cnt+"]."+attr;
		    	var vl = o[attr];
				if (typeof vl=="object" || typeof vl=="boolean" || 
					typeof vl=="number" || typeof vl=="string") {
					createHiddenElement(formId,nm,vl);
				}
			}
			cnt++;
		}
    }
}

function createHiddenElementsFromCheckbox(formId,ename,prefix,objects) {
    var form = document.forms[formId];
    var cnt = 0;
    for (var i=0; i<form.elements.length; i++) {
	    var e = form.elements[i];
	    if (e.name==ename && e.checked) {
//			createHiddenElement(formId,prefix,objects[e.value]);
			var o = objects[e.value];
			if (o) {
				for (attr in o) {
		    		var nm = prefix+"["+cnt+"]."+attr;
			    	var vl = o[attr];
					if (typeof vl=="object" || typeof vl=="boolean" || 
						typeof vl=="number" || typeof vl=="string") {
						createHiddenElement(formId,nm,vl);
					}
				}
				cnt++;
			}
    	}
    }
}

function createHiddenElementsFromText(formId,tname,delimiter,prefix,name) {
    var form = document.forms[formId];
    var textFrom = form.elements[tname].value.trim();
    if (textFrom.length>0) {
		var values = textFrom.split(delimiter);
	    for (var i=0; i<values.length; i++) {
	    	var nm = prefix+"["+i+"]";
	    	if (name!=null && name!=undefined) {
	    		nm += "."+name;
	    	}
	    	var vl = values[i];
			if (typeof vl=="object" || typeof vl=="boolean" || 
				typeof vl=="number" || typeof vl=="string") {
				createHiddenElement(formId,nm,vl);
			}
	    }
	}
}


/**
 * Listbox functions
 */

function moveItem(formId,lbx,up,objects) {
    var form = document.forms[formId];
    var list = form.elements[lbx];

	var selItem  = new Object();
	var prevItem = new Object();
	var nextItem = new Object();
	var tmp;
	
	for(var i = 0;i < list.length; i++){


		if (list.options[i].selected == true && ((i > 0 && up) || (list.length-1 > i && !up))) {

			selItem = list.options[i];
			if (i > 0) {
				prevItem = list.options[i-1];
			}
			
			if (list.length-1 > i) {
				nextItem = list.options[i+1];
			}
			
			if (up) {
				tmp = new Array(prevItem.text, prevItem.value, prevItem.id);
				prevItem.text = selItem.text;
				prevItem.value = selItem.value;
				prevItem.id = selItem.id;
			}
			else {
				tmp = new Array(nextItem.text, nextItem.value, nextItem.id);
				nextItem.text = selItem.text;
				nextItem.value = selItem.value;
				nextItem.id = selItem.id;
			}
			
			selItem.text = tmp[0];
			selItem.value = tmp[1];
			selItem.id = tmp[2];
			
			if (up) {
				prevItem.selected = true;
				selItem.selected = false;
			}
			else {
				nextItem.selected = true;
				selItem.selected = false;
				i++;
			}
			
		}
	}
}

function moveOptions(formId,from,to) {
	var options = getSelected(formId,from);
	for (var i=0; i<options.length; i++) {
		mvOptionByName(formId,from,to,options.item(i).innerHTML);
	}
}

function moveOption(formId,lbx1,lbx2,all,selected) {
    var arr = new Array();
    var form = document.forms[formId];
    var lbxFrom = form.elements[lbx1];
    var lbxTo = form.elements[lbx2];
    var i = lbxFrom.selectedIndex;
    if (i<0 && !all) return;
    for (var i=0; i<lbxFrom.options.length; i++) {
        if (lbxFrom.options.item(i).selected || all) {
            var opt = document.createElement("OPTION");
            lbxTo.appendChild(opt);
            opt.value=lbxFrom.options.item(i).value;
            opt.innerHTML=lbxFrom.options.item(i).innerHTML;
            opt.id=lbxFrom.options.item(i).id;
            arr[arr.length]=opt.id;
            lbxFrom.remove(i);
            i--;
            opt.selected=selected;
        }
    }
    return arr;
}

function mvOptionByName(formId,lbx1,lbx2,txt) {
    var form = document.forms[formId];
    var lbxFrom = form.elements[lbx1];
    var lbxTo = form.elements[lbx2];
    var i = lbxIndexOf(formId,lbx1,txt);
    if (i>-1) {
	    var opt = document.createElement("OPTION");
	    lbxTo.appendChild(opt);
	    opt.value=lbxFrom.options.item(i).value;
	    opt.innerHTML=lbxFrom.options.item(i).innerHTML;
	    opt.id=lbxFrom.options.item(i).id;
	    lbxFrom.remove(i);
    }
}
function getSelected(formId,lbxId) {
	var form = document.forms[formId];
	var lbx = form.elements[lbxId];
	var options = new Array();
    for (var i=0; i<lbx.options.length; i++) {
        if (lbx.options.item(i).selected) {
            options[options.length]=lbx.options.item(i);
        }
    }
    return options;
}

function getOptionByName(formId,lbxId,txt) {
	var form = document.forms[formId];
	var lbx = form.elements[lbxId];
    for (var i=0; i<lbx.options.length; i++) {
        if (lbx.options.item(i).innerHTML == txt) {
            return lbx.options.item(i);
        }
    }
    return null;
}

function lbxIndexOf(formId,lbx,txt) {
    var form = document.forms[formId];
    var lbxFrom = form.elements[lbx];
    for (var i=0; i<lbxFrom.options.length; i++) {
        if (lbxFrom.options.item(i).innerHTML==txt)
            return i;
    }
    return -1;
}

function lbxRemoveOption(formId,lbx) {
	var selectedOptions = getSelected(formId,lbx);
    var form = document.forms[formId];
    var lbxFrom = form.elements[lbx];

	var opt = "";
    for (var i=0; i<lbxFrom.options.length; i++) {
		var found = false;
		for (var j=0; j<selectedOptions.length && !found; j++) {
	        found = (lbxFrom.options.item(i).innerHTML==selectedOptions[j].innerHTML);
	    }
	    if (found) {
	    	opt = lbxFrom.options.item(i).innerHTML;
            lbxFrom.remove(i);
            i--;
	    }
	}
	return opt;
}

function lbxRemoveAll(formId,lbx) {
    var form = document.forms[formId];
    var lbxFrom = form.elements[lbx];

    for (var i=0; i<lbxFrom.options.length; i++) {
        lbxFrom.remove(i);
        i--;
	}
}

function lbxAddOption(formId,lbx,id,txt) {
	if (txt.length==0) return;
    var form = document.forms[formId];
    var lbxTo = form.elements[lbx];

	var found = false;
    for (var i=0; i<lbxTo.options.length && !found; i++) {
		found = (lbxTo.options.item(i).value==id);
	}
    if (found) {
    	return;
    }
    var opt = document.createElement("OPTION");
    lbxTo.appendChild(opt);
    opt.value=id;
    opt.innerHTML=txt;
    opt.id=id;
}

function lbxReplaceOption(formId,lbx,oldvalue,value,txt) {
	if (txt.length==0) return;
    var form = document.forms[formId];
    var lbxTo = form.elements[lbx];

	var option = null;
    for (var i=0; i<lbxTo.options.length && option==null; i++) {
		if (lbxTo.options.item(i).value==oldvalue) {
			option = lbxTo.options.item(i);
		}
	}
    if (option==null) {
	    option = document.createElement("OPTION");
	    lbxTo.appendChild(option);
    }
    option.value=value;
    option.innerHTML=txt;
    option.id=value;
}

function lbxSelectAll(formId,lbx) {
    var form = document.forms[formId];
    var lbxFrom = form.elements[lbx];
    for (var i=0; i<lbxFrom.options.length; i++) {
		lbxFrom.options.item(i).selected=true;
    }
}

/*
* Prototypes
*/
Object.prototype.isArray = function() {
	return this.constructor == Array;
}

String.prototype.trim = function() {
  var x=this;
  x=x.replace(/^\s*(.*)/, "$1");
  x=x.replace(/(.*?)\s*$/, "$1");
  return x;
}

Array.prototype.quickSort= Array_quickSort;
function Array_quickSort(start, stop){
	var Left= start > 0 ? start : 0;
	var Right= stop < this.length-1 ?  stop : this.length-1;
	var top= 1;
	var lStack= new Array();
	var rStack= new Array();
	var i, j, n, k, x, tmp;
  
	lStack[top]= Left;
	rStack[top]= Right;
  
	while (top!=0){
		Left= lStack[top]; 
		Right= rStack[top]; 
		top--;
    	while(Left < Right){
			i= Left;
			j= Right;
			n= Left + Right;
			k= Math.floor(n/2);
			x= this[k];
      
	  		while(i <= j){
        		while(this[i] < x){
					i++;
				}
				while(this[j] > x){
					j--;
				}
				if(i <= j){
					
					//Switch positions
					tmp= this[j];
					this[j]= this[i];
					this[i]= tmp;
        			
					i++; 
					j--;
				}
			}
			
			if((j-Left) < (Right-i)){
				if(i < Right){ 
					top++;
					lStack[top]= i;
					rStack[top]= Right;
				}
				Right= j;
			}else{
				if (Left < j){
					top++;
					lStack[top]= Left;
					rStack[top]= j; 
				}
				Left= i;
			}
		}
	}
}

Array.prototype.quickSortByKey= Array_quickSortByKey;
function Array_quickSortByKey(key, start, stop){
	var Left= start > 0 ? start : 0;
	var Right= stop < this.length-1 ?  stop : this.length-1;
	var top= 1;
	var lStack= new Array();
	var rStack= new Array();
	var i, j, n, k, x, tmp;
  
	lStack[top]= Left;
	rStack[top]= Right;
  
	while (top!=0){
		Left= lStack[top]; 
		Right= rStack[top]; 
		top--;
    	while(Left < Right){
			i= Left;
			j= Right;
			n= Left + Right;
			k= Math.floor(n/2);
			x= this[k][key];
      
	  		while(i <= j){
        		while(this[i][key] < x){
					i++;
				}
				while(this[j][key] > x){
					j--;
				}
				if(i <= j){
					
					//Switch positions
					tmp= this[j];
					this[j]= this[i];
					this[i]= tmp;
        			
					i++; 
					j--;
				}
			}
			
			if((j-Left) < (Right-i)){
				if(i < Right){ 
					top++;
					lStack[top]= i;
					rStack[top]= Right;
				}
				Right= j;
			}else{
				if (Left < j){
					top++;
					lStack[top]= Left;
					rStack[top]= j; 
				}
				Left= i;
			}
		}
	}
}


