﻿/******************************************************************************
 ******************************************************************************
 *********************** DATA FORMATTING FUNCTIONS ****************************
 ******************************************************************************
 *****************************************************************************/

function PopulateDynamicDropDowns()
{
	var f = document.forms[0];
	var l = f.length;
	var el;
	for (var i=0;i<l;i++)
	{
		el = f[i];
		if (el && el.type)
		{				
			var t = el.type.toLowerCase();
			if (t == "select-one")
			{
				var ddType = el.getAttribute("ddType");
				if (ddType && ddType=="State")
				{
					//looks like a state dropdown
					//http://www.columbia.edu/kermit/postal.html for address formatting				
					FillStateList(el);
					var CountryFieldID = el.getAttribute("CountryFieldID");
					if (CountryFieldID && CountryFieldID.length>0)
					{
						if ( isNaN )
						{ 
							el.onchange = HandleStateSelect;
						};
					}					
				}					
			}
		}
	}
}

/******************************************************************************
 * This is fired when a dynamically populated state dropdown is changed.
 *****************************************************************************/
function HandleStateSelect(e)
{
	e = e ? e: ((window.event) ? window.event : "");
	var el = (e.target) ? ( (e.target.nodeType == 3) ? e.target.parentNode : e.target ) : e.srcElement;
	var opt = el.options[el.selectedIndex];
	var CountryFieldID = el.getAttribute("CountryFieldID");
	var Country = opt.getAttribute("Country");
	if (Country && Country.length>0)
	{
		var z = GetElementById(CountryFieldID);
		if (z)
		{
			z.value = Country;
		}
		
	}
}

/******************************************************************************
* Used to dynamically fill the state dropdowns.
*****************************************************************************/
function FillStateList(obj)
{
	//Display name and country
	var list = ["|","AA - Army Atlantic|USA","Alberta|Canada","AE - Army Europe|USA","Alaska|USA","Alabama|USA","AP - Army Pacific|USA","Arizona|USA","Arkansas|USA","British Columbia|Canada","California|USA","Colorado|USA","Connecticut|USA","District of Columbia|USA","Delaware|USA","Florida|USA","FPO - Fleet Post Office|USA","Georgia|USA","Hawaii|USA","Iowa|USA","Idaho|USA","Illinois|USA","Indiana|USA","Kansas|USA","Kentucky|USA","Louisiana|USA","Maine|USA","Manitoba|Canada","Maryland|USA","Massachusetts|USA","Michigan|USA","Minnesota|USA","Mississippi|USA","Missouri|USA","Montana|USA","Nebraska|USA","Nevada|USA","New Brunswick|Canada","Newfoundland and Labrador|Canada","New Hampshire|USA","New Jersey|USA","New Mexico|USA","New York|USA","North Carolina|USA","North Dakota|USA","Northwest Territories|Canada","Nova Scotia|Canada","Nunavut|Canada","Ohio|USA","Oklahoma|USA","Ontario|Canada","Oregon|USA","Pennsylvania|USA","Prince Edward Island|Canada","Quebec|Canada","Rhode Island|USA","Saskatchewan|Canada","South Carolina|USA","South Dakota|USA","Tennessee|USA","Texas|USA","U.S. Virgin Islands|USA","Utah|USA","Vermont|USA","Virginia|USA","Washington|USA","West Virginia|USA","Wisconsin|USA","Wyoming|USA","Yukon Territory|Canada"];	
	
	//value name
	var valueList = ["","AA","Alberta","AE","Alaska","Alabama","AP","Arizona","Arkansas","British Columbia","California","Colorado","Connecticut","District of Columbia","Delaware","Florida","FPO","Georgia","Hawaii","Iowa","Idaho","Illinois","Indiana","Kansas","Kentucky","Louisiana","Maine","Manitoba","Maryland","Massachusetts","Michigan","Minnesota","Mississippi","Missouri","Montana","Nebraska","Nevada","New Brunswick","Newfoundland and Labrador","New Hampshire","New Jersey","New Mexico","New York","North Carolina","North Dakota","Northwest Territories","Nova Scotia","Nunavut","Ohio","Oklahoma","Ontario","Oregon","Pennsylvania","Prince Edward Island","Quebec","Rhode Island","Saskatchewan","South Carolina","South Dakota","Tennessee","Texas","U.S. Virgin Islands","Utah","Vermont","Virginia","Washington","West Virginia","Wisconsin","Wyoming","Yukon"];
	obj.options.length = 0;
	for(i=0;i<list.length;i++)
	{
		a = list[i].split("|");
		var opt = new Option(a[0],valueList[i]);
		opt.setAttribute("Country",a[1]);
		obj.options[i] = opt;
	}

}

/******************************************************************************
 * Cross-browser version of document.getElementById().
 * TODO: Make this cross browser compatible - chad. (so far it works on IE
 * and FireFox)
 *****************************************************************************/
function GetElementById(strID)
{
	return document.getElementById(strID);
}

/******************************************************************************
 * Cross-browser version of element.getAttribute().
 * TODO: Make this cross browser compatible - chad. (so far it works on IE
 * and FireFox)
 *****************************************************************************/
function GetAttribute(el, attName)
{
	return el.getAttribute(attName);
}


function f_phone(obj)
{
	var re = /^\(?(\d{3})?\)?[-| |\.]?(\d{3})[-| |\.]?(\d{4})\s*(\w*)$/
	if(re.test(obj.value))
	{
		var arr = re.exec(obj.value);
		var p = "";
		var s = RegExp.$1
		if (s.length>0) p += "(" + s + ") ";
		p += RegExp.$2 + "-" + RegExp.$3;
		s = RegExp.$4
		if (s.length>0) p += " " + s + "";
		obj.value = p;
	}
}

function f_date(obj)
{
  var Months = new Array("January", "February", "March","April","May", "June", "July", "August", "September", "October", "November","December");
  try {
   d = new Date(obj.value);
	if (isNaN(d)) return;
	var s = Months[d.getMonth()]
	s += " " + d.getDate();
	s += ", " + d.getFullYear();
	obj.value = s;
   }
   catch(e){}   
}


function f_money(obj)
{
	var v = obj.value;
	v = removeCurrency(v);
	if (validateNumeric(v))
	{
		v = addCurrency(v);
		obj.value = v;
	}
	return;
}

function f_ssn(obj)
{
	var re = /^(\d{3})\-?(\d{2})\-?(\d{4})$/
	if(re.test(obj.value))
	{
		var arr = re.exec(obj.value);
		obj.value = RegExp.$1 + "-" + RegExp.$2 + "-" + RegExp.$3;
	}
}

function f_zip(obj)
{
	//US Zip
	var re = /^(\d{5})[ -]?(\d{4})?$/;
	if(re.test(obj.value))
	{
		var arr = re.exec(obj.value);
		var s = RegExp.$2;
		if (s.length>0) s = "-" + s;
		obj.value = RegExp.$1 + s;
		return;
	}
	
	//Canadian Zip
	re = /^(\D{1}\d{1}\D{1})\-?(\d{1}\D{1}\d{1})$/;
	if(re.test(obj.value))
	{
		var arr = re.exec(obj.value);
		obj.value = RegExp.$1 + "-" + RegExp.$2;
		return;
	}	
}

function f_percent(obj)
{
	var v = obj.value;
	v = removePercent(v);
	if (validateNumeric(v))
	{
		v = v.toString() + "%";
		obj.value = v;
		return;
	}
}

/******************************************************************************
* These words or phrases are valid numeric descriptors.
*****************************************************************************/
function IsNumericContainValidWords(strValue)
{
	var objRegExp  = /(about)|(approximate)|(approx)|(between)|(million)|(thousand)|(hundred)|(percent)|(greater)|(less)|(more)|(<)|(>)|(one)|(two)|(three)|(four)|(five)|(six)|(seven)|(eight)|(nine)|(ten)|(eleven)|(twelve)|(thirteen)|(fourteen)|(fifteen)|(sixteen)|(seventeen)|(eighteen)|(nineteen)|(twenty)|(thirty)|(fourty)|(fifty)|(sixty)|(seventy)|(eighty)|(ninty)/gi;
	return objRegExp.test(strValue);
}


function validateEmail( strValue) {
/************************************************
DESCRIPTION: Validates that a string contains a
  valid email pattern.

 PARAMETERS:
   strValue - String to be tested for validity

RETURNS:
   True if valid, otherwise false.

REMARKS: Accounts for email with country appended
  does not validate that email contains valid URL
  type (.com, .gov, etc.) or valid country suffix.
*************************************************/
var objRegExp  =
 /(^[a-z]([a-z_\.]*)@([a-z_\.]*)([.][a-z]{3})$)|(^[a-z]([a-z_\.]*)@([a-z_\.]*)(\.[a-z]{3})(\.[a-z]{2})*$)/i;

  //check for valid email
  return objRegExp.test(strValue);
}

function validateUSPhone( strValue ) {
/************************************************
DESCRIPTION: Validates that a string contains valid
  US phone pattern.
  Ex. (999) 999-9999 or (999)999-9999

PARAMETERS:
   strValue - String to be tested for validity

RETURNS:
   True if valid, otherwise false.
*************************************************/
  var objRegExp  = /^\([1-9]\d{2}\)\s?\d{3}\-\d{4}$/;

  //check for valid us phone with or without space between
  //area code
  return objRegExp.test(strValue);
}

function  validateNumeric( strValue ) {
/******************************************************************************
DESCRIPTION: Validates that a string contains only valid numbers.

PARAMETERS:
   strValue - String to be tested for validity

RETURNS:
   True if valid, otherwise false.
******************************************************************************/
  var objRegExp  =  /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;

  //check for numeric characters
  return objRegExp.test(strValue);
}

function validateInteger( strValue ) {
/************************************************
DESCRIPTION: Validates that a string contains only
    valid integer number.

PARAMETERS:
   strValue - String to be tested for validity

RETURNS:
   True if valid, otherwise false.
******************************************************************************/
  var objRegExp  = /(^-?\d\d*$)/;

  //check for integer characters
  return objRegExp.test(strValue);
}

function validateNotEmpty( strValue ) {
/************************************************
DESCRIPTION: Validates that a string is not all
  blank (whitespace) characters.

PARAMETERS:
   strValue - String to be tested for validity

RETURNS:
   True if valid, otherwise false.
*************************************************/
   var strTemp = strValue;
   strTemp = trimAll(strTemp);
   if(strTemp.length > 0){
     return true;
   }
   return false;
}

function validateUSZip( strValue ) {
/************************************************
DESCRIPTION: Validates that a string a United
  States zip code in 5 digit format or zip+4
  format. 99999 or 99999-9999

PARAMETERS:
   strValue - String to be tested for validity

RETURNS:
   True if valid, otherwise false.

*************************************************/
var objRegExp  = /(^\d{5}$)|(^\d{5}-\d{4}$)/;

  //check for valid US Zipcode
  return objRegExp.test(strValue);
}

function validateUSDate( strValue ) {
/************************************************
DESCRIPTION: Validates that a string contains only
    valid dates with 2 digit month, 2 digit day,
    4 digit year. Date separator can be ., -, or /.
    Uses combination of regular expressions and
    string parsing to validate date.
    Ex. mm/dd/yyyy or mm-dd-yyyy or mm.dd.yyyy

PARAMETERS:
   strValue - String to be tested for validity

RETURNS:
   True if valid, otherwise false.

REMARKS:
   Avoids some of the limitations of the Date.parse()
   method such as the date separator character.
*************************************************/
  var objRegExp = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/

  //check to see if in correct format
  if(!objRegExp.test(strValue))
    return false; //doesn't match pattern, bad date
  else{
    var strSeparator = strValue.substring(2,3) //find date separator
    var arrayDate = strValue.split(strSeparator); //split date into month, day, year
    //create a lookup for months not equal to Feb.
    var arrayLookup = { '01' : 31,'03' : 31, '04' : 30,'05' : 31,'06' : 30,'07' : 31,
                        '08' : 31,'09' : 30,'10' : 31,'11' : 30,'12' : 31}
    var intDay = parseInt(arrayDate[1]);

    //check if month value and day value agree
    if(arrayLookup[arrayDate[0]] != null) {
      if(intDay <= arrayLookup[arrayDate[0]] && intDay != 0)
        return true; //found in lookup table, good date
    }

    //check for February
    var intYear = parseInt(arrayDate[2]);
    var intMonth = parseInt(arrayDate[0]);
    if( ((intYear % 4 == 0 && intDay <= 29) || (intYear % 4 != 0 && intDay <=28)) && intDay !=0)
      return true; //Feb. had valid number of days
  }
  return false; //any other values, bad date
}

function validateValue( strValue, strMatchPattern ) {
/************************************************
DESCRIPTION: Validates that a string a matches
  a valid regular expression value.

PARAMETERS:
   strValue - String to be tested for validity
   strMatchPattern - String containing a valid
      regular expression match pattern.

RETURNS:
   True if valid, otherwise false.
*************************************************/
var objRegExp = new RegExp( strMatchPattern);

 //check if string matches pattern
 return objRegExp.test(strValue);
}


function rightTrim( strValue ) {
/************************************************
DESCRIPTION: Trims trailing whitespace chars.

PARAMETERS:
   strValue - String to be trimmed.

RETURNS:
   Source string with right whitespaces removed.
*************************************************/
var objRegExp = /^([\w\W]*)(\b\s*)$/;

      if(objRegExp.test(strValue)) {
       //remove trailing a whitespace characters
       strValue = strValue.replace(objRegExp, '$1');
    }
  return strValue;
}

function leftTrim( strValue ) {
/************************************************
DESCRIPTION: Trims leading whitespace chars.

PARAMETERS:
   strValue - String to be trimmed

RETURNS:
   Source string with left whitespaces removed.
*************************************************/
var objRegExp = /^(\s*)(\b[\w\W]*)$/;

      if(objRegExp.test(strValue)) {
       //remove leading a whitespace characters
       strValue = strValue.replace(objRegExp, '$2');
    }
  return strValue;
}

function trimAll( strValue ) {
/************************************************
DESCRIPTION: Removes leading and trailing spaces.

PARAMETERS: Source string from which spaces will
  be removed;

RETURNS: Source string with whitespaces removed.
*************************************************/
 var objRegExp = /^(\s*)$/;

    //check for all spaces
    if(objRegExp.test(strValue)) {
       strValue = strValue.replace(objRegExp, '');
       if( strValue.length == 0)
          return strValue;
    }

   //check for leading & trailing spaces
   objRegExp = /^(\s*)([\W\w]*)(\b\s*$)/;
   if(objRegExp.test(strValue)) {
       //remove leading and trailing whitespace characters
       strValue = strValue.replace(objRegExp, '$2');
    }
  return strValue;
}

function trimForCurrency(obj)
{
	var v = obj.value;
	var strTemp = v.toString();
	strTemp = trimAll(strTemp);
	obj.value = strTemp;
}

function removeCurrency( strValue ) {
/************************************************
DESCRIPTION: Removes currency formatting from
  source string.

PARAMETERS:
  strValue - Source string from which currency formatting
     will be removed;

RETURNS: Source string with commas removed.
*************************************************/
  var objRegExp = /\(/;
  var strMinus = '';

  //check if negative
  if(objRegExp.test(strValue)){
    strMinus = '-';
  }

  objRegExp = /\)|\(|[,]/g;
  strValue = strValue.replace(objRegExp,'');
  if(strValue.indexOf('$') >= 0){
    strValue = strValue.substring(1, strValue.length);
  }
  return strMinus + strValue;
}

function addCurrency( strValue ) {
/************************************************
DESCRIPTION: Formats a number as currency.

PARAMETERS:
  strValue - Source string to be formatted

REMARKS: Assumes number passed is a valid
  numeric value in the rounded to 2 decimal
  places.  If not, returns original value.
*************************************************/
  var objRegExp = new RegExp("-?[0-9]+(\.[0-9]){0,2}");
    if( objRegExp.test(strValue)) {
      objRegExp.compile('^-');
      strValue = addCommas(strValue);
      if (objRegExp.test(strValue)){
        strValue = '(' + strValue.replace(objRegExp,'') + ')';
      }
	   var a = strValue.split(".");
	   if (a.length==2)
	   {
		strValue = a[0] + '.' + removeCommas(a[1]);
	   }
		return '$' + strValue;
    }
    else
	{
		return strValue;
	}
}

function removeCommas( strValue ) {
/************************************************
DESCRIPTION: Removes commas from source string.

PARAMETERS:
  strValue - Source string from which commas will
    be removed;

RETURNS: Source string with commas removed.
*************************************************/
  var objRegExp = /,/g; //search for commas globally

  //replace all matches with empty strings
  return strValue.replace(objRegExp,'');
}

function addCommas( strValue ) {
/************************************************
DESCRIPTION: Inserts commas into numeric string.

PARAMETERS:
  strValue - source string containing commas.

RETURNS: String modified with comma grouping if
  source was all numeric, otherwise source is
  returned.

REMARKS: Used with integers or numbers with
  2 or less decimal places.
*************************************************/
  var objRegExp  = new RegExp('(-?[0-9]+)([0-9]{3})');

    //check for match to search criteria
    while(objRegExp.test(strValue)) {
       //replace original string with first group match,
       //a comma, then second group match
       strValue = strValue.replace(objRegExp, '$1,$2');
    }
	objRegExp =null;
  return strValue;
}

function removeCharacters( strValue, strMatchPattern ) {
/************************************************
DESCRIPTION: Removes characters from a source string
  based upon matches of the supplied pattern.

PARAMETERS:
  strValue - source string containing number.

RETURNS: String modified with characters
  matching search pattern removed

USAGE:  strNoSpaces = removeCharacters( ' sfdf  dfd',
                                '\s*')
*************************************************/
 var objRegExp =  new RegExp( strMatchPattern, 'gi' );

 //replace passed pattern matches with blanks
  return strValue.replace(objRegExp,'');
}

function removePercent( strValue ) 
{
	return removeCharacters(strValue, '%');
}




