var total = 20.0; // Dollars
var discount = 0.0; // Percentage
var gst = 0.0; // Percentage
var pst = 0.0; // Percentage
var gstValue = 0.0; // Dollars
var pstValue = 0.0; // Dollars

var correctSN;

function validateForm(){
    // Validate form
    // Check all forms filled out
    var snvalue = "";
    
    if(document.getElementById("upgrade").checked == true){
        snvalue = document.getElementById("upgrade-serial").value;
        if(document.getElementById("upgrade-serial").value != correctSN){
            // Check valid SN
            alert("Please enter a valid serial number.");
            return;
        }
    }

    var incomplete = false;
    
    var nameField = document.getElementById("as-name");
    if(nameField.value < 5){
        incomplete = true
        nameField.style.backgroundImage = "url(snfail.png)";
    }else{
        nameField.style.backgroundImage = "";    
    }
    
    var emailField = document.getElementById("as-email");
    if(isValidEmail(emailField.value) == false){
        incomplete = true
        emailField.style.backgroundImage = "url(snfail.png)";
    }else{
        emailField.style.backgroundImage = "";    
    }

    var addressField = document.getElementById("as-address");
    if(addressField.value < 3){
        incomplete = true
        addressField.style.backgroundImage = "url(snfail.png)";
    }else{
        addressField.style.backgroundImage = "";    
    }

    var cityField = document.getElementById("as-city");
    if(cityField.value < 3){
        incomplete = true
        cityField.style.backgroundImage = "url(snfail.png)";
    }else{
        cityField.style.backgroundImage = "";    
    }

    var countryField = document.getElementById("as-country");

    var provinceField = document.getElementById("as-province");
    if(provinceField.value < 3){
        incomplete = true
        provinceField.style.backgroundImage = "url(snfail.png)";
    }else{
        provinceField.style.backgroundImage = "";    
    }
    
    if(incomplete){
        alert("Please complete all marked fields before continuing.");
        return;
    }
        
    // Check PROVINCE
    // Add sales tax
    // Update custom field
    updateProvince();
    
    var fieldValue = nameField.value + ":" + emailField.value + ":" + addressField.value + ":" + cityField.value + ":" + countryField.value + ":" + provinceField.value + ":" + formatCurrency(pstValue) + ":" + formatCurrency(gstValue) + ":" + snvalue;
    
    document.getElementById("custom").value = fieldValue;
    
    // Submit on completion
    document.getElementById("form").action = "https://www.paypal.com/cgi-bin/webscr";
    document.getElementById("form").submit();
}

function validateSerial(){
    document.getElementById("serial-result").style.display = "inline";
    document.getElementById("serial-result").src = "load.gif";

    var sn = document.getElementById("upgrade-serial").value;

    var request = new XMLHttpRequest();
    request.open("GET","validate.php?serial=" + sn,true);
    request.onreadystatechange = function(){ 
        if(request.readyState == 4 && request.status == 200){
            if(request.responseText){
                updateSerial(request.responseText); 
            }
        }   
    };
    
    request.send(null);
}

function updateSerial(isValid){
            
    if(isValid == "good"){
        correctSN = document.getElementById("upgrade-serial").value;
        document.getElementById("serial-result").src = "sngood.png";
    }else{
        document.getElementById("serial-result").src = "snfail.png";
    }
}

function validateCoupon(coupon){
    var sn = document.getElementById("as-coupon").value;

    var request = new XMLHttpRequest();
    request.open("GET","coupons.php?coupon=" + sn,true);
    request.onreadystatechange = function(){ 
        if(request.readyState == 4 && request.status == 200){
            if(request.responseText){
                updateCoupon(request.responseText); 
            }
        }   
    };
    
    request.send(null);    
}

function updateCoupon(value){
    discount = parseInt(value);
    updateTotal();
}

function updateValue(id){
    document.getElementById("item_type").value = id;
    
    if(id == "single"){
        //document.getElementById("purchaseIcon").src = "wallet_32.png";
        document.getElementById("single").checked = true;
        document.getElementById("upgrade").checked = false;
        document.getElementById("family").checked = false;
        
        document.getElementById("paypal-name").value = "Wallet Single License";
        document.getElementById("product-name").innerHTML = "Wallet";
        document.getElementById("paypal-number").value = "011";

        total = 20.00;
    }

    if(id == "family"){
        //document.getElementById("purchaseIcon").src = "wallet_32_family.png";    
        document.getElementById("family").checked = true;
        document.getElementById("single").checked = false;
        document.getElementById("upgrade").checked = false;

        document.getElementById("paypal-name").value = "Wallet Family License";
        document.getElementById("product-name").innerHTML = "Wallet Family Pack";
        document.getElementById("paypal-number").value = "012";
        
        total = 50.00;
    }

    if(id == "upgrade"){
        //document.getElementById("purchaseIcon").src = "wallet_32_upgrade.png";    
        document.getElementById("family").checked = false;
        document.getElementById("single").checked = false;
        document.getElementById("upgrade").checked = true;

        document.getElementById("paypal-name").value = "Wallet 3 Upgrade";
        document.getElementById("product-name").innerHTML = "Wallet Upgrade";
        document.getElementById("paypal-number").value = "013";
        
        total = 5.00;
    }
    
    updateTotal();
}

function updateProvince(){
    // Reset GST/PST
    gst = 0.0;
    pst = 0.0;
    
    // Canadian Rape
    var country = document.getElementById("as-country").value;
    if(country == "Canada"){
        var province = document.getElementById("as-province").value;
        province = standardizedProvince(province);
        
        gst = gstForProvince(province);
        pst = pstForProvince(province);
    }
    
    updateTotal();
}

function updateTotal(){
    var totalValue = total;
    var checkoutValue = totalValue;
    gstValue = 0.0;
    pstValue = 0.0;

    document.getElementById("discount").style.display = "none";
    document.getElementById("gst").style.display = "none";
    document.getElementById("pst").style.display = "none";
    
    if(discount > 0.0){
        var discountValue = -((discount / 100.0) * totalValue);
        checkoutValue += discountValue;
        totalValue += discountValue;
        document.getElementById("discount").innerHTML = "Discount: " + formatCurrency(discountValue);
        document.getElementById("discount").style.display = "block";
    }
    
    if(gst > 0.0){
        gstValue = ((gst / 100.0) * checkoutValue);
        totalValue += gstValue;
        document.getElementById("gst").innerHTML = "GST/HST: " + formatCurrency(gstValue);
        document.getElementById("gst").style.display = "block";
    }
    
    if(pst > 0.0){
        pstValue = ((pst / 100.0) * checkoutValue);    
        totalValue += pstValue;
        document.getElementById("pst").innerHTML = "PST: " + formatCurrency(pstValue);
        document.getElementById("pst").style.display = "block";
    }    

    document.getElementById("amount").innerHTML = formatCurrency(total);
    document.getElementById("totaltotal").innerHTML = "Total: " + formatCurrency(totalValue) + " CAD";

    document.getElementById("paypal-price").value = checkoutValue;
}

function pstForProvince(province){
    var returnValue = 0.0;
    
    switch (province) {
        case "bc":
            returnValue = 0.0;
            break;
    }
    
    return returnValue;
}

function gstForProvince(province){
    var returnValue = 5.0;
    
    switch (province) {
        case "bc":
            returnValue = 12.0;
            break;
        case "on":
            returnValue = 13.0;
            break;
        case "ns":
            returnValue = 13.0;
            break;
        case "nl":
            returnValue = 13.0;
            break;
        case "nb":
            returnValue = 13.0;
            break;
    }
    
    return returnValue;
}

function standardizedProvince(rawProvince){
    rawProvince = rawProvince.toLowerCase();
    var returnProvince = rawProvince;
    
    if(rawProvince == "british columbia")
        returnProvince = "bc";
    if(rawProvince == "b.c.")
        returnProvince = "bc";     

    if(rawProvince == "alberta")
        returnProvince = "ab";
    if(rawProvince == "a.b.")
        returnProvince = "ab";  

    if(rawProvince == "sasketchewan")
        returnProvince = "sk";
    if(rawProvince == "s.k.")
        returnProvince = "sk";  

    if(rawProvince == "manitoba")
        returnProvince = "mb";
    if(rawProvince == "m.b.")
        returnProvince = "mb";  

    if(rawProvince == "ontario")
        returnProvince = "on";
    if(rawProvince == "o.n.")
        returnProvince = "on";

    if(rawProvince == "quebec")
        returnProvince = "qc";
    if(rawProvince == "quŽbec")
        returnProvince = "qc";
    if(rawProvince == "q.c.")
        returnProvince = "qc";
    if(rawProvince == "pq")
        returnProvince = "qc";

    if(rawProvince == "nova scotia")
        returnProvince = "ns";
    if(rawProvince == "n.s.")
        returnProvince = "ns";

    if(rawProvince == "new brunswick")
        returnProvince = "nb";
    if(rawProvince == "n.b.")
        returnProvince = "nb";

    if(rawProvince == "newfoundland")
        returnProvince = "nl";
    if(rawProvince == "n.l.")
        returnProvince = "nl";

    if(rawProvince == "northwest territories")
        returnProvince = "nt";
    if(rawProvince == "n.t.")
        returnProvince = "nt";

    if(rawProvince == "nunavut")
        returnProvince = "nu";
    if(rawProvince == "n.u.")
        returnProvince = "nu";

    if(rawProvince == "prince edward island")
        returnProvince = "pe";
    if(rawProvince == "PEI")
        returnProvince = "pe";
    if(rawProvince == "p.e.i.")
        returnProvince = "pe";
    if(rawProvince == "p.e.")
        returnProvince = "pe";

    if(rawProvince == "yukon territory")
        returnProvince = "yt";
    if(rawProvince == "yukon")
        returnProvince = "yt";
        
    return returnProvince;
}

function formatCurrency(num) {
    num = num.toString().replace(/\$|\,/g,'');
    if(isNaN(num))
    num = "0";
    sign = (num == (num = Math.abs(num)));
    num = Math.floor(num*100+0.50000000001);
    cents = num%100;
    num = Math.floor(num/100).toString();
    if(cents<10)
    cents = "0" + cents;
    for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
    num = num.substring(0,num.length-(4*i+3))+','+
    num.substring(num.length-(4*i+3));
    return (((sign)?'':'-') + '$' + num + '.' + cents);
}

function isValidEmail(email, required) {
    if (required==undefined) {   // if not specified, assume it's required
        required=true;
    }
    if (email==null) {
        if (required) {
            return false;
        }
        return true;
    }
    if (email.length==0) {  
        if (required) {
            return false;
        }
        return true;
    }
    if (! allValidChars(email)) {  // check to make sure all characters are valid
        return false;
    }
    if (email.indexOf("@") < 1) { //  must contain @, and it must not be the first character
        return false;
    } else if (email.lastIndexOf(".") <= email.indexOf("@")) {  // last dot must be after the @
        return false;
    } else if (email.indexOf("@") == email.length) {  // @ must not be the last character
        return false;
    } else if (email.indexOf("..") >=0) { // two periods in a row is not valid
	return false;
    } else if (email.indexOf(".") == email.length) {  // . must not be the last character
	return false;
    }
    return true;
}

function allValidChars(email) {
  var parsed = true;
  var validchars = "abcdefghijklmnopqrstuvwxyz0123456789@.-_";
  for (var i=0; i < email.length; i++) {
    var letter = email.charAt(i).toLowerCase();
    if (validchars.indexOf(letter) != -1)
      continue;
    parsed = false;
    break;
  }
  return parsed;
}