// Editor Classfunction Editor(form,screen){  this._name = form;  this._screen = screen;  this._elements = new Array();  this._required = new Array();    this._fieldtypes = new Array();    this._fieldtypes[0] = 'pass';  this._fieldtypes[1] = 'email';  this._fieldtypes[2] = 'autocomplete';    this.saveForm = {    success:this.handleSave,    upload:this.handleUpload,    failure:this.handleFail,    scope: this  };    // some vars  this._box_width = 500;    // create all the stuff for the form  YAHOO.util.Event.onDOMReady(this.loadForm,form,this);}Editor.prototype._name;Editor.prototype._screen;Editor.prototype._elements;Editor.prototype._required;/*  checks the form before we submit it to be saved*/Editor.prototype.checkForm = function() {  // fix various elements of the form  this.checkFormMulti();  var items =  this._elements.length;	var itemsR = this._required.length;	var okcount = 0;	for(var i = 0; items > i; i++){		for(var j = 0; itemsR > j; j++){			if(this._elements[i] == this._required[j]){				okcount+=1;				break;			}		}	}    if(items != okcount){	    this.showBox('Form error','Please ensure all of the required fields are filled in');  }  else{    // show saving box    var title = 'Please wait...';    var msg = '<div align="center"><img src="/images/loading_large.gif" /></div>';    this.showBox(title,msg);        // get the form values    var postVars = '';			var postVarsA = new Array();		var postVarsRadio = new Array();		var div = document.getElementById(this._name);				var elem = div.elements;		var fileuploaded = false;		for(j=0;j<elem.length;j++){			if(elem[j].type == 'radio'){        if(elem[j].checked == true){          postVarsA.push(elem[j].name + '=' + encodeURIComponent(elem[j].value));        }      }      else if(elem[j].type == 'file'){        fileuploaded = true;      }      else{			        postVarsA.push(elem[j].name + '=' + encodeURIComponent(elem[j].value));      }		}				postVars = postVarsA.join("&");				// get the form action    var action = document.getElementById(this._name).action;        // set the form    if(fileuploaded){      YAHOO.util.Connect.setForm(this._name,true);    }    else{      YAHOO.util.Connect.setForm(this._name);    }        // make request				YAHOO.util.Connect.asyncRequest('POST', action, this.saveForm);				    // document.getElementById(this._name).submit();  }  }/*  on form submit setup the <select multi> fileds*/Editor.prototype.checkFormMulti = function(){  var pos = 0;   var temp = '';  var order = new Array();  var div = document.getElementById(this._name);			var elem = div.elements;	for(var j=0;j<elem.length;j++){		temp = elem[j].name;		pos = temp.indexOf('_multi_value');    if(pos > -1){      temp = temp.substring(0,pos);      var list = document.getElementById(temp);      for(var x=0;x<list.options.length;x++){    	  order[x] = list.options[x].value.replace(/\d+\|/, '');    	}    	elem[j].value = order.join(',');    }	}}/*  handles a sucessful upload*/ Editor.prototype.handleUpload = function(o){  document.location = document.location;}/*  handles a sucessful save*/ Editor.prototype.handleSave = function(o){  var type = this.trim(o.getResponseHeader['Content-Type']);    // is xml response  if(type == 'text/xml'){    var form = this._name;    form = form.replace('form','msg');    var div = document.getElementById(form);        var root = o.responseXML.documentElement;          var xml = root.getElementsByTagName('var');          var xml = root.getElementsByTagName('reply');  	var txt = xml[0].getAttribute('text');   	var status = xml[0].getAttribute('status');       	  	if(status == 'ok'){      this.showBox('Complete!',txt);    }    else{      this.showBox('Form error',txt);    }  	  	xml = root.getElementsByTagName('redirect');  	    if(xml[0]){      txt = xml[0].getAttribute('location');      document.location = txt;    }  	 	  }   else{    // somethings gone wrong as we should only ever get an xml response    this.handleFail(o);  } }/*  handles a fail*/Editor.prototype.handleFail = function(o){  alert(this._name + ' ' + o.responseText);}/*  load the form and add things like helptext, required fields etc*/Editor.prototype.loadForm = function(event,args,form){    // deal with the form items  var alldivs = document.getElementsByTagName('form');    var text = '';	var fname = '';	var type = '';	var pos = 0;  for(i=0;i<alldivs.length;i++){		if(alldivs[i].id.indexOf(this._name) != -1){		  var div = document.getElementById(alldivs[i].id);				var elem  = div.elements;            for(j=0;j<elem.length;j++){				fname = elem[j].id;				pos = fname.indexOf("_r");								// add js for help icons        var div = document.getElementById(fname);	        div.onfocus=function(){return showHelp(this,'show');};        div.onblur=function(){return showHelp(this,'hide');};											if(pos > -1){					// field is required          this._elements.push(fname);										propname = fname;          type = fname.substring((pos+3));					fname = fname.substring(0,pos);					editnum = fname.substring(7);										trdiv = document.getElementById('editor_tr_'+editnum);						trdiv = trdiv.getElementsByTagName("td");					lastcol = (trdiv.length-2);					          if(document.getElementById(propname).value != ''){						trdiv[lastcol].innerHTML = '<img src="/images/tick.gif" />';						this._required.push(elem[j].id);					}          else{ 						trdiv[lastcol].innerHTML = '<img src="/images/img_r.gif" />';					}                    if(type == 'email'){						YAHOO.util.Event.addListener(elem[j].id, "keyup", this.fnCallbackEmail, elem[j],this);  					}					else if(type == 'pass'){            YAHOO.util.Event.addListener(elem[j].id, "keyup", this.fnCallbackPass, elem[j],this);					}						else if(type == 'autocomplete'){            this.autoComplete(elem[j].id);          }					else{            if(elem[j].type == 'select-one'){              YAHOO.util.Event.addListener(elem[j].id, "blur", this.fnCallbackR, elem[j],this);            }            else{              YAHOO.util.Event.addListener(elem[j].id, "keyup", this.fnCallbackR, elem[j],this);            }					}								}				else if(fname.indexOf("_autocomplete") > -1){          this.autoComplete(elem[j].id);        }        else if(fname.indexOf("_imgtop") > -1){          pos = fname.indexOf("_imgtop");          fname = fname.substring(0,pos);                    YAHOO.util.Event.addListener(fname, "load", this.loadImageCrop, fname,this);                    }      }  			}	}	}Editor.prototype.loadImageCrop = function(e,obj) {  var Dom = YAHOO.util.Dom, Event = YAHOO.util.Event;    var fname = obj;    $x = (document.getElementById(fname+'_imgtop').value ? document.getElementById(fname+'_imgtop').value : 0);  $y = (document.getElementById(fname+'_imgleft').value ? document.getElementById(fname+'_imgleft').value : 0);   $h = (document.getElementById(fname+'_imgheight').value ? document.getElementById(fname+'_imgheight').value : 0);  $w = (document.getElementById(fname+'_imgwidth').value ? document.getElementById(fname+'_imgwidth').value : 0);           if($h == 0) $h = document.getElementById(fname).height;    if($w == 0) $w = document.getElementById(fname).width;                  var crop = new YAHOO.widget.ImageCropper(fname,{                  initialXY: [$x, $y],                     initHeight: $h,                     initWidth: $w  });    // set the image current width  document.getElementById(fname+'_imgwidthinit').value = document.getElementById(fname).width;  document.getElementById(fname+'_imgheightinit').value = document.getElementById(fname).height;  // watch for any changes to the cropped image            crop.on('moveEvent', function(top) {    var region = crop.getCropCoords();      var elem = crop.getEl();    // set the hidden values    document.getElementById(elem.id+'_imgtop').value = region.top;    document.getElementById(elem.id+'_imgleft').value = region.left;    document.getElementById(elem.id+'_imgheight').value = region.height;    document.getElementById(elem.id+'_imgwidth').value = region.width;  }); }/*  reload the form submitting some of the fields*/Editor.prototype.reloadForm = function(div) {  // get the current location, force to be string also  var loc = ""+document.location+"";    // check how we should add the new value  if(loc.indexOf('?') != -1){      var div2 = document.getElementById(this._name);				var elem = div2.elements;		for(j=0;j<elem.length;j++){			elem[j].name;			elem[j].value;						pos = loc.indexOf(''+ elem[j].name +'=');			if(pos != -1){        loc = loc.substring(0,pos) + elem[j].name + '=' + elem[j].value;      }      else{        loc = loc + '&' + elem[j].name + '=' + elem[j].value;      }            if(div.name == elem[j].name){        break;      }		}  }  else{    loc = loc + '?' + div.name + '=' + div.value;  }  // reload the page  document.location = loc;}/*  deals with auto complete fields*/Editor.prototype.autoComplete = function(divname){  var action = document.getElementById(this._name).action;  YAHOO.example.ACFlatData = new function(){        // Define a custom formatter function      this.fnCustomFormatter = function(oResultItem, sQuery) {          var sKey = oResultItem[0];          var nQuantity = oResultItem[1];          var sKeyQuery = sKey.substr(0, sQuery.length);          var sKeyRemainder = sKey.substr(sQuery.length);          var aMarkup = ["<div class='sample-result'><div class='sample-quantity'>",              nQuantity,              "</div><span class='sample-query'>",              sKeyQuery,              "</span>",              sKeyRemainder,              "</div>"];          return (aMarkup.join(""));      };             if(action.indexOf("?") > -1){        var pos = action.indexOf("?");        action = action.substring(0,pos);      }                // Instantiate one XHR DataSource and define schema as an array:      //     ["Record Delimiter",      //     "Field Delimiter"]      this.oACDS = new YAHOO.widget.DS_XHR(action, ["\n", "\t"]);      this.oACDS.responseType = YAHOO.widget.DS_XHR.TYPE_FLAT;      this.oACDS.maxCacheEntries = 100;      this.oACDS.queryMatchSubset = true;            // Instantiate the autocomplete object      this.oACDS.scriptQueryAppend = "autocomplete=true&field="+divname;       var myInput = document.getElementById(divname);      var myContainer = document.getElementById(divname+'_container');      this.oAutoComp0 = new YAHOO.widget.AutoComplete(myInput,myContainer,this.oACDS);      this.oAutoComp0.queryDelay = 0;      this.oAutoComp0.formatResult = this.fnCustomFormatter;    };}/* deals with password fields */Editor.prototype.fnCallbackPass = function(e,obj){  var str;	str = obj.value;		fname = obj.id;	pos = fname.indexOf("_r");	if(pos > -1){		fname = fname.substring(0,pos);	}		editnum = fname.substring(7);							trdiv = document.getElementById('editor_tr_'+editnum);		trdiv = trdiv.getElementsByTagName("td");	lastcol = (trdiv.length-1);		if(fname.indexOf("confirm") > -1){    var name = obj.id.replace("_confirm","");		var pdiv = document.getElementById(name);		if(pdiv.value == obj.value){ 			trdiv[lastcol-1].innerHTML = '<img src="/images/tick.gif" />';			trdiv[lastcol].innerHTML = '';			obj.className = 'defaultInput';				this._required.push(obj.id);		}		else{			trdiv[lastcol-1].innerHTML = '<img src="/images/img_r.gif" />';			trdiv[lastcol].innerHTML = 'Passwords don\'t match';			obj.className = 'defaultInputRed';						this._required = this.removeArray(this._required,obj.id);		}	}	else{				xpos = obj.value;		xpos = (xpos.length * 15);		//use of numbers in the password		var pw = obj.value;	    var numnumeric = pw.replace (/[0-9]/g, "");	    var numeric=(pw.length - numnumeric.length)*20;	    //use of symbols in the password	    var symbols = pw.replace (/\W/g, "");	    var numsymbols=(pw.length - symbols.length)*20;	    //use of uppercase in the password	    var numupper = pw.replace (/[A-Z]/g, "");	    var upper=(pw.length - numupper.length)*5;				//use of uppercase in the password	    var numlower = pw.replace (/[a-z]/g, "");	    var lower=(pw.length - numupper.length)*5;				var multipler = 0.75;				if(numeric>0) multipler+=0.25;		if(numsymbols>0) multipler+=0.25;		if(upper>0) multipler+=0.25;		if(lower>0) multipler+=0.25;				xpos = (xpos + numeric + numsymbols + upper + lower) * multipler;				if(xpos > 400) xpos = 400;				xpos = "-" + xpos;						if(obj.value.length > 5) {			trdiv[lastcol-1].innerHTML = '<img src="/images/tick.gif" />';			obj.className = 'defaultInput';								this._required.push(obj.id);					}			else {			trdiv[lastcol-1].innerHTML = '<img src="/images/img_r.gif" />';			obj.className = 'defaultInputRed';						this._required = this.removeArray(this._required,obj.id);		}				trdiv[lastcol].innerHTML = '<div align="center">Password Strength<div style="height: 5px; width: 100px; background: url(/images/password_strength.gif) no-repeat ' + xpos + 'px 0px; border: 1px solid #182021; margin-top: 1px;"></div></div>';	}}Editor.prototype.fnCallbackEmail = function(e,obj) { 	var str;	str = obj.value;		fname = obj.id;	pos = fname.indexOf("_r");	if(pos > -1){		fname = fname.substring(0,pos);	}							editnum = fname.substring(7);							trdiv = document.getElementById('editor_tr_'+editnum);	trdiv = trdiv.getElementsByTagName("td");	lastcol = (trdiv.length-1);		if((str.indexOf(".") > 2) && (str.indexOf("@") > 0)){		trdiv[lastcol-1].innerHTML = '<img src="/images/tick.gif" />';		trdiv[lastcol].innerHTML = '';		obj.className = 'defaultInput'; 				this._required.push(obj.id);	}	else{		trdiv[lastcol-1].innerHTML = '<img src="/images/img_r.gif" />';		trdiv[lastcol].innerHTML = 'Email is invalid';		obj.className = 'defaultInputRed';				this._required = this.removeArray(this._required,obj.id);	}}Editor.prototype.fnCallbackR = function(e,obj) {	fname = obj.id;	pos = fname.indexOf("_r");	if(pos > -1){		fname = fname.substring(0,pos);	}							editnum = fname.substring(7);							trdiv = document.getElementById('editor_tr_'+editnum);	trdiv = trdiv.getElementsByTagName("td");	lastcol = (trdiv.length-2);						if(obj.value == ''){		trdiv[lastcol].innerHTML = '<img src="/images/img_r.gif" />';		this._required = this.removeArray(this._required,obj.id);	}	else{		trdiv[lastcol].innerHTML = '<img src="/images/tick.gif" />';		this._required.push(obj.id);	}}Editor.prototype.showBox = function(title,msg){  document.getElementById('freeze_layer').style.visibility = 'visible';  document.getElementById('freeze_layer').style.width = this.getScreenWidth()+'px';  document.getElementById('freeze_layer').style.height = this.getScreenHeight()+'px';     document.getElementById('box_layer').innerHTML = '<table cellpadding="0" cellspacing="0"><tr class="header"><td>'+title+'</td><td align="right"><span class="close" onclick="'+this._screen+'.hideBox();"><span></td></tr><tr><td colspan="2">'+msg+'</td></tr></table>';  document.getElementById('box_layer').style.left = ( ((this.getScreenWidth()/2)-(this._box_width/2)) )+'px';  document.getElementById('box_layer').style.visibility = 'visible';}Editor.prototype.hideBox = function(msg){  document.getElementById('freeze_layer').style.visibility = 'hidden';  document.getElementById('box_layer').style.visibility = 'hidden';}Editor.prototype.getScreenWidth = function(){  var frameWidth;  if(self.innerWidth)  {    frameWidth=self.innerWidth;  }  else if(document.documentElement&&document.documentElement.clientWidth)  {    frameWidth=document.documentElement.clientWidth;  }  else if(document.body)  {    frameWidth=document.body.clientWidth;  }    return frameWidth;}Editor.prototype.getScreenHeight = function(){  var frameHeight;  if(self.innerHeight)  {    frameHeight=self.innerHeight;  }  else if(document.documentElement&&document.documentElement.clientHeight)  {    frameHeight=document.documentElement.clientHeight;  }  else if(document.body){    frameHeight=document.body.clientHeight;  }    return frameHeight;}/*  Moves an element in a multiselect*/ Editor.prototype.nudge = function(div,direction){  var list = document.getElementById(div);  var length = list.length;  var temp = new Object();  if (direction == 'up') {    for (var i = 0; i < length; i++) {      if (list[i].selected) {        for (var n = 0; n < length; n++) {          if (n == i) {            if (n > 0) {              this.swapListItems(list,n,(n - 1));            }          }        }      }    }  }  else {    for (var i = (length - 1); i > -1; i--) {      if (list[i].selected) {        for (var n = 0; n < length; n++) {          if (n == i) {            if (n < (length - 1)) {              this.swapListItems(list,n,(n + 1));            }          }        }      }    }  }}Editor.prototype.swapListItems = function(list,a,b){  var temp = new Object;  temp.value = list[b].value;  temp.text = list[b].text;    temp.selected = list[b].selected;  list[b].value = list[a].value;  list[b].text = list[a].text;    list[b].selected = list[a].selected;  list[a].value = temp.value;  list[a].text = temp.text;    list[a].selected = temp.selected;}/*  remove an item from an array*/Editor.prototype.removeArray = function(arr,str){	var newArr = new Array();	for(var i = 0; arr.length > i; i++){		if(arr[i] != str){			newArr.push(arr[i]);		}	}	return newArr;}/*  function to trim whitespaces*/Editor.prototype.trim = function(str, chars) {    return this.ltrim(this.rtrim(str, chars), chars);}/*  function to trim whitespaces from the left of a string*/Editor.prototype.ltrim = function(str, chars) {    chars = chars || "\\s";    return str.replace(new RegExp("^[" + chars + "]+", "g"), "");}/*  function to trim whitespaces from the right of a string*/Editor.prototype.rtrim = function(str, chars) {    chars = chars || "\\s";    return str.replace(new RegExp("[" + chars + "]+$", "g"), "");}function showHelp(div,type){  var fname = div.id;    var pos = fname.indexOf("_") + 1;  editnum = fname.substring(pos);  pos = editnum.indexOf("_");  if(pos > -1){    editnum = editnum.substring(0,pos);  }    div = document.getElementById("editor_help_"+editnum);  				  var id = div.id + '_hover';  var html = div.title;  var width = 200;  var height = 20;    var top = div.offsetTop;  var left = div.offsetLeft;  tempEl = div.offsetParent;  while(tempEl != null){    top += tempEl.offsetTop;    left += tempEl.offsetLeft;    tempEl = tempEl.offsetParent;  }    // hacks!  left = left - (width + 15);  top = top - 9;    if(type == 'show'){    createDiv(id,html,width+'px',height+'px',left+'px',top+'px');  }  else{    removeDiv(id);  }}function createDiv(id,html,width,height,left,top){  var newdiv = document.createElement('div');  newdiv.setAttribute('id', id);  newdiv.className = "editor_helpbox";    if(width){    newdiv.style.width = width;  }   if(height){    //newdiv.style.height = height;  }  if((left || top) || (left && top)){    newdiv.style.position = "absolute";    if(left){      newdiv.style.left = left;    }    if(top){      newdiv.style.top = top;    }  }    if (html) {    newdiv.innerHTML = html;  }else{    newdiv.innerHTML = "";  }  document.body.appendChild(newdiv);} function removeDiv(id){  var div = document.getElementById(id);  document.body.removeChild(div);}