﻿  /////////////////////////////////////////////////////////////////////////
 //////////Copyright © William J. Familia (wjfamilia@gmail.com)///////////
/////////////////////////////////////////////////////////////////////////
function formatPhoneNumber(phoneNumberField, allowExtension, useTollFreeFormatting, countryID, e) 
{
    //8  = Backspace
    //37 = Left Arrow
    //39 = Right Arrow
    
    if(getKeycode(e)!= 8 && countryID == "184")
    {
        var unformattedPhoneNumber = makeNumeric(phoneNumberField.value, false);
        var isValidTollFreePrefix = false;
        var formattedPhoneNumber   = "";
        
        //valid current & future toll free number prefixes : http://en.wikipedia.org/wiki/Toll_free_number
        var validTollFreePrefixies = new Array("800","888","877","866","855","844","833","822");
        var validTollFreePrefixiesFirst2Only = new Array("80","88","87","86","85","84","83","82");
        var first3Digits = unformattedPhoneNumber.charAt(0) + unformattedPhoneNumber.charAt(1) + unformattedPhoneNumber.charAt(2);
        var first4Digits = first3Digits + unformattedPhoneNumber.charAt(3);
        
        for(var k = 0; k < validTollFreePrefixies.length; k++)
        {
            if(validTollFreePrefixies[k] == first3Digits)
            {
                isValidTollFreePrefix = true;
                unformattedPhoneNumber = "1" + unformattedPhoneNumber;
            }
            else if("1" + validTollFreePrefixies[k] == first4Digits)
            {
                isValidTollFreePrefix = true;
            }
            else if("1" + validTollFreePrefixiesFirst2Only[k] == first3Digits && unformattedPhoneNumber.length == 3)
            {
                isValidTollFreePrefix = true;
            }
       }
       
       if(!useTollFreeFormatting)
       {
            isValidTollFreePrefix = false;
       }

       if(isValidTollFreePrefix)
       {
            //1-###-###-#### ext. ####
            formattedPhoneNumber += "1" + "-" + unformattedPhoneNumber.charAt(1) + unformattedPhoneNumber.charAt(2) + unformattedPhoneNumber.charAt(3);
            if(unformattedPhoneNumber.length > 3)
            {
                formattedPhoneNumber += "-"; 
                formattedPhoneNumber += unformattedPhoneNumber.charAt(4) + unformattedPhoneNumber.charAt(5) + unformattedPhoneNumber.charAt(6);
                if(unformattedPhoneNumber.length > 6)
                {
                    formattedPhoneNumber += "-";
                    formattedPhoneNumber += unformattedPhoneNumber.charAt(7) + unformattedPhoneNumber.charAt(8) + unformattedPhoneNumber.charAt(9) + unformattedPhoneNumber.charAt(10);
                    if(allowExtension)
                    {
                        if(unformattedPhoneNumber.length > 11)                                                                                                                                              
                        {                                                                                                                                                                                        
                            formattedPhoneNumber += " ext. ";
                            for(var i = 11; i < unformattedPhoneNumber.length; i++)                                                                                                                             
                            {                                                                                                                                                                                       
                                formattedPhoneNumber += unformattedPhoneNumber.charAt(i);                                                                                                                           
                            }
                        }
                    }
                }
            }
        }
        else
        {
            //If less then 4 in length, this still could be a valid toll-free number
            if(unformattedPhoneNumber.length > 2)
            {
                if(unformattedPhoneNumber.charAt(0) == "1")
                {
                    var tempUnformattedPhoneNumber = "";
                    for(var j = 1; j < unformattedPhoneNumber.length; j++)
                    {
                        tempUnformattedPhoneNumber += unformattedPhoneNumber.charAt(j);
                    }
                    unformattedPhoneNumber = tempUnformattedPhoneNumber;
                }
                //(###) ###-#### ext. ####
                if(unformattedPhoneNumber.length > 2 || phoneNumberField.value.charAt(0) == "(")
                {
                   formattedPhoneNumber += "("; 
                }
                formattedPhoneNumber += unformattedPhoneNumber.charAt(0) + unformattedPhoneNumber.charAt(1) + unformattedPhoneNumber.charAt(2);
                if(unformattedPhoneNumber.length > 2)
                {
                    formattedPhoneNumber += ") ";
                    formattedPhoneNumber += unformattedPhoneNumber.charAt(3) + unformattedPhoneNumber.charAt(4) + unformattedPhoneNumber.charAt(5);
                    if(unformattedPhoneNumber.length > 5)
                    {
                        formattedPhoneNumber += "-";
                        formattedPhoneNumber += unformattedPhoneNumber.charAt(6) + unformattedPhoneNumber.charAt(7) + unformattedPhoneNumber.charAt(8) + unformattedPhoneNumber.charAt(9);                                                                                                                                                                                   
                        if(allowExtension)
                        {
                            if(unformattedPhoneNumber.length > 10)
                            {
                                formattedPhoneNumber += " ext. ";
                                for(var i = 10; i < unformattedPhoneNumber.length; i++)
                                {
                                    formattedPhoneNumber += unformattedPhoneNumber.charAt(i);
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                if(phoneNumberField.value == "1" && useTollFreeFormatting)
                {
                    formattedPhoneNumber = "1-";
                }
                else if(phoneNumberField.value == "1--" && useTollFreeFormatting)
                {
                    formattedPhoneNumber = "1-";
                }
                else if(phoneNumberField.value == "1-8" && useTollFreeFormatting)
                {
                    formattedPhoneNumber = "1-8";
                }
                else if(phoneNumberField.value.charAt(0) == "(")
                {
                    formattedPhoneNumber = "(" + unformattedPhoneNumber;
                }
                else
                {
                    formattedPhoneNumber = unformattedPhoneNumber;
                }
            }
        }       
                
       return formattedPhoneNumber;    
    }
    else
    {
        return phoneNumberField.value;
    }
}
    
    
function formatSocialSecurityNumber(ssnField, countryID, e) 
{
    //8  = Backspace
    //9  = Tab (so will stay highlighted)
    //16 = Reverse Tab - Shift+Tab (so will stay highlighted)
    //37 = Left Arrow
    //39 = Right Arrow
    
    if(getKeycode(e)!= 8)
    {
        var unformattedSsn = makeNumeric(ssnField.value, false);
        var formattedSsn   = "";
        
        formattedSsn += unformattedSsn.charAt(0) + unformattedSsn.charAt(1) + unformattedSsn.charAt(2);
        if(unformattedSsn.length >= 3)
        {
            formattedSsn += "-";
            if(unformattedSsn.length > 3)
            {
                formattedSsn += unformattedSsn.charAt(3) + unformattedSsn.charAt(4);
                if(unformattedSsn.length > 4)
                {
					if(countryID == "31") //Canada
					{
						formattedSsn += "-" + unformattedSsn.charAt(5) + unformattedSsn.charAt(6) + unformattedSsn.charAt(7);
					}
					else
					{
						//US
						formattedSsn += "-" + unformattedSsn.charAt(5) + unformattedSsn.charAt(6) + unformattedSsn.charAt(7) + unformattedSsn.charAt(8);
					}
                    
                } 
            }
        }
                    
        return formattedSsn;  
    }
    else
    {
        return ssnField.value;
    }                                    
}


function formatPostalCode(postalCodeField, allowExtended ,countryID, e) 
{
    //8  = Backspace
    //9  = Tab (so will stay highlighted)
    //16 = Reverse Tab - Shift+Tab (so will stay highlighted)
    //37 = Left Arrow
    //39 = Right Arrow
    
    if(getKeycode(e)!= 8)
    {
        if(countryID != null && countryID == "31") //Canada
        {
            //http://www.infinitegravity.ca/postalcodeformat.htm (ANA NAN)
            var unformattedPostalCode = postalCodeField.value.replace(" ", "");
            var formattedPostalCode   = "";
            
            if(unformattedPostalCode.length > 0)
            {
                var validFirstCharacterOfFSA = new Array("A","B","C","E","G","H","J","K","L","M","N","P","R","S","T","V","X","Y");
                
                for(var i = 0; i < validFirstCharacterOfFSA.length; i++)
                {
                    if(validFirstCharacterOfFSA[i] == unformattedPostalCode.charAt(0).toUpperCase())
                    {
                        formattedPostalCode += validFirstCharacterOfFSA[i];
                    }
                }
                
                if(formattedPostalCode.length == 1 && unformattedPostalCode.length > 1)
                {
                    if(!isNaN(unformattedPostalCode.charAt(1)))
                    {
                        formattedPostalCode += unformattedPostalCode.charAt(1);
                    }
                }
                
                if(formattedPostalCode.length == 2 && unformattedPostalCode.length > 2)
                {
                    //http://en.wikipedia.org/wiki/Canadian_postal_code
                    //No postal code includes the letters D, F, I, O, Q, or U, as the OCR equipment used in automated sorting could easily confuse them with other letters and digits, especially when they are rendered as cursive handwriting. The letters W and Z are used, but are not currently used as the first letter.
                    
                    //Added W and Z to First list
                    var validThirdCharacterOfFSA = new Array("A","B","C","E","G","H","J","K","L","M","N","P","R","S","T","V","W","X","Y","Z");
                
                    for(var j = 0; j < validThirdCharacterOfFSA.length; j++)
                    {
                        if(validThirdCharacterOfFSA[j] == unformattedPostalCode.charAt(2).toUpperCase())
                        {
                            formattedPostalCode += validThirdCharacterOfFSA[j];
                        }
                    }
                }
                
                if(formattedPostalCode.length == 3)
                {
                    formattedPostalCode += " ";
                }
                
                if(formattedPostalCode.length == 4 && unformattedPostalCode.length > 3)
				{
					if(!isNaN(unformattedPostalCode.charAt(3)))
					{
						formattedPostalCode += unformattedPostalCode.charAt(3);
					}
				}
				
				if(formattedPostalCode.length == 5 && unformattedPostalCode.length > 4)
                {
                    //http://en.wikipedia.org/wiki/Canadian_postal_code
                    //No postal code includes the letters D, F, I, O, Q, or U, as the OCR equipment used in automated sorting could easily confuse them with other letters and digits, especially when they are rendered as cursive handwriting. The letters W and Z are used, but are not currently used as the first letter.
                    
                    //Added W and Z to First list
                    var validSecondCharacterOfLDU = new Array("A","B","C","E","G","H","J","K","L","M","N","P","R","S","T","V","W","X","Y","Z");
                
                    for(var j = 0; j < validSecondCharacterOfLDU.length; j++)
                    {
                        if(validSecondCharacterOfLDU[j] == unformattedPostalCode.charAt(4).toUpperCase())
                        {
                            formattedPostalCode += validSecondCharacterOfLDU[j];
                        }
                    }
                }
                
                if(formattedPostalCode.length == 6 && unformattedPostalCode.length > 5)
				{
					if(!isNaN(unformattedPostalCode.charAt(5)))
					{
						formattedPostalCode += unformattedPostalCode.charAt(5);
					}
				}
            }
                        
            return formattedPostalCode; 
        }
        else //USA countryID == "184"
        {
            var unformattedPostalCode = makeNumeric(postalCodeField.value, false);
            var formattedPostalCode   = "";
            
            formattedPostalCode += unformattedPostalCode.charAt(0) + unformattedPostalCode.charAt(1) + unformattedPostalCode.charAt(2) + unformattedPostalCode.charAt(3) + unformattedPostalCode.charAt(4);
            if(unformattedPostalCode.length > 5 && allowExtended)
            {
                formattedPostalCode += "-" + unformattedPostalCode.charAt(5) + unformattedPostalCode.charAt(6) + unformattedPostalCode.charAt(7) + unformattedPostalCode.charAt(8);
            }
                        
            return formattedPostalCode; 
        }
    }
    else
    {
        return postalCodeField.value;
    }                                      
}


function formatNumberWithCheckDigit(formField, e) 
{
    //8  = Backspace
    //9  = Tab (so will stay highlighted)
    //16 = Reverse Tab - Shift+Tab (so will stay highlighted)
    //37 = Left Arrow
    //39 = Right Arrow

    if(getKeycode(e)!= 8)
    {
        var unformattedNumberWithCheckDigit = makeNumeric(formField.value, false);
        var formattedNumberWithCheckDigit   = "";
        var originalValueLength        = formField.value.length;
        var dashIndex                  = formField.value.indexOf("-");
        
        if(dashIndex == 0)
        {
            formattedNumberWithCheckDigit = unformattedNumberWithCheckDigit;
        }
        else if(dashIndex > 0)
        {
            formattedNumberWithCheckDigit = unformattedNumberWithCheckDigit.substr(0, dashIndex) + "-" + unformattedNumberWithCheckDigit.substr(dashIndex, 1);
        }
        else
        {
            formattedNumberWithCheckDigit = unformattedNumberWithCheckDigit;
        }
        
        return formattedNumberWithCheckDigit;
    }
    else
    {
        return formField.value;
    }
}


function makeNumeric(value, setEmptyToZero) 
{
    var numericValue = "";
    for(var i = 0; i <= value.length; i++) 
    {
        if(value.charAt(i) == "1" || value.charAt(i) == "2" || value.charAt(i) == "3" || value.charAt(i) == "4" || value.charAt(i) == "5" || value.charAt(i) == "6" || value.charAt(i) == "7" || value.charAt(i) == "8" || value.charAt(i) == "9" || value.charAt(i) == "0")
        {
            numericValue += value.charAt(i);
        }
    }
    
    if(setEmptyToZero)
    {
        if(numericValue == "")
        {
            numericValue = 0;
        }
    }
    
    return numericValue;
}

function getKeycode(e)
{
    var blnDOM = false, blnIE4 = false, blnNN4 = false; 
    
    if(document.layers) blnNN4 = true;
    else if(document.all) blnIE4 = true;
    else if(document.getElementById) blnDOM = true;

    if(blnNN4)
    {
        var NN4key = e.which
        return NN4key;
    }
    if(blnDOM)
    {
        var blnkey = e.which
        return blnkey;
    }
    if(blnIE4)
    {
        var IE4key = event.keyCode
        return IE4key;
    }
}

function formatCurrency(formField, setEmptyToZero, e) 
{
    //8  = Backspace
    //9  = Tab (so will stay highlighted)
    //16 = Reverse Tab - Shift+Tab (so will stay highlighted)
    //37 = Left Arrow
    //39 = Right Arrow
    
    if(getKeycode(e)!= 8)
    {
        var unformattedCurrency = makeNumeric(formField.value, setEmptyToZero);
        var formattedCurrency   = "";
        var originalValueLength = formField.value.length;
        var decimalIndex        = formField.value.indexOf(".");
        
        if(decimalIndex == 0)
        {
            formattedCurrency = unformattedCurrency;
        }
        else if(decimalIndex > 0)
        {
            formattedCurrency = unformattedCurrency.substr(0, decimalIndex) + "." + unformattedCurrency.substr(decimalIndex, 2);
        }
        else
        {
            formattedCurrency = unformattedCurrency;
        }
        
        return formattedCurrency;
    }
    else
    {
        return formField.value;
    }
}