﻿/// <reference path="~/JavaScript/jquery/jquery-1.3.2-vsdoc2.js" />

Type.registerNamespace("Monvee");

/////////////////////
// CONSTRUCTORS
/////////////
Monvee.KenticoFormSubmitButtonReplacer
= function(strFormClientId, strNewButtonContainerClientId)
{
    this.autoReplace(strFormClientId, strNewButtonContainerClientId);
}


/////////////////////
// PROTOTYPE
/////////////
Monvee.KenticoFormSubmitButtonReplacer.prototype =
{
    /////////////////////
    // CONSTANTS
    /////////////
    _SkinnedButtonHtmlTemplate: '<a href="javascript:;" class="{CssClass}"><span>{Text}</span></a>',


    /////////////////////
    // METHODS
    /////////////
    autoReplace: function(strFormClientId, overriddenbuttonText, matteColor)
    {
        // locate old button.
        var jqPlainButtons
            = $("#" + strFormClientId + " input[type='submit']"
                + ", #" + strFormClientId + " input[type='button']");

        for (var i = 0; i < jqPlainButtons.length; ++i)
        {
            var plainButton = jqPlainButtons.get(i);
            var jqPlainButton = $(plainButton);

            // has this button been skinned already?
            if (jqPlainButton.data("HasBeenSkinned") == true)
            {
                continue;
            }
            else if (jqPlainButton.css("display") == "none")
            {
                continue;
            }

            // mark as skinned
            jqPlainButton.data("HasBeenSkinned", true);

            // override text?
            var buttonText;
            if (typeof (overriddenbuttonText) == "string"
                && overriddenbuttonText.length != 0)
            {
                buttonText = overriddenbuttonText;
            }
            else
            {
                buttonText = plainButton.value;
            }

            // determine css class
            var cssClass;
            switch (matteColor)
            {
                case "light":
                    cssClass = "green_light_btn";
                    break;
                case "dark":
                    cssClass = "green_btn";
                    break;
                default:
                    // auto-detect
                    if (jqPlainButton.parents(".inner_panel, .panel, .CartStepTable").length != 0)
                    {
                        cssClass = "green_light_btn";
                    }
                    else if (jqPlainButton.parents(".side").length != 0)
                    {
                        cssClass = "green_btn";
                    }
                    else
                    {
                        cssClass = "green_btn";
                    }
                    break;
            }

            // create new button from template.
            var jqNewButtonHyperLink
            = $(
                this.dataBind(
                    { Text: buttonText, CssClass: cssClass },
                    this._SkinnedButtonHtmlTemplate));


            // add skinned button at the old button.
            plainButton.parentNode.appendChild(jqNewButtonHyperLink[0]);
            jqNewButtonHyperLink.insertAfter($(plainButton));

            // hide the old button.
            plainButton.style.display = "none";

            // make new button cause click on the old button.
            // this nested method is necessary to make a closure containing 'i'.
            var closure = function(index)
            {
                var handler = function()
                {
                    jqPlainButtons[index].click();
                };

                jqNewButtonHyperLink.bind("click", handler);
                jqNewButtonHyperLink.bind("keypress",
                    function(e, src)
                    {
                        if (e.keyCode == 32)
                        {
                            handler();
                        }
                    });
            };
            closure(i);
        }
    },

    dataBind: function(sourceObject, template)
    {
        if (typeof (template) != "string")
        {
            throw new Error("expected a template of type String.");
        }

        var filledTemplate = new String(template);
        for (var propertyName in sourceObject)
        {
            var regex = new RegExp("\\{" + propertyName + "\\}");
            filledTemplate = filledTemplate.replace(regex, sourceObject[propertyName]);
        }
        return filledTemplate;
    }
};
