$ektron().ready(function()
{
    if ("undefined" === typeof Ektron.PageBuilder)
    {
        Ektron.PageBuilder = {};
    }

    if ("undefined" === typeof Ektron.PageBuilder.Wizards)
    {
        Ektron.PageBuilder.Wizards =
        {
            // PROPERTIES
            mode: "add",
            language: 1033,

            // METHODS
            centerModal: function(modalId)
            {
                $ektron(modalId).css("margin-top", -1 * Math.round($ektron(modalId).outerHeight()/2));
            },

            checkAliasName: function(options)
            {
                var returnValue = false;
                params = {
                    aliasName: "",
                    extension: ".aspx",
                    language: 1033
                };
                $ektron.extend(params, options);
                $ektron.ajax({
                    url: Ektron.ResourceText.PageBuilder.Wizards.appPath + "urlaliasdialoghandler.ashx?action=checkaliasname&aliasname=" + params.aliasName + "&fileextension=" + params.extension + "&langtype=" + params.language,
                    cache: false,
                    async: false,
                    success: function(html)
                    {
                        if (html.indexOf("<aliasname>") != -1)
                        {
                            returnValue = true;
                            return true;
                        }
                        else
                        {
                            returnValue = html;
                            return false;
                        }
                    }
                });
                return returnValue;
            },

            init: function()
            {
                // add the Markup to the page
                Ektron.PageBuilder.Wizards.Markup.init();

                // initialize Buttons
                Ektron.PageBuilder.Wizards.Buttons.init();

                // initialize Modals
                Ektron.PageBuilder.Wizards.Modals.init();
            },

            parseAliasExtension: function(alias)
            {
                var result = "/"
                // get everything after the last "/"
                alias = alias.substring(alias.lastIndexOf("\/")+1);
                // now lop off anything that might be a query string
                if (alias.indexOf("?") !== -1)
                {
                    alias = alias.substring(0, alias.indexOf("?"));
                }
                // check for a period in what's left
                if (alias.lastIndexOf(".") > -1)
                {
                    // get everythign after the last period
                    result = alias.substring(alias.lastIndexOf(".")+1);
                }
                if (result.length === 0)
                {
                    result = "/";
                }
                return result
            },

            redirectIframe: function(iframeSelector, newUrl)
            {
                var iframe = $ektron(iframeSelector);
                $ektron(iframeSelector).attr("src", newUrl);
            },

            redirectPage: function()
            {
                var iframe = $ektron(".ektronPageBuilderWizard iframe.ektronPageBuilderAddPageIframe");
                var fullUrlAlias = iframe.contents().find(".redirectMessage input[type='hidden']").val();
                if (location.href.toLowerCase().indexOf(Ektron.ResourceText.PageBuilder.Wizards.appPath.toLowerCase()) != -1)
                {
                    $ektron(this).parents().filter(".ektronPageBuilderWizard").modalHide();
                    window.open(fullUrlAlias, "_blank");
                    location.href = location.href;
                }
                else
                {
                    window.location = fullUrlAlias;
                }
                return false;
            },

            showAddPage: function(options)
            {
                var pageTitle = $ektron(".ektronPageBuilderWizard .ektronModalHeader h3 span.addPageTitle");
                var iframe = $ektron(".ektronPageBuilderWizard iframe.ektronPageBuilderAddPageIframe");
                var buttons = $ektron(".ektronPageBuilderWizard .ektronPageBuilderWizardButtons");

                //reset buttons shown
                buttons.find(".button").hide();
                buttons.find(".nextButton").show();
                buttons.find(".cancelButton").show();

                params =
                {
                    mode: "add",
                    language: "",
                    folderId: "",
                    pageid: ""
                };
                // if an options object is provided,
                // extend the params with the options
                $ektron.extend(params, options);

                // alter UI based on mode paramter
                Ektron.PageBuilder.Wizards.redirectIframe(".ektronPageBuilderWizard iframe.ektronPageBuilderAddPageIframe", Ektron.ResourceText.PageBuilder.Wizards.path + "addpage.aspx?folderid=" + params.folderId + "&language=" + params.language + "&LangType=" + params.language + "&mode=" + params.mode + "&pageid=" + params.pageid);
                Ektron.PageBuilder.Wizards.language = params.language;
                if (params.mode == "add")
                {
                    Ektron.PageBuilder.Wizards.mode = "add";
                    pageTitle.html(Ektron.ResourceText.PageBuilder.Wizards.addPage);
                    iframe.css("height", "30.5em");
                }
                else
                {
                    Ektron.PageBuilder.Wizards.mode = "saveAs";
                    pageTitle.html(Ektron.ResourceText.PageBuilder.Wizards.savePageAs);
                    iframe.css("height", "6em");
                }
                // show the modal
                Ektron.PageBuilder.Wizards.centerModal(".ektronPageBuilderAddPage");
                $ektron(".ektronPageBuilderWizard").modalShow();
                return false;
            },

            stepBack: function(clickedButton)
            {
                clickedButton = $ektron(clickedButton);
                var modal = clickedButton.parent().parent().parent().parent();
                var iframe = $ektron(".ektronPageBuilderIframe");
                var messages = modal.find(".messages");
                var finishButton = clickedButton.parent().parent().find(".finishButton");
                var nextButton = clickedButton.parent().parent().find(".nextButton");
                var step1 = $ektron(iframe).contents().find("#step1");
                var step2 = $ektron(iframe).contents().find("#step2");
                modal.fadeOut(200);
                window.setTimeout(function()
                {
                    clickedButton.hide();
                    finishButton.hide();
                    nextButton.show();
                    messages.empty();
                    step2.hide();
                    if (Ektron.PageBuilder.Wizards.mode == "saveAs")
                    {
                        iframe.css("height", "6em");
                    }
                    step1.find(".messages").empty();
                    step1.css("display", "block");
                    Ektron.PageBuilder.Wizards.centerModal(".ektronPageBuilderAddPage");
                    modal.fadeIn("slow");
                }, 200);
                return false;
            },


            stepNext: function(clickedButton)
            {
                if (Ektron.PageBuilder.Wizards.verifyTemplateInfo() === false)
                {
                    return false;
                }
                clickedButton = $ektron(clickedButton);
                var modal = clickedButton.parent().parent().parent().parent();
                var iframe = $ektron(".ektronPageBuilderIframe");
                var buttonsToShow = clickedButton.parent().parent().find(".backButton, .finishButton");
                var messages = $ektron(".ektronPageBuilderAddPage .messages");
                var step1 = $ektron(iframe).contents().find("#step1");
                var step2 = $ektron(iframe).contents().find("#step2");
                modal.fadeOut(200);
                window.setTimeout(function()
                {
                    clickedButton.hide();
                    buttonsToShow.show();
                    step1.hide();
                    iframe.css("height", "30.5em");
                    messages.empty();
                    step2.css("display", "block");
                    Ektron.PageBuilder.Wizards.centerModal(".ektronPageBuilderAddPage");
                    modal.fadeIn("slow");
                }, 200);
                return false;
            },

            updateMessage: function (messageContainer, message, messageType)
            {
                // search the message for any URLs and wrap them.
                message = message.replace(Ektron.RegExp.PageBuilderURL, ' <span class="EkForceWrap">$2</span>');
                message = message.replace(Ektron.RegExp.PageBuilderObjectName, function($0_match){return $0_match.replace(".", '<span class="EkForceWrap">.</span>');});
                if (typeof(messageType) == "undefined")
                {
                    messageType = "error";
                }
                // NOTE: the messageContainer expected is an Ektron Library object
                if (messageContainer.length != 1)
                {
                    // message DIV to update was not found, or there is more than one
                    // DIV that matches the request
                    return false;
                }
                else
                {
                    messageContainer.empty();
                    messageContainer.html('<span class="' + messageType + '">' + message + "</span>").fadeIn("slow");
                }
                Ektron.PageBuilder.Wizards.centerModal(".ektronPageBuilderAddPage");
                return true;
            },

            verifyTemplateInfo: function()
            {
                var result = true;
                var iframe = $ektron(".ektronPageBuilderAddPage .ektronPageBuilderIframe");
                var iframeBodyHeight = iframe.contents().find("body").outerHeight();
                var pageTitle = iframe.contents().find(".pageBuilderWizardPageTitle").val();
                var urlAlias = iframe.contents().find(".pageBuilderWizardAlias");
                var AliasExt = iframe.contents().find("#ExtensionDropdown").val();
                var AliasOpts = iframe.contents().find("#ExtensionDropdown > option");
                var template = iframe.contents().find("#ektronSelectedTemplate").val();
                var messageContainer = $ektron(".ektronPageBuilderAddPage .messages");
                if (($ektron.trim(pageTitle)).length == 0)
                {
                    Ektron.PageBuilder.Wizards.updateMessage(
                        messageContainer,
                        Ektron.ResourceText.PageBuilder.Wizards.errorPageTitle
                    );
                    result = false;
                    return result;
                }
                if (urlAlias.length > 0)
                {
                    // urlAliasing is enabled, verify the alias
                    urlAlias = urlAlias.val();
                    //trim / from beginning
                    while (urlAlias.substring(0,1) == '/')
                    {
                        urlAlias = urlAlias.substring(1, urlAlias.length);
                    }
                    iframe.contents().find(".pageBuilderWizardAlias").val(urlAlias);

                    if (urlAlias.length !== 0)
                    {
                        //scan for extensions at end of alias. if already one, and it matches dropdown, great. if not one, use dropdown. if one but doesn't match, error.
                        var matched = null;
                        var mismatch = false;
                        if( urlAlias.indexOf("+")!= -1)
                        {
                           urlAlias = urlAlias.replace(/\+/g,"%2B");
                        }
                        for(var i = 0; i < AliasOpts.length; i++){
                            if(AliasOpts[i].value != "none"){
                               //var index = urlAlias.toLowerCase().lastIndexOf(AliasOpts[i].value.toLowerCase());
                               //if(index > -1 && index == (urlAlias.length - AliasOpts[i].value.length)){
                                 if(AliasOpts[i].value == AliasExt){
                                    //found a match!
                                    matched = AliasOpts[i].value;
                                    if(matched.toLowerCase() != AliasExt.toLowerCase() && AliasExt.toLowerCase() != "none"){
                                        //does not match dropdown!
                                        mismatch = true;
                                        break;
                                    }
                                }
                            }
                        }
                        if(matched == null && urlAlias.indexOf(".") > -1){
                            Ektron.PageBuilder.Wizards.updateMessage(
                                messageContainer,
                                Ektron.ResourceText.PageBuilder.Wizards.invalidExtension
                            );
                            return false;
                        }
                        if(matched == null && AliasExt == "none"){
                            Ektron.PageBuilder.Wizards.updateMessage(
                                messageContainer,
                                Ektron.ResourceText.PageBuilder.Wizards.selectExtension
                            );
                            return false;
                        }
                        if(mismatch){
                            Ektron.PageBuilder.Wizards.updateMessage(
                                messageContainer,
                                Ektron.ResourceText.PageBuilder.Wizards.dropdownMustMatch
                            );
                            return false;
                        }
//                        if(matched != null){
//                            urlAlias = urlAlias.replace(matched, "");
//                        }

                        // verify the url/alias is valid.
                        var aliasInUse = Ektron.PageBuilder.Wizards.checkAliasName({
                            aliasName: $ektron.trim(urlAlias),
                            extension: matched,
                            language: Ektron.PageBuilder.Wizards.language
                        });
                        if (aliasInUse !== true)
                        {
                            // we've got an error
                            Ektron.PageBuilder.Wizards.updateMessage(
                                messageContainer,
                                aliasInUse
                            );
                            result = false;
                            return result;
                        }
                    }
                    else
                    {
                        // if the urlAlias field is present, it is required.
                        Ektron.PageBuilder.Wizards.updateMessage(
                            messageContainer,
                            Ektron.ResourceText.PageBuilder.Wizards.errorUrlAlias
                        );
                        result = false;
                    }
                }

                if (Ektron.PageBuilder.Wizards.mode === "add")
                {
                    // need to verify the template data
                    if (($ektron.trim(template)).length == 0)
                    {
                        // template has not been selected
                        Ektron.PageBuilder.Wizards.updateMessage(messageContainer, Ektron.ResourceText.PageBuilder.Wizards.errorSelectLayout);
                        result = false;
                        return result;
                    }
                }
                return result;
            },

            verifyMetadataInfo: function()
            {
                var result = true;
                var iframe = $ektron(".ektronPageBuilderAddPage .ektronPageBuilderIframe");
                var messageContainer = $ektron(".ektronPageBuilderAddPage .messages");
                var reqfield = iframe.contents().find("[name='req_fields']");

                if(reqfield.length > 0){
                    reqfield = reqfield.val();

                    var reqfield = reqfield.split(',');
                    for(var i=0; i<reqfield.length; i++){
                        if(reqfield[i] != ""){
                            var value = iframe.contents().find("#"+reqfield[i]).val();
                            if(value == null || value == ""){
                                result = false;

                                Ektron.PageBuilder.Wizards.updateMessage(
                                    messageContainer,
                                    Ektron.ResourceText.PageBuilder.Wizards.errorMetadata
                                );

                                break;
                            }
                        }
                    }
                }
                return result;
            },

            verifyTaxonomy: function()
            {
                var result = true;
                var iframe = $ektron(".ektronPageBuilderAddPage .ektronPageBuilderIframe");
                var messageContainer = $ektron(".ektronPageBuilderAddPage .messages");
                var req = iframe.contents().find(".TaxRequiredBool");
                if(req.length > 0){
                    if(req.html() == "true"){
                        //verify that at least one is checked
                        var checked = iframe.contents().find("div.treecontainer input.categoryCheck:checked");
                        if(checked.length == 0){
                            Ektron.PageBuilder.Wizards.updateMessage(
                                messageContainer,
                                Ektron.ResourceText.PageBuilder.Wizards.errorTaxonomy
                            );
                            return false;
                        }
                    }
                }

                return result;
            },

            // CLASSES
            Buttons:
            {
                init: function()
                {
                    var wizardButtons = $ektron(".ektronPageBuilderAddPage .ektronPageBuilderWizardButtons");
                    // bind button handlers
                    wizardButtons.find(".nextButton").bind("click", function(e)
                        {
                            return Ektron.PageBuilder.Wizards.stepNext(this);
                        }
                    );

                    wizardButtons.find(".backButton").bind("click", function(e)
                        {
                            return Ektron.PageBuilder.Wizards.stepBack(this);
                        }
                    );

                    wizardButtons.find(".cancelButton").bind("click", function(e)
                        {
                            $ektron(this).parents().filter(".ektronPageBuilderWizard").modalHide();
                            if (location.href.indexOf(Ektron.ResourceText.PageBuilder.Wizards.appPath) != -1)
                            {
                                location.href = location.href;
                            }
                            return false;
                        }
                    );

                    wizardButtons.find(".finishButton").bind("click", function(e)
                        {
                            //check metadata + taxonomy
                            if (Ektron.PageBuilder.Wizards.verifyMetadataInfo() === false)
                            {
                                return false;
                            }
                            if (Ektron.PageBuilder.Wizards.verifyTaxonomy() === false)
                            {
                                return false;
                            }
                            $ektron(".ektronPageBuilderAddPage .messages").empty();

                            var iframe = $ektron(".ektronPageBuilderAddPage .ektronPageBuilderIframe");
                            var submitButton = iframe.contents().find("#btnFinish");
                            submitButton.click();
                            return false;
                        }
                    );

                    wizardButtons.find(".okButton").bind("click", function(e)
                        {
                            return Ektron.PageBuilder.Wizards.redirectPage();
                        }
                    );
                },

                showPromptButtons: function()
                {
                    var wizardButtons = $ektron(".ektronPageBuilderWizard .ektronPageBuilderWizardButtons");
                    wizardButtons.find(".button").hide();
                    wizardButtons.find(".cancelButton").show();
                    wizardButtons.find(".okButton").show();
                }
            },

            Markup:
            {
                init: function()
                {
                    var modal = new String();
                    modal = '<div class="ektronWindow ektronModalStandard ektronPageBuilderWizard ektronPageBuilderAddPage" id="PageBuilderAddPageModal">\n';
                    modal += '  <div class="ektronModalHeader">\n';
                    modal += '    <h3>\n';
                    modal += '      <span class="addPageTitle"></span>\n';
                    modal += '      <a class="ektronModalClose"></a>\n';
                    modal += '    </h3>\n';
                    modal += '  </div>\n';
                    modal += '  <div class="ektronModalBody">\n';
                    modal += '    <div class="messages"></div>\n';
                    modal += '    <iframe noresize="noresize" frameborder="0" border="0"  marginwidth="0" marginheight="0" id="ektronPageBuilderAddPageIframe" class="ektronPageBuilderIframe ektronPageBuilderAddPageIframe" scrolling="auto"></iframe>\n';
                    modal += '    <ul class="ektronModalButtonWrapper ektronPageBuilderWizardButtons clearfix">\n';
                    modal += '      <li><a id="ektronPageBuilderFinish" title="' + Ektron.ResourceText.PageBuilder.Wizards.finish + '" class="greenHover button finishButton buttonRight" href="#' + Ektron.ResourceText.PageBuilder.Wizards.finish + '">' + Ektron.ResourceText.PageBuilder.Wizards.finish + '</a></li>\n';
                    modal += '      <li><a id="ektronPageBuilderFinish" title="' + Ektron.ResourceText.PageBuilder.Wizards.ok + '" class="greenHover button okButton buttonRight" href="#' + Ektron.ResourceText.PageBuilder.Wizards.ok + '">' + Ektron.ResourceText.PageBuilder.Wizards.ok + '</a></li>\n';
                    modal += '      <li><a id="ektronPageBuilderNext" title="' + Ektron.ResourceText.PageBuilder.Wizards.next + '" class="blueHover button nextButton buttonRight" href="#' + Ektron.ResourceText.PageBuilder.Wizards.next + '">' + Ektron.ResourceText.PageBuilder.Wizards.next + '</a></li>\n';
                    modal += '      <li><a id="ektronPageBuilderCancel" title="' + Ektron.ResourceText.PageBuilder.Wizards.cancel + '" class="redHover button cancelButton buttonRight" href="#' + Ektron.ResourceText.PageBuilder.Wizards.cancel + '">' + Ektron.ResourceText.PageBuilder.Wizards.cancel + '</a></li>\n';
                    modal += '      <li><a id="ektronPageBuilderBack" title="' + Ektron.ResourceText.PageBuilder.Wizards.back + '" class="blueHover button backButton buttonRight" href="#' + Ektron.ResourceText.PageBuilder.Wizards.back + '">Back</a></li>\n';
                    modal += '    </ul>\n';
                    modal += '  </div>\n';
                    modal += '</div>\n';

                    var pageBody = $ektron("body");
                    pageBody.append(modal);
                }
            },

            Modals:
            {
                init: function()
                {
                    var addPage = $ektron(".ektronPageBuilderAddPage");
                    var messages = addPage.find(".messages");
                    addPage.modal({
                        modal: true,
                        toTop: true,
                        overlay: 0,
                        onShow: function(hash) {
                            Ektron.PageBuilder.Wizards.centerModal(".ektronPageBuilderAddPage");
			                hash.o.fadeTo("fast", 0.5, function() {
				                hash.w.fadeIn("fast");
			                });
                        },
                        onHide: function(hash) {
                            messages.empty();
                            hash.w.fadeOut("fast");
			                hash.o.fadeOut("fast", function(){
				                if (hash.o)
				                {
					                hash.o.remove();
			                    }
			                });
                        }
                    });
                }
            }
        };
    }

    // initialize the Wizards
    Ektron.PageBuilder.Wizards.init();
    // Define Reular Expressions for later use
    Ektron.RegExp.PageBuilderURL = new RegExp("(^|[ \t\r\n])((ftp|http|https|file)://(([A-Za-z0-9$_.+!*(),;/?:@&~=-])|%[A-Fa-f0-9]{2}){2,}(#([a-zA-Z0-9][a-zA-Z0-9$_.+!*(),;/?:@&~=%-]*))?(([A-Za-z0-9$_+!*();/?:~-])|%[A-Fa-f0-9]{2}))", "gi");
    Ektron.RegExp.PageBuilderObjectName = new RegExp("\\w+(\\.\\w+)+", "g");
});
