
function trimAll(strValue) {
    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 validateNotEmpty(strValue) {
    var strTemp = strValue;
    strTemp = trimAll(strTemp);
    if (strTemp.length > 0) {
        return true;
    }
    return false;
}

function validateNumeric(strValue) {
    var objRegExp = /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;

    //check for numeric characters
    return objRegExp.test(strValue);
}

function Toggle(item) {
    var thisItem = document.getElementById(item);
    if (thisItem != "undefined") {
        if (thisItem.style.display == "none")
            thisItem.style.display = "";
        else
            thisItem.style.display = "none";
    }
}


function testCreditCard(txtCardNumber, drpCardType) {
    if (document.getElementById(txtCardNumber) == null || document.getElementById(txtCardNumber) == "undefined")
        return;
        
    var cardNumber = document.getElementById(txtCardNumber).value;
    var tmpCardType = document.getElementById(drpCardType);
    var cardType = tmpCardType.options[tmpCardType.selectedIndex].value;

    //alert('CardNumber' + cardNumber);
    //alert('cardType' + cardType);

    if (false == checkCreditCard(cardNumber, cardType)) {
        alert(ccErrors[ccErrorNo])
    }
    else {
        //alert ("Credit card has a valid format")
    };
}


function testCreditCard2(txtCardNumber, drpCardType, button, validationGroup) {
    if (document.getElementById(txtCardNumber) == null || document.getElementById(txtCardNumber) == "undefined") {
        // user is not using credit card, do not check, just return true
        ToggleButton(button, validationGroup);
        return true;
    }
        
    var cardNumber = document.getElementById(txtCardNumber).value;
    var tmpCardType = document.getElementById(drpCardType);
    var cardType = tmpCardType.options[tmpCardType.selectedIndex].value;

    //alert('CardNumber' + cardNumber);
    //alert('cardType' + cardType);

    if (false == checkCreditCard(cardNumber, cardType)) {
        alert(ccErrors[ccErrorNo]);
        return false;
    }
    else {
        ToggleButton(button, validationGroup);
        return true;
    }
}


//Modified from the original to meet our requirement
/*============================================================================*/
/*
This routine checks the credit card number. The following checks are made:

1. A number has been provided
2. The number is a right length for the card
3. The number has an appropriate prefix for the card
4. The number has a valid modulus 10 number check digit if required

If the validation fails an error is reported.

The structure of credit card formats was gleaned from a variety of sources on 
the web, although the best is probably on Wikepedia ("Credit card number"):

http://en.wikipedia.org/wiki/Credit_card_number

Parameters:
cardnumber           number on the card
cardname             name of card as defined in the card list below

Author:     John Gardner
Date:       1st November 2003
Updated:    26th Feb. 2005      Additional cards added by request
Updated:    27th Nov. 2006      Additional cards added from Wikipedia
Updated:    18th Jan. 2008      Additional cards added from Wikipedia


*/


var ccErrorNo = 0;
var ccErrors = new Array()

ccErrors[1] = "No card number provided";
ccErrors[2] = "Credit card number is in invalid format";
ccErrors[3] = "Credit card number is invalid";
ccErrors[4] = "Credit card number has an inappropriate number of digits";

function checkCreditCard(cardnumber, cardname) {

    // Array to hold the permitted card characteristics
    var cards = new Array();

    // Define the cards we support. You may add addtional card types.

    //  Name:      As in the selection box of the form - must be same as user's
    //  Length:    List of possible valid lengths of the card number for the card
    //  prefixes:  List of possible prefixes for the card
    //  checkdigit Boolean to say whether there is a check digit

    cards[0] = { name: "Visa",
        length: "13,16",
        prefixes: "4",
        checkdigit: true
    };
    cards[1] = { name: "MasterCard",
        length: "16",
        prefixes: "51,52,53,54,55",
        checkdigit: true
    };
    cards[2] = { name: "DinersClub",
        length: "14,16",
        prefixes: "300,301,302,303,304,305,36,38,55",
        checkdigit: true
    };
    cards[3] = { name: "CarteBlanche",
        length: "14",
        prefixes: "300,301,302,303,304,305,36,38",
        checkdigit: true
    };
    cards[4] = { name: "AmericanExpress",
        length: "15",
        prefixes: "34,37",
        checkdigit: true
    };
    cards[5] = { name: "Discover",
        length: "16",
        prefixes: "6011,650",
        checkdigit: true
    };
    cards[6] = { name: "JCB",
        length: "15,16",
        prefixes: "3,1800,2131",
        checkdigit: true
    };
    cards[7] = { name: "enRoute",
        length: "15",
        prefixes: "2014,2149",
        checkdigit: true
    };
    cards[8] = { name: "Solo",
        length: "16,18,19",
        prefixes: "6334, 6767",
        checkdigit: true
    };
    cards[9] = { name: "Switch",
        length: "16,18,19",
        prefixes: "4903,4905,4911,4936,564182,633110,6333,6759",
        checkdigit: true
    };
    cards[10] = { name: "Maestro",
        length: "16,18",
        prefixes: "5020,6",
        checkdigit: true
    };
    cards[11] = { name: "VisaElectron",
        length: "16",
        prefixes: "417500,4917,4913",
        checkdigit: true
    };

    // Establish card type
    var cardType = -1;
    for (var i = 0; i < cards.length; i++) {

        // See if it is this card (ignoring the case of the string)
        if (cardname.toLowerCase() == cards[i].name.toLowerCase()) {
            cardType = i;
            break;
        }
    }

    // If card type not found,
    if (cardType == -1) {
        return true;   //Ignore this error.
    }

    // Ensure that the user has provided a credit card number
    //if (cardnumber.length == 0) {
        //ccErrorNo = 1;
        //return false;
    //}

    // Now remove any spaces from the credit card number
    cardnumber = cardnumber.replace(/\s/g, "");
    var isMasked = /^[xX]+[0-9]{1,4}$/;
    if (isMasked.exec(cardnumber)) {
        //alert("Masked");
        return true;
    }

    // Check that the number is numeric
    var cardNo = cardnumber
    var cardexp = /^[0-9]{13,19}$/;
    if (!cardexp.exec(cardNo)) {
        ccErrorNo = 2;
        return false;
    }

    // Now check the modulus 10 check digit - if required
    if (cards[cardType].checkdigit) {
        var checksum = 0;                                  // running checksum total
        var mychar = "";                                   // next char to process
        var j = 1;                                         // takes value of 1 or 2

        // Process each digit one by one starting at the right
        var calc;
        for (i = cardNo.length - 1; i >= 0; i--) {

            // Extract the next digit and multiply by 1 or 2 on alternative digits.
            calc = Number(cardNo.charAt(i)) * j;

            // If the result is in two digits add 1 to the checksum total
            if (calc > 9) {
                checksum = checksum + 1;
                calc = calc - 10;
            }

            // Add the units element to the checksum total
            checksum = checksum + calc;

            // Switch the value of j
            if (j == 1) { j = 2 } else { j = 1 };
        }

        // All done - if checksum is divisible by 10, it is a valid modulus 10.
        // If not, report an error.
        if (checksum % 10 != 0) {
            ccErrorNo = 3;
            return false;
        }
    }

    // The following are the card-specific checks we undertake.
    var LengthValid = false;
    var PrefixValid = false;
    var undefined;

    // We use these for holding the valid lengths and prefixes of a card type
    var prefix = new Array();
    var lengths = new Array();

    // Load an array with the valid prefixes for this card
    prefix = cards[cardType].prefixes.split(",");

    // Now see if any of them match what we have in the card number
    for (i = 0; i < prefix.length; i++) {
        var exp = new RegExp("^" + prefix[i]);
        if (exp.test(cardNo)) PrefixValid = true;
    }

    // If it isn't a valid prefix there's no point at looking at the length
    if (!PrefixValid) {
        ccErrorNo = 3;
        return false;
    }

    // See if the length is valid for this card
    lengths = cards[cardType].length.split(",");
    for (j = 0; j < lengths.length; j++) {
        if (cardNo.length == lengths[j]) LengthValid = true;
    }

    // See if all is OK by seeing if the length was valid. We only check the 
    // length if all else was hunky dory.
    if (!LengthValid) {
        ccErrorNo = 4;
        return false;
    };

    // The credit card is in the required format.
    return true;
}

/*============================================================================*/

function ToggleButton(button, validationGroup) {
    //alert('start');
    // If client validators not active
    if (typeof (Page_Validators) == "undefined") {
        //alert('Page_Validators undefined');
        DisableButton(button, 'divProcessing');
    }

    if (typeof (Page_ClientValidate) == 'function') {
        //alert('Page_ClientValidate is a function');
        // Force Page validation 
        Page_ClientValidate(validationGroup);

        // If validation passed
        if (Page_IsValid) {
            //alert('Page is valid');
            DisableButton(button, 'divProcessing');
        }
    }
    else {
        //alert('Page_ClientValidate is not function');
        DisableButton(button, 'divProcessing');
    }
}

function DisableButton(buttonID, processingID) {
    window.document.getElementById(buttonID).style.display = 'none';
    window.document.getElementById(processingID).style.display = 'block';
}

function KeyDownHandler(btnName) {
    var btn = document.getElementById(btnName);
    if (btn != 'undefined') {
        if (document.all) {

            if (event.keyCode == 13) {
                event.returnValue = false;
                event.cancel = true;
                btn.click();
            }
        }
        else if (document.getElementById) {
            if (event.which == 13) {
                event.returnValue = false;
                event.cancel = true;
                btn.click();
            }
        }
        else if (document.layers) {
            if (event.which == 13) {
                event.returnValue = false;
                event.cancel = true;
                btn.click();
            }
        }
    }
}

function ShowCustomerDetail(item) {
    var thisItem = $get(item);
    if (thisItem != "undefined") {
        if (item == "trNewCustomer") {
            var toggleItem = $get("ToggleLink");
            if (toggleItem != "undefined") {
                toggleItem.innerHTML = "Back to customer list";
            }
        }
        thisItem.style.display = "";
    }
}

function HideCustomerDetail(item) {
    var thisItem = $get(item);
    if (thisItem != "undefined") {
        if (item == "trNewCustomer") {
            var toggleItem = $get("ToggleLink");
            if (toggleItem != "undefined") {
                toggleItem.innerHTML = "Create a new customer";
            }
        }
        thisItem.style.display = "none";
    }
}



