function calculate() {
	
    var form = document.getElementById('frm-card-calculator');
    var bits = parseInt(form.bitlength.value);
    var hex = form.hexval.value;

    var hexPattern = /^[0-9A-Fa-f]*$/;
    
    if (!hexPattern.test(hex)) {
        var en = "Please enter the hexadecimal value exactly as it appears. "
               + "Allowed characters: 0-9 and A-F/a-f. No spaces.";
        var fr = "Saisissez la valeur hexadecimal telle qu'elle apparait. "
               + "Caracteres permis: 0-9 et A-F/a-f. Pas d'espaces.";
        
        // 20100903, nmow - No idea where lang var is defined...commenting this out for now
        //alert((lang == "en") ? en : fr);
        alert(en);
        return false;
    }

    while (hex.length < 16) {
    	hex = "0" + hex;
    }

   	var firsthalfhex = hex.substr(0,8);
    var secondhalfhex = hex.substr(8,8);
    
    var firsthalfbinary = parseInt("0x" + firsthalfhex).toString(2);
    var secondhalfbinary = parseInt("0x" + secondhalfhex).toString(2);

    while (firsthalfbinary.length < 32) {
        firsthalfbinary = "0" + firsthalfbinary;
    }

    while (secondhalfbinary.length < 32) {
        secondhalfbinary = "0" + secondhalfbinary;
    }
    
    var combinedbinary = firsthalfbinary + secondhalfbinary;
    var proplengthbinary = combinedbinary.substring(64-bits);

    document.getElementById("bitPattern").innerHTML = proplengthbinary;

    var f1, f2, f3;

    switch(bits) {

        case 26:
            f1 = "Standard 26 Bit";
            f2 = toDecimal(proplengthbinary.substr(9,16));
            f3 = toDecimal(proplengthbinary.substr(1,8));
            populate(f1, f2, f3);
            break;

        case 33:
            f1 = "Generic 33 Bit";
            f2 = toDecimal(proplengthbinary.substr(8,24));
            f3 = toDecimal(proplengthbinary.substr(1,7));
            populate(f1, f2, f3);
            break;

        case 34:
            var str = proplengthbinary.substr(17).match(/1/g).length;
            var parity = str % 2 == 0 ? "EVEN" : "ODD";
            f1 = "Generic 34 Bit " + parity + " Parity";
            f2 = toDecimal(proplengthbinary.substr(17,16));
            f3 = toDecimal(proplengthbinary.substr(1,16));
            populate(f1, f2, f3);
            break;

        case 35:
            f1 = "HID Corporate 1000";
            f2 = toDecimal(proplengthbinary.substr(14,20));
            f3 = toDecimal(proplengthbinary.substr(2,12));
            populate(f1, f2, f3);
            break;

        case 37:
            f1 =  "HID 37 Bit (or HID 37 Bit with Facility Code)";
            f2 = toDecimal(proplengthbinary.substr(1,35)) + " (" +
                 toDecimal(proplengthbinary.substr(17,19)) + ")";
            f3 = "None (" + toDecimal(proplengthbinary.substr(1,16)) + ")";
            populate(f1, f2, f3);
            break;

        case 40:
            var x1 = toDecimal(proplengthbinary.substr(1,19)).toString();
            var x2 = toDecimal(proplengthbinary.substr(20,19)).toString();
            while (x1.length < 6) {
                x1 = "0" + x1;
            }
            while (x2.length < 6) {
                x2 = "0" + x2;
            }
            f1 = "Casi-Rusco 40 Bit";
            f2 = x1 + x2;
            f3 = "None";
            populate(f1, f2, f3);
            break;
    }

    return false;
}

// string, number, number
function populate(cardFormat, cardNumber, facilityCode) {
    document.getElementById("cardFormat").innerHTML = cardFormat;
    document.getElementById("cardNumber").innerHTML = cardNumber.toString();
    document.getElementById("facilityCode").innerHTML = facilityCode.toString();
}

//string binary
function toDecimal(binary) {
    var d = 0;
    var j = -1;
    for (i = binary.length; i >= 0; i--) {
        d += binary.substr(i,1) * Math.pow(2,j++);
    }
    return d;
}

// object textfield
function trim(field) {
    var str = field.value;
    field.value = str.replace(/^\s+/, "").replace(/\s+$/, "");
}

