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 getObject_old(o){
 if(isStr(o)){
  var d=document;
  return ((d.all)?d.all(o):(d.getElementById)?d.getElementById(o):(d.getElementsByName)?d.getElementsByName(o)[0]:(d.layers)?d.layers[o]:false);
 }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;
}


/* WINDOW */

function referringUrl(){
 if(document.referrer){
  return document.referrer.toString();
 }else if(window.opener && window.opener.location){
  return window.opener.location.toString();
 }else{
  return "";
 }
}
function duplicateWindow(){
 window.open(window.location.href,"_blank");
};
function queryPairs(s){  //var test=new queryPairs("?name=snitch&color=tabby&volume=loud");
 this.keyValuePairs=[];
 if(s.length>1){
  this.s=s.substring(1,s.length); // remove leading"?"
  this.keyValuePairs=this.s.split("&");
 }else{
  this.s="";
 }
 this.getKeyValuePairs=function(){ // returns an array of the key=value pairs
  return this.keyValuePairs;
 }
 this.getValue=function(key){ // returns the value for a specified key
  for(var j=0; j<this.keyValuePairs.length; j++){
   if(this.keyValuePairs[j].split("=")[0]==key){
    return this.keyValuePairs[j].split("=")[1];
   }
  }
  return false;
 }
 this.getParameters=function(){ // returns an array of the key names
  var a=[];
  for(var j=0; j<this.keyValuePairs.length; j++){
   a.push(this.keyValuePairs[j].split("=")[0]);
  }
  return a;
 }
 this.getLength=function(){ // returns a count of key/value pairs
  return this.keyValuePairs.length;
 }
}



/* 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 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, 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}
}





/* FORM */

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

/* VALIDATION */
function requiredValues(reqf){
 var a,b;
 var c=true;
 var f=false;
 if(!isArray(reqf)){
  reqf=[reqf];
 }
 for(var j=0; j<reqf.length; j++){
  a=getObject(reqf[j]);
  if(a){
   b="";
   if(a.type.substr(0,4)=="text" || a.type=="hidden" || a.type=="password" || a.type=="file"){
    switch(a.type){
     case "textarea":
      a.value=a.value.cleanStr(1);
      break;
     case "password":
      a.value=a.value.cleanStr(18);
      break;
     case "file":
      break;
     default:
      a.value=a.value.cleanStr(4);
      break;
    }
    if(a.name.indexOf("email")>=0){
     a.value=a.value.cleanStr(6).toLowerCase();
    }else if(a.name.indexOf("postcode")>=0){
     a.value=a.value.cleanStr(7).toUpperCase();
    }
    b=a.value;
   }else if(a.type.substr(0,6)=="select"){
    b=ddv(a);
   }else if(a.type=="radio"){
    b=getRadio(a);
   }else if(a.type=="checkbox"){
    b="checkbox";
   }
   if(b==""){
    c=false;
    if(!f){
     a.focus();
     f=true;
    }
   }  
  }
 }
 return c;
}



/* 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 DaysInMonthselect(o,d,h){ //e.g. h="d", "e d" etc.
 o=getObject(o);
 if(o && isDate(d)){
  resetSelect(o,"","");
  var g=copyDate(d);
  for(var i=1; i<=d.dateProperties().dim; i++){
   o.options[i-1]=new Option(g.setDate(i).formatDate(h),i,0,0);
  }
 }
}
function getMultiple(obj){
 var o=getObject(obj);
 if(o.type.substr(0,6)=="select"){
  var arSelected=[];
  for(var j=0; j<o.options.length; j++){
   if(o.options[j].selected){
    arSelected.push(o.options[j].value);
   }
  }
  return arSelected.toString();
 }else{
  return "";
 }
}
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;
   }
  }
 }
}
function setMultiSelect(o,t){
 var s=getObject(o);
 if(!isArray(t)){
  t=[t];
 }
 if(s){
  for(var i=0; i<s.options.length; i++){
   for(j in t){
    if(s.options[i].value==t[j]){
     s.options[i].selected=true;
    }
   }
  }
 }
}
function noSelect(o){
 var s=getObject(o);
 if(s){
  for(var i=0; i<s.options.length; i++){
   s.options[i].selected=false;
  }
 }
}
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 searchSelect(o,t){
 var s=getObject(o);
 if(s){
  for(var i=0; i<s.options.length; i++){
   if(s.options[i].value==t){
    return s.options[i].text;
    break;
   }
  } 
 }
}
function removefromSelect(o,t){
 var s=getObject(o);
 if(s){
  for(var i=0; i<s.options.length; i++){
   if(s.options[i].value==t){
    s.options[i]=null;
    break;
   }
  } 
 }
}
function replicateSelect(o1,o2){
 var s1=getObject(o1);
 var s2=getObject(o2);
 if(s1 && s2){
  resetSelect(o2,"","");
  for(var i=0; i<s1.options.length; i++){
   var s=s1.options[i];
   s2.options[i]=new Option(s.text,s.value,0,0);
  }
 }
}



/* CHECKBOXES */
function isCheckbox(o){
 var obj=getObject(o);
 return (obj && obj.type=="checkbox")?true:false;
}
function setCheckboxes(n,t){
 var d=df(0);
 for(var i; i<d.elements.length; i++){
  var f=d.elements[i];
  if(isCheckbox(f) && (n=="" || (n!="" && f.id.indexOf(n)>=0))){
   switch(parseInt(t,10)){
    case 0:
     f.checked=false;
     break;
    case 1:
     f.checked=true;
     break;
    case 2:
     f.checked=((f.checked==true)?false:true);  //toggle
     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;
   }
  }
 }
}



/* PASSWORDS */
String.prototype.isValidAlphaNumeric=function(){
 return !(/[^a-zA-Z0-9]/.test(this));
}
String.prototype.isAlphaAndNumeric=function(){
 var alpha=/[a-zA-Z]/.test(this);
 var numeric=/\d/.test(this);
 return alpha*numeric;
}
String.prototype.checkPassword=function(o,l){
 p1=this.value.cleanStr(2);
 p2=p1.isValidAlphaNumeric();
 p3=p1.length;
 if(p1=="" || !p2 || p3<l){
  alert("\n\nPlease provide a valid "+o+"\n\nPlease make sure the password has\nat least "+l+" characters\n\n");
  this.focus();
  return false;
 }else{
  return true;
 }
}
String.prototype.passwordStrength=function(){
 var passwd=this.trim();
 var pwScore=0;
 var pwVerdict="";

	// PW LENGTH
	if(passwd.length>0){
	
  // ANALYSE STRING
  var nUpperCount=passwd.replace(/[^A-Z]/g, "").length;
  var nLowerCount=passwd.replace(/[^a-z]/g, "").length;
  var nLowerUpperCount=nUpperCount+nLowerCount;
  var nNumberCount=passwd.replace(/[^0-9]/g, "").length;
  var nCharacterCount=passwd.replace(/[^!@#$%^&*?_~]/g, "").length;	
	
  if(passwd.length<5){
 		pwScore+=5;
 	}else if(passwd.length>=5 && passwd.length<8){
 		pwScore+=10;
 	}else if(passwd.length>=8){
 		//pwScore+=25;
 		pwScore+=(passwd.length*3)+1;
 	}
  
 	// LETTERS
 	if(nUpperCount==0 && nLowerCount!=0){	// lower case
 		pwScore+=10; 
 	}else if(nUpperCount!=0 && nLowerCount!=0){ 	// upper and lower case
 		pwScore+=20; 
 	}
 	
 	// NUMBERS
 	if(nNumberCount>=1){	// 1 number
 		pwScore+=10;
 	}
  if(nNumberCount>=3){	// 3+ numbers
 		pwScore+=20;
 	}
 	
 	// CHARACTERS
 	if(nCharacterCount==1){
 		pwScore+=10;
 	}else if(nCharacterCount>1){
 		pwScore+=25;
 	}
 	
 	// LETTERS AND NUMBERS
 	if(nNumberCount!=0 && nLowerUpperCount!=0){
 		pwScore+=2;
 	}
 	// LETTERS, NUMBERS AND CHARACTERS
 	if (nNumberCount!=0 && nLowerUpperCount!=0 && nCharacterCount!=0){
 		pwScore+=3;
 	}
 	// MIXED CASE LETTERS, NUMBERS AND CHARACTERS
 	if(nNumberCount!=0 && nUpperCount!=0 && nLowerCount!=0 && nCharacterCount!=0){
 		pwScore+=5;
 	}

  // Set verdict
  if(pwScore>90){
   pwVerdict="very secure";
  }else if(pwScore>80){
   pwVerdict="secure";
  }else if(pwScore>70){
   pwVerdict="very strong";
  }else if(pwScore>60){
   pwVerdict="strong";
  }else if(pwScore>50){
   pwVerdict="average";
  }else if(pwScore>25){
   pwVerdict="weak";
  }else{
   pwVerdict="very weak";
  }
 }
 return {verdict:pwVerdict, score:pwScore};
}



/* 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.ltrim=function(){
 return this.replace(/^\s+/g,"");
};
String.prototype.rtrim=function(){
 return this.replace(/\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.isValidPostCode=function(){
 return /^([A-PR-UWYZ0-9][A-HK-Y0-9][AEHMNPRTVXY0-9]?[ABEHMNPRVWXY0-9]? {1,2}[0-9][ABD-HJLN-UW-Z]{2}|GIR 0AA)$/.test(s);
};
String.prototype.addApostrophe=function(){
 return "'"+this+"'";
};
String.prototype.removeApostrophe=function(){
 return this.replace(/[\']/g, "");
};
String.prototype.replaceApostrophe=function(){
 return this.replace(/[\']/g, "&#39;");
};
String.prototype.replaceNewline=function(){
 return this.replace(/[\n]/g, "<br />");
};
String.prototype.ajaxCleanString=function(){
 return escape(this.cleanStr(1).replaceApostrophe());
}
String.prototype.repeatStr=function(n){
 var s="";
 n=parseInt(n,10);
 if(isInt(n)){
  for(var i=0; i<((n<0)?0:n); i++){
   s+=this;
  }
  return s;
 }else{
  return this;
 }
}
function isTelNum(n,o){
 n.value=n.value.replace(/[\(\)\.\-\ ]/g, "").trim();
 if(n.value.length>9){
  if(isNum(n.value)){
   return true;
  }else{
   alert("\n\nThe "+o+" number contains illegal characters\n\n");
   n.focus();
   return false;
  }
 }else{
  if(n.value==""){
   alert("\n\nThe "+o+" number is the wrong length\n\n");
  }else{
   alert("\n\nThe "+o+" number is the wrong length\n\nPlease include an area code\n\n");
  }
  n.focus();
  return false;
 }
}
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;
 }
};

var exceptions=['Mackin', 'Machin', 'Machen', 'Macintosh', 'Macintyre', 'Macaulay', 'Macaskill', 'Macara', 'Mackay', 'Maciver', 'Maclaren', 'Macrae', 'Mach', 'MacO', 'MacA'];
var tcPattern1=new RegExp("[\\s'-]","g");
var tcPattern2=new RegExp("^(\\w)(.*)");
var tcPattern3=new RegExp("^(mac|mc{1,2}){0,1}(.*)","i");

String.prototype.titleCase=function(){
 var n=this.cleanStr(14);
 if(n.length>0){
  var newString='';
  var wordDividers=n.match(tcPattern1);
  var words=n.split(tcPattern1);
  for(var i in words){
   var e=isException(words[i]);
   if(e){
    var newwords=e;
   }else{
    var newwords='';
    var wordParts=words[i].match(tcPattern3);
    for(var j in wordParts)newwords+=(!wordParts[j])?'':upperLower(wordParts[j]);
   }
   newString+=newwords+((wordDividers==null)?'':((wordDividers[i]==undefined)?'':wordDividers[i]));
  }
  return newString;
 }
 return "";
};
function isException(w){
 for(var k in exceptions){
  var reg=new RegExp("^"+exceptions[k],'i');
  if(reg.test(w))return exceptions[k];
 }
 return false;
}
function upperLower(w){
 var p=tcPattern2.exec(w);
 return (p[1].toUpperCase()+p[2].toLowerCase());
}








/* DATES */
var months=['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'];
var mons=['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var days=['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var dys=['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];

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(sDate);
  return (d.getDate()==dArray[1]) && (d.getMonth()+1==dArray[0]) && (d.getFullYear()==dArray[2]);
 }else{
  return false;
 }
}
function copyDate(d){
 var t=new Date();
 if(isDate(d)){
  t.setFullYear(d.getFullYear(),d.getMonth(),d.getDate());
  t.setHours(d.getHours(),d.getMinutes(),d.getSeconds());
  return t;
 }else{
  return t;
 }
}
Date.prototype.dateProperties=function(){
 return {year:this.getFullYear(), month:this.getMonth()+1, day:this.getDate(), dow:this.getDay(), monthname:this.getMonthName(0), dayname:this.getDayofWeek(0), doy:this.getDayofYear(), woy:this.getWeekofYear(), dim:this.daysInMonth(), leapyear:this.isLeapYear()};
};
Date.prototype.leapYearTest=function(){
 var p=this.dateProperties();
 var m=p.month;
 var y=p.year;
 return ((m==2)&&(((y%4==0)&&(y%100!=0))||(y%400==0)))?true:false;
};
Date.prototype.isLeapYear=function(){
 var p=this.dateProperties();
 var y=p.year;
 return (((y%4==0)&&(y%100!=0))||(y%400==0))?true:false;
};
Date.prototype.daysInMonth=function(){
 return new Date(this.getFullYear(), this.getMonth()+1, 0).getDate();
};
Date.prototype.getDayofWeek=function(s){
 return (s)?dys[this.getDay()]:days[this.getDay()];
};
Date.prototype.getMonthName=function(s){
 return (s)?mons[this.getMonth()]:months[this.getMonth()];
};
Date.prototype.getDayofYear=function(){
 var jan1=new Date(this.getFullYear(),0,1);
 return Math.ceil((this-jan1)/86400000);
};
Date.prototype.getWeekofYear=function(){
 var jan1=new Date(this.getFullYear(),0,1);
 return Math.ceil((((this-jan1)/86400000)+jan1.getDay())/7);
};
Date.prototype.compareDates=function(d2){
 if(isDate(d2)){
  if(this==d2){
   return 0;
  }else if(this<d2){
   return -1;
  }else{
   return 1;
  }
 }else{
  return false;
 }
}

Date.prototype.dateDiff=function(d){
 var diff=d-this;
 var milliseconds=Math.floor(diff%1000);
 var seconds=Math.floor((diff/=1000)%60);
 var minutes=Math.floor((diff/=60)%60);
 var hours=Math.floor((diff/=60)%24);
 var days=Math.floor(diff/=24);
 return [milliseconds,seconds,minutes,hours,days];
};
function dateAdd(i,v,d){
 if(!isDate(d)){
  d=new Date();
 }
 var t=copyDate(d);
 v=parseInt(v,10);
 if(isInt(v)){
  i=i.toLowerCase();
  switch(i){
   case "y":
    t.setFullYear(d.getFullYear()+v);
    return compareDaysInMonth(t,d);
    break;
   case "q":
   case "m":
    v*=(i=="q")?3:1;
    t.setMonth(d.getMonth()+v);
    return compareDaysInMonth(t,d);
    break;
   case "d":
   case "w":
    v*=(i=="w")?7:1;
    t.setDate(d.getDate()+v)
    return t;
    break;
   case "h":
    t.setHours(d.getHours()+v);
    return t;
    break;
   case "n":
    t.setMinutes(d.getMinutes()+v);
    return t;
    break;
   case "s":
    t.setSeconds(d.getSeconds()+v);
    return t;
    break;
   default:
    return t;
    break;
  }
 }else{
  return t;
 }
};
function compareDaysInMonth(d1,d2){
 if(isDate(d1) && isDate(d2)){
  if(d1.getDate()==d2.getDate()){
   return d1;
  }else{
   d1.setMonth(d1.getMonth()-1);
   d1.setDate(d1.daysInMonth());
   return d1;
  }
 }else{
  var t=new Date();
  return t;
 }
}
function z2pad(s){
 return ("00".substr(0,2-s.length))+""+s;
}
Date.prototype.formatDate=function(format){
	var dstr="";
	var fstr=0;
	var c,s,v;
 format+="";
	while(fstr<format.length){
	 s="";
		c=format.charAt(fstr);
		while((format.charAt(fstr)==c)&&(fstr<format.length)){
			s+=format.charAt(fstr++);
		}
		v=dateFormats(this,s);
		dstr+=(v=="")?s:v;
	}
	return dstr;
}

//e.g. var d=new Date(); d.setFullYear(2008,2,21);
//document.write(d.formatDate("e, dj mmm yy hh:nn:ss aa"));

function dateFormats(date,v){
 switch(v.substr(0,1).toLowerCase()){
  case "y":
   var y=date.getFullYear().toString();
   switch(v){
    case "yy": return y.substring(2,4);
    case "yyyy": return y;
    default: return "";
   }
  case "m":
   var m=date.getMonth()+1;
   switch(v){
    case "m": return m;
    case "mm": return z2pad(m);
    case "mmm": return mons[m-1];
    case "mmmm": return months[m-1];   
    default: return "";
   }
  case "d":
  case "j":
 	 var d=date.getDate();
   switch(v){
    case "d": return d;
    case "dd": return z2pad(d);
   }
   return d.toOrdinal(0);
  case "e":
 	 var e=date.getDay();
   switch(v){
    case "e": return dys[e];
    case "ee": return days[e]; 
    default: return "";
   }
  case "h":
  case "a":
 	 var H=date.getHours();
   switch(v){
    case "H": return H;
    case "HH": return z2pad(H);
    case "h": return (H==0)?12:(H>12)?H-12:H;
    case "hh": return z2pad(((H==0)?12:(H>12)?H-12:H));
    case "aa": return (H>11)?"pm":"am";
    case "AA": return (H>11)?"PM":"AM";
    default: return "";
   }
  case "n":
 	 var n=date.getMinutes();
   switch(v){
    case "n": return n;
    case "nn": return z2pad(n);
    default: return "";
   }
  case "s":
 	 var s=date.getSeconds();
   switch(v){
    case "s": return s;
    case "ss": return z2pad(s);
    default: return "";
   }
  case "t":
   switch(v){
    case "T":
     return date.formatDate("H:nn:ss");
    case "TT":
     return date.formatDate("HH:nn:ss");
    case "t":
     return date.formatDate("h:nn:ss aa");
    case "tt":
     return date.formatDate("hh:nn:ss aa");
   }
  case "f":
   switch(v){
    case "f":
     return date.formatDate("d/m/yy");
    case "F":
     return date.formatDate("dd/mm/yyyy");
    case "ff":
     return date.formatDate("e, dj mmm yy");
    case "FF":
     return date.formatDate("ee, ddj mmmm yyyy");
    case "fff":
     return date.formatDate("ff t");
    case "FFF":
     return date.formatDate("FF T");
    case "ffff":
     return date.formatDate("ff tt");
    case "FFFF":
     return date.formatDate("FF TT");
   }
  default: return "";
 }
}



/* ARRAYS */

function isArray(a){
 return a && !(a.propertyIsEnumerable('length')) && isObj(a) && isNumber(a.length);
};
function zeroArray(s){
 this.arr=new Array();
 for(var i=0; i<=s; i++)this.arr.push(0);
}
Array.prototype.inArray=function(v){
	for(var i=0; i<this.length; i++){
		if(this[i]===v){
			return true;
		}
	}
	return false;
};
Array.prototype.sortNum=function(s){//tmp=tmp.sortNum();
 s=parseInt(s,10);
 switch(s){
  case -1:
   return this.sort(function(a,b){return b-a;});
  case 2:
   return this.sort(function(a,b){return 0.5-Math.random()});  //shuffle
  default:
   return this.sort(function(a,b){return a-b;});
 }
};
Array.prototype.shuffle=function(){
	return this.sortNum(2);
};
Array.prototype.sortAlpha=function(s){
 s=parseInt(s,10);
 switch(s){
  case -1:
   return this.sort().reverse();
  default:
   return this.sort();
 }
} 
Array.prototype.find=function(searchStr){//if(someArray.find('HELP')){
 var returnArray=false;
 for(var i=0; i<this.length; i++){
  if(isFn(searchStr)){
   if(searchStr.test(this[i])){
    if(!returnArray){
     returnArray=[];
    }
    returnArray.push(i);
   }
  }else{
   if(this[i]===searchStr){
    if(!returnArray){
     returnArray=[];
    }
    returnArray.push(i);
   }
  }
 }
 return returnArray;
};
Array.prototype.compare=function(testArr){
 if(this.length!=testArr.length){
  return false;
 }
 for(var i=0; i<testArr.length; i++){
  if(this[i].compare){ 
   if(!this[i].compare(testArr[i])){
    return false;
   }
  }
  if(this[i]!==testArr[i]){
   return false;
  }
 }
 return true;
};




/* 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;
 }
}
function randRange(a,b){
 return a+(b-a)*Math.random();
}
function rgbToDec(c){
 if(c.trim().length==6){
  return {red:hex2dec(c.substr(0,2)), green:hex2dec(c.substr(2,2)), blue:hex2dec(c.substr(4,2))};
 }
}
function rgbToHex(r,g,b){
 if(isInt(r) && isInt(g) && isInt(b)){
  return z2pad(dec2hex(r))+z2pad(dec2hex(g))+z2pad(dec2hex(b));
 }else{
  return "000000";
 }
}
function dec2hex(d){
 return (isInt(r))?d.toString(16):0;
}
function hex2dec(h){
 return parseInt(h,16);
}
Number.prototype.toOrdinal=function(f){
 var n=this%100;
 var suff=["th","st","nd","rd","th"];
 var ord=(n<21)?((n<4)?suff[n]:suff[0]):((n%10>4)?suff[0]:suff[n%10]);
 return ((f)?this:"")+ord;
}
Number.prototype.toRoman=function(){
 var n=this,r='',d,rn=['IIII','V','XXXX','L','CCCC','D','MMMM'];
 for(var i in rn){
  var x=rn[i].length+1;
  var d=n%x;
  r=rn[i].substr(0,d)+r;
  n=(n-d)/x;
 }
 return r.replace(/DCCCC/g,'CM').replace(/CCCC/g,'CD').replace(/LXXXX/g,'XC').replace(/XXXX/g,'XL').replace(/VIIII/g,'IX').replace(/IIII/g,'IV');
}

var nwords={n0:"zero", n1:"one", n2:"two", n3:"three", n4:"four", n5:"five", n6:"six", n7:"seven", n8:"eight", n9:"nine", n10:"ten", n11:"eleven", n12:"twelve", n13:"thirteen", n14:"fourteen", n15:"fifteen", n16:"sixteen", n17:"seventeen", n18:"eighteen", n19:"nineteen", n20:"twenty", n30:"thirty", n40:"forty", n50:"fifty", n60:"sixty", n70:"seventy", n80:"eighty", n90:"ninety"};

function fmod(n,b){
 return n-b*Math.floor(n/b);
}
function intToWords(x){
 x=parseFloat(x);
 var w="";
	if(x<0){
		w="minus ";
		x=-x;
	}
	if(x<21){
		w+=eval("nwords.n"+x);
	}else if(x<100){
		w+=eval("nwords.n"+(10*Math.floor(x/10)));
		r=fmod(x,10);
		if(r>0){
			w+='-'+eval("nwords.n"+r);
		}
	}else if(x<Math.pow(10,3)){
	 w+=toWordsAux(x,Math.pow(10,2),"hundred");
	}else if(x<Math.pow(10,6)){
	 w+=toWordsAux(x,Math.pow(10,3),"thousand");
	}else if(x<Math.pow(10,9)){
	 w+=toWordsAux(x,Math.pow(10,6),"million");
	}else if(x<Math.pow(10,12)){
	 w+=toWordsAux(x,Math.pow(10,9),"billion");	 
	}else{
	 w+=toWordsAux(x,Math.pow(10,12),"trillion");
	}
	return w;
}
function toWordsAux(x,d,n){
 var v="";
	v=intToWords(Math.floor(x/d))+" "+n;
	r=fmod(x,d);
	if(r>0){
		v+=' ';
		if(r<100){
			v+="and ";
		}
		v+=intToWords(r);
	}
	return v;
}



/* COOKIES */
function getCookie(name){
	var start=document.cookie.indexOf(name+"=");
	var len=start+name.length+1;
	if((!start) && (name!=document.cookie.substring(0,name.length))){
		return null;
	}
	if(start==-1){
  return null;
 }
	var end=document.cookie.indexOf(';',len);
	if(end==-1){
  end=document.cookie.length;
 }
	return unescape(document.cookie.substring(len,end));
}
function setCookie(name,value,expires,path,domain,secure){
	var today=new Date();
	today.setTime(today.getTime());
	if(expires){
		expires=expires*1000*3600*24;
	}
	var expires_date=new Date(today.getTime()+(expires));
	document.cookie=name+'='+escape(value)+
		((expires)?';expires='+expires_date.toGMTString():'')+
		((path)?';path='+path:'')+
		((domain)?';domain='+domain:'')+
		((secure)?';secure':'');
}
function deleteCookie(name,path,domain){
	if(getCookie(name)){
  document.cookie=name+'='+
   ((path)?';path='+path:'')+
   ((domain)?';domain='+domain:'')+
   ';expires=Thu,01-Jan-1970 00:00:01 GMT';
 }
}




/* 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){
    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{
   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{
   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)}
}