// requires jQuery

function trace(msg){
 // try{ console.log(msg); }catch(e){}
} 
function trace_obj(obj){
 var msg = '';
 for(var i in obj){ msg += i+':'+obj[i]+','; }
 if(msg.length>0){ msg = '('+msg.substr(0,msg.length-1)+')'; }
 trace(msg);
} 
function element(id){ return document.getElementById(id); }
function lpad(str,len,chr){
 var pad=''; var tmp=''+str;
 while(pad.length<len-tmp.length){ pad+=chr; } 
 return pad+tmp;
}
function XY(e){
 var x=e.offsetLeft;
 var y=e.offsetTop;
 if(e.offsetParent){
  while(e=e.offsetParent){ x+=e.offsetLeft; y+=e.offsetTop; }
 }
 return [x,y];
}
function addOnLoad(func){
 var ol=window.onload?window.onload:false;
 window.onload=function(){ if(ol) ol(); func(); };
}
function addOnUnload(func){
 var ou=window.onunload?window.onunload:false;
 window.onunload=function(){ func(); if(ou) ou(); };
}
function loadContent(id,url,data,post,timeout){
 var e="#"+id;
 $(e).html("<div class='container'>Loading... please wait.</div>");
 var type = "GET";
 if(post){ type="POST"; }
 if(timeout==null){ timeout=15000; }
 var x=$.ajax({
  type: type, url: url, timeout: timeout, data: data,
  error: function(){$(e).html("<div class='container'>Error loading content.</div>")},
  success: function(){
	     $(e).html(x.responseText);
	 }
 });
}
function wait_cursor(target,callback){
 var cursor=$(target).css('cursor');
 $(target).css('cursor','wait');
 setTimeout(function(){ callback(); $(target).css('cursor',cursor); },10);
}

