/******************************************************************************************************************/
/* Purpose: This file contains most of the validation functions written in JavaScript for front-end validations.  */
/* Author: Sandeep Agarwal                                                                                        */
/* Create Date:                                                                                                   */
/* Last Modify Date:                                                                                              */
/* File Name: CommonFunctions.js                                                                                  */
/******************************************************************************************************************/

var CommonFnsIncluded="defined";

var isNS4 = (navigator.appName=="Netscape" && parseInt(navigator.appVersion)>=4);
var isIE4 = (navigator.appName=="Microsoft Internet Explorer" && parseInt(navigator.appVersion)>=4);
var serverDate="";

function checkNull(field1,msg)
{
  if (field1.value == "")
  {
    alert(msg);
    field1.select();
    field1.focus();
    return true;
  }
  else 
    return false;
}

function deleteExtremeSpaces(fieldname)
{
  var i, j;

  for(i=0; i<fieldname.value.length; i++ )
  {
    if (fieldname.value.charAt(i)!=" " && fieldname.value.charAt(i)!="\t" && fieldname.value.charAt(i)!="\n" )
       break;
  }

  for(j=fieldname.value.length-1; j>=0; j-- )
  {
    if (fieldname.value.charAt(j)!=" " && fieldname.value.charAt(j)!="\t" && fieldname.value.charAt(j)!="\n" )
       break;
  }

  if (i > j)
     fieldname.value = "";
  else
     fieldname.value = fieldname.value.substring(i, j+1);

  return(fieldname);
}

function IsNumeric(field, msg)
/* This function checks for whether the value passed to it is a number and diplays a message as specified in the 'msg' parameter */
{
if (isNaN(field.value))
{
	alert(msg);		
      field.focus();
      field.select();
	return false;
}
else	
	return true;
}

function validate_date(mm,dd,yy,msg)
{
  if (deleteExtremeSpaces(mm).value == "" && deleteExtremeSpaces(dd).value == "" && deleteExtremeSpaces(yy).value == "")
  {
     if (arguments.length > 3)
        alert(msg);
     else
        alert("Please enter complete date.");

     mm.select();
     mm.focus();
     return false;
  }

  if (checkNull(mm, "Please enter Month."))
     return false;

  if (!(IsNumeric(mm, 'Please enter numeric value.')))
     return false;

  if (checkNull(dd, "Please enter Date."))
     return false;

  if (!(IsNumeric(dd, 'Please enter numeric value.')))
     return false;

  if (mm.value.charAt(0) == "0")
      mm.value = mm.value.substring(1);

  if (mm.value > 12 || mm.value < 1)
  {
     mm.select();
     mm.focus();
     alert("Not a valid Date !\nIncorrect Month Value."); 
     return false;
  }

  var YrLength = yy.value.length;
  for (i = 0; i < YrLength; ++i)
  {
      if (yy.value.charAt(0) == "0")
         yy.value = yy.value.substring(1);
      else
         break;
  }

  if ( yy.value.length < 4)
  {
     yy.select();
     yy.focus();
     alert("Not a valid Date !\nIncorrect Year value."); 
     return false;
  }

  var monthlength = new Array(12);
  for ( var i = 1; i <= 12; i++ ) 
  { 
      monthlength[i] = 31;
  }
  monthlength[4] = 30;
  monthlength[6] = 30;
  monthlength[9] = 30;
  monthlength[11] = 30;	
  if (yy.value % 4 != 0 )
     monthlength[2] = 28;
  else
     monthlength[2] = ( yy.value % 100 == 0 && yy.value % 400 != 0 ) ? 28 : 29;	

  if (dd.value.charAt(0) == "0")
      dd.value = dd.value.substring(1);

  if ( dd.value > monthlength[mm.value] || dd.value < 1 )
  {
     dd.select();
     dd.focus();
     alert("Not a valid Date !\nSpecified Month has " + monthlength[mm.value] + " days.");
     return false;
  }
  return true;

} /* End of validate_date() */


function roundTo(field,decimal)
{  
  if (!(field.value.indexOf(".") == -1 ))
  {
     if (decimal == 0)
        field.value = field.value.substring(0,field.value.indexOf(".")+decimal);
     else
        field.value = field.value.substring(0,field.value.indexOf(".")+decimal+1);
  }

} /* End of roundTo() */

function addComma(num)
{
  var tmp="", tmp2="";
  var isNeg = num<0 ? true : false;

  if (isNeg)
     num = -num;

  var str=removeComma(num.toString());

  var j = str.indexOf(".");


  if (j != -1)
  {
    for (var i=str.length; i>j; i--)
    {     
        tmp=tmp+str.charAt(i-1);
    }
  }
  else
    j=str.length;

  for (i=j; i>0; i--)
  {
      if ( (i != j) && ((j-i)%3 == 0))
       	 tmp=tmp+",";

      tmp=tmp+str.charAt(i-1);
  }

  // reverse
  for (var i=tmp.length-1; i>=0; i--)
      tmp2=tmp2+tmp.charAt(i);

  if (isNeg)
     tmp2="-"+tmp2;

  return tmp2;
}

function updateAmt(myinput,uptoDecimalPlaces, maximumLength)
{
  deleteExtremeSpaces(myinput);
  if (!(myinput.value.substr(myinput.value.indexOf(".")+1,myinput.value.length).indexOf(".") == -1) || 
       (myinput.value.length == 1 && myinput.value.indexOf(".")==0))
  {
    alert("Please enter valid data.");
    myinput.value = "";
    myinput.focus();
    myinput.select();
    return false;
  }

   if (myinput.value == "" ) 
      return true;

   if (myinput.value == 0 )
   {
     myinput.value = 0;
     return true;
   }
 
   if (verifyMoney(myinput))
   {
     myinput.value=addComma(convertMoney(myinput.value));
     if (arguments.length > 1)
       roundTo(myinput,uptoDecimalPlaces);
     else
       roundTo(myinput,0);
   }
   else
   {
     myinput.value = "";
     myinput.focus();
     myinput.select();
     return false;
   }

   if (removeComma(removeDollar(myinput.value)) < 0)
   {
      alert("Please enter value greater than zero.");
      myinput.value = "";
      myinput.focus();
      myinput.select();
      return false;
   }

   if (arguments.length > 2)
   {
     if (removeComma(removeDollar(myinput.value)).length > maximumLength)
     {
        alert("The entered value exceeded the maximum value for this field.\nPlease enter less than or equal to "+maximumLength+" digits.");
        myinput.value = "";
        myinput.focus();
        myinput.select();
        return false;
     }
   }

   if (isNaN(removeComma(removeDollar(myinput.value))))
   {
      alert("Please enter Numeric value.");
      myinput.value = "";
      myinput.focus();
      myinput.select();
      return false;
   }

   myinput.value = addComma(parseInt(removeComma(removeDollar(myinput.value))));

   return true;

}/*  End of updateamt () */

function checkTextLength(field,maximumLength)
{
  deleteExtremeSpaces(field);
  if (field.value != "")
  {
    if (field.value.length > maximumLength)
    {
     alert("The entered text exceeded the maximum limit of "+maximumLength+" characters.");
     field.focus();
     return false;
    }
  else
  	return true;
  }
  
  return true;
} /* end of checkTextLength() */

function checkTextLength2(field,minimumLength)
{
  deleteExtremeSpaces(field);
  if (field.value != "")
  {
    if (field.value.length < minimumLength)
    {
     alert("The entered text did not reach the minimum limit of "+minimumLength+" characters.");
     field.focus();
     return false;
    }
  }
  
  return true;
} /* end of checkTextLength() */

function checkRange(field,lowerValue,upperValue, msg)
{

//alert("checkRange");

  if (deleteExtremeSpaces(field).value == "") 
     return true;

  roundTo(field,0);

  if (field.value.toUpperCase().indexOf("E") != -1)
  {
     alert("Please enter numeric value.");   
     field.value = "";
     field.select();
     field.focus();
     return false;
  }

  if (!(IsNumeric(field,'Please enter numeric value.')))
  {
     field.value = "";
     field.select();
     field.focus();
     return false;
  }

  if ((arguments.length == 2) && (field.value < lowerValue))
  {
     alert("Please enter value greater than or equal to "+lowerValue+".");
     field.value = "";
     field.select();
     field.focus();
     return false;
  }

  if (arguments.length > 2)
  {
     if (field.value < lowerValue || field.value > upperValue)
 	{
          if (arguments.length > 3)
   		alert(msg);
 	    else
	    	alert("Please enter value between "+lowerValue+" and "+upperValue+".");

     	    field.value = "";
	    field.select();
	    field.focus();
	    return false;
	}
  }

  return true;
} /* End of checkRange() */

function checkRangeWC(field,lowerValue,upperValue)
{

//alert("checkRangeWC");
  var lowerValueWC = addComma(lowerValue);

  if (deleteExtremeSpaces(field).value == "") 
     return true;

  roundTo(field,0);

  if (field.value.toUpperCase().indexOf("E") != -1)
  {
     alert("Please enter Numeric Value.");   
     field.select();
     field.focus();
     return false;
  }

  if (!(IsNumeric(field,'Please enter Numeric Value.')))
     return false;

  if ((arguments.length == 2) && (field.value < lowerValue))
  {
     alert("Please enter value greater than or equal to "+lowerValueWC+".");
     field.select();
     field.focus();
     return false;
  }

  if (arguments.length > 2)
  {
  var upperValueWC = addComma(upperValue);
     if (field.value < lowerValue || field.value > upperValue)
 	{
	    alert("Please enter value between "+lowerValueWC+" and "+upperValueWC+".");
	    field.select();
	    field.focus();
	    return false;
	}
  }

  return true;
} /* End of checkRangeWC() */

function checkPhoneFaxZipcode(field, lowerVal, upperVal, numberofchar, phonefaxzip)
{
//alert("checkPhoneFaxZipcode");
  if (deleteExtremeSpaces(field).value == "")
     return true;

  if (!(checkRange(field,lowerVal,upperVal)))
     return false;

  if (field.value.length < numberofchar)
  {
     alert("Please enter correct " + phonefaxzip + ".");
     field.value = "";
     field.focus();
     field.select();
     return false;
  }
  return true;
} /* End of checkPhoneFaxZipcode() */


// This function verifies that all the characters in 'field' must be in 'passedstr'
function isValidString(field, passedstr)
{
    deleteExtremeSpaces(field);

    var isvalid;
    var charinfield = "";
    var charinpassedstr = "";

    for (var i = 0 ; i < field.value.length; i++)
    {
        charinfield = field.value.substring(i, i+1);
        isvalid = false;
        for (j = 0 ; j < passedstr.length ; j++)
        {
            charinpassedstr = passedstr.substring(j, j+1);
            if ( charinfield == charinpassedstr )
            {
                isvalid = true;
                break; 
            } 
        }
        if (isvalid == false)
            return false; 
    }
    return true;
}

function checkCommonFnsInclusion()
{
  var type = typeof CommonFnsIncluded;
  if (type == "undefined")
  {
     alert("Warning: CommonFunctions.js not included.");
     return false;
  }
  return true;
}

function checkDateRange(month,day,year,lowerValue,upperValue)
{
  /* If 0 included, then current date is also included */
  var curr_mnth = GetCurrMonth();
  var curr_yr   = GetCurrYear();
  var curr_day  = GetCurrDay();

  curr_mnth += 1;

  var lowerDate = addDays(parseInt(curr_day),parseInt(curr_mnth),parseInt(curr_yr),-lowerValue);
  var lowerYY = getYYYY(lowerDate);
  var lowerMM = getMM(lowerDate);
  var lowerDD = getDD(lowerDate);

  var upperDate = addDays(parseInt(curr_day),parseInt(curr_mnth),parseInt(curr_yr),upperValue);
  var upperYY = getYYYY(upperDate);
  var upperMM = getMM(upperDate);
  var upperDD = getDD(upperDate);

  if ( (year.value  < lowerYY) || (year.value > upperYY) ) return false;
  if ( (year.value  == lowerYY) && (month.value < lowerMM) ) return false;
  if ( (year.value  == upperYY) && (month.value > upperMM) ) return false;
  if ( (year.value  == lowerYY) && (month.value == lowerMM) && (day.value < lowerDD) ) return false ;
  if ( (year.value  == upperYY) && (month.value == upperMM) && (day.value > upperDD) ) return false ;

  return true;

} /* End of checkDateRange() */

function addTotalValue(field, truncfield, numberoffields, sumfield, lowerValue, upperValue)
{
  if (!(checkRange(field, lowerValue, upperValue)))
     return false;

  if (field.value != "")
  field.value = parseInt(field.value);

  var sum_percentage=0;
  for (var i=1; i<=numberoffields; ++i)
  {
      var valueOfField;
      eval("valueOfField=document.cbpform2."+truncfield+i+".value");
      if (valueOfField != "")
      {
         sum_percentage += parseInt(valueOfField);
      }
  }

  sumfield.value = sum_percentage;

} /* End of addTotalValue() */

function compareAmounts(currField,field2,decimalPlaces,maximumLength,msg,condition)
{
  if (!(updateAmt(currField, decimalPlaces, maximumLength)))
  {
     currField.value = "";
     currField.select();
     currField.focus();
     return false;
  }

  if (arguments.length == 5) 
     condition = '>';

  if ((currField.value != "") && (field2.value != ""))
  {
     if (!(eval("parseInt(removeComma(currField.value)) " + condition + "  parseInt(removeComma(field2.value))")))
     {
        alert(msg);
        currField.value = "";
        currField.select();
        currField.focus();
        return false;
     }
  }
  return true;
}

function validate_email(field)
{
// alert("validate_email");
 if (deleteExtremeSpaces(field).value != "")
 {
    var curratpos = field.value.indexOf('@');
    var currdotpos = field.value.indexOf('.');
    var lastdotpos = field.value.lastIndexOf('.');
    var nextatpos = field.value.lastIndexOf('@');
    var spacepos = field.value.indexOf(' ');

    if (curratpos < 1 || curratpos >= field.value.length - 1 ||
     currdotpos < 1 || lastdotpos >= field.value.length - 2 ||
     curratpos != nextatpos ||
     spacepos > 0)
      	return false;
	else
		return true;
 }
 
 return true;  
}

function PopulateDropDown(objDropDown, strArray, intItems, valArray)
/* This function loads the drop down with the item elements present in strArray.
   The no. of items loaded is defined by intItems */
{
   var intcount; 
   objDropDown.length = 0 ;

   //Populate the drop down with all the choices
   for (intcount=0; intcount<intItems; intcount++)	
   {
     objDropDown.options[intcount] = new Option();
     objDropDown.options[intcount].text = strArray[intcount];
     if (arguments.length > 3)
        objDropDown.options[intcount].value = valArray[intcount];
   }
   objDropDown.SelectedIndex = -1;
}

function GetCurrYear()
{
  /* This function returns the current year */
  var dt = deleteSlash(serverDate);
  stryear = dt.substring(4,8) - 0;

  return stryear;
}

function GetCurrMonth()
{
  /* This function returns the current month between 0(Jan) and 11(Dec) */
  var dt = deleteSlash(serverDate);
  strmonth = dt.substring(0,2) - 0;

  return strmonth;
}

function GetCurrDay()
{
  /* This function returns the current day between 1 and 31 */
  var dt = deleteSlash(serverDate);
  strday = dt.substring(2,4) - 0;

  return strday;
}

function getCurrDate()
{
  /* This function returns the current date in the format mm/dd/yyyy */
  var mo = GetCurrMonth();
  var dy = GetCurrDay();
  var yr = GetCurrYear();
  var now = (mo<9?"0":"") + (mo+1) + "/" + (dy<10?"0":"") + dy + "/" + yr;

  return now;
}

function deleteSlash(str)
{
  /* This function deletes the slash from the passed string */
  var newstr = "";
  for (var i=0; i<str.length; i++)
      if (str.charAt(i) != "/")
         newstr = newstr + str.charAt(i);

  return newstr;
}

function deleteChar(str,strchar)
{
  /* To remove a character from the string */
  var newstr = "";

  for (var i=0; i<str.length; i++)
      if (str.charAt(i) != strchar)
         newstr = newstr + str.charAt(i);

  return newstr;
}

function makeArray()
{
   /* This function when passed an unspecified number of arguments creates an array, with the first array element, 
      i.e. [0], containing the number of items within the array.

      One simple use of the makeArray() function is to create an array containing the months of the year, monthsofyear[]

      var monthsofyear   = new makeArray('January','February','March',
                                   'April','May','June',
                                   'July','August','September',
                                   'October','November','December');
   */

    this[0] = makeArray.arguments.length;
    for (i = 0; i<makeArray.arguments.length; i++)
        this[i+1] = makeArray.arguments[i];
}

function removeDollar(str)
{
  /* This function removes the dollar sign from the passed string */

  return str.replace(/\$/, "");
}

function removeComma(str)
{
  /* This function removes the comma sign from the passed string */

  while(str.indexOf(",") != -1)
    str = str.replace(/,/, "");

  return str;
}

function removeLeadingZero(str)
{
  /* This function removes the leading zero from the passed string */

  var tmp = str;
  for (var i=str.length; i>0; i--)
  {
    if(tmp.charAt(0) == "0")
      tmp = tmp.substr(1, tmp.length-1);
  }
  return tmp;
}

function padZeros(num,zeroCnt)
{
  var strnum = num.toString();
  var decimalCnt=0; //no of digits to the right of decimal
  var decimalFound=false;
  var decIdx; //position at which the decimal is found

  for(i=0; i< strnum.length; i++)
  {
	if (decimalFound)
		decimalCnt = parseInt(decimalCnt) + 1;
	if (strnum.charAt(i)==".")
		{
			decimalFound=true;
			decIdx = i;
		}
  }
  strnum = deleteChar(strnum,".");//remove decimal

  if (!decimalFound)//if no decimal found simply pad with zeros	
  {
		for (i=0;i<zeroCnt;i++)
			strnum = strnum + "0";
		return strnum;
  }

  if (zeroCnt==decimalCnt)//simply return string w/out decimal
	return strnum;

  if (zeroCnt>decimalCnt)
  {
		for (i=0;i<(zeroCnt-decimalCnt);i++)
			strnum=strnum + "0";
  } 

  if (zeroCnt<decimalCnt)
  {
		var len=parseInt(decIdx) + parseInt(zeroCnt)
		strnum=strnum.substr(0,len) + "." + strnum.substr(len,(strnum.length - len))
  }

  return strnum;
}

function verifyMoney(myinput, errmsg)
{
  var ret = true;
  var pattern = /^\$?-?(\.|\,|\d)+([Kk]?|[Mm]{0,2})$/i;

  if ( pattern.test(myinput.value) == false )
  {
    //alert("invalid money format");
    ret = false;
  }

  if ( ret==false && arguments.length > 1)
  {
    myinput.select();
    myinput.focus();
  }

  if ( ret==false )
     if ( arguments.length > 1)
        alert(errmsg);
     else
        alert("Please enter a numeric value.");

  return ret;
}

function convertMoney(str)
{
  var tmp = removeDollar(str);

  tmp = removeLeadingZero(removeComma(tmp));

  var mIdx = tmp.toUpperCase().indexOf("M");
  if (mIdx != -1) // 'M' found
     tmp = padZeros(tmp.substring(0,mIdx),6);
  else if (tmp.toUpperCase().charAt(tmp.length-1) == "K")
     tmp = padZeros(tmp.substr(0,tmp.length-1),3);

  tmp = tmp - 0; //subtract 0 to convert tmp to a number

  //don't use parseInt since if the user enters 0.001 then padzeros gives a number preceeded by 0 and paseInt
  //gives a different value (don't use parseInt if a no. is going to be preceeded by a zero).
  //return parseInt(tmp);

  return tmp;
}

function addDays(day,month,year,addition)
{
  var accumulate    = new makeArray(  0, 31, 59, 90,120,151,181,212,243,273,304,334);
  var accumulateLY  = new makeArray(  0, 31, 60, 91,121,152,182,213,244,274,305,335);    

  if (LeapYear(year)) 
	var number = day + accumulateLY[month] + addition;
  else                
	var number = day + accumulate[month]   + addition;

  var days = daysinyear(year);
   
  while (number > days)
  {
        number -= days;
        days = daysinyear(++year);
  }

  while (number < 1) 
  {
        days = daysinyear(--year);
        number += days;
  }

  month = 1;

  if (LeapYear(year))
  {
        while (number > accumulateLY[month]) { month++; }
        day = number - accumulateLY[--month];
  }
  else
  {
        while (number > accumulate[month]) { month++; }
        day = number - accumulate[--month];
  }
	
  return year + '.' + padout(month) + '.' + padout(day);
}

function getYYYY(string)
{
  /* This fn returns the year from the date string (1999.05.02) where 05 is the month and 02 is the day. */

  var year =  string.substring(0,string.indexOf('.'));
  year = year - 0;
  return year;
}

function getMM(string)
{ 
  /* This fn returns the month from the date string (1999.05.02) where 05 is the month and 02 is the day. */

  var month = string.substr(5,2);
  month = month - 0;
  return month;
}

function getDD(string)
{ 
  /* This fn returns the day from the date string (1999.05.02) where 05 is the month and 02 is the day. */

  var day = string.substr(8,2);
  day = day - 0;
  return day;
}

function LeapYear(year)
{
    if ((year/4)   != Math.floor(year/4))   return false;
    if ((year/100) != Math.floor(year/100)) return true;
    if ((year/400) != Math.floor(year/400)) return false;

    return true;
}

function daysinyear(year)
{
  if (LeapYear(year))
     return 366;
  else
     return 365;
}

function padout(number)
{
  /* The padout() function adds a leading zero if the number passed is less than 10 and returns a padded string */
  var padstr = (number < 10) ? '0' + number : number.toString();

  return padstr;
}

function compareAmounts(currField,field2,decimalPlaces,maximumLength,msg,condition)
{
  if (!(updateAmt(currField, decimalPlaces, maximumLength)))
  {
     currField.value = "";
     currField.select();
     currField.focus();
     return false;
  }

  if (arguments.length == 5) 
     condition = '>';

  if ((currField.value != "") && (field2.value != ""))
  {
     if (!(eval("parseInt(removeComma(currField.value)) " + condition + "  parseInt(removeComma(field2.value))")))
     {
        alert(msg);
        currField.value = "";
        currField.select();
        currField.focus();
        return false;
     }
  }
  return true;
}

function incrementYear(from_mm, from_dd, from_yy, to_mm, to_dd, to_yy)
{
  if ((from_mm.value != "") && 
      (from_dd.value != "") &&
      (from_yy.value != ""))
  {
     if (!(validate_date(from_mm, from_dd, from_yy)))
        return false;
     else
     {
        if ((from_mm.value == 2) && (from_dd.value == 29))
           to_dd.value = from_dd.value - 1;
        else
           to_dd.value = from_dd.value;

        to_mm.value = from_mm.value;
        to_yy.value = from_yy.value - 0 + 1;
     }
  }
}

function daysElapsed(date1, date2)
{
  var difference = Date.UTC(date1.getYear(), date1.getMonth(), date1.getDate(), 0, 0, 0)
                 - Date.UTC(date2.getYear(), date2.getMonth(), date2.getDate(), 0, 0, 0);

  return difference/1000/60/60/24;
}

function showBalloonHelp(ie_obj, nn_obj, helpText)
{
  if (document.all)
      ie_obj.title = helpText;
/*
// Sandeep: Following code is for Netscape Functionality:
// Step 1: Create a div tag on top of body tag with the id "tooltip": <div id="tooltip" style="position:absolute; visibility:hidden"></div>
// Step 2: Remove the comments from the current else if loop below
// Step 3: Write 'onmouseout' for the current object which calls a function
// Step 4: The called function will be having only this statement: if (document.layers) document.tooltip.visibility="hidden";
// Step 5: The balloon help will now work for netscape browser also.
  else if (document.layers)
  {
      document.tooltip.document.write('<layer bgcolor=#f5f5dc style="border:black solid 1px; font-size:12px; font-color:#0033cc;">' + helpText + '</layer>');
      document.tooltip.document.close();
      document.tooltip.top = nn_obj.pageY + 6;
      document.tooltip.left = nn_obj.pageX + 6;
      document.tooltip.visibility = "show";
  }
*/
}

/********************* End of CommonFunctions.js ****************************************************************/
