/*---------------------------------------------------------------------------------------------------------
 Yardi Common JavaScript Library
 Copyright 1999-2000 (c) Yardi Systems, Inc.
[3] Error - displays an error
[4] Empty - checks if string is empty
[5] ValidLength - checks is string is of a valid length
[6] ValidInt - checks if number is a valid integer
[7] ValidCurrency - checks if number is a valid currency
[8] ValidateDate - checks if object is valid date
[9] ValidPhone - checks if string is valid phone number
[16] GotChange - set bDataChanged = true
[21] SetCookie - Sets a cookie
[22] GetCookie - Returns a cookie
[30] FormatNumber - formats a number with the mask (i.e. 100 -> 100.00)
[35] FT_FinalTest - checks for mandatory fields on sys generated filters
[45] FormatNumber2 - truncates extra digits from numbers
[46] Round - rounds numbers to 2 digits.
[49] FormatPhoneNum - guess
[54] ValidateTime - validates time in hh:mm format
[55] CurrentDate - returns string of current date
[82] isValidInteger - Test if a string is a valid number like 123 or -1,234,567
[83] parseInteger - strips commas (or rather thousand separators) out, executes parseInt
[84] formatInteger - formats a number with the mask (i.e. 100 -> 100.00)
[85] validInteger - checks if number in a field on the form is a valid integer between a min and a max value and formats the number with thousand separators
[100] trim function for the built-in JavaScript String object
-----------------------------------------------------------------------------------------------------------*/

//[3]
function error(elem, text, bSelect) {
// display the first error
   var ss;

   if (typeof(text)  == "undefined") { window.alert("Undefined error."); this.select()}
   window.alert(text);
   if (typeof(elem)  == "undefined") {return}
   if (elem == "n"){return}
   if (elem.disabled == true) {return}
   if (bSelect != "false") {
      if (bSelect != "combo") {          
        try {
      	  document.forms[0].elements[elem.name].focus();        
      	  document.forms[0].elements[elem.name].select();        
      	}
      	catch (any) { }
      }
   };
   errorfound = true;
}

//[4]
function Empty(num) {
  if (num == "") return true;
  num = num.toString();		/* ensure variable num is of datatype string before we use string routines */
  for (var i = 0; (i < num.length); i++) {
  	if (num.charAt(i) == " ") continue;
  	else return false; 
  }
  return true;	  
}

//[5]
function ValidLength(item, maxlen) {
   if (Empty(item.value)) return true;
   return (item.Length <= maxlen);
}

//[6]
function ValidInt(numObj)
{
	var sTest = numObj.value;
	var sGUID = GetCookie("bEuroNum");
	var sPattern;
	var bTemp = false;
	
	/* check for numbers like 123 */
	var re = new RegExp("^(-\\d)?\\d*$");
	bTemp = (re.test(sTest)) ? true : bTemp;
	
	/* check for numbers like 1,234 and -123,456,789 */
	sPattern = (sGUID == "true") ? "^-?\\d{1,3}(\\.\\d{3})*$" : "^-?\\d{1,3}(\\,\\d{3})*$";
	re.compile(sPattern);
	bTemp = (re.test(sTest)) ? true : bTemp;
	if (! bTemp)
	{
		error(numObj, "Invalid number");
	}
	return bTemp;
}

//[7]
function ValidCurrency(numObj, iMin, iMax)
{
	var sTest = numObj.value;
	iMin = (iMin == null) ? -1000000000 : iMin;
	iMax = (iMax == null) ?  1000000000 : iMax;

	/* test if number is valid currency format */
	if (Empty(sTest)) {return true;}
	if (! isValidMoneyFormat(sTest, 2))
	{
		error(numObj, "Invalid number.");
		return false;
	}
	
	/* get number back as US format without thousand separator */
	sTest = parseNum(numObj, 2);

	/* test if number is within min and max limits */
	if (! ValidMinMax(sTest, iMin, iMax))
	{
		error(numObj, "Invalid number.");
		return false;
	}
	
	numObj.value = sTest;
	FormatNumber(numObj);
	return true;
}

//[8]
function ValidateDate(obj)
{
  var ilen;
  var sout;
  var yy, mm, dd;
  var tmp;
  var inumsep;
  var imonth, iyear, iday;
  var serr;
  var isep1, isep2;  //holds position of "/"
  var imstart, imlen;
  var idstart, idlen;
  var iystart, iylen;
  var bJapan
  
  var ss = new String(obj.value);
  var d = new Date();
  var m = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
    var window = 50;  //year cutoff when yy is passed in (i.e. 49 = 2049, 50 = 1950)

        var sGUID = GetCookie("bEuroDate");
        var sJAPAN = GetCookie("bJapanDate");
    if (sGUID == "true") {bEuro = true}
    else                 {bEuro = false}

    if (sJAPAN == "true") {bJapan = true}


  ilen = ss.length;
  iday = 0;  //in case is never gets set below
  
  // check for required field

  if( typeof(obj.isRequired) == "undefined"){
    obj.isRequired = false;   // default not required
  }



  if (ilen == 0) {return true;}

  // check for .isDay
  if( typeof(obj.isDay) == "undefined"){
    obj.isDay = false;      // default to not expecting days - month & year only
                           
  }

  //set error message
  if (bEuro == false) {
    if (obj.isDay) {serr = "Expecting date in mm/dd/yyyy format."}
    else {serr = "Expecting date in mm/yyyy format."}
  }
  else {
    if (obj.isDay) {serr = "Expecting date in dd/mm/yyyy format."} 
    else {serr = "Expecting date in mm/yyyy format."}
  }

  if (bJapan == true) {
    if (obj.isDay) {serr = "Expecting date in yyyy/mm/dd format."}
    else {serr = "Expecting date in yyyy/mm format."}
  }     
  

  // all chars must be numeric or "/"
  inumsep = 0
  for( var i = 0; i < ilen; i++){
    tmp = ss.charAt(i);
    if (tmp == '/') {
      inumsep = inumsep + 1;
      if (inumsep == 1) {isep1 = i}
      else if (inumsep == 2) {isep2 = i}
    }
  }

  //check for valid number of "/"
     if (obj.isDay && inumsep > 2) {error(obj, serr); return false;}
     else if (!obj.isDay && inumsep > 1) {error(obj, serr); return false;}

  if (bJapan != true) {
     //check for valid placement of "/"
     if (inumsep > 0) {
        if (isep1 != 1 && isep1 != 2 && isep1 != 5) {error(obj, serr); return false;}
     }
     if (inumsep > 1) {
        if (isep2 != 3 && isep2 != 4 && isep2 != 5) {error(obj, serr); return false;}
      }
  }
  else
  {
     //check for valid placement of "/"
     if (inumsep > 0) {
        if (isep1 != 2 && isep1 != 4) {error(obj, serr); return false;}
     }
     if (inumsep > 1) {
        if (isep2 != 4 && isep2 != 5 && isep2 != 6 && isep2 != 7) {error(obj, serr); return false;}
      }  	
  }  	      


  //set start and length of month, day and year
  if (inumsep == 0) {
    if (ilen == 4) {
      imstart = 0; imlen = 2;
      iystart = 2; iylen = 2;
      if (bJapan == true) {
      	iystart = 0; iylen = 2;
      	imstart = 2; imlen = 2;      	
      }
    }
    else if (ilen == 6 && obj.isDay) {
      imstart = 0; imlen = 2;
      idstart = 2; idlen = 2;
      iystart = 4; iylen = 2;
      if (bJapan == true) {
      	iystart = 0; iylen = 2;
      	imstart = 2; imlen = 2;
      	idstart = 4; idlen = 2;
      }
    }  
    else if (ilen == 6 && !obj.isDay) {
      imstart = 0; imlen = 2;
      iystart = 2; iylen = 4;
      if (bJapan == true) {
      	iystart = 0; iylen = 4;
      	imstart = 4; imlen = 2;      	
      }
    }  
    else if (ilen == 8) {
      imstart = 0; imlen = 2;
      idstart = 2; idlen = 2;
      iystart = 4; iylen = 4;
      if (bJapan == true) {
      	iystart = 0; iylen = 4;
      	imstart = 4; imlen = 2;
      	idstart = 6; idlen = 2;
      }     
    }
  }
  else if (inumsep == 1) {
    imstart = 0; imlen = isep1;
    iystart = isep1  + 1; iylen = ilen - isep1 - 1;
    if (bJapan == true) {
      iystart = 0; iylen = isep1;
      imstart = isep1  + 1; imlen = ilen - isep1 - 1;
    }  	
  }
  else if (inumsep == 2) {
    imstart = 0; imlen = isep1;
    idstart = isep1  + 1; idlen = isep2 - isep1 - 1;
    iystart = isep2 + 1; iylen = ilen - isep2 - 1;
    if (bJapan == true) {
      iystart = 0; imlen = isep1;
      imstart = isep1  + 1; idlen = isep2 - isep1 - 1;
      idstart = isep2 + 1; iylen = ilen - isep2 - 1;
    }
  }

  if (obj.isDay != false) {
  if (bEuro==true && obj.isDay.toUpperCase() == 'TRUE') {
    //switch it all around
    ii = imstart;
    ij = imlen;
    imstart = idstart;
    imlen = idlen;
    idstart = ii;
    idlen = ij;
  }
}

  if (obj.isDay != false) {
  if (bJapan==true && obj.isDay.toUpperCase() == 'TRUE') {
    //switch it all around
    if (inumsep == 2) {
    	iystart = 0; iylen = isep1;
    	imstart = isep1  + 1; imlen = isep2 - isep1 - 1;
    	idstart = isep2 + 1; idlen = ilen - isep2 - 1;
    }
  }
  }


  imonth = parseInt(ss.substr(imstart, imlen), 10);  //10 param sets to base 10 (default is 8!)
                 //without it, "08" and "09" returned 0
  iyear = parseInt(ss.substr(iystart, iylen), 10);
  if (obj.isDay) { iday = parseInt(ss.substr(idstart, idlen), 10) }

  if (isNaN(imonth) || isNaN(iyear) || isNaN(iday)) {error(obj, serr); return false;}

  if (obj.isDay) {serr = "Date out of range."} else {serr = "Expecting date in mm/yy format."}
  if (iylen != 4 && iylen != 2) {error(obj, serr); return false;}
  if (imlen != 1 && imlen != 2) {error(obj, serr); return false;}
  if (obj.isDay) {
  if (idlen != 1 && idlen != 2) {error(obj, serr); return false;}
    }

  if (imonth < 1 || imonth > 12) {error(obj, serr); return false;}
  if (iylen == 4 && (iyear < 1875 || iyear > 2199)) {error(obj, serr); return false;}
  //SA052802  change year range lower limit from 1900 to 1875 for affordable tenants birthdates
  //MRB	      change year range upper limit from 2100 to 2199 for leases in good old England
  if (iylen == 2 && (iyear < 0 || iyear > 99)) {error(obj, serr); return false;}
  if ( (obj.isDay) && (iday < 1 || iday > 31) ) {error(obj, serr); return false;}

  mm = imonth;
  mm = mm > 9 ? mm : "0" + mm.toString();
  dd = iday;
  dd = dd > 9 ? dd : "0" + dd.toString();
  yy = iyear;
  yy = yy > 9 ? yy : "0" + yy.toString();

    if (iyear < 1000) {
    if (parseInt(yy) < window ) {yy = "20" + yy }
    else { yy = "19" +  yy }
    iyear = parseInt(yy)
  }


  //30 days hath November...
  if ((imonth == 1) || (imonth == 3) || (imonth == 5) || (imonth == 7) || (imonth == 8) || (imonth == 10) || (imonth == 12)) {
      if (iday > 31) {error(obj, serr); return false;}
  }
  else if ((imonth == 4) || (imonth == 6) || (imonth == 9) || (imonth == 11) ) {
      if (iday > 30) {error(obj, serr); return false;}
  }
  else if (imonth == 2) {
      //leap year, every 4 years, except centuries that are not evenly
      //divisible by 100
      imod = iyear % 4
      imod2 = iyear % 100
      if (imod == 0 && ( (imod2 != 0) || (iyear % 400 == 0) )) {  
        if (iday > 29) {error(obj, serr); return false;}
      }
      else {
        if (iday > 28) {error(obj, serr); return false;}
      }
  }

if (bEuro == true) {
    if( obj.isDay){
      sout = dd + "/" + mm + "/" + yy;
    }
    else{
      sout = mm + "/" + yy;
    }
}
else {
    if( obj.isDay){
      sout = mm + "/" + dd + "/" + yy;
    }
    else{
      sout = mm + "/" + yy;
    }

}

if (bJapan == true) {
    if( obj.isDay){
      sout = yy + "/" + mm + "/" + dd;
    }
    else{
      sout = yyyy + "/" + mm;
    }
}

  obj.value = sout;
  return true;
}

//[9]
function ValidPhone(num) {
        return true;  // todo
        if (Empty(num)) return true;
        for (var i = 0; (i < num.length); i++) {
        if (num.charAt(i) == " ") continue;
        if ((num.charAt(i) >= "0") && (num.charAt(i) <= "9")) continue;
        return false;
}
return true;
}
//[16]
function gotChange() {        

        document.forms[0].BDATACHANGED.value = "1";
}
//[21]
// Create a cookie with the specified name and value.
function SetCookie(sName, sValue)
{
//  document.cookie = sName + "=" + escape(sValue) + ";";
  var d = new Date();
  d.setFullYear(d.getFullYear()+1);
  document.cookie=sName+"="+escape(sValue)+";"+"expires="+d;
}

//[22]
// Get the specified cookie
function GetCookie(sCookie)
{
  // cookies are separated by semicolons
  var aCookie = document.cookie.split(";");
  for (var i=0; i < aCookie.length; i++)
  {
    // a name/value pair (a crumb) is separated by an equal sign
    var aCrumb = aCookie[i].split("=");
    if (sCookie.replace(" ", "") == unescape(aCrumb[0].replace(" ", "")))
      return unescape(aCrumb[1]);
  }

  return null;
}


//[30]
function FormatNumber(numObj)
{
	/* called from ValidateCurrency
	   2100    -> 2,100.00
	   2100.   -> 2,100.00
	   2100.1  -> 2,100.10
	   2100.10 -> 2,100.10
	   
	   This function always assume an US number format (. dot as decimal separator) as input
	*/
	
	var sTemp = numObj.value;
	var sDigits = "00";
	
	/* strip thousand separators */
	var re = new RegExp("\\,", "g");
	sTemp = sTemp.replace(re, "");
	
	/* test for decimal part */
	re.compile("^(-?\\d*)\\.(\\d{0,2})");
	if (re.test(sTemp))
	{
		sTemp = ((RegExp.$1 == "-") || (RegExp.$1 == "")) ? RegExp.$1 + "0" : RegExp.$1;
		sDigits = (RegExp.$2 + sDigits).substr(0,2);
	}
	
	var sGUID = GetCookie("bEuroNum");
	var sThousandSep = (sGUID == "true") ? "." : ",";
	var sFractionSep = (sGUID == "true") ? "," : ".";
	
	/* put in thousand separators */
	re.compile("(-?\\d+)(\\d{3})");
	while (re.test(sTemp))
	{
		sTemp = sTemp.replace(re, "$1" + sThousandSep + "$2");
	}
	
	/* put everything together again */
	numObj.value = sTemp + sFractionSep + sDigits;
	
	return;
}

//[35]
function FT_FinalTest() {
  var InputCollection = document.getElementsByTagName("INPUT")

  for (i = 0; i < InputCollection.length; i++) {
      if (InputCollection[i].getAttribute("mandatory") == "true" && InputCollection[i].value == "") {
        error(InputCollection[i], 'Field may not be blank'); return false;
      }
  }
  
  var SelectCollection = document.getElementsByTagName("SELECT")
  for (i = 0; i < SelectCollection.length; i++) {
      if (SelectCollection[i].getAttribute("mandatory") == "true") {
          if (SelectCollection[i].type == "select-multiple") {
            var bb = false;
            for (j=0; j < SelectCollection[i].options.length; j++) {        	
            	if (SelectCollection[i].options[j].selected == true && SelectCollection[i].options[j].text != "") {
            		bb = true
            		break
            	}
            }
            if (bb == false) {error(SelectCollection[i], 'Field may not be blank'); return false}
          }
          else {          
             var dd = SelectCollection[i];
             if ( dd.options[dd.options.selectedIndex].text.trim() == "" ) {error(SelectCollection[i], 'Field may not be blank'); return false}
          }      
      }    
  }
  var TextAreaCollection = document.getElementsByTagName("TEXTAREA")

  for (i = 0; i < TextAreaCollection.length; i++) {
  
      if (TextAreaCollection[i].getAttribute("mandatory") == "true" && TextAreaCollection[i].value == "") {
        error(TextAreaCollection[i], 'Field may not be blank'); return false;
      }
  }
  return true;
 
}

//[45]
function FormatNumber2(sTest)
{
	/*
	   2100.0000001    -> 2100.00
	   
	   This function always assume an US number format (. dot as decimal separator) as input
	*/
	
	var iDigits = "00";
	
	/* test for decimal part */
	var re = new RegExp("(-?[0-9\\,]*)\\.?(\\d*)");
	if (re.test(sTest))
	{
		sTest = RegExp.$1;
		iDigits = (RegExp.$2 + iDigits).substr(0,2);
	}
	
	var sGUID = GetCookie("bEuroNum");
	var sFractionSep = (sGUID == "true") ? "," : ".";
	
	/* put everything together again */
	return (sTest + sFractionSep + iDigits);
}

//[46]
function Round(num) {
    return Math.round((num) * 100) / 100
}

//[49]
function FormatPhoneNum(txtFieldName, PhoneNum) {
  var sPhoneNum = "";
  var sNewPhoneNum = "";
  var sOrigPhoneNum = PhoneNum.value;
   var sGUID = GetCookie("BINTERNATIONAL");
  if (sGUID == "true") {return}
  if (Empty(PhoneNum.value)) 
  {
  	PhoneNum.value = "";
  	return true;
  }
  if (txtFieldName == '') {txtFieldName = PhoneNum.name}
  /* --loop through to get just the numbers and not special characters */
  for (var i = 0; i <= PhoneNum.value.length; i++) {
    if ((PhoneNum.value.charAt(i) >= "0") && (PhoneNum.value.charAt(i) <= "9")) {
      sPhoneNum = sPhoneNum  + PhoneNum.value.charAt(i);
    }
  }
  if (sPhoneNum != "") {
    if (sPhoneNum.substring(7,15) == "") { 
      sNewPhoneNum = sPhoneNum.substring(0, 3) + "-" + sPhoneNum.substring(3, 7);
    }
    else
    {
      sNewPhoneNum = '(' + sPhoneNum.substring(0, 3) + ') ' + sPhoneNum.substring(3, 6) + "-" + sPhoneNum.substring(6, 10);
      if (sPhoneNum.substring(10, 15) != "") { sNewPhoneNum = sNewPhoneNum + " x" + sPhoneNum.substring(10, 15); }
    }
  }
  else  /* Display error message */
  {    
      return error(PhoneNum, "Not a valid Phone Number");  
  }

  document.forms[0].elements[txtFieldName].value = sNewPhoneNum;

  if (sOrigPhoneNum != sNewPhoneNum) { gotChange(); }
}

//[54]
function ValidateTime(sTime) {
	var iColon=0;
	var iBeforeNum=0;
	var iAfterNum=0;
	var iFoundColon=0;
	var sAfterNum=''
	var sBeforeNum=''
  var s1 = "";
  var ss = new String(sTime.value);   //converts object to string

  if (Empty(ss)) {return true;}
  if (ss.indexOf(":") == -1) {
    if (ss.length == 3) {ss = ss.substring(0, 1) + ":" + ss.substring(1, 3)}
    else if (ss.length == 4) {ss = ss.substring(0, 2) + ":" + ss.substring(2, 4)}
  }

  for (var i = 0; (i < ss.length); i++) {
    if (ss.charAt(i) == ":") {
    	iColon = iColon + 1;
    	if (iColon > 1) return error(sTime, "Invalid time.");        // only allow one colon
    	if ((i != 1) && (i != 2)) return error(sTime, "Invalid time.");  //colon in correct position
    	iFoundColon = 1;
		}
		else {
        s1 = ss.charAt(i)
        s1 = s1.toUpperCase() 
        //only allow number or am/pm
        if (s1 >= "0" && s1 <= "9") {
  				if (iFoundColon == 1) {iAfterNum = iAfterNum + 1; sAfterNum = sAfterNum + ss.charAt(i)}
  				else {iBeforeNum = iBeforeNum + 1; sBeforeNum = sBeforeNum + ss.charAt(i)}
        } 
        else if (s1 == "A" || s1 == "P" || s1 == "M" || s1 == " ") {} //OK
        else {return error(sTime, "Invalid time.");}        
		}
//		if (i > 5) return error(sTime, "Invalid time.");
	}
	if (iAfterNum != 2) return error(sTime, "Invalid time.");
	if (iBeforeNum ==1) {
		if ((sBeforeNum >= "1") && (sBeforeNum <= "9")) {}
		else {return error(sTime, "Invalid time.");}
		}
	else {
		if ((sBeforeNum >= "01") && (sBeforeNum <= "12")) {}
		else {return error(sTime, "Invalid time.");}
		}
	if ((sAfterNum >= "0") && (sAfterNum <= "59")) {}
	else {return error(sTime, "Invalid time.");}
  sTime.value = ss
	return true;
}

//[55]
function CurrentDate() {
  var dt = new Date()
  var month = 0;
  var day = 0;
  var year = 0;
  var ss;

  month = dt.getMonth() + 1
  year = dt.getYear()
  day = dt.getDate()
  ss = month + "/" + day + "/" + year;
  return ss;

}

//[82]
function isValidInteger(sTest)
{
	var sGUID = GetCookie("bEuroNum");
	var sPattern;
	var bTemp = false;
	
	/* check for numbers like 123 and -123.45 */
	sPattern = (sGUID == "true") ? "^-?\\d*$" : "^-?\\d*$";
	var re = new RegExp(sPattern);
	bTemp = (re.test(sTest)) ? true : bTemp;
	
	/* check for numbers like 1,234 and -123,456,789.01 */
	sPattern = (sGUID == "true") ? "^-?\\d{1,3}(\\.\\d{3})*$" : "^-?\\d{1,3}(\\,\\d{3})*$";
	re.compile(sPattern);
	bTemp = (re.test(sTest)) ? true : bTemp;
	
	/* last check. Special case sTest="-" */
	bTemp = (sTest == "-") ? false : bTemp;
		
	return bTemp;
}


//[83]
function parseInteger(numObj)
{
	/* strips commas out of numbers, does a parseInt on it. */
	
	var sTemp = numObj.value;
	
	if ((! isValidInteger(sTemp)) || (sTemp == ""))
	{
		/* NOTE that "return false;" actually is the same as "return 0;" */
		return false;
	}
	
	var sGUID = GetCookie("bEuroNum");
	var sThousandSep = (sGUID == "true") ? "\\." : ",";
	var re = new RegExp(sThousandSep, "g");
	sTemp = sTemp.replace(re, "");
	
	return parseInt(sTemp);
}


//[84]
function formatInteger(numObj)
{
	/* called from validInteger
	   2100    -> 2,100
	   
	   This function always assume an US number format (. dot as decimal separator) as input
	*/
	
	var sTemp = numObj.value;
	
	/* strip thousand separators */
	var re = new RegExp("\\,", "g");
	sTemp = sTemp.replace(re, "");
	
	var sGUID = GetCookie("bEuroNum");
	var sThousandSep = (sGUID == "true") ? "." : ",";
	var sFractionSep = (sGUID == "true") ? "," : ".";
	
	/* put in thousand separators */
	re.compile("(-?\\d+)(\\d{3})");
	while (re.test(sTemp))
	{
		sTemp = sTemp.replace(re, "$1" + sThousandSep + "$2");
	}
	
	/* put everything together again */
	numObj.value = sTemp;
	
	return;
}


//[85]
function validInteger(numObj, iMin, iMax)
{
	var sTest = numObj.value;
	iMin = (iMin == null) ? -1000000000 : iMin;
	iMax = (iMax == null) ?  1000000000 : iMax;
	
	/* test if number is valid currency format */
	if (Empty(sTest)) {return true;}
	if ( ! isValidInteger(sTest))
	{
		error(numObj, "Invalid Integer.");
		return false;
	}
	
	/* get number back as US format without thousand separator */
	sTest = parseInteger(numObj);
	
	/* test if number is within min and max limits */
	if (! ValidMinMax(sTest, iMin, iMax))
	{
		error(numObj, "Expecting number in range " + iMin + " to " + iMax);
		return false;
	}
	
	numObj.value = sTest;
	formatInteger(numObj);
	return true;
}

//[100] trim function for the built-in JavaScript String object
String.prototype.trim = function()
{
   return this.replace(/^\s*|\s*$/g, "");
}


