var loadingNow=true;
function assignEventListeners(checkNow) {
	//alert(formName+', '+formID);
  var inputs = document.getElementsByTagName('input');
	//for(i in inputs) { // doesn't work in IE
  for (i=0;i<inputs.length;i++) {
    var input = inputs[i];
		var type = input.type;
		if(type == "radio" || type == "checkbox") {
      if (input.attributes['sCart']!=null && input.checked==true) addseltotot(input.name,input.value);
      if (!input.name.match(/^a_/)) {
        //alert(input.name);
        
        // Hacks for forms with special needs just after page loads:
        if (checkNow && input.name=='Payment_Type' && formID=='286' && input.checked==true) hack286(input.value,'input');
        
        //chkDepend(input.name,input.value,input.id,'input');
  			if(input.addEventListener) input.addEventListener('click',onClickHandlerRC,false); // Not IE
  			else input.attachEvent('onclick',onClickHandlerRC); // IE
  		}
		}
	}
	loadingNow=false;
	/*
	return; // not working for drop-downs yet...
  var selects = document.getElementsByTagName('select');
  for (i=0;i<selects.length;i++) {
    var select = selects[i];
    if (select.attributes['sCart']!=null) addseltotot(select.name,select.value);
    if (select.attributes['MULTIPLE']!=null) continue;
    if(select.name.match(/\[\]/)) select.name=select.name.substring(0,select.name.length-2);
    
    // Hacks for forms with special needs just after page loads:
    if (select.name=='Payment_Type' && formID=='286') hack286(select.value,'select');
    
    chkDepend(select.name,select.value,select.id,'select');
		if(select.addEventListener) select.addEventListener('change',onChangeHandlerS,false); // Not IE
		else select.attachEvent('onchange',onChangeHandlerS); // IE
  }
  */
} // End function assignEventListeners

function displayDependent(thisElm,testElm,operand,value) { // displays dependent element if parent matches dependency criteria
  var display=false;
  var elms=document.getElementsByName(testElm);
  if(elms.length<2) var elms=document.getElementsByName(testElm+'[]');
  if(operand=='=' && matchAny(value,elms,true)) display=true;
  if(operand=='!=' && matchAny(value,elms,false)) display=true;
  if(operand=='<' && lessThanAny(value,elms)) display=true;
  if(operand=='>' && greaterThanAny(value,elms)) display=true;
  if(display) {
    document.getElementById(thisElm).style.display=''; // do display <tr...
    var reqInput=document.getElementById('req_'+thisElm);
    if(isObject(reqInput)) {
      reqInput.value=value=thisElm; // require input
      document.getElementById('hide_'+thisElm).value=''; // unflag as hidden
    }
    changeMiniReq(thisElm,true);
  }
} // End function displayDependents

function onChangeHandlerS(ev) { // for select (drop-downs) tags only
  ev = ev||window.event; // Different browsers handle this differently...
  var select = (ev.srcElement)?ev.srcElement : ev.target;
  check4redir(select.value);
  if (select.attributes['MULTIPLE']!=null) return;
  if (select.attributes['sCart']!=null) addseltotot(select.name,select.value);
  if(select.name.match(/\[\]/)) select.name=select.name.substring(0,select.name.length-2);
  //alert( select.name+' hellow '+select.value);

  // Hacks for forms with special needs:
  if (select.name=='Payment_Type' && formID=='286') hack286(select.value,'select');

  chkDepend(select.name,select.value,select.id,'select');
} // End function onChangeHandlerS

function onClickHandlerRC(ev) { // for radio and checkbox input tags only
  ev = ev||window.event; // Different browsers handle this differently...
  var input = (ev.srcElement)?ev.srcElement : ev.target;
  
  if (input.attributes['sCart']!=null) addseltotot(input.name,input.value);

  // Hacks for forms with special needs:
  if (input.name=='Payment_Type' && formID=='286') hack286(input.value,'input');

  chkDepend(input.name,input.value,input.id,'input');
  /*
  var inputs = document.getElementsByTagName('input');
	//for(i in inputs) { // doesn't work in IE
  for (i=0;i<inputs.length;i++) {
    var input = inputs[i];
		var type = input.type;
		if(type == "radio" || type == "checkbox") {
      if (input.attributes['sCart']!=null && input.checked==true) addseltotot(input.name,input.value);
      if (!input.name.match(/^a_/)) {
        chkDepend(input.name,input.value,input.id,'input');
  		}
		}
	}
	*/
} // End function onClickHandlerRC

function hack286(value,tag) {  // special needs for form ID 286 -- payment
  //if (/Student Acc/i.test(value)) { // both of these methods work fine:
  //alert(value);
  if(value.match(/Student Acc/i)) {
    document.getElementById('option2').checked=false;
    document.getElementById('option1').checked=true;
    chkDepend('option','eCheck','option1',tag);
  }else{
    document.getElementById('option1').checked=false;
    document.getElementById('option2').checked=true;
    chkDepend('option','eCheck','option2',tag);
  }
} // End function hack286

function chkDepend(name,evalue,id,tag) {
  if(name.match(/\[\]/)) name=name.substring(0,name.length-2);
  //alert(name+', '+evalue+', '+id);
  if(!isObject(compare[name])) return;
  if(!evalue) return;
  var elms=document.getElementsByName(name);
  if(elms.length<2) var elms=document.getElementsByName(name+'[]');
  //if(tag=='select') var elms=document.getElementById(id);
  var i=0;
  while(isObject(compare[name][i])) {
    var obj=compare[name][i];
    var elmTR=document.getElementById(obj.change);
    if(!isObject(elmTR)) {
      //alert('No Object: '+name+' '+evalue+' '+id+' '+i);
      //return;
    }
    var reqInput=document.getElementById('req_'+obj.change);
    var hideInput=document.getElementById('hide_'+obj.change);
    //if(hideInput==null) alert(name+','+evalue+','+id+': hideInput is null! hide_'+obj.change);
    var dis='nothing';
    if(document.getElementById(id).checked==true || tag=='select') { // a checkbox or radio was just checked
      //alert('value:'+obj.value);
      if(obj.operand=='=') {
        if(matchAny(obj.value,elms,true) || obj.value==evalue) dis=true;
        else dis=false;
        //alert(name+':'+obj.value+'='+dis+'; evalue='+evalue);
        //if(tag=='select' && obj.value==evalue) dis=true 
        //if(name='Payment_Type') alert(obj.value+', '+dis+', '+evalue);
      }
      else if(obj.operand=='!=') {
        if(obj.value=='') dis=true;
        else if(matchAny(obj.value,elms,true)) dis=false;
        else dis=true;
        //alert(obj.value+'!='+dis);
        //if(tag=='select' && obj.value!=evalue) dis=true 
      }
      else if(obj.operand=='<' && (evalue < obj.value)) dis=true;
      else if(obj.operand=='<' && (evalue >= obj.value)) dis=false;
      else if(obj.operand=='>' && (evalue > obj.value)) dis=true;
      else if(obj.operand=='>' && (evalue <= obj.value)) dis=false;
    }else if(!loadingNow) { // a checkbox was just unchecked
      if(obj.operand=='=') {
        if(obj.value==evalue) dis=false;
        //alert(obj.value+':'+evalue+':'+dis);
        //if(matchAny(obj.value,elms,false)) dis=true;
        else dis=false;
      }
      else if(obj.operand=='!=') {
        //if(obj.value!=evalue) dis=false;
        if(obj.value.length>0 && matchAny(obj.value,elms,false)) dis=true;
        else dis=false;
        //alert(obj.value+'!='+dis);
        //alert(obj.value+' '+evalue.length);
      }
    }
    if(dis==true && isObject(elmTR)) {
      elmTR.style.display=''; // do display <tr...
      if(isObject(reqInput)) {
        reqInput.value=obj.change; // require input
        hideInput.value=''; 
      }
      setIframeHeight();
    }else if(dis==false && isObject(elmTR)) {
      elmTR.style.display='none'; // don't display <tr...
      //var ttmmp=reqInput.value;
      if(isObject(reqInput)) {
        reqInput.value=''; // don't require input
        hideInput.value=obj.change;
      }
      //alert(ttmmp+'=>'+reqInput.value);
    }
    //alert(elmTR.id);
    changeMiniReq(obj.change,dis);
    //alert(name+' '+reqInput.value);
    i++;
  }
} // End function chkDepend

function changeMiniReq(name,dis) {
  //alert(dis+' '+name);
  if(! isObject(minis[name])) return
  var i=0;
  while(isObject(minis[name][i])) {
    //alert(minis[name][i]['id']);
    var reqInput=document.getElementById('req_'+minis[name][i]['id']);
    if(reqInput && dis==false) reqInput.value='';
    else if(dis==true) reqInput.value=minis[name][i]['id'];
    //alert('req_'+minis[name][i]['id']+' = '+reqInput.value);
    i++;
  }
} // End function changeMiniReq

function setIframeHeight() { // not currently used
  if(!parent.document.getElementById('formIframe')) return;
  var iframeElement = parent.document.getElementById('formIframe');
  var high=document.body.scrollHeight;
  iframeElement.style.height = high+'px';
} // End function setIframeHeight

// Begin Shopping Cart Code

var totalCartItems=0;
function updateCart(cartNum,cost) {
  var qty=document.getElementById('cq_' + parseInt(cartNum)).value;
  var subTotal=qty * cost;
  document.getElementById('ct_' + cartNum).value=subTotal.toFixed(2);
  updateCartTotal();
} // End function updateCart

function addseltotot(name, selval) {
	//alert('addseltotot: '+selval);
	var adtval = selval.match(/\$[0-9\,\.]+/g);
	
	//alert(adtval.length);
	var totrow = "0";
	if (adtval != null && typeof(adtval) == "object") {
		for (var seqsu in adtval) {
			//if(seqsu == "index") break;
			if(seqsu != "input" && seqsu != "index" && seqsu != "lastIndex"){
				//alert(seqsu);
				//alert(adtval[seqsu]);
				adtval[seqsu] = adtval[seqsu].replace(/(\$|\,)/g, '');
				//alert(adtval[seqsu]);
				totrow = Number(totrow) + Number(adtval[seqsu]);
			}
		}
	}
	document.getElementById("ct_radio_"+name).value = totrow;
	updateCartTotal();
} // END function addseltotot

function updateCartTotal() {
  var grandTotal=0;
  for(var j=1; j<=totalCartItems; j++) {
    grandTotal+=parseFloat(document.getElementById('ct_' + j).value);
  } 

// Add radio element values
	var gotbn = pGetByName("input", "ct_radio");
	var grandTotalRS = "0";
	if (isArray(gotbn)) {
		for (var fincon in gotbn) {
			if (!gotbn[fincon].value.match(/[^0-9\.]/)) {
				grandTotalRS = Number(grandTotalRS) + Number(gotbn[fincon].value);
			}
		}
		grandTotal = Number(grandTotal) + Number(grandTotalRS);
	}

  document.getElementById('cart_total').value=grandTotal.toFixed(2);
} // End function updateCartTotal

function clearInput(id) {
  document.getElementById(id).value='';
} // End function clearInput

// if someone leaves the quantity blank, or enters a non-number or negative number, let's change it to zero.
function checkInput(id,cartNum,cost) { 
  var val = document.getElementById(id).value;
  if(!isNum(val) || val<0) {
    document.getElementById(id).value=0;
    updateCart(cartNum,cost);
  }
} // End function checkInput

function checkWriteInInput(id) {
  var val=parseFloat(document.getElementById(id).value);
  if(val) document.getElementById(id).value=val.toFixed(2);
  else document.getElementById(id).value='0.00';
  updateCartTotal();
} // End function checkWriteInInput

// End Shopping Cart Code

function checkDOM(id) { // Validates Day Of Month field in the date element
  var val = document.getElementById(id).value;
  if(!isNum(val) || val<1 || val>31) {
    alert('Sorry, but "'+val+'" is not a valid day.\nDay should be a number between 1 and 31');
    document.getElementById(id).value='';
    //document.getElementById(id).focus(); // doesn't work in FF and causes loop in IE
  }
} // End function checkDOM

function checkYear(id,fYear,lYear) { // Validates Year field in the date element
  var val = document.getElementById(id).value;
  if(val.length!=4 || !isNum(val) || val>lYear || val<fYear) {
    alert('Sorry, but "'+val+'" is not an acceptable year.\nThe year must be in the range of '+fYear+'-'+lYear+'.');
    document.getElementById(id).value='';
    //document.getElementById(id).focus(); // doesn't work in FF and causes loop in IE
  }
} // End function checkYear

function selectUnselectAllCheckedBox(selectAllCheckbox) {
  var theForm=document.getElementById('cbOptions');
  for (i=0;i<theForm.length;i++) 
    //if (theForm[i].name == 'checkedBox[]')
    if (/checkedBox/.test(theForm[i].name))
      theForm[i].checked = selectAllCheckbox.checked;
} // End function selectUnselectAllCheckedBox

function popUp(basePath,type,ridx,path) {
  if(!path) path="newAttachment.php";
  //var theArgs=basePath+path+"?type="+type+"&ridx="+ridx,"formIt_popUp","height=200,width=680,status=no,menubar=auto,location=no";
  //alert(basePath+path+"?type="+type+"&ridx="+ridx);
  vHWin=window.open(basePath+path+"?type="+type+"&ridx="+ridx,"formIt_popUp","height=200,width=680,status=no,menubar=auto,location=no");
  vHWin.focus();
} // End function popUp

function popUpText(txt) {
  vHWin=window.open("","formIt_popUp","height=350,width=800,status=no,menubar=no,location=no");
  vHWin.document.write(txt);
  vHWin.focus();
} // End function popUpText

function confirmDelete(what) {
  return confirm('Do you really want to delete this '+what+'?');
} // End function confirmDelete

function setAndSubmit(id,val) {
  document.getElementByID(id).value=val;
  document.getElementByID('formIt').submit();
} // End function emailForm

function checkDigiSig2(id,fullname) {
  var sig=document.getElementById(id).value;
  if(fullname.length>4 && sig.toLowerCase() == fullname.toLowerCase()) return;
  if(fullname) alert('Your electronic signature must match your login name ('+fullname+')');
  else if(sig.length<5) alert('Please type your full name into the space provided for your electronic signature');
  else return;
  document.getElementById(id).focus();
  //sig='';
  //alert(document.getElementById(id).value);
} // End function checkDigiSig2

// Checks for regex match in the value of any of the elements in array "elms"
function matchAny(regex,elms,checkedStatus) { // regex=regular expression;  elms=an array of elements
 //alert(regex+','+checkedStatus);
 //alert(elms[0].value);
 for(var j=0; j<elms.length; j++) {
   //alert(j+','+elms[j].value);
   //alert(j);
   if(elms[j].checked==checkedStatus && elms[j].value.match(regex)) return true;
  }
} // End function matchAny

function lessThanAny(value,elms) {
 for(var j=0; j<elms.length; j++) {
   if(elms[j].checked==true && elms[j].value<value) return true;
  }
} // End function lessThanAny

function greaterThanAny(value,elms) {
 for(var j=0; j<elms.length; j++) {
   if(elms[j].checked==true && elms[j].value>value) return true;
  }
} // End function greaterThanAny

// This function returns true if a is an object, array, or function. 
//It returns false if a is a string, number, Boolean, null, or undefined.
function isObject(a) {
  return (typeof a == 'object' && !!a) || isFunction(a);
} // END function isObject

// This function returns true if a is a function. Beware that some native 
//functions in IE were made to look like objects instead of functions. 
//This function does not detect that.Netscape is better behaved in this regard.
function isFunction(a) {
    return typeof a == 'function';
} // END function isFunction

  // This function returns true if a is a finite number. It returns false if it is NaN or Infinite. 
function isNum(s) { return(s*2); } // END function isNum

// This function returns true if a is an array, meaning that it was produced 
//by the Array constructor or by the [ ] array literal notation.
function isArray(a) {
  return isObject(a) && a.constructor == Array;
} // END function 

// Redirect if location provided - need for redirects in IE from dropdowns
function check4redir(selectValue) {
	if (selectValue.match('([^>]*>>.*)')) {
		var url = selectValue.replace(/([^>]*>>\s*)/, '');
		document.location=(url);
	}
} // END function check4redir

function pGetByName(tb_tagname, tb_name) {
	var tb_elem = document.getElementsByTagName(tb_tagname);
	var tb_arr = new Array();
	for(tb_i = 0,tb_iarr = 0; tb_i < tb_elem.length; tb_i++) {
		tb_att = tb_elem[tb_i].getAttribute("name");
		if(tb_att == tb_name) {
			tb_arr[tb_iarr] = tb_elem[tb_i];
			tb_iarr++;
		}
	}
	return tb_arr;
} // END function pGetByName

//******************************* FormIt textarea functions ********************************//

function openTMCEC(file,edel,window) {
	//alert(file);
  var elcont = '';
//	if (document.getElementsByName(edel) != null && (typeof document.getElementsByName(edel).value!='undefined')) {
	if (document.getElementsByName(edel) != null) {
//		elcont = document.getElementsByName(edel);
//		if (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent) == true) {
			var tb_tagname = "textarea";
			var tb_name = edel;

			var tb_elem = document.getElementsByTagName(tb_tagname);
			var tb_arr = new Array();
			for(tb_i = 0,tb_iarr = 0; tb_i < tb_elem.length; tb_i++) {
				tb_att = tb_elem[tb_i].getAttribute("name");
				if(tb_att == tb_name) {
					tb_arr[tb_iarr] = tb_elem[tb_i];
					tb_iarr++;
				}
			}
			elcont = tb_arr;
//		}
		elcont = elcont[0].value;
		if (elcont != '')
			elcont = base64_encode(elcont);
	}
	if(window=='noargs') file=file+"?elname="+edel;
	else file = file+"?elname="+edel+"&elcont="+elcont;
	//alert(file);
	childWindow=open(file,window,'resizable=yes,toolbar=no,status=no,menubar=no,width=850,height=700');
	if (childWindow.opener == null) childWindow.opener = self;
} // END function openTMCEC

function updateTMCEP(edel,elcont) {
	if (elcont != "")
		elcont = base64_decode(elcont);

//	if (/msie/i.test(navigator.userAgent) && !/opera/i.test(navigator.userAgent) == true) {
		var tb_tagname = "textarea";
		var tb_name = edel;

		var tb_elem = opener.document.getElementsByTagName(tb_tagname);
		var tb_arr = new Array();
		for(tb_i = 0,tb_iarr = 0; tb_i < tb_elem.length; tb_i++) {
			tb_att = tb_elem[tb_i].getAttribute("name");
			if(tb_att == tb_name) {
				tb_elem[tb_i].value = elcont;
			}
		}
//	}
//	else {
////		var parel = eval("opener.document.formit_main."+edel+".value");
//		opener.document.getElementsByName(edel)[0].value = elcont;
//	}
	self.close();
	return false;
} // END function updateTMCEP

/*  This code was supplanted by limitChars();
function srmcheck(e, container, counter, maxchco) {
	if (typeof e!='undefined') {
		var keynum;
		if (window.event) { // IE
			  keynum = e.keyCode;
		}
		else if(e.which) { // Netscape/Firefox/Opera
			  keynum = e.which;
		}
		if ( keynum == 13 || keynum == 32 || ( keynum > 47 && keynum < 91 ) || ( keynum > 95 && keynum < 112 ) || ( keynum > 185 && keynum < 193 ) || ( keynum > 218 && keynum < 223 ) ) { var countchar = true; }
	}

	if (document.getElementById(container) != null)
		var contlen = document.getElementById(container).value.length;

	if (document.getElementById(counter) != null)
		var counlen = document.getElementById(counter).value;

	var remch = Number(maxchco) - Number(contlen);

	if ( remch < "1" && countchar == true) return false;
	else {
		document.getElementById(counter).value = remch;
		return;
	}

//	alert(contlen);

} // END function srmcheck

function showremchar(e, container, counter, maxchco) {
	var notrim = false;

	if (document.getElementById(container) != null)
		var contlen = document.getElementById(container).value.length;

	if (document.getElementById(counter) != null)
		var counlen = document.getElementById(counter).value;

	var remch = Number(maxchco) - Number(contlen);
	if (remch < "0") remch = "0";

	if (typeof e!='undefined') {
		var keynum;
		if (window.event) { // IE
			  keynum = e.keyCode;
		}
		else if(e.which) { // Netscape/Firefox/Opera
			  keynum = e.which;
		}
		if ( keynum > 32 || keynum < 41)  { notrim = true; }
	}
	
//	if (notrim == false) {
	if (document.getElementById(container).value.length > maxchco)
		document.getElementById(container).value = document.getElementById(container).value.substring(0, maxchco);
//	}
	document.getElementById(counter).value = remch;
	return;

} // END function showrenchar
*/

/*
//limits characters to a specified number,
//keeps track of how many characters are left
function limitChars(elem){
	var textarea = elem;
	var counter = document.getElementById("maxchc_"+textarea.id.replace("_textarea", ""));
	textarea.value = CropVisibleChars(textarea.value, textarea.charLimit);
	counter.value = (textarea.charLimit - CharsBetweenTags());
} //End function limitChars
*/

function limitChars(e){
	var textarea = "";
	if(e.target) textarea = e.target;
	else textarea = e.scrElement;
	var counter = document.getElementById("maxchc_"+textarea.id.replace("_textarea", ""));
	if(counter){
		HTMLtoXML(textarea.value);
		var charsLeft = (textarea.charLimit - CharsBetweenTags());
		if(charsLeft < 0){
			textarea.value = CropVisibleChars(textarea.value, textarea.charLimit);
			counter.value = 0;
			alert("There is a maximum of "+textarea.charLimit+" characters allowed for this field!");
		}else{
			counter.value = charsLeft;
		}
	}
}

function base64_encode( benc_data ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Tyler Akins (http://rumkin.com)
    // +   improved by: Bayron Guevara
    // +   improved by: Thunder.m
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)        
    // -    depends on: utf8_encode
    // *     example 1: base64_encode('Kevin van Zonneveld');
    // *     returns 1: 'S2V2aW4gdmFuIFpvbm5ldmVsZA=='
 
    // mozilla has this native
    // - but breaks in 2.0.0.12!
    //if (typeof window['atob'] == 'function') {
    //    return atob(data);
    //}
        
    var benc_b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var benc_o1, benc_o2, benc_o3, benc_h1, benc_h2, benc_h3, benc_h4, benc_bits, benc_i = benc_ac = 0, benc_enc="", benc_tmp_arr = [];
    benc_data = benc_utf8_encode(benc_data);
    
    do { // pack three octets into four hexets
        benc_o1 = benc_data.charCodeAt(benc_i++);
        benc_o2 = benc_data.charCodeAt(benc_i++);
        benc_o3 = benc_data.charCodeAt(benc_i++);
 
        benc_bits = benc_o1<<16 | benc_o2<<8 | benc_o3;
 
        benc_h1 = benc_bits>>18 & 0x3f;
        benc_h2 = benc_bits>>12 & 0x3f;
        benc_h3 = benc_bits>>6 & 0x3f;
        benc_h4 = benc_bits & 0x3f;
 
        // use hexets to index into b64, and append result to encoded string
        benc_tmp_arr[benc_ac++] = benc_b64.charAt(benc_h1) + benc_b64.charAt(benc_h2) + benc_b64.charAt(benc_h3) + benc_b64.charAt(benc_h4);
    } while (benc_i < benc_data.length);
    
    benc_enc = benc_tmp_arr.join('');
    
    switch( benc_data.length % 3 ){
        case 1:
            benc_enc = benc_enc.slice(0, -2) + '==';
        break;
        case 2:
            benc_enc = benc_enc.slice(0, -1) + '=';
        break;
    }
 
    return benc_enc;
} // END function base64_encode

function base64_decode( data ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Tyler Akins (http://rumkin.com)
    // +   improved by: Thunder.m
    // +      input by: Aman Gupta
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // -    depends on: utf8_decode
    // *     example 1: base64_decode('S2V2aW4gdmFuIFpvbm5ldmVsZA==');
    // *     returns 1: 'Kevin van Zonneveld'
 
    // mozilla has this native
    // - but breaks in 2.0.0.12!
    //if (typeof window['btoa'] == 'function') {
    //    return btoa(data);
    //}
 
    var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
    var o1, o2, o3, h1, h2, h3, h4, bits, i = ac = 0, dec = "", tmp_arr = [];
 
    data += '';
 
    do {  // unpack four hexets into three octets using index points in b64
        h1 = b64.indexOf(data.charAt(i++));
        h2 = b64.indexOf(data.charAt(i++));
        h3 = b64.indexOf(data.charAt(i++));
        h4 = b64.indexOf(data.charAt(i++));
 
        bits = h1<<18 | h2<<12 | h3<<6 | h4;
 
        o1 = bits>>16 & 0xff;
        o2 = bits>>8 & 0xff;
        o3 = bits & 0xff;
 
        if (h3 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1);
        } else if (h4 == 64) {
            tmp_arr[ac++] = String.fromCharCode(o1, o2);
        } else {
            tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
        }
    } while (i < data.length);
 
    dec = tmp_arr.join('');
    dec = benc_utf8_decode(dec);
 
    return dec;
} // END function base64_decode

function benc_utf8_encode ( u8_string ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: sowberry
    // +    tweaked by: Jack
    // +   bugfixed by: Onno Marsman
    // +   improved by: Yves Sucaet
    // +   bugfixed by: Onno Marsman
    // *     example 1: utf8_encode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'
 
    u8_string = (u8_string+'').replace(/\r\n/g, "\n").replace(/\r/g, "\n");
 
    var u8_utftext = "";
    var u8_start, u8_end;
    var u8_stringl = 0;
 
    u8_start = u8_end = 0;
    u8_stringl = u8_string.length;
    for (var u8_n = 0; u8_n < u8_stringl; u8_n++) {
        var u8_c1 = u8_string.charCodeAt(u8_n);
        var u8_enc = null;
 
        if (u8_c1 < 128) {
            u8_end++;
        } else if((u8_c1 > 127) && (u8_c1 < 2048)) {
            u8_enc = String.fromCharCode((u8_c1 >> 6) | 192) + String.fromCharCode((u8_c1 & 63) | 128);
        } else {
            u8_enc = String.fromCharCode((u8_c1 >> 12) | 224) + String.fromCharCode(((u8_c1 >> 6) & 63) | 128) + String.fromCharCode((u8_c1 & 63) | 128);
        }
        if (u8_enc != null) {
            if (u8_end > u8_start) {
                u8_utftext += u8_string.substring(u8_start, u8_end);
            }
            u8_utftext += u8_enc;
            u8_start = u8_end = u8_n+1;
        }
    }
 
    if (u8_end > u8_start) {
        u8_utftext += u8_string.substring(u8_start, u8_string.length);
    }
 
    return u8_utftext;
} // end function benc_utf8_encode

function benc_utf8_decode ( str_data ) {
    // http://kevin.vanzonneveld.net
    // +   original by: Webtoolkit.info (http://www.webtoolkit.info/)
    // +      input by: Aman Gupta
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Norman "zEh" Fuchs
    // +   bugfixed by: hitwork
    // +   bugfixed by: Onno Marsman
    // *     example 1: utf8_decode('Kevin van Zonneveld');
    // *     returns 1: 'Kevin van Zonneveld'
 
    var tmp_arr = [], i = ac = c1 = c2 = c3 = 0;
 
    str_data += '';
 
    while ( i < str_data.length ) {
        c1 = str_data.charCodeAt(i);
        if (c1 < 128) {
            tmp_arr[ac++] = String.fromCharCode(c1);
            i++;
        } else if ((c1 > 191) && (c1 < 224)) {
            c2 = str_data.charCodeAt(i+1);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
            i += 2;
        } else {
            c2 = str_data.charCodeAt(i+1);
            c3 = str_data.charCodeAt(i+2);
            tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
            i += 3;
        }
    }
 
    return tmp_arr.join('');
} // end function benc_utf8_decode

//***************************** FormIt AJAX search functions *******************************//

function ajax(url,container,obvar,loc) {
// native XMLHttpRequest object
	if (window.XMLHttpRequest) { obvar = new XMLHttpRequest(); }
// IE/Windows ActiveX version
	if (window.ActiveXObject) { obvar = new ActiveXObject("Microsoft.XMLHTTP"); }
	if (obvar) {
		obvar.onreadystatechange = function() {ajaxDone(container,obvar,loc);};
		obvar.open("GET", url, true);
		obvar.send(null);
	}
} // END function ajax

function ajaxDone(container,obvar,loc) {
// only if obvar is "loaded"
	if (obvar.readyState == 4) {
// only if "OK"
		if (obvar.status == 200 || obvar.status == 304) {
			if (loc == "overLib" && obvar.responseText!=null) {
				if (toid!=null) {
					clearTimeout(toid);
					nd();
				}
				overlib(obvar.responseText, ABOVE, FGCOLOR, '#f0ebe1', TEXTCOLOR, 'blue', WRAP, CENTER);
				toid=setTimeout("nd()", 5000);
			}
			else {
	  			document.getElementById(container).innerHTML = obvar.responseText;
			}
		}
		else {
			document.getElementById(container).innerHTML="ajax error:\n" + obvar.statusText;
		}
	}
} // END function ajaxDone

function formSearch(purl) {
  var mres="";
  var searchStr = document.getElementById('searchStr').value;
  if(searchStr.length>2) {
    if (purl) { var url=purl; }
    else { var url=""; }
    url=url+"?search="+searchStr;
    var username="&username=";
    if (document.getElementById('username').checked==true) {
      username=username+document.getElementById('username').value;
    }
    var options="";
    if (document.getElementById('form_name') && document.getElementById('form_name').checked==true) {
      options=options+"form_name;"
    }
    if (document.getElementById('tags') && document.getElementById('tags').checked==true) {
      options=options+"tags;"
    }
    if (document.getElementById('title') && document.getElementById('title').checked==true) {
      options=options+"title;"
    }
    if (document.getElementById('introduction') && document.getElementById('introduction').checked==true) {
      options=options+"introduction;"
    }
    url=url+username+"&options="+options;
    ajax(url,"searchResultsContainer",mres);
  }
  if(searchStr.length<3) document.getElementById('searchResultsContainer').innerHTML = '';
} // END function formSearch 
    
//******************************** FormIt onLoad functions *********************************//

// Initialise

try {
	window.addEventListener?window.addEventListener("load",efol(),false):window.attachEvent("onload",efol());

// for Mozilla
if (document.addEventListener) {
	document.addEventListener("DOMContentLoaded", efol(), false);
}

// for IE
/*@cc_on @*/
/*@if (@_win32)
	document.write("<script defer>efol()<\/script>");
/*@end @*/

// Old style
//	window.onload = efol();

}
catch (e) {
}

function efol() {
	var sTO = "55"; // sesstion timeout in minutes
//	var trackTO = setTimeout(reloadFormIt, sTO*60*1000);
} // END function efol

function reloadFormIt() {
	if (document.getElementById('authisreq')) {
		alert("I'm sorry, but your login time has expired. Please click here to re-login.");
//		location.reload(true);
		window.location.reload(true);
	}
} // END function reloadFormIt

//*************************** FormIt submit validation functions ***************************//

// Validation function for copying forms
function chns(e) {
	var fail = false;
	var execute = true;
	var newName = document.getElementById('newName').value;
	var newTitle = document.getElementById('newTitle').value;

	if (typeof e!='undefined') {
		var keynum;
		if (window.event) { // IE
			  keynum = e.keyCode;
		}
		else if(e.which) { // Netscape/Firefox/Opera
			  keynum = e.which;
		}
		if (keynum != 13) { var execute = false; }
	}

	if (execute == true) {
		if (newName != '') {
			if (newName.match(/[^a-zA-Z0-9\-]/)) {
				window.alert('The form name can contain only letters, numbers and/or dashes (no spaces or special characters). Please, correct it and try again.');
				fail = true;
			}
		}
		else {
			window.alert('Please provide a name for the new form');
		}
		if (newTitle == '') {
			window.alert('Please provide a title for the new form');
			fail = true;
		}
		if (fail != true) { document.forms.copy_form.submit(); }
	}
} // END function chns

function verifyHuman() {
  var hia=8*document.getElementById('hia').value;
  //alert('hia:'+hia); return false;
  if (hia<2) return true;
  
  var ans=document.getElementById('vhuman_answer').value;
	if (hia == ans) return true;

	alert('Wrong answer. Think harder... (hint: '+hia+')');
	return false;
  
	//unused code below...
  var vhumstat = true;
	if (document.getElementById('vhuman_rnum1')) var rnum1=document.getElementById('vhuman_rnum1').value;
	if (document.getElementById('vhuman_rnum2')) var rnum2=document.getElementById('vhuman_rnum2').value;

	if (rnum1 > "0" && rnum2 > "0") {
		var canswer= parseInt(rnum1) + parseInt(rnum2);
		if (document.getElementById('vhuman_answer')) var uanswer=document.getElementById('vhuman_answer').value;
		if (rnum1 != '0' && rnum2 != '0') {
			if (uanswer != canswer) {
				alert('Wrong answer. Think harder... (hint: '+canswer+')');
				vhumstat = false;
			}
			if (uanswer == canswer) vhuman = true;
		}
	}
	return vhumstat;
} // END function verifyHuman

var fnRef='void(1)';

function emailConfirmation() {
	var confstat = true;
	var retmes = false;
	var allConfirm = document.getElementsByName('conftag');
	if (allConfirm.length > "0") {
		for (var confname in allConfirm) {
			if (typeof allConfirm[confname].value!='undefined') {
				var test_field = document.getElementById('ectg_'+allConfirm[confname].value);
				var test_confirm = document.getElementById('cctg_'+allConfirm[confname].value);
				if (test_field != null && test_confirm != null) {
					if (test_field.value != test_confirm.value) {
						document.getElementById('cmsg_'+allConfirm[confname].value).innerHTML = "Addresses do not match!";
						alert ("Please check for non-matching e-mail addresses");
						confstat = false;
					}
					else {
						document.getElementById('cmsg_'+allConfirm[confname].value).innerHTML = "";
						if (test_field.value != "" && !test_field.value.match(/.*@.*\..*/)) {
							document.getElementById('cmsg_'+allConfirm[confname].value).innerHTML = "Addresses do not appear to be valid!";
							alert ("Please provide valid e-mail addresses");
							confstat = false;
						}
						else {
							document.getElementById('cmsg_'+allConfirm[confname].value).innerHTML = "";
						}
					}
					test_field = null;
					test_confirm = null;
				}
			}
		}
	}
	return confstat;
} // END function emailConfirmation

function textConfirmation() {
	var confstat = true;
	var retmes = false;
	var allConfirm = document.getElementsByName('conftag');
	if (allConfirm.length > "0") {
		for (var confname in allConfirm) {
			if (typeof allConfirm[confname].value!='undefined') {
				var test_field = document.getElementById('tctg_'+allConfirm[confname].value);
				var test_confirm = document.getElementById('cctg_'+allConfirm[confname].value);
				if (test_field != null && test_confirm != null) {
					if (test_field.value != test_confirm.value) {
						document.getElementById('cmsg_'+allConfirm[confname].value).innerHTML = "These fields do not match. Please correct...<br />";
						alert ("Please check for non-matching content");
						confstat = false;
					}
					else {
						document.getElementById('cmsg_'+allConfirm[confname].value).innerHTML = "";
// Place for checking for bad characters, words, patterns, etc.
//						if (test_field.value != "" && !test_field.value.match(/.*@.*\..*/)) {
//							document.getElementById('cmsg_'+allConfirm[confname].value).innerHTML = "Addresses do not appear to be valid!";
//							alert ("Please provide valid e-mail addresses");
//							confstat = false;
//						}
					}
					test_field = null;
					test_confirm = null;
				}
			}
		}
	}
	return confstat;
} // END function textConfirmation

function validateFormIt(e,force) {
	var clstat = true;

// Force submission termination
	if (force == "fail") return false;
 
// Verify human
	if (verifyHuman() == false) clstat = false;

// Matching fields (e-mail addresses)
	if (emailConfirmation() == false) clstat = false;

// Matching fields (text fields)
	if (textConfirmation() == false) clstat = false;

	if (clstat == false) return false;

} // END function validateFormIt

function testFileType( fileName, fileTypes ) {
  if (!fileName) return false;
  dots = fileName.split(".")
  //get the part AFTER the LAST period.
  fileType = "." + dots[dots.length-1];
  if(fileTypes.join(".").indexOf(fileType) == -1) { 
    alert("Only the following file types are accepted: \n\n." + (fileTypes.join(" .")) + "\n\nPlease select a file of one of these types.");
    return false;
  }
  return true;
} // END function testFileType

/*========================================================================================================
 * Function for adding a Filter to an Input Field                                   
 * @param  : [filterType  ] Type of filter 0=>Alpha, 1=>Num, 2=>AlphaNum, 3=>None   
 * @param  : [evt         ] The Event Object                                        
 * @param  : [allowDecimal] To allow Decimal Point set this to true                 
 * @param  : [allowCustom ] Custom Characters that are to be allowed                
  Examples : 
   onKeyPress="filterInput(0,event);"  // alpha characters only 
   onKeyPress="filterInput(1,event);"  // numbers only 
   onKeyPress="filterInput(1,event,true);"  // money: nums and only one decimal 
   onKeyPress="filterInput(2,event);"  // alpha numeric characters only 
   onKeyPress="filterInput(3,event,false,'as;dlkfmn1234*');"  // only allow these chars: as;dlkfmn1234* 
#=========================================================================================================*/
function filterInput(filterType, evt, allowDecimal, allowCustom){
	var keyCode, Char, inputField, filter = '';
	var alpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
	var num   = '0123456789';
	// Get the Key Code of the Key pressed if possible else - allow
	if(window.event){
		keyCode = window.event.keyCode;
		evt = window.event;
	}else if (evt)keyCode = evt.which;
	else return true;
	// Setup the allowed Character Set
	if(filterType == 0) filter = alpha;
	else if(filterType == 1) filter = num;
	else if(filterType == 2) filter = alpha + num;
	if(allowCustom)filter += allowCustom;
	if(filter == '')return true;
	// Get the Element that triggered the Event
	inputField = evt.srcElement ? evt.srcElement : evt.target || evt.currentTarget;
	// If the Key Pressed is a CTRL key like Esc, Enter etc - allow
	if((keyCode==null) || (keyCode==0) || (keyCode==8) || (keyCode==9) || (keyCode==13) || (keyCode==27) )return true;
	// Get the Pressed Character
	Char = String.fromCharCode(keyCode);
	// If the Character is a number - allow
	if((filter.indexOf(Char) > -1)) return true;
	// Else if Decimal Point is allowed and the Character is '.' - allow
	else if(filterType == 1 && allowDecimal && (Char == '.') && inputField.value.indexOf('.') == -1)return true;
	else return false;
} // End function filterInput

