if ("undefined" === typeof window.PayPalPurchase) {
    window.PayPalPurchase = {};
}

if ("undefined" === typeof PayPalPurchase.CatalogueEntries) {
    PayPalPurchase.CatalogueEntries = [];
}

if ("undefined" === typeof PayPalPurchase.PayPalDefaultUrl) {
    PayPalPurchase.PayPalDefaultUrl = "https://www.paypal.com/cgi-bin/webscr";
}

if ("undefined" === typeof PayPalPurchase.PayPalSandboxUrl) {
    PayPalPurchase.PayPalSandboxUrl = "https://www.sandbox.paypal.com/cgi-bin/webscr";
}

if ("undefined" === typeof PayPalPurchase.CartFormConfigValues) {
    PayPalPurchase.CartFormConfigValues = 
        { 
            "cmd" : "_ext-enter",
            "redirect_cmd" : "_cart",
            "upload" : 1,
            "no_shipping" : 2,
            "no_note" : 1,
            "currency_code" : "GBP",
            "business" : "bob@malloney.com",
            "image_url" : "https://www.in2itive.biz/images/videocoach.png",
            "notify_url" : "http://www.videocoaching.tv/paypal/VideoCoachPayPalIPN.aspx",
            "return" : "http://www.videocoaching.tv/paypal/VideoCoachPayPalPDT.aspx"
        };
}

if ("undefined" === typeof PayPalPurchase.CartFormPassedFields) {
    PayPalPurchase.CartFormPassedFields = 
        { 
/*
            "business" : "BusinessEmail",
            "image_url" : "ImageUrl",
            "notify_url" : "IPNNotifyUrl",
            "return" : "PDTReturnUrl",
*/
            "email" : "Email",
            "first_name" : "Firstname",
            "last_name" : "Lastname",
            "item_count" : "EntryCount",
            "custom" : "EncryptedData",
            "invoice" : "EncryptionIV"
        };
}

if ("undefined" === typeof PayPalPurchase.CartFormEntryValues) {
    PayPalPurchase.CartFormEntryValues = 
        { 
            "item_number_" : "#INDEX#",
            "on0_" : "Subscription Days",
            "os0_" : "#DAYS#",
            "quantity_" : 1
        };
}

if ("undefined" === typeof PayPalPurchase.CartFormEntryFields) {
    PayPalPurchase.CartFormEntryFields = 
        { 
            "item_name_" : "ProductName",
            "amount_" : "_#DAYS#_Days_Price"
        };
}

PayPalPurchase.initCartForm = function(payPalCartFormName, sandboxMode)
{
    if ("undefined" !== typeof PayPalPurchase.PayPalCartForm)
    {
        return;
    }

    PayPalPurchase.PayPalCartForm = $("#" + payPalCartFormName);
    var actionUrl = PayPalPurchase.PayPalDefaultUrl;

    if (sandboxMode)
    {
        actionUrl = PayPalPurchase.PayPalSandboxUrl;
    }

    PayPalPurchase.PayPalCartForm.attr({ action: actionUrl });

    /*
    if ("undefined" === typeof PayPalPurchase.PayPalCartForm)
    {
        return;
    }

    PayPalPurchase.PayPalCartForm.ajaxForm();
    PayPalPurchase.PayPalCartForm.submit(function() {
        // submit the form
        $(this).ajaxSubmit();
        // return false to prevent normal browser submit and page navigation
        return false;
    });
    */
};

PayPalPurchase.initCatalogueEntries = function(catalogueEntries)
{
    PayPalPurchase.CatalogueEntries = [];
    var entryCount = catalogueEntries.length;
    for (var i = 0; i < entryCount; i++)
    {
        PayPalPurchase.CatalogueEntries.push(catalogueEntries[i]);
    }
};

PayPalPurchase.findCatalogueEntry = function(entryId) {
    var i = PayPalPurchase.CatalogueEntries.length;
    while (i--) {
        if (PayPalPurchase.CatalogueEntries[i].CatalogueEntryId === entryId) {
            return PayPalPurchase.CatalogueEntries[i];
        }
    }

    return null;
};

PayPalPurchase.clearEntryOptions = function(entryId)
{
    var entryOptions = $("#CatalogueEntriesContainer input[name=" + entryId.toString() + "]");
    var i = entryOptions.length;
    while (i--)
    {
        entryOptions[i].checked = false;
    }
};

PayPalPurchase.clearRelatedEntries = function(entry)
{
    var relatedEntries = entry.ClearCatalogueEntryIdList.split(',');
    var i = relatedEntries.length;
    while (i--)
    {
        PayPalPurchase.clearEntryOptions(parseInt(relatedEntries[i], 10));
    }
};

PayPalPurchase.selectEntry = function(entryButton)
{
    var entry = PayPalPurchase.findCatalogueEntry(parseInt(entryButton.name, 10));

    if (entry === null)
    {
        return;
    }

    PayPalPurchase.clearRelatedEntries(entry);
};

/*
PayPalPurchase.getRegExInputs = function(replaceInputs)
{
    var sRegExInputs = [];
    var i = replaceInputs.length;
    while (i--)
    {
        sRegExInputs.push(new RegExp(replaceInputs[i], "g"));
    }

    return sRegExInputs;
};
*/

PayPalPurchase.replaceInValue = function(value, index, days)
{
    value = value.replace(/#INDEX#/g, index);
    value = value.replace(/#DAYS#/g, days);
    return value;
};

PayPalPurchase.addParamToCartForm = function(fieldName, fieldValue)
{
    PayPalPurchase.PayPalCartForm
        .append($('<input />')
            .attr({
                type: "hidden",
                name: fieldName,
                value: fieldValue
            })
        );
};

PayPalPurchase.addConfigValuesToCartForm = function()
{
    for (configName in PayPalPurchase.CartFormConfigValues)
    {
        var configValue = PayPalPurchase.CartFormConfigValues[configName].toString();
        PayPalPurchase.addParamToCartForm(configName, configValue);
    }
};

PayPalPurchase.addPassedFieldsToCartForm = function(passedData)
{
    for (fieldName in PayPalPurchase.CartFormPassedFields)
    {
        var fieldValue = passedData[PayPalPurchase.CartFormPassedFields[fieldName]];
        if ("undefined" !== typeof fieldValue)
        {
            PayPalPurchase.addParamToCartForm(fieldName, fieldValue.toString());
        }
    }
};

PayPalPurchase.addEntryValuesToCartForm = function(entryIndex, cartIndex, days)
{
    for (entryName in PayPalPurchase.CartFormEntryValues)
    {
        var entryValue = PayPalPurchase.CartFormEntryValues[entryName].toString();
        entryValue = PayPalPurchase.replaceInValue(entryValue, entryIndex, days);
        
        PayPalPurchase.addParamToCartForm(entryName + cartIndex.toString(), entryValue);
    }
};

PayPalPurchase.addEntryFieldsToCartForm = function(entry, entryIndex, cartIndex, days)
{
    for (fieldName in PayPalPurchase.CartFormEntryFields)
    {
        var fieldColumn = PayPalPurchase.CartFormEntryFields[fieldName].toString();
        fieldColumn = PayPalPurchase.replaceInValue(fieldColumn, entryIndex, days);
        var fieldValue = entry[fieldColumn];
        if ("undefined" !== typeof fieldValue)
        {
            PayPalPurchase.addParamToCartForm(
                fieldName + cartIndex.toString(), fieldValue.toString());
        }
    }
};

PayPalPurchase.addEntryToCartForm = function(entry, entryIndex, cartIndex, days)
{
    PayPalPurchase.addEntryValuesToCartForm(entryIndex, cartIndex, days);
    PayPalPurchase.addEntryFieldsToCartForm(entry, entryIndex, cartIndex, days);
    /*.replace(/_/g, " ")*/
};

PayPalPurchase.submitCartForm = function(purchaseData)
{
    PayPalPurchase.addPassedFieldsToCartForm(purchaseData);
//    alert(PayPalPurchase.PayPalCartForm.html());
    PayPalPurchase.PayPalCartForm.submit();
};

PayPalPurchase.processSelectedEntries = function()
{
    if ("undefined" === typeof PayPalPurchase.PayPalCartForm)
    {
        return;
    }

    PayPalPurchase.PayPalCartForm.remove("input");
    PayPalPurchase.addConfigValuesToCartForm();

    var entryCount = PayPalPurchase.CatalogueEntries.length;
    var cartCount = 0;
    for (var entryIndex = 0; entryIndex < entryCount; entryIndex++)
    {
        var entry = PayPalPurchase.CatalogueEntries[entryIndex];
        var entryId = entry.CatalogueEntryId;
        var shadowEntryOptions = 
			$("#CatalogueEntriesContainer input[name=" + entryId.toString() + "]");
        for (var j = 0, optionButton; optionButton = shadowEntryOptions[j++]; )
        {
            if (optionButton.checked === true)
            {
                cartCount++;
                var days = optionButton.value;
                PayPalPurchase.addEntryToCartForm(entry, entryIndex + 1, cartCount, days);
            }
        }
    }

    if (cartCount === 0)
    {
        alert("You must select at least one item before you can buy via PayPal.");
        return;
    }

    if ("undefined" === typeof window.UserAccess) {
        return;
    }

	var confirmMsg = "Please click OK to be redirected to PayPal to complete your order.\n";
	var termsCheckBoxes = $("input[name=TandC]");
	var cont = ("undefined" === typeof termsCheckBoxes);

	if (!cont)
	{
		cont = (termsCheckBoxes[0].checked === true);
	}

	if (!cont)
	{
		confirmMsg = "Please click OK only if you accept the Terms and Conditions of Use.\nYou will then be redirected to PayPal to complete your order.";
	}

	cont = confirm(confirmMsg);
    if (!cont)
    {
        return;
    }

    UserAccess.getEncryptedPurchaseData(
        function(purchaseData)
        {
            purchaseData.EntryCount = cartCount;
            if (purchaseData.UserLoggedIn !== true)
            {
                PayPalPurchase.submitCartForm(purchaseData);
                return;
            }

	        UserAccess.getLoggedInUserInfo(
		        function(userInfo)
		        {
                    $.extend(purchaseData, userInfo);
                    PayPalPurchase.submitCartForm(purchaseData);
                }
            );
        }
    );


    return false; //.sort(PayPalPurchase.sortNumber);
};
