function getObject(o){
 if(isStr(o) && o!=""){
  var d=document;
  //if(d.all && d.all(o)){
   //return d.all(o);
  //}else 
  if(d.getElementById && d.getElementById(o)){
   return d.getElementById(o);
  }else if(d.getElementsByName && d.getElementsByName(o)){
   return d.getElementsByName(o);
  }else if(df(0) && df(0).elements[o]){   
   return df(0).elements[o];
  }else if(df(1) && df(1).elements[o]){   
   return df(1).elements[o];
  }else if(d.layers && d.layers[o]){
   return d.layers[o];
  }else{
   return null;
  }
 }else{
  return o;
 }
}
function getStyleSimple(o){
 var el=getObject(o);
 return (el)?((el.style)?el.style:el):false;
}
function getStyle(o){
 var el=getObject(o);
 if(el){
  var s=(el.style)?el.style:el;
  if(s){
   return s;
  }else{
   if(window.getComputedStyle){
    s=window.getComputedStyle(el,null);
   }else if(el.currentStyle){
    s=el.currentStyle;
   }
   return (s)?s:false;
  } 
 }else{
  return false;
 }
}
function reportStyle(obj,csspropJS,csspropCSS){
 if(obj.currentStyle){
  return obj.currentStyle[csspropJS];
 }else if(window.getComputedStyle){
  var objstyle=window.getComputedStyle(el, "");
  return objstyle.getPropertyValue(csspropCSS);
 }else{
  return false;
 }
}
function isObj(o){
 return (typeof(o)==="object")?true:false;
}

function isFn(o){
 return (typeof(o)==="function")?true:false;
}

function isNumber(o){
 return (typeof(o)==="number")?true:false;
}

function isStr(o){
 return (typeof(o)==="string")?true:false;
}

function isEmpty(o){
 var i,v;
 if(isObj(o)){
  for(i in o){
   v=o[i];
   if(v!==undefined && !isFn(v)) {
    return false;
   }
  }
 }
 return true;
}



/* BROWSER */
function testforBrowser(){
 var d=document;
 var ns=d.namespaces;
 var im=d.implementation;
 var isIE=d.all && !window.opera;
 var ens=isIE && ns;
 var isIE8=document.XDomainRequest;
 var isIE7=ens && im && window.XMLHttpRequest;
 var isIE60=ens && im && !window.XMLHttpRequest;
 var isIE55=ens && !im;
 var isIE50=isIE && !ns && !im;
 var isgteIE60=isIE7 || isIE60;
 var isIEDOM2=isIE50 || isgteIE60;
 var isIE4=isIE && !isIEDOM2 && navigator.cookieEnabled;
 var isIE3=isIE && !isIE4 && !isIEDOM2;
 var isNS=navigator.mimeTypes && !isIE;
 var isNS3=isNS && !navigator.language;
 var isNS4=d.layers;
 var isNS6=d.getElementById && !isIE;
 var isNS7=isNS6;
 var isNS71=d.designMode;
 var isNSDOM2=isNS6;
 var isDOM2=isIEDOM2 || isNSDOM2;
 return {isIE:isIE, isIE8:isIE8, isIE7:isIE7, isIE60:isIE60, isgteIE60:isgteIE60, isIE50:isIE50, isIE55:isIE55, isIEDOM2:isIEDOM2, isIE4:isIE4, isIE3:isIE3, isNS:isNS, isNS3:isNS3, isNS4:isNS4, isNS6:isNS6, isNS7:isNS7, isNS71:isNS71, isNSDOM2:isNSDOM2, isDOM2:isDOM2}
}



/* IMAGES */

function imgLoaded(o){
 if(!o.complete){
  return false;
 }
 if(typeof(o.naturalWidth)!="undefined" && o.naturalWidth==0){
  return false;
 }
 return true;
}




/* FORM */
function df(o){
 return document.forms[o];
}


/* DATES */
function isDate(o){
 try{
  o.getDate();
  return true;
 }catch(e){
  return false;
 }
}
function isDateString(sDate){
 var re=/^\d{1,2}\/\d{1,2}\/\d{4}$/;
 if(re.test(sDate)){
  var dArray=sDate.split("/");
  var d=new Date();
  d.setFullYear(dArray[2],dArray[1]-1,dArray[0]);  //UK Date
  if(isDate(d)){
   return [(d.getDate()==dArray[0]) && (d.getMonth()+1==dArray[1]) && (d.getFullYear()==dArray[2]), d];
  }else{
   return [false,false];
  }
 }else{
  return false;
 }
}
Date.prototype.compareDates=function(d2){
 if(isDate(d2)){
  if((this==d2) || (this.compareYMD(d2))){
   return 0;
  }else if(this<d2){
   return -1;
  }else{
   return 1;
  }
 }else{
  return false;
 }
}
Date.prototype.compareYMD=function(d){
 if(isDate(d)){
  var a=this.dateProperties();
  var b=d.dateProperties();
  if((a.year==b.year) && (a.month==b.month) && (a.day==b.day)){
   return true;
  }else{
   return false;
  }
 }else{
  return false;
 }
}
Date.prototype.dateProperties=function(){
 return {year:this.getFullYear(), month:this.getMonth()+1, day:this.getDate()};
};






/* SELECT */
function ddv(o){
 var obj=getObject(o);
 if(obj){
  if(obj.type=="select-one"){
   return obj.options[obj.selectedIndex].value;
  }else if(obj.type=="select-multiple"){
   return getMultipleSelect(obj);
  }else{
   return false;
  }
 }else{
  return false;
 }
}
function ddt(o){
 var obj=getObject(o);
 if(obj && obj.type=="select-one"){
  return obj.options[obj.selectedIndex].text;
 }else{
  return false;
 }
}
function noSelect(o){
 var s=getObject(o);
 if(s){
  for(var i=0; i<s.options.length; i++){
   s.options[i].selected=false;
  }
 }
 s.options[0].selected=true;
}
function resetSelect(o,n,v){
 var s=getObject(o);
 if(s){
  s.options.length=0;
  s.options[0]=new Option(n,v,0,0);
 }
}
function setSelect(o,t){
 var s=getObject(o);
 if(s){
  for(var i=0; i<s.options.length; i++){
   if(s.options[i].value==t){
    s.selectedIndex=i;
    break;
   }
  }
 }
}




/* RADIOS */
function isRadio(id){
 var obj=getObject(id);
 return (obj && obj.type=="radio")?true:false;
}
function getRadioObj(n){
 var d=document;
 if(d.getElementsByName && d.getElementsByName(n)){
 return d.getElementsByName(n);
 }else{
  return getObject(n);
 }
}
function getRadio(n){
 var obj=getRadioObj(n);
 if(obj[0] && isRadio(obj[0].id)){
  var l=obj.length;
  if(l==1){
   return obj.value;
  }else{
   for(var i=0; i<l; i++){
    if(obj[i].checked){
     return obj[i].value;
    }
   }
   return "";
  }
 }else{
  return "";
 }
}
function getRadioName(id){
 var obj=getObject(id);
 if(obj[0] && isRadio(obj[0].id)){
  return obj.name;
 }else{
  return "";
 }
}
function unsetRadioName(n){
 var obj=getRadioObj(n);
 if(obj[0] && isRadio(obj[0].id)){
  var l=obj.length;
  if(l==1){
   obj.checked=false;
  }else{
   for(var i=0; i<l; i++){
    obj[i].checked=false;
   }
  }
 }
}
function setRadioName(n,i){
 var obj=getRadioObj(n);
 if(obj[0] && isRadio(obj[0].id)){
  var l=obj.length;
  if(l==1){
   obj.checked=false;
  }else{
   if(obj[i]){
    obj[i].checked=true;
   }
  }
 }
}
function setRadio(n){
 var o=getObject(n);
 if(o){
  o.checked=true;
 }
}
function getRadioValue(o){
 l=o.length;
 if(l==1){
  return o.value;
 }else{
  for(i=0; i<l; i++){
   if(o[i].checked){
    return o[i].value;
   }
  }
 }
}






/* STRINGS */
String.prototype.isString=function(){
 return (typeof(o)==="string")?true:false;
};
String.prototype.trim=function(){//var test3=test.trim();
 return this.replace(/^\s+|\s+$/g,"");
};
String.prototype.htmlEntities=function(){
 return this.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');
};
String.prototype.stripTags=function(){
 return this.replace(/<([^>]+)>/g,'');
};
String.prototype.replaceApostrophe=function(){
 return this.replace(/[\']/g, "&#39;");
};
String.prototype.ajaxCleanString=function(){
 return escape(this.cleanStr(1).replaceApostrophe());
}
function replaceAndClean(sArray,f){
 if(!isArray(sArray)){
  sArray=[sArray];
 }
 for(var i=0; i<sArray.length; i++){
  var o=getObject(sArray[i]);
  if(o){
   o.value=o.value.cleanStr(f);
  }
 }
}
String.prototype.cleanStr=function(f){
 var s=this;
 if(s){
  s=s.trim();
  switch(f){
   case 1:
    return s.replace(/[^a-zA-Z0-9\-\'\.\,\s#\\n:\/\_\&\(\)\*\+\!\"\£\$\%\^\=\{\}\[\]\;\@\~\|\<\>\?]/g, "");  //textareas
   case 2:
    return s.replace(/[^a-zA-Z0-9]/g, ""); //simple alpha-numeric
   case 3:
    return s.replace(/[^a-zA-Z0-9\-\'\.\,\s]/g, ""); //alpha-numeric1
   case 4:
    return s.replace(/[^a-zA-Z0-9\-\'\.\,\s:\/\@]/g, "");  //alpha-numeric2
   case 5:
    return s.replace(/[^a-zA-Z0-9\-]/g, "");  //license
   case 6:
    return s.replace(/[^\w\.\-\@\']/g, "");  //simple email
   case 7:
    return s.replace(/[^\w\s]/g, "");  //post code
   case 8:
    return s.replace(/[^\w\.\-]/g, "");  //image
   case 9:
    return s.replace(/[\$\^\{\[\(\|\)\]\}\*\\\+_<>~\"]/g, "");  //generic
   case 10:
    return s.replace(/[^\d\-.]/g, "");  //numeric
   case 11:
    return s.replace(/[^\d]/g, "");  //+ve integer
   case 12:
    return s.replace(/[^\d\*]/g, "");     //creditcard
   case 13:
    return s.replace(/[^a-zA-Z0-9\-\.\,\s:]/g, "");     //address alpha-numeric
   case 14:
    return s.replace(/[^a-zA-Z\-\s\']/g, "");     //name alpha-numeric
   case 15:
    return s.replace(/[^a-zA-Z0-9\s]/g, "");     //simple space alpha-numeric
   case 16:
    return s.replace(/[^a-zA-Z0-9_\|]/g, "");     //error alpha-numeric
   case 17:
    return s.replace(/[^0-9:]/g, "");     //simple time
   case 18:
    return s.replace(/[^a-zA-Z0-9\!\@\#\$\%\^\&\*\?\_\~]/g, "");     //password
  }
 }else{
  return this;
 }
};


/* ARRAYS */

function isArray(a){
 return a && !(a.propertyIsEnumerable('length')) && isObj(a) && isNumber(a.length);
};



/* NUMBERS */
function isNum(n){
 return (isFinite(n))?true:false;
}
function isNumChars(s){
 var numRegExp=/[^\d\.-]/;
 return !numRegExp.test(s);
}
function isInt(n){
 if(isNumChars(n) && isNum(n)){
  var y=parseInt(n,10);
  if(isNaN(y)){
   return false;
  }else{
   return n==y && n.toString()==y.toString();
  }
 }else{
  return false;
 }
}
function isFloat(n){
 if(isNumChars(n) && isNum(n)){
  var y=parseFloat(n);
  if(isNaN(y)){
   return false;
  }else{
   return n==y && n.toString()==y.toString();
  }
 }else{
  return false;
 }
}



/* EVENT HANDLERS */
function addEvents(o,eType,f,useCapture){//addEvents(window,'load',function1,false);
	if(o.addEventListener){
		o.addEventListener(eType,f,useCapture);
		return true;
	}else if(o.attachEvent){
		return o.attachEvent('on'+eType,f);
	}else{
		o['on'+eType]=f;
	}
}
var getEvents={
 gete:function(e){
  return (e)?e:((window.event)?window.event:false);
 },
 etype:function(e){
  e=getEvents.gete(e);
  return (e)?e.type:false;
 },
 mmove:function(e){
  e=getEvents.gete(e);
  if(e){
   if(window.Event && !document.all){
    return [e.pageX,e.pageY];
   }else{
    if(!window.opera && document.all){
     return [event.clientX+docProperties.scrollLeft(),event.clientY+docProperties.scrollTop()];
    }else{
     return [event.clientX,event.clientY];
    }
   }
  }else{
   return false;
  }
 },
 modkeys:function(e){
  var a,c,s,m;
  e=getEvents.gete(e);
  if(e){
   if(document.layers){
    a=e.modifiers && Event.ALT_MASK;
    c=e.modifiers && Event.CONTROL_MASK;
    s=e.modifiers && Event.SHIFT_MASK;
    m=e.modifiers && Event.META_MASK;
   }else{
    a=window.event.altKey;
    c=window.event.ctrlKey;
    s=window.event.shiftKey;
    m=false;
   }
   return [a,c,s,m];
  }else{
   return false;
  }
 },
 keycodes:function(e){
  var ktype;
  e=getEvents.gete(e);
  if(e){
   if(e.keyCode){
    e=e.keyCode;
   }else if(e.which){
    e=e.which;
   }else if(e.charCode){
    e=e.charCode;
   }else{
    return false;
   }
   ktype=((e>47)&&(e<58))?'numeric':((((e>96)&&(e<123))||((e>64)&&(e<91)))?'alpha':'other');
   return [e,String.fromCharCode(e),ktype];
  }else{
   return false;
  }
 },
 gettarget:function(e){
  var targ;
 	e=getEvents.gete(e);
 	if(e){
  	if(e.target){
    targ=e.target;
   }else if(e.srcElement){
    targ=e.srcElement;
   }
  	if(targ.nodeType==3){ //safari bug
  		return targ.parentNode;
   }else{
    return targ;
   }
  }else{
   return false;
  }
 },
 getrightclick:function(e){
 	e=getEvents.gete(e);
 	if(e){
  	if(e.which){
    return (e.which==3);
   }else if(e.button){
    return (e.button==2);
   }else{
    return false;
   }
  }else{
   return false;
  }
 },
 getleftclick:function(e){
 	e=getEvents.gete(e);
 	if(e){
  	if(e.which){
    return (e.which==1);
   }else if(e.button){
    return (e.button==1);
   }else{
    return false;
   }
  }else{
   return false;
  }
 },
 getbothclicks:function(e){
 	e=getEvents.gete(e);
 	if(e){
  	if(e.which){
    return false;
   }else if(e.button){
    return (e.button==3);
   }else{
    return false;
   }
  }else{
   return false;
  }
 }
}

var divStyle={
 left:function(o){
  var ds=getStyle(o);
  if(ds){
   if(ds.pixelLeft){
    return ds.pixelLeft;
   }else if(ds.left){
    return ds.left;
   }else{
    return 0;
   }
  }else{
   return 0;
  }
 },
 right:function(o){
  var ds=getStyle(o);
  if(ds){
   if(ds.pixelRight){
    return ds.pixelRight;
   }else if(ds.right){
    return ds.right;
   }else{
    return 0;
   }
  }else{
   return 0;
  }
 },
 top:function(o){
  var ds=getStyle(o);
  if(ds){
   if(ds.pixelTop){
    return ds.pixelTop;
   }else if(ds.top){
    return ds.top;
   }else{
    return 0;
   }
  }else{
   return 0;
  }
 },
 bottom:function(o){
  var ds=getStyle(o);
  if(ds){
   if(ds.pixelBottom){
    return ds.pixelBottom;
   }else if(ds.bottom){
    return ds.bottom;
   }else{
    return 0;
   }
  }else{
   return 0;
  }
 },
 height:function(o){
  var ds=getStyle(o);
  if(ds){
   if(ds.pixelHeight){
    return ds.pixelHeight;
   }else if(ds.height){
    return ds.height;
   }else{
    return 0;
   }
  }else{
   return 0;
  }
 },
 width:function(o){
  var ds=getStyle(o);
  if(ds){
   if(ds.pixelWidth){
    return ds.pixelWidth;
   }else if(ds.width){
    return ds.width;
   }else{
    return 0;
   }
  }else{
   return 0;
  }
 },
 visible:function(o){
  var ds=getStyle(o);
  if(ds){
   ds.visibility=(document.layers)?"show":"visible";
  }
 },
 hidden:function(o){
  var ds=getStyle(o);
  if(ds){
   ds.visibility=(document.layers)?"hide":"hidden";
  }
 }
}


function jstoolkit(){
 var toolkit=java.awt.Toolkit.getDefaultToolkit();
 return toolkit.getScreenSize();
}
var docProperties={
 screenWidth:function(){
  if(screen.width){
   return screen.width;
  }else if(navigator.javaEnabled()){
   return jstoolkit().width;
  }else{
   return 0;
  }
 },
 screenHeight:function(){
  if(screen.height){
   return screen.height;
  }else if(navigator.javaEnabled()){
   return jstoolkit().height;
  }else{
   return 0;
  }
 },
 screenAvailWidth:function(){
  return screen.availWidth;
 },
 screenAvailHeight:function(){
  return screen.availHeight;
 },
 scrollTop:function(){
  var db=document.body;
  var de=document.documentElement;
  if(typeof(window.pageYOffset)=='number'){
   return window.pageYOffset;
  }else if(db && db.scrollTop){
   return db.scrollTop;
  }else if(de && de.scrollTop){
   return de.scrollTop;
  }else{
   return 0;
  }
 },
 scrollLeft:function(){
  var db=document.body;
  var de=document.documentElement;
  if(typeof(window.pageYOffset)=='number'){
   return window.pageXOffset;
  }else if(db && db.scrollLeft){
   return db.scrollLeft;
  }else if(de && de.scrollLeft){
   return de.scrollLeft;
  }else{
   return 0;
  }
 },
 windowWidth:function(){
  var db=document.body;
  var de=document.documentElement;
  if(typeof(window.innerWidth)=='number'){
   return window.innerWidth;
  }else if(de && de.clientWidth){
   return de.clientWidth;
  }else if(db && db.clientWidth){
   return db.clientWidth;
  }else{
   return 0;
  }
 },
 windowHeight:function(){
  var db=document.body;
  var de=document.documentElement;
  if(typeof(window.innerWidth)=='number'){
   return window.innerHeight;
  }else if(de && de.clientHeight){
   return de.clientHeight;
  }else if(db && db.clientHeight){
   return db.clientHeight;
  }else{
   return 0;
  }
 },
 pageHeight:function(){
  var db=document.body;
  var de=document.documentElement;
  var sb,ob,vb;
  var se,oe,ve;
  if(window.innerHeight && window.scrollMaxY){
 		return window.innerHeight+window.scrollMaxY;
 	}else if(db || de){
 	 sb=0; ob=0; vb=0;
 	 se=0; oe=0; ve=0;
   if(db){
    sb=db.scrollHeight;
    ob=db.offsetHeight;
    vb=(sb>ob)?sb:ob;
   }
   if(de){
    se=de.scrollHeight;
    oe=de.offsetHeight;
    ve=(se>oe)?se:oe;   
   }
   return (vb>ve)?vb:ve;
  }else if(window.opera && de.clientHeight){
   return de.clientHeight;
  }else{
   return 0;
  }
 },
 pageWidth:function(){
  var db=document.body;
  var de=document.documentElement;
  var sb,ob,vb;
  var se,oe,ve;
  if(window.innerWidth && window.scrollMaxX){
 		return window.innerWidth+window.scrollMaxX;
 	}else if(db || de){
 	 sb=0; ob=0; vb=0;
 	 se=0; oe=0; ve=0;
   if(db){
    sb=db.scrollWidth;
    ob=db.offsetWidth;
    vb=(sb>ob)?sb:ob;
   }
   if(de){
    se=de.scrollWidth;
    oe=de.offsetWidth;
    ve=(se>oe)?se:oe;   
   }
   return (vb>ve)?vb:ve;
  }else if(window.opera && de.clientWidth){
   return de.clientWidth;
  }else{
   return 0;
  }
 },
 resizeWindowTo:function(w,h){
  if(parseInt(navigator.appVersion)>3){
   if(document.all){
    top.window.resizeTo(w,h);
   }else if(document.layers || document.getElementById){
    if(top.window.outerWidth<w || top.window.outerHeight<h){
     top.window.outerWidth=w;
     top.window.outerHeight=h;
    }
   }
  }
 },
 maxWindow:function(){
  if(parseInt(navigator.appVersion)>3){
   top.window.moveTo(0,0);
   resizeWindowTo(docProperties.screenAvailWidth(),docProperties.screenAvailHeight());
  }
 }
}

function getObjDims(id){
 var l=t=w=h=0;
 var o=getObject(id);
 if(o){
  l=parseFloat(o.offsetLeft);
  t=parseFloat(o.offsetTop);
  w=parseFloat(o.offsetWidth);
  h=parseFloat(o.offsetHeight);
 }
 return {l:l, t:t, h:h, w:w, r:(l+w), b:(t+h)}
}
function moveObj(position,target,velocity){
 position=Math.round(position);
 target=Math.round(target);
 velocity=(velocity)?Math.round(velocity):0;

 this.updatePosition=function(){
  position+=velocity;
  if(velocity<0){
   if(position-velocity*(velocity-1)/2<target){
    velocity++;
   }else if(position-(velocity-1)*(velocity-2)/2>=target){
    velocity--;
   }
  }else{
   if(position+velocity*(velocity+1)/2>target){
    velocity--;
   }else if(position+(velocity+1)*(velocity+2)/2<=target){
    velocity++;
   }
  }
  return position;
 }

 this.hasStopped=function(){
  return (position==target && velocity==0);
 }
 
 //POSITION
 this.setPosition=function(newPosition){
  position=Math.round(newPosition);
 }
 this.getPosition=function(){
  return position;
 }
 
 //TARGET
 this.setTarget=function(newTarget){
  target=Math.round(newTarget);
 }
 this.getTarget=function(newTarget){
  return target;
 }
 
 //VELOCITY
 this.setVelocity=function(newV){
  velocity=newV;
 }
 this.getVelocity=function(){
  return velocity;
 }
}
