/* ################################# INTERFACE ###############################
All functions start with u >> utilities  {exception >>> getID() and ubmitFormMain()}

1.	u_isValidEmail(String email);
2.	u_titleToGender(String titleID,String genderID);
3.	u_fieldLimit(String fieldID, int limit);

11.	u_validDaysForMonthYear(int year,int month,int days);
12.	u_dateParValues(String date);
13.	u_dateTimeStr(int[3] dPar, int h, int min);
14.	u_dateToString(int y, int m, int d);
15. u_daysForYear(int m,int y);
16.	u_dateTimeStr_iCal(int y, int m, int d, int h, int min);
17.	u_dateStr_iCal(int y, int m, int d);
18. u_addDateToField(String fldID, String uName);
19. u_dateTimeStr_long(Date dateObj);

21.	u_validInteger(FieldRef fld);
22.	u_validInteger_range(FieldRef fld, int min, int max, int def);
23.	u_validInteger_pos(FieldRef fld);
25.	u_validValue(FieldRef fld);
26.	u_validValue_pos(FieldRef fld);

31. u_startFileUpload(String sID);
32. u_downLoad(String cmdParList,String sID);
33. u_downLoadFile(String fg,String name,int refID,String sID) {

41.	u_showDlg(String dlgID,int top,int left);
42.	u_hideDlg(String dlgID);
43.	u_deleteDlgRows(String fromID,int numRows);

51. u_removeRow(FieldRef row);

61. u_displayFieldErrors(Array list);
62. u_addErrorMsg(String msg, Array list);

91. u_isRequestDuplicate();
92. u_mouseX(Event evt);
93. u_mouseY(Event evt);

NB: JS can not overload methods ! ! !
###########################################################################*/


/*################################# FUNCTIONS ###############################*/

/*## FUNCTION 1 ##*/
function u_isValidEmail(emailStr) {
	return pri_u_isValidEmail(emailStr);
}

/*## FUNCTION 2 ## */
function u_titleToGender(titleID, genderID) {
    var result = false;
    var title = getID(titleID).value;
    var fG = getID(genderID);
    if(title == "Mr") fG.value = 1;
    if(title == "Sir") fG.value = 1;
    if(title == "Father") fG.value = 1;
    if(title == "Baron") fG.value = 1;
    if(title == "Ms") fG.value = 2;
    if(title == "Mrs") fG.value = 2;
    if(title == "Miss") fG.value = 2;
    if(title == "Sister") fG.value = 2;
    if(title == "Lady") fG.value = 2;
    if(title == "Queen") fG.value = 2;
    if(title == "Queen Mother") fG.value = 2;
    if(title == "Prince") fG.value = 1;
    if(title == "King") fG.value = 1;
}

/*## FUNCTION 3 ## */
function u_fieldLimit(fieldID,limit) {
	var field = getID(fieldID);
  if (field.value.length > limit) {
   	field.value = field.value.substring(0, limit);
  }
}

/*## FUNCTION 11 ######################################################################################################
 - Human readabile
 - TEST only month and day .... year test ie. leap-year stil to implement
*/
function u_validDaysForMonthYear(year, month, days){
    var result = 1;
    if(u_isNumber(year) && u_isNumber(month) && u_isNumber(days)){
        var maxDays = ONU_DAYS_IN_MONTH[month-1];
        if(month == 2 && u_isLeapYear(year)) maxDays = 29;
        var d = parseInt(days);
        result = (( maxDays < d) ? maxDays : ((d < 1)? 1 : d));
    }else{
        alert("Error >> " + year + "-" + month + "-" + days);
    }
    return result;
}


/*## FUNCTION 12 ##
 - strDate: dd-MM-yyyy
 - return {dd,MM,yyyy}
*/
function u_dateParValues(strDate) {
	 var result = null;
    if(strDate.length == 10){
    	result = new Array(3);
    	result[0] = strDate.substr(0,2); // (start, numCh)
    	result[1] = strDate.substr(3,2);
    	result[2] = strDate.substr(6,4);
    }
    else alert("DATE STRING invalid length: [" + strDate.length + "] " + strDate);
    return result; 
}

/*## FUNCTION 13 ## */
function u_dateTimeStr(dPar,h,min){
    return (dPar[0] + "-" + dPar[1] + "-" + dPar[2] + " [" + pri_u_toTwoDiget(h) + "H" + pri_u_toTwoDiget(min) + "]");
}

/*## FUNCTION 14 ## */
function u_dateToString(y,m,d) {
    return (pri_u_toTwoDiget(d) + "-" + pri_u_toTwoDiget(m) + "-" + y); 
}

/*## FUNCTION 15 ##
 - Zero base
*/
function u_daysForYear(m,y){
    var r = 0;
    for(i = 0; i < m; i++){
			r = r + ONU_DAYS_IN_MONTH[i];
    }
    return r;
}

/*## FUNCTION 16 ## 
	yyyyMMdd'T'hhmmss
*/
function u_dateTimeStr_iCal(y,m,d,h,min){
    return (y + pri_u_toTwoDiget(m) + pri_u_toTwoDiget(d) +  "T" + pri_u_toTwoDiget(h) + pri_u_toTwoDiget(min) + "00");
}

/*## FUNCTION 17 ## 
	yyyyMMdd
*/
function u_dateStr_iCal(y,m,d){
    return (y + pri_u_toTwoDiget(m) + pri_u_toTwoDiget(d));
}

/*## FUNCTION 18 ##*/
function u_addDateToField(elID,uName) {
	var txtEL = getID(elID);
	var initials = "";
	
	for (var i=0; i<uName.length; i++) {
  	if (i == 0 || uName.charAt(i-1) == " " || uName.charAt(i-1) == "-") initials += uName.charAt(i);
  }
	
	if(txtEL != null){
		var dStr = u_dateTimeStr_long(new Date())  + " (" + initials + ")";
		txtEL.value = dStr + "  \n" + txtEL.value;
		txtEL.focus();

		if (txtEL.setSelectionRange) { 
			txtEL.focus(); 
			txtEL.setSelectionRange(dStr.length+1, dStr.length+1); 
  	} 
  	else if (txtEL.createTextRange) { 
		  var range = txtEL.createTextRange(); 
		  range.collapse(true); 
		  range.moveEnd('character', dStr.length+1); 
		  range.moveStart('character', dStr.length+1); 
		  range.select(); 
	 	} 
	}
}


/*## FUNCTION 19 ## 
	dd MMM yyyy HH:mm
*/
function u_dateTimeStr_long(dateObj){
    return dateObj.getDate() + " " + ONU_MONTHS_OF_YEAR[dateObj.getMonth()] + " " + dateObj.getFullYear() + " " 
    				+ pri_u_toTwoDiget(dateObj.getHours()) + ":" + pri_u_toTwoDiget(dateObj.getMinutes());
}


/*## FUNCTION 21 ###################################################################################################### 
 - NB: Used in EventProfileBean
*/
var ONU_INTEGER_CHARACTERS = "0123456789-";
function u_validInteger(fld) {
    var v = fld.value;
    var nv = "";
    for(i = 0; i < v.length; i++){
    	var ch = v.charAt(i);
    	if(ONU_INTEGER_CHARACTERS.indexOf(ch) >= 0) nv += ch;
    }
    fld.value = nv;
}

/*## FUNCTION 22 ## */
function u_validInteger_range(fld,min,max,def){
    var v = fld.value;
    var nv = "";
    for(i = 0; i < v.length; i++){
    	var ch = v.charAt(i);
    	if(ONU_INTEGER_CHARACTERS.indexOf(ch) >= 0) nv += ch;
    }
    if(nv >= min && nv <= max) fld.value = nv;
    else fld.value = def;
}


/*## FUNCTION 23 ## */
function u_validInteger_pos(fld) {
    var v = fld.value;
    var nv = "";
    for(i = 0; i < v.length; i++){
    	var ch = v.charAt(i);
    	if(ONU_INTEGER_CHARACTERS.indexOf(ch) >= 0 && ch != '-') nv += ch;
    }
    fld.value = nv;
}

/*## FUNCTION 25 ## 
 - NB: Used in Deal & Product
*/
var ONU_VALUE_CHARACTERS = "0123456789.,-";
function u_validValue(fld) {
    var v = fld.value;
    var nv = "";
    for(i = 0; i < v.length; i++){
    	var ch = v.charAt(i);
    	if(ONU_VALUE_CHARACTERS.indexOf(ch) >= 0) nv += ch;
    }
    fld.value = nv;
}

/*## FUNCTION 26 ## 
 - NB: Used in Deal & Product
*/
function u_validValue_pos(fld) {
    var v = fld.value;
    var nv = "";
    for(i = 0; i < v.length; i++){
    	var ch = v.charAt(i);
    	if(ONU_VALUE_CHARACTERS.indexOf(ch) >= 0 && ch != '-') nv += ch;
    }
    fld.value = nv;
}

/*## FUNCTION 31 ###################################################################################################### */
function u_startFileUpload(sID){
	var elmForm = getID("idFileUploadForm");
	elmForm.style.display = "none";
	elmForm.submit();
	
	var elmProg = getID("idFileUploadProgress");
	elmProg.style.display = "";
	elmProg.innerHTML = "";
	pu_trackFileUploadProgress(sID);
}

function pu_trackFileUploadProgress(sID){
	ajax_RequestPost_cbf("/opennetworks/admin;jsessionid=" + sID + "?cmd=upload_file_progress","","puCBF_fileUploadProgress");
}

function puCBF_fileUploadProgress(jsonStr){
	//alert("RESULT: " + jsonStr);
	var fulJson = ajax_getItemJson(jsonStr);
	var elmProg = getID("idFileUploadProgress");
	if(fulJson.hasError){
		elmProg.innerHTML = fulJson.errMsg;
		getID("idFileUploadForm").style.display = "";
	}
	else{
		if(fulJson.finished){
			elmProg.innerHTML = "Completed";
			getID("idFileUploadForm").style.display = "";
			if(fulJson.is_imagefile) {
				//alert(fulJson.is_imagefile + " >> exec: reqU_addImage");
				reqU_addImage(fulJson.name,fulJson.image_url);
			}
			else {
				//alert(fulJson.is_imagefile + " >> req: fileList");
				var url = "/opennetworks/main;jsessionid=" + fulJson.session_id + "?cmd=file&action=fileList";
				var parList = "&fileGroup=" + fulJson.filegroup_str + "&refID=" + fulJson.ref_id;
				//alert("url["+ url +"] par["+ parList +"]");
				ajax_RequestPost_cbf(url,parList,"puCBF_listFiles");
			}
		 	getID("idFileField").value = "";
		}
		else {
			elmProg.innerHTML = fulJson.completed + "%";
			setTimeout("pu_trackFileUploadProgress('" + fulJson.session_id + "');", 500); 
		}
	}
}

function puCBF_listFiles(jsonStr){
	//alert("RESULT: " + jsonStr);
	var itemJson = ajax_getItemJson(jsonStr);
	var rs = pu_resultLength(itemJson);
	if(rs > 0){
		var fg = itemJson.filegroup_str;
		var fileList = getID("idFileList");
		while(fileList.rows.length > 0) fileList.deleteRow(-1);
		for(var i = 0; i < rs ; i++){
			var fn = itemJson.list[i];
			var rowA = fileList.insertRow(-1);
			rowA.id = "idFileRow_" + fn;
		  var cellA1 = rowA.insertCell(0);
		  cellA1.style.width = "20px";
		 	if(reqU_canDeleteFile()){
		  	cellA1.innerHTML = "<img onmouseover=\"overx(this);\" onclick=\"reqU_deleteFile('" + fg + "','" + fn + "',event);\"" +
		  	 "title=\"Remove\" border=\"0\" src=\"images/delete_small.png\">";
		 	}
		  var cellA2 = rowA.insertCell(1);
			cellA2.innerHTML = "<div class=\"jsLink\" onmouseover=\"overx(this);\" onmouseout=\"outx(this)\" " + 
				"onclick=\"reqU_downLoadFile('" + fg + "','" + fn + "');\">" + fn + "</div>";
		}
	}
}

function pu_resultLength(itemJson){
	var rs = 0;
	if(itemJson.hasError) setInfoMessages("",itemJson.errMsg);
	else rs = (itemJson.list == null)? -1:itemJson.list.length;
	return rs;
}

/*## FUNCTION 32 ##*/
function u_downLoad(cmdParList,sID) {
	if(!document.all) linkParList(cmdParList);
	else{
		var url = "/opennetworks/main;jsessionid=" + sID + "?cmd=";
		var popup = window.open(url + cmdParList,'DownLoad_Window',
			'toolbar=no, directories=no, location=no, status=yes, menubar=no, resizable=no, scrollbars=no, width=100,height=100,left=100,top=100');
		popup.focus();
	}
}
/*## FUNCTION 33 ##*/
function u_downLoadFile(fg,name,refID,sID) {
	var parList = "file&action=getFile&fileGroup=" + fg + "&refID=" + refID + "&fileName=" + escape(name); 
	u_downLoad(parList,sID);
}

function u_downLoadFileXXX(fg,name,refID,sID) {
	var parList = "file&action=getFile&fileGroup=" + fg + "&refID=" + refID + "&fileName=" + escape(name); 
	if(!document.all) linkParList(parList);
	else{
		var url = "/opennetworks/main;jsessionid=" + sID + "?cmd=";
		var popup = window.open(url + parList,'DownLoad_Window',
			'toolbar=no, directories=no, location=no, status=yes, menubar=no, resizable=no, scrollbars=no, width=100,height=100,left=100,top=100');
		popup.focus();
	}
}

/*## FUNCTION 41 ###################################################################################################### */
function u_showDlg(dlgID,top,left){
	var dlgStyle = getID(dlgID).style;
	if(top > 0 && left > 0){
		dlgStyle.top = (top + "px");
		dlgStyle.left = (left + "px");
	}
	dlgStyle.display = "block";
}

/*## FUNCTION 42 ##*/
function u_hideDlg(dlgID){
	getID(dlgID).style.display = "none";
}

/*## FUNCTION 43 ##*/
function u_deleteDlgRows(fromID,numRows){
   var tableTo = getID(fromID);
   var inputCol = tableTo.getElementsByTagName("input");
   for(var i = (inputCol.length - 1); i >= 0 ; i--){
		if(inputCol[i].type == "checkbox" && inputCol[i].checked){
	  		var rowIdx = inputCol[i].parentNode.parentNode.rowIndex;
	  		for(var i = 0; i < numRows ; i++) tableTo.deleteRow(rowIdx);
		}
   }
}


/*## FUNCTION 51 ###################################################################################################### */
function u_removeRow(row){
	row.parentNode.removeChild(row);
}

// replace 51 with ....
function u_removeElement(elm){
  try{
    elm.parentNode.removeChild(elm);
  }
  catch(x){
    //document.location.reload(); ????
  }
}

/*## FUNCTION 61 ###################################################################################################### */
function u_displayFieldErrors(list){
	var fld = getID("idFieldErr_top");
	var txtList = "";
	for(var i = 0; i < list.length ; i++) txtList += list[i];
	if(fld != null) fld.innerHTML = "<ul>" + txtList + "</ul>";
	fld = getID("idFieldErr_bottom");
	if(fld != null) fld.innerHTML = "<ul>" + txtList + "</ul>";
}

/*## FUNCTION 62 ##*/
function u_addErrorMsg(msg,list){
	list.push("<li style=\"font-size: 14px; color: red;\">" + msg + "</li>");
}

/*## FUNCTION 91 ###################################################################################################### */
var ONU_TMP_TIMEVALUE = -1;
function u_isRequestDuplicate(){
	var d = new Date();
	var result = false;
	if(ONU_TMP_TIMEVALUE >= 0){
		var diff = d.getTime() - ONU_TMP_TIMEVALUE;
		result = diff < 1000;
	}
	if(result) alert("Duplicate request!!!");
	else ONU_TMP_TIMEVALUE = d.getTime();
	return result;
}

/*## FUNCTION 92 ##*/
function u_mouseX(evt){
	var mx = 50;
	if(evt.pageX) mx = evt.pageX;
	else if(evt.clientX) mx = evt.clientX + (document.documentElement.scrollLeft ? document.documentElement.scrollLeft : document.body.scrollLeft);
	return mx - 20;
}

/*## FUNCTION 93 ##*/
function u_mouseY(evt){
	var my = 50;
	if(evt.pageY) my = evt.pageY;
	else if(evt.clientY) my = evt.clientY + (document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop);
	return my - 20;
}


/* ############################################################################################################### */
/* ############################################## SPECIAL FUNCTIONS ############################################## */
/* ############################################## SPECIAL FUNCTIONS ############################################## */
/* ############################################################################################################### */
/* 
  - Do not have prefix (u_)
  - Used all over 
  - DO NOT ADD MORE OF THEM
  
  A.	getID(String id);
  B.	overx(FieldRef f);
  C.	outx(FieldRef f);
  D.	overHand(FieldRef f);
  
*/

/*## SPECIAL FUNCTION A ##*/ 
function getID(id){
	return document.getElementById(id);
}

/*## SPECIAL FUNCTION B ##*/
function overx(fx) {
  //fx.style.color = "blue";
  fx.style.textDecoration = "underline";
  fx.style.cursor = "pointer";
}

/*## SPECIAL FUNCTION C ##*/
function outx(fx) {
  //fx.style.color = "blue";
  //fx.style.color = "black";
  fx.style.textDecoration= "none";
}

/*## SPECIAL FUNCTION D ##*/
function overHand(fx) {
  fx.style.cursor = "pointer";
}

/*################################# NOT USED (OLD) FUNCTIONS ###############################*/

/*
 - IF not a number return default value
 - Will parse 34abc >>> 34
*/
function u_toInt(value, defVal){
    var tV = parseInt(value);
    return ((isNaN(tV))? defVal : tV);
}

function u_isNumber(value){
    return !isNaN(parseInt(value));
}

function u_testAlert(id){
    alert("Hello from 'utils/${opennetworks_user.codeReferences.fn_onUtils_js}'...you are >>> " + id);
}

function u_isLeapYear(year){
    var result = false;
    //var ly100 = year % 100;
    //var ly400 = year % 400;
    //var ly4 = year % 4;
    
    if(year % 100 == 0){
       result = (year % 400 == 0); 
    }else{
       result = (year % 4 == 0); 
    }
    //alert("Test Leap year >> " + ly100 + "-" + ly400 + "-" + ly4 + "   ..... " + result);
    return result;
}

// Human readabile ie: 2005-12-31-23-45 >> yyyy-MM-d-HH-mm
// Note: Only used to calc if one date is before the other... leap year do not play a part 
function u_calcDateValue(y,m,d,h,min){
    //alert("IN["+ y +"-"+ m +"-"+ d +"-"+ h +"-"+ min + "]");
    var v = 0;
    var daysFY = u_daysForYear((m-1),y);
    v= min*1 + 60 * h + 60 * 24 * (d-1) + 60 * 24 * daysFY + 60 * 24 * 365 * (y-1900);     
    //alert("DFY = " + daysFY + " V= " + v);

    return v;
}

// Human readabile ?????????????????????????????????????????????????????????? used where ?????
function u_validateA_Before_B(start,end){
    var t = true;
    t = (start <= end);
    return t;
}

/*
 - Used in EventProfileBean: Old published versions can still be around
 - Replaced by: u_validInteger() and u_validInteger_pos() 
*/
function u_isValidDigit(vField) {
    var v = vField.value;
    var nv = "";
    for(i = 0; i < v.length; i++){
    	var ch = v.charAt(i);
    	if(ONU_INTEGER_CHARACTERS.indexOf(ch) >= 0) nv += ch;
    }
    vField.value = nv;
}

/*################################# PRIVATE ###############################*/
/*################################# PRIVATE ###############################*/
/*################################# PRIVATE ###############################*/
/*################################# PRIVATE ###############################*/

/*################################# PRIVATE CONSTANTS ###############################*/

var ONU_DAYS_IN_MONTH = new Array(31,28,31,30,31,30,31,31,30,31,30,31);
var ONU_MONTHS_OF_YEAR = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];

/*################################# PRIVATE FUNCTIONS ###############################*/

function pri_u_toTwoDiget(n) {
	var num = parseInt(n);
    return (num > -1 && num < 10)? ("0" + num) : ("" + num);
}

/*################################# EMAIL VALIDATION FROM HERE ###############################*/

/* Check if the email address is valid. */
function pri_u_isValidEmail(emailStr) {

    emailStr = pri_u_trim(emailStr);

    if (emailStr == "") return true; // blank email addresses are fine


    /* 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=0;

    /* 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|mobi|COM|NET|ORG|EDU|INT|MIL|GOV|ARPA|BIZ|AERO|NAME|COOP|INFO|PRO|MUSEUM|MOBI)$/;

    /* 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);

    if (matchArray==null) {

        /* Too many/few @'s or something; basically, this address doesn't
        even fit the general mould of a valid e-mail address. */

        //alert("Email address seems incorrect (check @ and .'s)");
        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) {
            //alert("Ths username contains invalid characters.");
            return false;
        }
    }
    for (i=0; i<domain.length; i++) {
        if (domain.charCodeAt(i)>127) {
            //alert("This domain name contains invalid characters.");
            return false;
        }
    }

    // See if "user" is valid 

    if (user.match(userPat)==null) {

        // user is not valid
        //alert("The username doesn't seem to be 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) {
                //alert("Destination IP address is invalid!");
                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) {
            //alert("The domain name does not seem to be valid.");
            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) {
        //alert("The address must end in a well-known domain or two letter " + "country.");
        return false;
    }

    // Make sure there's a host name preceding the domain.

    if (len<2) {
        //alert("This address is missing a hostname!");
        return false;
    }

    // If we've gotten this far, everything's valid!
    return true;
}

/* Trim function to trim whitespace from a string on either side. */
function pri_u_trim(TRIM_VALUE){
    if (TRIM_VALUE.length < 1) {
        return "";
    }
    TRIM_VALUE = pri_u_rTrim(TRIM_VALUE);
    TRIM_VALUE = pri_u_lTrim(TRIM_VALUE);
    if (TRIM_VALUE=="") {
        return "";
    } else {
        return TRIM_VALUE;
    }
}

function pri_u_rTrim(VALUE){
    var w_space = String.fromCharCode(32);
    var v_length = VALUE.length;
    var strTemp = "";
    if (v_length < 0) {
        return"";
    }
    var iTemp = v_length -1;

    while (iTemp > -1) {
        if (VALUE.charAt(iTemp) == w_space) {
        } else {
            strTemp = VALUE.substring(0,iTemp +1);
            break;
        }
        iTemp = iTemp-1;
    }
    return strTemp;
}

function pri_u_lTrim(VALUE){
    var w_space = String.fromCharCode(32);
    if (v_length < 1) {
        return"";
    }
    var v_length = VALUE.length;
    var strTemp = "";

    var iTemp = 0;

    while (iTemp < v_length) {
        if (VALUE.charAt(iTemp) == w_space) {
        } else {
            strTemp = VALUE.substring(iTemp,v_length);
            break;
        }
        iTemp = iTemp + 1;
    }
    return strTemp;
}







