function limitVal(minVal,maxVal,val){
 return Math.min(Math.max(val,minVal),maxVal);
}

String.prototype.lpad=function(padChar,length){
 var result=this;
 while(result.length<length){result=padChar+result;}
 return result;
}
String.prototype.toHexColor=function(){
 return parseInt(this).toString(16).lpad("0",6);
}


Array.prototype.first=function(){
 if(this.length>0){
       var result=this[0];
 }else{var result=undefined;}
 return result;
}
Array.prototype.last=function(){
 if(this.length>0){
       var result=this[this.length-1];
 }else{var result=undefined;}
 return result;
}

function require_once(scriptUrl){
 var newScript=document.createElement("script");
 newScript.src=scriptUrl;
 var scriptList=document.getElementsByTagName("script")
 var scriptExists=false;
// var scriptNames=new Array();
 for(var i=0;i<scriptList.length;i++){
//  scriptNames.push(scriptList[i].src);
  if(scriptList[i].src==newScript.src){
   scriptExists=true;
   break;
  }else if(!scriptList[i].src){
   var prependToScript=scriptList[i];
  }
 }
// alert(scriptNames.join("\n"));
 if(!scriptExists){
//  alert("Loading "+newScript.src+" : "+scriptList[0]);
  document.getElementsByTagName("head")[0].insertBefore(newScript,scriptList[0]);
//  alert("newScript.src: "+newScript.src);
//  scriptList[0].insertBefore(newScript);
//  document.getElementsByTagName("head")[0].appendChild(newScript);
 }else{
//  alert("Already loaded "+newScript.src);
 }
}