
	var submitted=false;
	var alertMsg = "";
function isValid(htmlform){
	var valid=true;
	var elems = htmlform.elements;
	for(var i=0; i<elems.length; i++){
		for(var j=0; j<xx_req_fields.length;j++)
			if(elems[i].name==xx_req_fields[j] && elems[i].value==''){
				valid=false;
				elem=elems[i];
				elem.style.borderColor="#FF8181";
				elem.style.borderStyle="solid";
				elem.style.borderWidth="1px";
			}
	}
	if(!valid) alert("Required field(s) missing");
	return valid;
}
	function safeSubmit(sform,paramAlertMsg){
		if(!isObject(sform))return false;
		if(isdefined("doPreValidation") && doPreValidation && !isValid(sform)) return false;
		if(isValid(sform)){
			if(submitted) alert(alertMsg);
			else {
				submitted=true;
				alertMsg = paramAlertMsg;
				return true;
			}
		}	
		return false;
	}
	function isObject(obj){
		if(typeof obj != "object") return false;	
		else return true;
	}
	function toggle_on_select(selectElement,optionValue,hiddenElem,displayType){
		if (typeof selectElement == 'undefined' || typeof document.getElementById(hiddenElem) == 'undefined' ) return;
		var inverse = (optionValue.charAt(0)=="!");
		var inverse_val = optionValue.substring(1);

		for(var j=0; j<selectElement.options.length ; j++){
		
			if(selectElement.options[j].selected==true && ! inverse){
			
				if(selectElement.options[j].value==optionValue)
				try{	
					document.getElementById(hiddenElem).style.display = displayType;
				}catch(err){
					//alert(selectElement.options[j].value);
					//alert(document.getElementById(hiddenElem).style.display);
					//alert(displayType);
					//alert(err.description);
					break;
				}
				else if(selectElement.options[j].value!=optionValue)
					document.getElementById(hiddenElem).style.display="none";
				
			} else 	if(selectElement.options[j].selected==true && inverse){

				if(selectElement.options[j].value!=inverse_val)
					document.getElementById(hiddenElem).style.display=displayType;
				else if(selectElement.options[j].value==inverse_val)
					document.getElementById(hiddenElem).style.display="none";

			} 
		
		}
		
	}


function isdefined( variable){
    return (typeof(window[variable]) == "undefined")?  false: true;
}

function popUp(URL,width,height) {
day = new Date();
id = day.getTime();
eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=1,location=0,statusbar=0,menubar=0,resizable=1,width="+width+",height="+height+",left = 340,top = 237');");
}
function arrayIndexOf(sarray,str){
	if(!isArray(sarray)||sarray.length ==0) return -1;
	for(var i=0; i<sarray.length; i++){
		if(sarray[i]==str) return i
	}
	return -1;
}

function isArray(obj) {
	if(!obj) return false;
   if (obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
}

function errorFields(elements,formName){
	if(!isArray(elements)||elements.length ==0||formName==""||!isObject(document.forms[formName])) return;

	var formFields = document.forms[formName].elements;
	
	for(var i=0; i<formFields.length; i++){
		var index = arrayIndexOf(elements,formFields[i].name);
		if(index>=0){
			var elem = formFields[i];
			elem.style.borderColor="#FF8181";
			elem.style.borderStyle="solid";
			elem.style.borderWidth="1px";
		}
	}
	/*
	for(var i=0; i<fields.length; i++){
		var elements = document.getElementsByName(fields[i]);
		var elem = elements[0];
		for(var j=0; j<elements.length; j++){
			var elem = elements[j];
				//if(elem.type=="select-one"||elem.type=="text"||elem.type=="text"||elem.type=="select-multiple");
			elem.style.borderColor="#FF8181";
			elem.style.borderStyle="solid";
			elem.style.borderWidth="1px";
		}
	}
	*/
}

function alternateColor(tblname,leaveFromTop,leaveFromBottom,color)
{
	if(document.getElementById(tblname)!=null){
		for(var i=leaveFromTop; i<document.getElementById(tblname).rows.length-leaveFromBottom;i++){
			for(var j=0; j<document.getElementById(tblname).rows[i].cells.length; j++){
				var cell = document.getElementById(tblname).rows[i].cells[j];
				var style = cell.style;
				if(i%2==0)
					style.backgroundColor = color;
				else
					style.backgroundColor = "#ffffff";
			}
		}
	} 
}
		
function formPopulate(varArray, formName){
	if(typeof document.forms[formName] != "object") return;
	
	if(!isArray(varArray)) return;

	var elems = document.forms[formName].elements;
	var elementType = "";
	
	for (var i=0; i<elems.length; i++){ // in elems){
		var arrayelem = false;
		elementType=elems[i].type;
		if((elems[i].name).indexOf("[]")>=0){ // considered to be an array
			var phpName = (elems[i].name).substring(0,(elems[i].name).length-2);
			
			if(elementType=="checkbox"){
			if (typeof varArray[phpName]!="undefined" && isArray(varArray[phpName])){ // the multiple select or check boxes may only have one user option making the variable non-array
			
						for(var j=0;j<varArray[phpName].length;j++){
						if(varArray[phpName][j]==elems[i].value)
							elems[i].checked=true;
					}
				} else { // if user selected only one, we don't need to traverse it (removed 'j' index)
					if(varArray[phpName]==elems[i].value)
						elems[i].checked=true;
				}
			} else if(elementType=="select-multiple"){
				
				if (typeof varArray[phpName]!="undefined"){
					if(isArray(varArray[phpName])){ // the multiple select or check boxes may only have one user option making the variable non-array
						// FOR: traversing through each elements posted by user
						for(var j=0;j<varArray[phpName].length;j++){
							// traversing through the OPTION elements to SELECT
							for(var k=0; k<elems[i].options.length; k++){
								if(elems[i].options[k].value==varArray[phpName][j])
									elems[i].options[k].selected=true;
							}
						}
					}
				}
			}
		} else if (elementType!='hidden'||elems[i].name!="action"){ // we don't want the hidden action element to be populated.
			//if alert ("Changing "+elems[i].value+" to "+varArray[elems[i].name]);
			// TEXT , TEXTAREA, HIDDEN, PASSWORD
			if(elementType=='text'||elementType=='textarea'||elementType=='hidden'||elementType=='password'){ // checking of type TEXT, TextArea, Hidden, and Password
				if(varArray[elems[i].name]) // we only try to populate if we've found any value for it
					elems[i].value=varArray[elems[i].name];
			}
					
			// RADIO, CHECKBOX(single)
			if(elementType=='radio'||elementType=='checkbox'){ // deal radio buttons separately since we don't set value, instead we CHECK
				if(elems[i].value==varArray[elems[i].name])
					elems[i].checked=true;
			}
				
			// SELECT - ONE
			if(elementType=='select-one'){  // deal radio buttons separately since we don't set value, instead we SELECT
				for(var j=0; j<elems[i].options.length; j++){
					if(elems[i].options[j].value==varArray[elems[i].name])
						elems[i].options[j].selected=true;
				}
			}
		}
	}
	return;
	
}

function getFormData(formName,fields){
	
	if((typeof formName)!='object' && typeof document.forms[formName] != "object") return;
	
	// getting the form object
	var formObject = formName;
	if((typeof formName)!='object')
		formObject = document.forms[formName];
	
	
	var elems = formObject.elements;
	var elementType = "";
	var queryString="";
	for (var i=0; i<elems.length; i++){ // in elems){
		var arrayelem = false;
		elementType=elems[i].type;
		if((isArray(fields) && indexOf(fields,elems[i].name)>-1)|| !isArray(fields)){
			if (elementType!='hidden'||elems[i].name!="action"){ // we don't want the hidden action element to be populated.
			
				//if alert ("Changing "+elems[i].value+" to "+varArray[elems[i].name]);
				// TEXT , TEXTAREA, HIDDEN, PASSWORD
				if(elementType=='text'||elementType=='textarea'||elementType=='hidden'||elementType=='password'||elementType=='radio') // checking of type TEXT, TextArea, Hidden, and Password				
				{
						if((elementType=='radio' && elems[i].checked) || elementType!='radio')
						queryString+= elems[i].name+"="+elems[i].value+'&';
				}
						
				// SELECT - ONE
				if(elementType=='select-one'){  // deal radio buttons separately since we don't set value, instead we SELECT
					for(var j=0; j<elems[i].options.length; j++){
						if(elems[i].options[j].selected)
							queryString+= elems[i].name+"="+elems[i].options[j].value+'&';
					}
				}
			}
		}
	}
	
	return queryString;
}
function emailCheck(emailStr) {

    /* The following variable tells the rest of the function whether or not
    to verify that the address ends in a two-letter country or well-known
    TLD.  1 means check it, 0 means don't. */

    var checkTLD=1;

    /* The following is the list of known TLDs that an e-mail address must end with. */

    var knownDomsPat=/^(com|net|org|edu|int|mil|gov|arpa|biz|aero|name|coop|info|pro|museum)$/;

    /* The following pattern is used to check if the entered e-mail address
    fits the user@domain format.  It also is used to separate the username
    from the domain. */

    var emailPat=/^(.+)@(.+)$/;

    /* The following string represents the pattern for matching all special
    characters.  We don't want to allow special characters in the address. 
    These characters include ( ) < > @ , ; : \ " . [ ] */

    var specialChars="\\(\\)><@,;:\\\\\\\"\\.\\[\\]";

    /* The following string represents the range of characters allowed in a 
    username or domainname.  It really states which chars aren't allowed.*/

    var validChars="\[^\\s" + specialChars + "\]";

    /* The following pattern applies if the "user" is a quoted string (in
    which case, there are no rules about which characters are allowed
    and which aren't; anything goes).  E.g. "jiminy cricket"@disney.com
    is a legal e-mail address. */

    var quotedUser="(\"[^\"]*\")";

    /* The following pattern applies for domains that are IP addresses,
    rather than symbolic names.  E.g. joe@[123.124.233.4] is a legal
    e-mail address. NOTE: The square brackets are required. */

    var ipDomainPat=/^\[(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})\]$/;

    /* The following string represents an atom (basically a series of non-special characters.) */

    var atom=validChars + '+';

    /* The following string represents one word in the typical username.
    For example, in john.doe@somewhere.com, john and doe are words.
    Basically, a word is either an atom or quoted string. */

    var word="(" + atom + "|" + quotedUser + ")";

    // The following pattern describes the structure of the user

    var userPat=new RegExp("^" + word + "(\\." + word + ")*$");

    /* The following pattern describes the structure of a normal symbolic
    domain, as opposed to ipDomainPat, shown above. */

    var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$");

    /* Finally, let's start trying to figure out if the supplied address is valid. */

    /* Begin with the coarse pattern to simply break up user@domain into
    different pieces that are easy to analyze. */

    var matchArray=emailStr.match(emailPat);


	/* Too many/few @'s or something; basically, this address doesn't
	even fit the general mould of a valid e-mail address. */
    if (matchArray==null) return false;
	
    var user=matchArray[1];
    var domain=matchArray[2];

    // Start by checking that only basic ASCII characters are in the strings (0-127).
    for (i=0; i<user.length; i++) {
		if (user.charCodeAt(i)>127) {
			return false;
		}
    }
	
    for (i=0; i<domain.length; i++) {
		if (domain.charCodeAt(i)>127) {
			return false;
		}
    }

    // See if "user" is valid 

    if (user.match(userPat)==null) {
		// user is not valid
		return false;
    }

    /* if the e-mail address is at an IP address (as opposed to a symbolic
    host name) make sure the IP address is valid. */

    var IPArray=domain.match(ipDomainPat);
    if (IPArray!=null) {

		// this is an IP address

		for (var i=1;i<=4;i++) {
			if (IPArray[i]>255) {
				return false;
			}
		}
		return true;
    }

    // Domain is symbolic name.  Check if it's valid.

    var atomPat=new RegExp("^" + atom + "$");
    var domArr=domain.split(".");
    var len=domArr.length;
    for (i=0;i<len;i++) {
		if (domArr[i].search(atomPat)==-1) {
			return false;
		}
    }

    /* domain name seems valid, but now make sure that it ends in a
    known top-level domain (like com, edu, gov) or a two-letter word,
    representing country (uk, nl), and that there's a hostname preceding 
    the domain or country. */

    if (checkTLD && domArr[domArr.length-1].length!=2 && 
    domArr[domArr.length-1].search(knownDomsPat)==-1) {
		return false;
    }

    // Make sure there's a host name preceding the domain.

    if (len<2) {
		return false;
    }

    // If we've gotten this far, everything's valid!
    return true;
}

function urlencode(str) {
    // http://kevin.vanzonneveld.net
    // +   original by: Philip Peterson
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: AJ
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: travc
    // +      input by: Brett Zamir (http://brett-zamir.me)
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Lars Fischer
    // +      input by: Ratheous
    // +      reimplemented by: Brett Zamir (http://brett-zamir.me)
    // %          note 1: This reflects PHP 5.3/6.0+ behavior
    // *     example 1: urlencode('Kevin van Zonneveld!');
    // *     returns 1: 'Kevin+van+Zonneveld%21'
    // *     example 2: urlencode('http://kevin.vanzonneveld.net/');
    // *     returns 2: 'http%3A%2F%2Fkevin.vanzonneveld.net%2F'
    // *     example 3: urlencode('http://www.google.nl/search?q=php.js&ie=utf-8&oe=utf-8&aq=t&rls=com.ubuntu:en-US:unofficial&client=firefox-a');
    // *     returns 3: 'http%3A%2F%2Fwww.google.nl%2Fsearch%3Fq%3Dphp.js%26ie%3Dutf-8%26oe%3Dutf-8%26aq%3Dt%26rls%3Dcom.ubuntu%3Aen-US%3Aunofficial%26client%3Dfirefox-a'
 
    var hexStr = function (dec) {
		if(dec==10||dec==13)
			return '%0' + dec.toString(16).toUpperCase();
		else
			return '%' + dec.toString(16).toUpperCase();
    };
 
    var ret = '',
            unreserved = /[\w.-]/; // A-Za-z0-9_.- // Tilde is not here for historical reasons; to preserve it, use rawurlencode instead
    str = (str+'').toString();
 
    for (var i = 0, dl = str.length; i < dl; i++) {
        var ch = str.charAt(i);
        if (unreserved.test(ch)) {
            ret += ch;
        }
        else {
            var code = str.charCodeAt(i);
            // Reserved assumed to be in UTF-8, as in PHP
            if (code === 32) {
                ret += '+'; // %20 in rawurlencode
            }
            else if (code < 128) { // 1 byte
                ret += hexStr(code);
				//alert(hexStr(code));
            }
            else if (code >= 128 && code < 2048) { // 2 bytes
                ret += hexStr((code >> 6) | 0xC0);
                ret += hexStr((code & 0x3F) | 0x80);
            }
            else if (code >= 2048 && code < 65536) { // 3 bytes
                ret += hexStr((code >> 12) | 0xE0);
                ret += hexStr(((code >> 6) & 0x3F) | 0x80);
                ret += hexStr((code & 0x3F) | 0x80);
            }
            else if (code >= 65536) { // 4 bytes
                ret += hexStr((code >> 18) | 0xF0);
                ret += hexStr(((code >> 12) & 0x3F) | 0x80);
                ret += hexStr(((code >> 6) & 0x3F) | 0x80);
                ret += hexStr((code & 0x3F) | 0x80);
            }
        }
    }
    return ret;
}

