// JavaScript Document
//  Validate
//

// isInteger(s)
// check to see if value in all and only numbers


//  dateString()
// 		- create date string (mm/dd/yyyy)

//  valid_date = validateDate(date_field,format_field,range_field) 
//   		Format_field should be U, J, or W to indicate the date format and the 
//   		range_field shoud be A, P, or F to indicate whether all, past or future dates are valid.

// 	function ValidatePhone(PhoneNumber)
//

//  function validZip(zip)
//

//	function validEmail(email)
//

// function getAge(DOBstring)
// 	return age in years

// function getAgeOn(DOBString,OnDateString)
// 	return age in years on specified date
// 	date format mm/dd/yyyy

// capitilize the first
// stCap(string);

//
// function capWords(object)
// used to capitilize works in a text box

// function slcCheck(object)
// used to change slc to salt lake city in text box

// trim(str)
// trims leading and trailing blanks

// roundTo(value,places)
// rounds to that many decimal places.

// formatPhone(object, areaCode)
// format phone field to (xxx) xxx-xxxx

// Format Street address
// formatStreet(streetAddressObject)
// streetAddress is object (address.value)

// format state
// function formatState(field) {


// format data

//--------------------------------------------------------
function formatStreet(street) {
	var ss = " " + street.value + " ";

	// stuff to consider adding
	// insert space for n,s,e,w  next to a number
	// only correct once, let everything go thru the second time
	
	ss = ss.replace(".", " ");
	ss = ss.replace(".", " ");
	ss = ss.replace(".", " ");
	ss = ss.replace(".", " ");
	ss = ss.replace(/ drive /i,	 " dr ");
	ss = ss.replace(/ street /i, " St ");
	ss = ss.replace(/ avenue /i, " av ");
	ss = ss.replace(/ road /i,	 " rd ");
	ss = ss.replace(/ lane /i,	 " ln ");
	ss = ss.replace(/ place /i,	 " pl ");
	ss = ss.replace(/ court /i,	 " ct ");
	ss = ss.replace(/ circle /i, " cir ");
	
	ss = ss.replace(/ po box /i, " pobox ");
	ss = ss.replace(/ pobox /i, " PO box ");
	
	ss = ss.replace(/ north /i, " n ");
	ss = ss.replace(/ south /i, " s ");
	ss = ss.replace(/ so /i, " s ");
	ss = ss.replace(/ east /i, " e ");
	ss = ss.replace(/ west /i, " w ");
	ss = ss.replace(/  /i, "  ");
			
	ss = ss.replace(/ ne /i, " NE ");
	ss = ss.replace(/ nw /i, " NW ");
	ss = ss.replace(/ se /i, " SE ");
	ss = ss.replace(/ sw /i, " SW ");

	ss = ss.replace(/ s temple /i, " south temple ");
	ss = ss.replace(/ n temple /i, " north temple ");
	ss = ss.replace(/ e temple /i, " east temple ");
	ss = ss.replace(/ w temple /i, " west temple ");
					
	street.value = ss;
	capWords(street);  // this also trims and removes white space, does not change case of other letters
};

function formatPrice(price) {
	var p = price.value;
	
	p = p.replace("$", "");
	
	if(p.indexOf(".")==-1 && p!="") {
		p = p + ".00";
	}
	
	price.value = p;
}


//------------------------------------------
function formatPhone(field,area) {
	if (ValidatePhone(field.value)) {  //if good phone number, then format
		var s = field.value;
		s=s.replace(/[^0-9]/gi, "");  //keep only numbers, format into 3 seperate fields
		if (s.length == 7) pnumber = "("+area+") " + s.substr(0,3) + "-" +  s.substr(3)
		else pnumber = "(" + s.substr(0,3) + ") " + s.substr(3,3) + "-" + s.substr(6);
		field.value=pnumber;
		};
	};

//------------------------------------------
function formatDate(field) {	//
		//format date if missing leading century
		// accept dd/mm/yy(yy)  or dd-mm-yy(yy)
		// output dd/mm/yyyy
		var yy,dd,mm;
		fld = field.value;
		var d1 = fld.split('\/');
		if (d1.length == 1) d1 = fld.split('\-');
		if (d1.length == 1) d1 = fld.split(' ');
		if (d1.length == 3) {
			mm = d1[0]; dd = d1[1]; yy = d1[2];
			if (isNum(yy)) {
				yy = parseFloat(yy);
				if (yy < 20 ) yy=yy+2000;
				if (yy < 100) yy=yy+1900; };
			
			if (isNum(dd) &&  isNum(mm) && isNum(yy)) field.value = mm+'/'+dd+'/'+yy;		
		}; 
};

//---------------------------------------------------------------------
// valid IP address
function validIP(ipAddress) {

	ipAddress = trim(ipAddress);
	//if (ipAddress == '') return true;
	
	var error = false;
	var ipPattern = /^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/;
	var ipArray = ipAddress.match(ipPattern);

	if (ipArray == null) error = true;
	else {
		for (i = 1; i < 5; i++) {
			thisSegment = ipArray[i];
			//alert('thisSegment='+thisSegment);
			//alert(i);&& thisSegment == 0
			if (thisSegment == 0 && i == 1) error = true;
			
			if (thisSegment >= 255) {
				error = true;
			};
		};
	};

	return !(error);
};

//----------------------------------------
function roundTo(value, places) {
	newValue = Math.round(value*Math.pow(10,places))/Math.pow(10,places);
	return newValue;
};
	
function toFixed(value) {
	value += '';
	if(value.indexOf('.')<0) value += '.00';
	return value;
}
	
//----------------------------------
// make each word capitilized, remove leading/trailing spaces
function capWords(obj) {
        val = obj.value;
        newVal = '';
        val = val.split(' ');
        for(var c=0; c < val.length; c++) {
        	newVal += val[c].substring(0,1).toUpperCase() + val[c].substring(1,val[c].length) + ' ';
        };
        newVal = newVal.replace(/[ \s]+$/,"").replace(/^[ \s]+/,""); 
        
   var re = /  /g;
   while (newVal.match(re)) { newVal = newVal.replace(re, " "); }
        obj.value = newVal;
	};

//--------------------------------------
// check for SLC
function formatCity(obj) {slcCheck(obj)};
function slcCheck(obj) {
	
	val = obj.value;
	val=trim(val);
	 	newVal = val;
    	if (val.toLowerCase() == "slc" ) newVal = "Salt Lake City";
    	if (val.toLowerCase() == "nsl" || val.toLowerCase() == "nslc" ) newVal = "North Salt Lake City";
	obj.value=newVal;
	capWords(obj);
	};

// format state
function formatState(field) {
	
	a=field.value;
	if (a.length == 2) {
		a=a.toUpperCase();
		field.value = a;
	} else {
		capWords(field);
	};
};
		


//-----------------------------
function trim(str) { 
    str = str.replace(/[ \s]+$/,"").replace(/^[ \s]+/,""); 
    return str;
	};



//--------------------------------------
// capitilize first, lower cass the rest
function stCap(strObj){
	return(strObj.charAt(0).toUpperCase()+strObj.substr(1).toLowerCase());
	};

//----------------------------------------------
//  function DateString(new Date())
//
function dateString(mydate) {
//	return a mm/dd/yyyy string of a date object
	var theyear=mydate.getFullYear();
	var theday=mydate.getDay();
	var themonth=mydate.getMonth()+1;
	var theday=mydate.getDate();
			
	return themonth+"/"+theday+"/"+theyear;
	};

//-----------------------------------------------
// validate Email address
//
function validEmail(email) {	
	if (/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email))  return (true);
	return false;
	};

//--------------------------------------------
// validate zipcode
//
function validZip(zip)  {
	len=zip.length; 
	digits="0123456789";
	
	if (len != 5 && len != 10) return false;
	for (i=0; i<5; i++) {if (digits.indexOf(zip.charAt(i))<0) return false; };
	return true; 
};

//--------------------------------------------------------------
//validate phone number
//
// Declaring required variables
var digits = "0123456789";
// non-digit characters which are allowed in phone numbers
var phoneNumberDelimiters = "()- .";
// characters which are allowed in international phone numbers
// (a leading + is OK)
var validWorldPhoneChars = phoneNumberDelimiters + "+";
// Minimum no of digits in an international phone no.
var minDigitsInIPhoneNumber = 7
var maxDigitsInIPhoneNumber = 10;

function isInteger(s)
{   var i;
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}
function stripCharsInBag(s, bag)
{   var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++)
    {   
        // Check that current character isn't whitespace.
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function checkInternationalPhone(strPhone){
	s=stripCharsInBag(strPhone,validWorldPhoneChars);
	return (isInteger(s) && ( s.length == minDigitsInIPhoneNumber || s.length == maxDigitsInIPhoneNumber ));
}

function ValidatePhone(PhoneNumber)
{
	var Phone=PhoneNumber;

	if ((Phone==null)||(Phone==""))	return false
	
	if (checkInternationalPhone(Phone)==false){
		//alert("Please Enter a Valid Phone Number");
		return false;
	}
	return true
 }

// 
//-------------------------------------------------------------------------
// Date Validation
// pass mm/dd/yy -- return system date object  
var t = new Date;
t.setHours(0);
t.setMinutes(0);
t.setSeconds(0);

function returnDate(dateString) {
	validateDate(dateString,"U","A");
	return t;
}

function valDateFmt(datefmt) {
	myOption = -1;
	for (var i=0; i<datefmt.length; i++) {if (datefmt[i].checked) {myOption = i;}}
	if (myOption == -1) {alert("You must select a date format");return ' ';}
	return datefmt[myOption].value;}

function valDateRng(daterng) {myOption = -1;
	for (var i=0; i<daterng.length; i++) {if (daterng[i].checked) {myOption = i;}}
	if (myOption == -1) {alert("You must select a date range");return ' ';}
	return daterng[myOption].value;}

function stripBlanks(fld) {
	var result = "";
	var c=0;
	for (var i=0; i<fld.length; i++) {
		if (fld.charAt(i) != " " || c > 0) {
			result += fld.charAt(i);
			if (fld.charAt(i) != " ") c = result.length;
			}
		}
		return result.substr(0,c);
	}
var numb = '0123456789';

function isValid(parm,val) {if (parm == "") return true;
	for (var i=0; i<parm.length; i++) {if (val.indexOf(parm.charAt(i),0) == -1)
	return false;}return true;}

function isNum(parm) {return isValid(parm,numb);}

var mth = new Array('','january','february','march','april','may','june','july','august','september','october','november','december');
var day = new Array(31,28,31,30,31,30,31,31,30,31,30,31);

function validateDate(fld,fmt,rng) {

var dd, mm, yy;
var today = new Date;
//var t = new Date;
fld = stripBlanks(fld);
if (fld == '') return false;

var d1 = fld.split('\/');
if (d1.length != 3) d1 = fld.split(' ');
if (d1.length != 3) d1 = fld.split('-');
if (d1.length != 3) return false;
if      (fmt == 'u' || fmt == 'U') {  dd = d1[1]; mm = d1[0]; yy = d1[2];}
else if (fmt == 'j' || fmt == 'J') {  dd = d1[2]; mm = d1[1]; yy = d1[0];}
else if (fmt == 'w' || fmt == 'W') {  dd = d1[0]; mm = d1[1]; yy = d1[2];}
else return false;
n = dd.lastIndexOf('st');
if (n > -1) dd = dd.substr(0,n);
n = dd.lastIndexOf('nd');
if (n > -1) dd = dd.substr(0,n);
n = dd.lastIndexOf('rd');
if (n > -1) dd = dd.substr(0,n);
n = dd.lastIndexOf('th');
if (n > -1) dd = dd.substr(0,n);
n = dd.lastIndexOf(',');
if (n > -1) dd = dd.substr(0,n);
n = mm.lastIndexOf(',');
if (n > -1) mm = mm.substr(0,n);
if (!isNum(dd)) return false;
if (!isNum(yy)) return false;
if (!isNum(mm)) {
  var nn = mm.toLowerCase();
  for (var i9=1; i9 < 13; i9++) {
    //if (nn == mth[i9] || nn == mth[i9].substr(0,3)) {mm = i9; i9 = 13;}  //test to text month name
  }
}
if (!isNum(mm)) return false;

dd = parseFloat(dd); mm = parseFloat(mm); yy = parseFloat(yy);
if (yy < 100 && yy > 20 ) yy += 1900; // these two lines were changed
if (yy <= 20)  yy += 2000; 

if (yy < 1582 || yy > 4881) return false;

if (mm == 2 && (yy%400 == 0 || (yy%4 == 0 && yy%100 != 0))) day[mm-1]++;
if (mm < 1 || mm > 12) return false;
if (dd < 1 || dd > day[mm-1]) return false;

t.setDate(dd); t.setMonth(mm-1); t.setFullYear(yy);

if      (rng == 'p' || rng == 'P') { if (t > today) return false;	}
else if (rng == 'f' || rng == 'F') { if (t < today) return false;	}
else if (rng != 'a' && rng != 'A') return false;
return true;
}

//---------------------------------
// return age in years on specified date
// date format mm/dd/yyyy
function getAgeOn(DOBString,OnDateString){
	dob = returnDate(DOBString);
    var yearDob = dob.getFullYear();
    var monthDob = dob.getMonth();
    var dateDob = dob.getDate();
     
	on = returnDate(OnDateString);
    var yearOn = on.getFullYear();
    var monthOn = on.getMonth();
    var dateOn = on.getDate();
    
    yearAge = yearOn - yearDob;

    if (monthOn >= monthDob)
        var monthAge = monthOn - monthDob
    else {
        yearAge--;
        var monthAge = 12 + monthOn -monthDob;
    }

    if (dateOn >= dateDob)
        var dateAge = dateOn - dateDob
    else {
        monthAge--;
        var dateAge = 31 + dateOn - dateDob;

        if (monthAge < 0) {
            monthAge = 11;
            yearAge--; 
        }
	}
	//alert(yearAge);
return yearAge;
}



//---------------------
function getAge(DOBstring){
// return age in years for now
// pass date strint  mm/dd/yyyy
    var now = new Date();
    var year = now.getFullYear();
    var month = now.getMonth()+1;
    var date = now.getDate();
    
    NowString = month + "/" + date + "/" + year;  
    return getAgeOn(DOBstring, NowString);
    };


