// jslib.js
/*
Author: 
	Carlos Andres Caballero Pino, Panama
	
Purpose:
	Expose a common browser interface for object manipulation, as well as various
	utility functions. 

BTW:	
	Dont expect too many comments
*/

/*GLOBALS:    just state stuff*/
var _jslib_isIE=document.all?true:false;
var _jslib_isNS=document.layers?true:false;
var _jslib_isNS6=document.getElementById&&!document.all?true:false;
var _jslib_isSafari=(navigator.platform.indexOf("Mac") >= 0) ? true : false;
var _jsErrorMsg="";

var __jsisdrag=false;
var __jsDragx,__jsDragy,__jsDragtx,__jsDragty;
var __jsdobj;


//Dialog window stuff
var _dlgResult=null;		//dialog results
var _jsDlg=null;			//dialog window

//form validator
var _jslibValidator=new Array();

function jsGetError()
{
	return _jsErrorMsg;
}

function jsGetObject(name) {
	if(_jslib_isIE) {
		return document.all[name];
	} else if(_jslib_isNS) {
		return document.layers[name];
	} else if (_jslib_isNS6) {
		return document.getElementById(name);
	}
	
	return null;
}

function jsAddEvent(obj,evname,func)
{
	var robj=jsGetObject(obj);	
	if(robj)
	{
		if(_jslib_isIE)
		{
			robj.attachEvent("on" + evname, func);
		} 
		else 
		{
			robj.addEventListener(evname, func, true);
		}
	}
}

function jsAddEvent2(robj,evname,func)
{
	if(robj)
	{
		if(_jslib_isIE)
		{
			robj.attachEvent("on" + evname, func);
		} 
		else 
		{
			robj.addEventListener(evname, func, true);
		}
	}
}


function jsGetParent(obj)
{
	if(_jslib_isIE)
	{
		return obj.parentElement;
	}
	else
	{
		return obj.parentNode;
	}
}

function jsGetStyle(object,style)
{
	var obj=jsGetObject(object);
	var stl;
	if(obj)
	{
		if((_jslib_isIE==true)||(_jslib_isNS6==true))
		{
			stl=eval("obj.style."+style);
		}
		else if(_jslib_isNS)
		{
			stl=eval("obj."+style);
		}
		if(stl!=null)
		{
			return stl;
		}
		_jsErrorMsg="Invalid Style";
		return null;
	}
	return null;
}

function jsGetStyle2(object,style)
{
	var stl;
	if(object)
	{
		if((_jslib_isIE==true)||(_jslib_isNS6==true))
		{
			stl=eval("object.style."+style);
		}
		else if(_jslib_isNS)
		{
			stl=eval("object."+style);
		}
		if(stl!=null)
		{
			return stl;
		}
		_jsErrorMsg="Invalid Style";
		return null;
	}
	return null;
}

function jsGetStyles(obj,styles)
{
	var cobj=jsGetObject(obj);
	if(cobj)
	{
		var res=new Array();
		for(i=0;i<styles.length;i++)
		{
			res[i]=jsGetStyle2(cobj,styles[i]);
		}		
		return res;
	}
	return null;
}

function jsGetStyles2(obj,styles)
{
	if(obj)
	{
		var res=new Array();
		for(i=0;i<styles.length;i++)
		{
			res[i]=jsGetStyle2(obj,styles[i]);
		}
		return res;
	}
	return null;
}


function jsSetStyle(object,style,value)
{
	var obj=jsGetObject(object);
	if(obj)
	{
		if(jsGetStyle(object,style)!=null)
		{
			if((_jslib_isIE==true)||(_jslib_isNS6==true))
			{
				eval("obj.style."+style+"='"+value+"'");
			}
			else if(_jslib_isNS)
			{
				eval("obj."+style+"='"+value+"'");
			}
			else
			{
				return false;
			}
			return true;
		}
		return false;
	}
	return false;
}

function jsSetStyle2(object,style,value)
{
	if(object)
	{
		if(jsGetStyle2(object,style)!=null)
		{				
			if((_jslib_isIE==true)||(_jslib_isNS6==true))
			{
				eval("object.style."+style+"='"+value+"'");
			}
			else if(_jslib_isNS)
			{
				eval("object."+style+"='"+value+"'");
			}
			else
			{
				return false;
			}
			return true;
		}
		return false;
	}
	return false;
}

function jsSetStyles(obj,styles,values)
{
	var cobj=jsGetObject(obj);
	if(cobj)
	{
		for(i=0;i<styles.length,i<values.length;i++)
		{
			jsSetStyle2(cobj,styles[i],values[i]);
		}
	}
}

function jsSetStyles2(obj,styles,values)
{
	if(obj)
	{
		for(i=0;i<styles.length,i<values.length;i++)
		{
			jsSetStyle2(obj,styles[i],values[i]);
		}
	}
}

//JAVASCRIPT FORM VALIDATION

function jsRegisterFormValidator(name,function_name)
{
	_jslibValidator[name]=function_name;
}


function jsValidateForm(form,beforeValidate,afterValidate)
{	
	var id;
	var status=1;
	if(beforeValidate)
	{
		if(!beforeValidate(form))
			return false;
	}
	for(i=0;i<form.elements.length;i++)
	{
		if(form.elements[i].type!="button" && form.elements[i].type!="submit")
		{
			elem=form.elements[i];
			validation='';	hint='';	vmsg='';
			validation=elem.getAttribute("validation",2);
			hint=elem.getAttribute("validationHint",2);
			vmsg=elem.getAttribute("validationMsg",2);
			if(validation)
			{
				if(_jslibValidator[validation])
				{
					if(!_jslibValidator[validation](elem,hint)) 
					{
						if(vmsg!=null)	alert(vmsg);
						if(elem.type!="hidden") elem.focus();
						return false;
					}
				}
				else
				{
					alert('Validator '+validation+' not found');
				}
			}
		}
	}	
	if(afterValidate)
	{
		if(!afterValidate(form))
			return false;
	}
	return true;
}
//MULTI BROWSER DIALONGS
function dlgExecute(func)
{
	window.onfocus=function(){}
	eval(func+'(this._dlgResult)');	
}
function jsDialog(url,name,width,height,handler)
{		
	if(_jslib_isIE)
	{
		this._dlgResult=window.showModalDialog(url,"","dialogHeight:"+height+"px; dialogWidth:"+width+"px;");
		dlgExecute(handler);
	}
	else
	{
		_jsDlg=window.open("","jsDwlg","status=yes,scrollbars=yes,width="+width+",height="+height+",left="+((screen.width/2)-(width/2))+",top="+((screen.height/2)-(height/2)));
		_jsDlg.document.location.href=url;
		_jsDlg.opener=this;
		_jsDlg.onload=function()
		{
			self.loaded=true;
			this.returnValue=null;
		}
		_jsDlg.onbeforeunload=function()
		{
			if(self.loaded)
			{
				this.opener._dlgResult=this.returnValue;
			}			
		}
		eval('window.onfocus=function(){if(_jsDlg!=null){if(!_jsDlg.closed){_jsDlg.focus();_jsDlg.focus();}else{ dlgExecute("'+handler+'"); }}}');		
	}
}

//JAVASCRIPT GRID
function jsGrid(name,width,height)
{
	this.name=name;
	this.width=width;
	this.height=height;
	this.labelStyle='defGridHeader';
	this.gridStyle='defGridStyle';
	this.itemStyle='defDataClass';
	this.selectedStyle='defDataSelected';
	this.selected=null;
	this.onClick='jsGridSelectRow';
	this.headerEvents=new Array();
	this.cellEvents=new Array();
	this.rowEvents=new Array();
	this.selectedColor='#EDF5CD';
	this.headerEvents['click']=function(id){ this.gridDriver.sortColumn(this); };
	this.headerEvents['over']=function(id)
	{ 
		this.oldcolors= jsGetStyles2(this,['borderBottomColor','backgroundColor']) ;
		jsSetStyles2(this,['borderBottomColor','backgroundColor'],['#FFBB00','#FFFFFF']); 
	};
	this.headerEvents['out']=function(id)
	{ 
		jsSetStyles2(this,['borderBottomColor','backgroundColor'],this.oldcolors); 
	};

	
	this.cellEvents['over']=function(id)
	{
		this.oldcolors= jsGetStyles2(this,['backgroundColor','color']) ;
		jsSetStyles2(this,['backgroundColor','color'],['#DDF5FF','#000000']); 
	};
	this.cellEvents['out']=function(id)
	{
		jsSetStyles2(this,['backgroundColor','color'],this.oldcolors); 
	};

	this.Create=function(labels)
	{
		eval("this.cellEvents['click']=function(id){ "+this.onClick+"(this); }");

		document.writeln('<div id="jsgrid_'+this.name+'" style="width:'+this.width+';height:'+this.height+';overflow:auto;" class="'+this.gridStyle+'" >');
		document.writeln('<table width="100%" id='+this.name+' cellpading="0" cellspacing="0" border="0">');
		document.writeln('</table>');
		document.writeln('</div>');
		
		if(labels.length)
		{	
			var tbl=jsGetObject(this.name);
			var row,cell;
			row=tbl.insertRow(-1);
			row.gridDriver=this;
			for(i=0;i<labels.length;i++)
			{
				cell=row.insertCell(-1);				
				cell.id=this.name+'_label'+i;
				cell.className=this.labelStyle;
				lbl_text=labels[i];
				while(lbl_text.indexOf(' ')>0)
					lbl_text=lbl_text.replace(' ','&nbsp;');
					
				cell.innerHTML=lbl_text;
				cell.parentGrid=this;

				cell.onclick=this.headerEvents['click'];
				cell.onmouseover=this.headerEvents['over'];
				cell.onmouseout=this.headerEvents['out'];
				cell.gridDriver=this;
				
			}
		}
		
		var tbl=jsGetObject(this.name)
		tbl.setAttribute('selectedItem',null);		
		
	}
	this.insertRow=function(data)
	{
		var tbl=jsGetObject(this.name);
		var row,cell;
		row=tbl.insertRow(-1);
		row.gridDriver=this;
		for(i=0;i<tbl.rows[0].cells.length,i<data.length;i++)
		{			
			cell=row.insertCell(-1);
			cell.id=this.name+'_item_'+tbl.rows.length+'_'+row.cells.length;
			cell.className=this.itemStyle;
			cell.selectedStyle=this.selectedStyle;
			cell.normalStyle=this.itemStyle;
			if(data[i].pop)
			{
				cell.innerHTML=i<data.length?data[i][0]:'&nbsp;';
				cell.cell_value=i<data.length?data[i][1]:'';
			}
			else
			{
				cell.innerHTML=i<data.length?data[i]:'&nbsp;';
				cell.cell_value=i<data.length?data[i]:'';
			}
			cell.parentGrid=this;
			cell.onclick=this.cellEvents['click'];
			cell.onmouseover=this.cellEvents['over'];
			cell.onmouseout=this.cellEvents['out'];
			cell.gridDriver=this;
		}
	}
	this.setRowData=function(row_id,data)
	{
		var tbl=jsGetObject(this.name);
		var row,cell;
		if(row_id>=1 && row_id<tbl.rows.length)
		{
			row=tbl.rows[row_id];
			for(i=0;i<row.cells.length, i<data.length ;i++)
			{			
				if(data[i].pop)
				{
					row.cells[i].innerHTML=i<data.length?data[i][0]:'&nbsp;';
					row.cells[i].cell_value=i<data.length?data[i][1]:'';
				}
				else
				{
					row.cells[i].innerHTML=i<data.length?data[i]:'&nbsp;';
					row.cells[i].cell_value=i<data.length?data[i]:'';
				}
			}
		}
	}
	this.setColumnWidth=function(data)
	{
		var tbl=jsGetObject(this.name);
		var row,cell;
		row=tbl.rows[0];
		for(i=0;i<row.cells.length,i<data.length;i++)
		{			
//			alert(data[i]);

			jsSetStyle2(row.cells[i],'width',data[i]);
			
//			row.cells[i].width=data[i];
		}
	}
	
	this.moveUp=function ()
	{
		tobj=jsGetObject(this.name);
		if(this.selected!=null)
		{
			if(this.selected.rowIndex>1)
			{
				rd=tobj.rows[this.selected.rowIndex-1];
				ro=this.selected;
				for(i=0;i<rd.cells.length;i++)
				{
					tmp=rd.cells[i].innerHTML;
					rd.cells[i].innerHTML=ro.cells[i].innerHTML;
					ro.cells[i].innerHTML=tmp;
				}
				jsGridSelectRow(rd.cells[0]);
			}
		}
	}
	this.moveDown=function ()
	{
		tobj=jsGetObject(this.name);
		if(this.selected!=null)
		{
			if(this.selected.rowIndex<(tobj.rows.length-1))
			{
				rd=tobj.rows[this.selected.rowIndex+1];
				ro=this.selected;
				for(i=0;i<rd.cells.length;i++)
				{
					tmp=rd.cells[i].innerHTML;
					rd.cells[i].innerHTML=ro.cells[i].innerHTML;
					ro.cells[i].innerHTML=tmp;
				}
				jsGridSelectRow(rd.cells[0]);
			}
		}
	}
	this.removeSelected=function()
	{
		tobj=jsGetObject(this.name);
		if(this.selected!=null)
		{
			tobj.deleteRow(this.selected.rowIndex);
			this.selected=null;
		}
	}
	this.Clear=function()
	{
		tobj=jsGetObject(this.name);
		while(tobj.rows.length>1)
		{
			tobj.deleteRow(1);
		}
		this.selected=null;
	}
	this.getRowData=function()
	{		
		if(this.selected!=null)
		{
			var res=new Array();
			for(i=0;i<this.selected.cells.length;i++)
			{
				res[i]=this.selected.cells[i].cell_value;				
			}
			return res;
		}
		return null;
	}
	
	this.getRowDataIdx=function(row_id)
	{		
		var tbl=jsGetObject(this.name);
		var row,cell;
		var res=new Array();
		if(row_id>=1 && row_id<tbl.rows.length)
		{
			row=tbl.rows[row_id];
			for(i=0;i<row.cells.length;i++)
			{
				res[i]=row.cells[i].cell_value;				
			}
		}
		return res;
	}
	
	this.getCell=function(col,row)
	{
	}
	this.sortColumn=function(col)
	{		
	}
}

function jsGridSelectRow(obj)
{
	var tobj=jsGetParent(obj)
	tobj=jsGetParent(tobj);
	if(tobj.rows.length>1)
	{
		selectedItem=obj.parentGrid.selected;
		if(selectedItem==null)		
		{			
			row=jsGetParent(obj);
			obj.parentGrid.selected=row;
			for(i=0;i<row.cells.length;i++)
			{	
				row.cells[i].className=row.cells[i].selectedStyle;
			}
		}
		else
		{
			if(selectedItem.rowIndex==jsGetParent(obj).rowIndex)
			{
				obj.parentGrid.selected=null;
				row=jsGetParent(obj);
				for(i=0;i<row.cells.length;i++)
				{				
					row.cells[i].className=row.cells[i].normalStyle;
				}
			}
			else
			{
				row=selectedItem;
				for(i=0;i<row.cells.length;i++)
				{				
					row.cells[i].className=row.cells[i].normalStyle;
				}				
				row=jsGetParent(obj);
				obj.parentGrid.selected=row;
				for(i=0;i<row.cells.length;i++)
				{				
					row.cells[i].className=row.cells[i].selectedStyle;
				}
			}
		}
	}
}

//TEXTAREA LIMIT TEXT
function jsLimitText(obj,limit)
{
	var vobj=jsGetObject(obj);
	if(vobj)
	{
		vobj.text_limit=limit;
		jsAddEvent2(vobj,'keydown',
				function(ev)
				{
					var target=document.all?ev.srcElement:ev.currentTarget;
					if(target.value.length>=target.text_limit)
					{
						target.value=target.value.substr(0,target.text_limit-1);
						return false;
					}
					return true;
				});
	}
}

//INPUT NUMBER FILTER
function jsOnlyNumbers(obj,decimals)
{
	var vobj=jsGetObject(obj);
	if(vobj)
	{
		vobj.decimals=decimals;
		jsAddEvent2(vobj,'keyup',
				function(ev)
				{
					var target=document.all?ev.srcElement:ev.currentTarget;
					if(isNaN(target.value))
					{						
						target.value='';
						return false;
					}
					return true;
				});
	}
}

function jsToolTipOver(ev)
{	
	var target=document.all?ev.srcElement:ev.currentTarget;
	target.visibleTip=target.visibleTip?false:true;
	
	jsShowTip(target.id,ev.clientX+5,ev.clientY-(105),20.00,target.fadeSpeed,true);
}

function jsToolTipOut(ev)
{	
	var target=document.all?ev.srcElement:ev.currentTarget;
	if(jsGetStyle('js_current_tool_tip','display')!='none')
	{
		jsShowTip(target.id,ev.clientX+5,ev.clientY-(105),100.00,target.fadeSpeed,false);	
	}
}

function jsShowTip(obj,x,y,alpha,step,show)
{
	var target=jsGetObject(obj);
	var tip=jsGetObject('js_current_tool_tip');
	if(jsGetStyle2(tip,'display')!='') jsSetStyle2(tip,'display','');

	if(show){
		if(!tip.toolSet)
		{
			tip.innerHTML='<b>'+target.toolTipTitle+'</b><hr size="1" color="#FFCC00">'+target.toolTip;
			tip.className=target.tipClass;
			jsSetStyles2(tip,['left','top'],[x,y]);
			tip.toolSet=true;
		}		
	}
	
	if(document.all){
		jsSetStyle2(tip,'filter','alpha(opacity='+alpha+')');		
	}else{
		jsSetStyle2(tip,'MozOpacity',alpha/100.00);
	}
	if(show==true){	
		if(alpha<100){
			alpha+=step;
			setTimeout('jsShowTip("'+obj+'",'+x+','+y+','+alpha+','+step+',true)',30);
		}
	}else{
		if(alpha>0){
			alpha-=step;
			setTimeout('jsShowTip("'+obj+'",'+x+','+y+','+alpha+','+step+',false)',30);
		}else{
			tip.toolSet=false;	
			jsSetStyle2(tip,'display','none');
		}
	}	
}

function jsAddToolTip(id_obj,title,txt,cls,speed)
{
		var obj=jsGetObject(id_obj);
		obj.fadeSpeed=speed;
		obj.toolTip=txt;
		obj.tipClass=cls;
		obj.toolTipTitle=title;
		jsAddEvent2(obj,'click',jsToolTipOver);
		jsAddEvent2(obj,'mouseout',jsToolTipOut);
		var tip=jsGetObject('js_current_tool_tip');
		if(!tip)
		{
			document.write('<div id="js_current_tool_tip" style="position:absolute;top:0px;left:0px; display:none; width:220px; height:100px;"></div>')
		}
}

function jsDrag(e)
{
  if (__jsisdrag)
  {
	if(!__jsdobj.canceldrag)
	{		
		__jsdobj.style.left = _jslib_isNS6 ? __jsDragtx + e.clientX - __jsDragx : __jsDragtx + event.clientX - __jsDragx;
		__jsdobj.style.top  = _jslib_isNS6 ? __jsDragty + e.clientY - __jsDragy : __jsDragty + event.clientY - __jsDragy;
		if(__jsdobj.onDrag){
				__jsdobj.onDrag();
		}
	}
    return false;
  }
}

function jsBeginDrag(e) 
{
  var fobj       = _jslib_isNS6 ? e.target : event.srcElement;
  var topelement = _jslib_isNS6 ? "HTML" : "BODY";
  var candrag;
  var dragtarget=null;
  candrag=fobj.getAttribute("dragObj",2);
  
  while (fobj.tagName != topelement && !candrag)
  {
    fobj = _jslib_isNS6 ? fobj.parentNode : fobj.parentElement;
	candrag=fobj.getAttribute("dragObj",2);
  }

  dragtarget=fobj.getAttribute("dragTarget",2);
  
  if(dragtarget){
	  	dragtarget=jsGetObject(dragtarget);
  }
  if (dragtarget)
  {
	dragtarget.old_styles=jsGetStyle2(dragtarget,'cursor');	
	jsSetStyle2(dragtarget,'cursor','move');
    __jsisdrag = true;
    __jsdobj = dragtarget;
    __jsDragtx = parseInt(__jsdobj.style.left+0);
    __jsDragty = parseInt(__jsdobj.style.top+0);
    __jsDragx = _jslib_isNS6 ? e.clientX : event.clientX;
    __jsDragy = _jslib_isNS6 ? e.clientY : event.clientY;
    document.onmousemove=jsDrag;
    return false;
  }
}

function jsAddDrag(trigger,target,on_drag,on_end_drag)
{
	tgr=jsGetObject(trigger);
	tg=jsGetObject(target);
	if(tgr && target){
		tgr.setAttribute("dragObj",1);
		tgr.setAttribute("dragTarget",target);
		if(on_drag)	tg.onDrag=on_drag;
		if(on_end_drag)	tg.onEndDrag=on_end_drag;
	}
}

/*document.onmousedown=jsBeginDrag;
document.onmouseup=function(){
	if(__jsdobj){
		if(__jsdobj.onEndDrag)
			__jsdobj.onEndDrag();
		jsSetStyle2(__jsdobj,'cursor',__jsdobj.old_styles);
	}
	__jsisdrag=false;
	document.onmousemove=function(){};
	
}*/

