﻿var Utils = new Object();

//#region Plugins

(function ($) {
    $('.profileCalendar').datepicker();

    $.fn.cufon = function (options) {
        var settings = $.extend({ fontFamily: 'Optima' }, options || {});

        if (Utils.IsCufonAvailable())
            Cufon.replace(this, settings);
        else
            $(this).addClass('noCufon');

        return this;
    };
    $.fn.recufon = function (options) {
        if (Utils.IsCufonAvailable()) {
            this.each(function () {
                    var result = '';

                    $(this).children('cufon')
                    .each(function () {
                        result += $(this).attr('alt');
                    })
                    .remove();

                    $(this).text(result);

                    if ($.browser.webkit)
                        if (!(/chrome/.test(navigator.userAgent.toLowerCase())))
                            return this;

                    Cufon.replace(this, options);
                });
        }

        return this;
    };
    $.fn.decufon = function (options) {
        this
            .each(function () {
                var result = '';

                $(this).children('cufon')
                .each(function () {
                    result += $(this).attr('alt');
                })
                .remove();

                $(this).text(result);
            })
            .addClass('noCufon');

        return this;
    }; //    $.fn.callFlashMethod = function(methodName, parameters)
    //    {
    //        var element = $.browser.msie || $.browser.webkit ? this[0] : $('object', this)[0];
    //        var method = element[methodName];

    //        method.call(element, parameters);
    //        return this;
    //    }

    $.fn.fancyDialog = function (options) {
        var userContainer = this.first();

        if (options == 'close') {
            var context = $('.dynBox');
            context = context.length > 0 ? context : $(userContainer).parent();

            $('a.closePandoraDialog', context).click();
            return;
        }

        if (options == 'remove') {
            $('.dynBox').hide('drop', function () { $(this).remove(); });
            return false;
        }

        var settings = $.extend
        (
            {
                modal: true,
                resizable: false,
                show: 'drop',
                hide: 'drop',
                width: 800,
                height: 600,
                useDefaultUI: true,
                useSignMeUp: true
            }, options || {});

        var container = settings.useDefaultUI ? $('<div class="dynBox"/>')
                .addClass((settings.overlayClass != undefined) ? settings.overlayClass : "") : $(userContainer);

        var callOptions = options;

        var closeDialog = function () {
            // container should be remowed from DOM.
            // reason: for JS funcionality to work in popup. otherwise container is hidden and selectors won't hit if there are more than one hidden container in DOM. 
            // for all browsers not only MSIE
            if ($.browser.msie)
            {
                if (callOptions != null && callOptions.close != null)
                {
                    callOptions.close();
                }
            }
            else
            {
                container.dialog('close');
            }

            container.parent().remove();
            container.remove();
            
            return false;
        };
        var createCloseDialogButton = function () {
            return $('<a href="#" class="closePandoraDialog"/>')
                    .append($.browser.msie ? '<span class="bullet closePandoraDialogIE">&nbsp;</span>' : '<span class="bullet closePandoraDialogOther">&nbsp;</span>')
                    .click(closeDialog);
        };
            
        if (settings.useDefaultUI) {
            var dynBoxTop = $('<div class="dynBoxTop">').appendTo(container);
                var dynBoxTopLeft = $('<div class="dynBoxTopLeft">&nbsp;</div>').appendTo(dynBoxTop);
                var dynBoxTopBg = $('<div class="dynBoxTopBg">&nbsp;</div>').appendTo(dynBoxTop);
                var dynBoxTopRight = $('<div class="dynBoxTopRight">&nbsp;</div>').appendTo(dynBoxTop);
            
            $('<div class="dynBoxBottom">')
                .appendTo(container)
                .append('<div class="dynBoxBottomLeft">&nbsp;</div>')
                .append('<div class="dynBoxBottomBg">&nbsp;</div>')
                .append('<div class="dynBoxBottomRight">&nbsp;</div>');

            $('<div class="dynBoxMain">')
                .appendTo(container)
                .append('<div class="dynBoxLeft">&nbsp;</div>')
                .append($('<div class="dynBoxContent"/>').append(userContainer))
                .append('<div class="dynBoxRight">&nbsp;</div>');

            if ($("body").hasClass("righttoleft")) {
                createCloseDialogButton().appendTo(dynBoxTopLeft);
            } else {
                createCloseDialogButton().appendTo(dynBoxTopRight);
            }
        }

        settings.open = function () {
            //            var windowWidth = document.documentElement.clientWidth + "px";
            //            var windowHeight = document.documentElement.clientHeight + "px";
            //            $('body > .ui-widget-overlay').css("width",  windowWidth);

            container
                .removeClass('ui-dialog-content ui-widget-content')
                .width(settings.width)
                .height(settings.height)
                .parent()
                    .removeClass('ui-widget-content')
                    .end()
                .siblings('.ui-dialog-titlebar').remove();

            if (!settings.useDefaultUI) {
                container.parent()
                    .prepend(createCloseDialogButton())
                    .css('padding-top', '17px')
                    .css('padding-right', '17px');
            }
            else {
                if ($.browser.msie) // I hate MSIE!!!
                    $('div.dynBoxTop>div, div.dynBoxBottom>div, div.dynBoxMain>div').not('.dynBoxContent').css('background', 'none');
            }

            if (callOptions != null && callOptions.open != null)
                callOptions.open();
        };
        $.fx.speeds._default = 0;

        container.dialog(settings);

        return this;
    };
    
    $.enableHiResPreview = function (options) {
        var settings = $.extend
        (
            {
                modal: true,
                resizable: false,
                show: 'drop',
                hide: 'drop',
                open: onOpen,
                width: width,
                height: height
            }, options || {});

        settings.uiEffect = $.browser.msie ? '' : 'puff';

        settings.products =
            $(settings.productsImagesSelector)
            .filter(function () {
                return $(this)
                        .find('img')
                            .filter(function () {
                                return $(this).attr('src').match(settings.productImageUrlRegex);
                            })
                            .length == 1;
                                })
            .map(function (index) {
                var image = $(this).find('img');
                var links = $(this).children('a:first');

                return {
                    OriginalUrl: image.attr('src'),
                    HiResUrl: settings.transformer(image.attr('src')),
                    Title: $(this).find('.p-title').text(),
                    Price: $(this).find('.p-price').text(),
                    ProductPageUrl: links.length > 0 ? links.attr('href') : null,
                    Index: index
                };
                                  })
            .toArray();

        settings.displayProduct = function (index) {
            settings.current = index;

            var productInfo = settings.products[index];

            var productContainer = $('.productContainer');
            productContainer.find('img').stop();

            productContainer.find('.productTitle').text(productInfo.Title).cufon();
            productContainer.find('.productPrice').text(productInfo.Price).cufon();

            var productPageUrl = productContainer.find('.productPageUrl');

            if (productInfo.ProductPageUrl == null)
                productPageUrl.hide();
            else
                productPageUrl.show().attr('href', productInfo.ProductPageUrl);

            var image = productContainer.find('img:first');

            var position = image.position();

            var newImage = image
                                .clone()
                                .attr('src', productInfo.HiResUrl)
                                .hide()
                                .css(
                                {
                                    position: 'absolute',
                                    top: position.top,
                                    left: position.left,
                                    width: 800,
                                    height: 800
                                })
                                .appendTo(image.parent());

            image
                .fadeOut('slow', function () { $(this).remove(); });

            newImage
                .css('filter', 'alpha(opacity=40)')
                .fadeTo('slow', 1, function () {
                    var self = this;

                    productContainer.find('img').filter(function () {
                        return this != self;
                    }).remove();
                });
        };
        settings.displayHiResPhoto = function (index) {
            // preload images
            $(settings.products).each(function () {
                $('<img/>')
                    .attr('src', this.HiResUrl);
            });

            // 1. Create dialog
            var dialog =
                $('<div id="productsPreviewContainer"/>')
                    .prepend($('<a href="#"/>').addClass('closeDialog').text('close'))
                    .append
                    (
                        $('<div/>')
                            .addClass('productContainer')
                            .append($('<h2/>').addClass('productTitle'))
                            .append($('<h3/>').addClass('productPrice'))
                            .append($('<img/>').attr('id', 'pictureContainer').css({ width: 800, height: 800 }))
                            .append($('<a />').addClass('productPageUrl').text('Go to product page'))
                    )
                    .append
                    (
                        settings.products.length > 1 ?
                            $('<input type="button"/>')
                                .addClass('prev')
                                .click(function () { settings.displayProduct((settings.products.length + settings.current - 1) % settings.products.length); })
                            : null
                    )
                    .append
                    (
                        settings.products.length > 1 ?
                            $('<input type="button"/>')
                                .addClass('next')
                                .click(function () { settings.displayProduct((settings.current + 1) % settings.products.length); })
                            : null
                    )
                    .find('input.next, input.prev')
                        .css('opacity', '0.6')
                        .hover(function () { if (!$.browser.msie) $(this).fadeTo('slow', 0.9); }, function () { if (!$.browser.msie) $(this).fadeTo('slow', 0.6); })
                        .end()
                    .append($('<div/>').addClass('jMyCarousel'))
                    .dialog
                    ({
                        modal: true,
                        resizable: false,
                        show: settings.uiEffect,
                        hide: settings.uiEffect,
                        width: 900,
                        height: 700,
                        open: function () {
                            $('.ui-dialog-titlebar').remove();

                            if ($.browser.msie)
                                $('img, input', dialog).css('filter', '');

                            // Create carousel
                            var carousel$ = $(this).find('.jMyCarousel');

                            var ul$ = $('<ul/>').appendTo(carousel$);

                            $(settings.products).each(function (index) {
                                $('<li/>').appendTo(ul$).append
                                (
                                    $('<img/>').attr(
                                    {
                                        src: this.OriginalUrl,
                                        width: 100,
                                        height: 100,
                                        alt: this.Title,
                                        index: index
                                    })
                                    .data('index', index)
                                    .click(function () { settings.displayProduct($(this).attr('index')); })
                                //.fadeTo(0, 0.6)
                                //                                    .hover
                                //                                    (
                                //                                        function(){ $(this).fadeTo('slow', 1) },
                                //                                        function(){ $(this).fadeTo('slow', 0.6) }
                                //                                    )
                                );
                            });

                            carousel$.jMyCarousel
                            ({
                                visible: '6',
                                eltByElt: true,
                                mouseWheel: true,
                                circular: true,
                                evtStart: 'mousedown, mouseover',
                                evtStop: 'mouseup, mouseout'
                            });

                            // Display product
                            settings.displayProduct(index);

                            $('a.closeDialog', dialog).click(function () {
                                if ($.browser.msie) {
                                    dialog.parent().remove();
                                    dialog.remove();
                                }
                                else
                                    dialog.dialog('close');

                                return false;
                            });
                        }
                    });
        };
        $(settings.productsImagesSelector)
            .each(function (index) { $(this).data('hiResPreview-index', index); })
            .hover
            (
                function () {
                    var preview = $(this).find('.preview');

                    if (preview.length != 0)
                        preview.stop();
                    else
                        preview = $('<img/>')
                                    .addClass('productPreview')
                                    .hide()
                                    .attr('src', '/design/consumer/images/productpreview.png')
                                    .appendTo(this)
                                    .hover
                                    (
                                        function () { $(this).attr('src', '/design/consumer/images/productpreviewhover.png'); },
                                        function () { $(this).attr('src', '/design/consumer/images/productpreview.png'); }
                                    )
                                    .click(function () { settings.displayHiResPhoto($(this).parent().data('hiResPreview-index')); });

                    preview.fadeIn('slow');
                },
                function () {
                    $(this)
                        .find('.productPreview')
                            .stop()
                            .fadeOut('slow', function () { $(this).remove(); });
                }
            );
    };
              })(jQuery);

$.validator.addMethod("notInputHint", function (value, element) {
    return $(element).val() != $(element).attr("title");
}, "Please enter value");

$.validator.addMethod('regexp', function (value, element, regexp) {
    return this.optional(element) || regexp.test(value);
}, "Please check your input.");
//#endregion

$(function () {
    document.eCommerceAvailable = $("#faqLink").length == 1;
});

Utils.TrimValues = function (elements) {
    $(elements)
        .each(function (i, elem) {
            $(elem).val($.trim($(elem).val()));
        });
};
Utils.TrimValidators = function (elements) {
    $.each($.validator.methods, function (key, value) {
        $.validator.methods[key] = function () {
            if (arguments.length > 0) {
                arguments[0] = $.trim(arguments[0]);
            }

            return value.apply(this, arguments);
        };
    });
};
Utils.CheckAndReplaceJewelleryResult = function (x) {
    var breadCrumbsParts = x.split(' > ');
    var position = $.inArray("Jewelry", breadCrumbsParts);
    if (position != -1) {
        var partsToRemove = breadCrumbsParts.length - position;
        breadCrumbsParts = breadCrumbsParts.slice(0, breadCrumbsParts.length - partsToRemove);
    }

    return breadCrumbsParts.join(' > ');
};

// Get a key from the querystring
Utils.GetQuerystring = function(key, defaultValue)
{
    if (defaultValue == null) defaultValue = "";
    key = key.replace( /[\[]/ , "\\\[").replace( /[\]]/ , "\\\]");
    var regex = new RegExp("[\\?&]" + key + "=([^&#]*)");
    var qs = regex.exec(window.location.href);
    if (qs == null)
        return defaultValue;
    else
        return qs[1];
};

// Function that writes the current url netminers
// It takes care of everything
// Parameters:
//      (Optional) content: The breadcrumb that needs to be added eg. " Sign Up > Join Success > My Pandora"
//      (Optional) usePostPageView: if true it uses ($netminers.push(['postPageView', document.netminers.title]);)
Utils.WriteToNetminers = function (content, usePostPageView) {
    if (document.netminersPush) {
        // Callback is an onBeforeAction (runs before the tag is written to netminers)
        document.netminersPush(function (breadCrumb) {
            // Does some url-tweaking to the breadCrumb when url points to something in /Jewellery
            Utils.CheckAndReplaceJewelleryResult(breadCrumb);
            document.netminers.title = breadCrumb + content;

            if (usePostPageView) {
                if (usePostPageView == true) {
                    $netminers.push(['postPageView', document.netminers.title]);
                }
                else {
                    return document.netminers.title;
                }
            }
            else {
                return document.netminers.title;
            }
        });
    }
};
Utils.LoginUserWithError = function (callback, startPage, onOpenCallback, params) {
    if (startPage != "showLoginErrorNoEffects") {
        $("#formLogin").remove();
    }

    var url = '/' + Utils.SiteLanguage() + '/views/consumer/shared/login.aspx';

    var ui = "<form id='formLogin'></form>";
    var dialog = $(ui);

    var onContentLoad = function (data) {
        var onOpen = function () {
            $("#formLogin h3, #formLogin h4, #formLogin .information-section").cufon();

            if (document.netminersPush) {
                document.netminersPush(function (x) {
                    var result = CheckAndReplaceJewelleryResult(x);
                    return result + ' > My Pandora Access';
                                                    });
            }
        };
        if (startPage == "showLoginErrorNoEffects") {
            $("#formLogin").remove();
        }

        $.fx.speeds._default = (startPage == "showLoginErrorNoEffects") ? 0 : 300;

        var width = 822;
        var height = 441;

        dialog.dialog
        ({
            modal: true,
            resizable: false,
            title: LoginDictionary.LoginRequired,
            show: 'drop',
            hide: 'drop',
            open: onOpen,
            width: width,
            height: height
        }).width(width).height(height);

        $("#formLogin").parent().removeClass("ui-widget-content").children("div").remove();

        var loginContent = $(data).find("div.loginArea")
                                .removeClass('lightbox2')
                                .addClass('loginbox');

        $('h3.pandora', loginContent).hide();
        $('div.information-section', loginContent).hide();

        $(".info-area", loginContent).remove();

        dialog.append(loginContent);
        loginContent.removeClass("hide");

        $("#formLogin h3, #formLogin h4, #formLogin h4.halfsize, #formLogin .information-section").cufon();

        $("#formLogin a.close").click(function () {
            if ($.browser.msie) {
                dialog.parent().remove();
                dialog.remove();
            }
            else
                dialog.dialog('close');
        });

        var errorPlacement = function (error, element) { $(error).insertBefore(element); };
        var setLoginSize = function (showerror) {
            if (showerror) {
                $('#loginErrorMessage').show();
                $("#formLogin .info-area")
                        .addClass("halfsize")
                        .removeClass("fullsize");
            }
            else {
                $('#loginErrorMessage').hide();
                $("#formLogin .info-area")
                        .addClass("fullsize")
                        .removeClass("halfsize");
            }
        }; //#region Display login
        var displayLogin = function (showError, params) {
            var oldElement = $("#formLogin .info-area");
            var newElement = $(data).find(".loginArea .info-area");

            // Hide element
            $('a.link2', newElement).hide();
            $('.keepLogged', newElement).removeClass('hide');
            $('#btSignMeUpFirst', newElement).hide();

            var btn = $('#btLogin', newElement);
            var span = btn.find('span');
            var btnText = span.text();
            span.remove();

            btn.removeClass('link1')
               .addClass('large dark')
               .append('<span class="l">&nbsp;</span>')
               .append($('<span class="c"/>')
                    .append('<img src="../../../Design/Consumer/Images/arrow-white01.gif" alt="" /> ')
                    .append(btnText))
               .append('<span class="r">&nbsp;</span>');

            if (oldElement.length) {
                newElement.css('display', 'none');

                oldElement.hide('drop', {}, 500, function () {
                    oldElement.remove();
                    newElement.show('drop', {}, 500);
                });
            }

            $("#formLogin .frame").append(newElement);
            $("#formLogin h4, #formLogin h4.halfsize").cufon();

            $("#formLogin .passwordText").show();
            $("#formLogin input").coolinput();

            $("#formLogin .passwordValue").blur(function () {
                if ($(this).val().length == 0) {
                    $("#formLogin .passwordValue").hide();
                    $("#formLogin .passwordText").show();
                    $("#formLogin .passwordText").coolinput();
                }
            });
            $("#formLogin .passwordText").focus(function () {
                $("#formLogin .passwordText").hide();
                $("#formLogin .passwordValue").show().focus();
            });
            $("#formLogin a[rel='closeDialog']").click(function () {
                if ($.browser.msie) {
                    dialog.parent().remove();
                    dialog.remove();
                }
                else
                    dialog.dialog('close');

            });

            $("#btLogin").click(function () {
                if (!$("#formLogin").valid())
                    return;

                $("#formLogin")[0].loaded = false;
                Utils.BlockUI($("#formLogin"));

                AuthenticationClass.AuthenticateUser(
                    $("#tbLogin").val(),
                    $("#tbPassword").val(),
                    $("#cbxKeepLogged:checked").val() == "on",
                    function (response) {
                        $("#formLogin")[0].loaded = true;
                        Utils.UnblockUI();

                        if (!response) {
                            setLoginSize(true);
                            var errs = PandoraClubLoginDictionary.LoginFailed.split('.');

                            $('#loginErrorMessage')
                                .empty()
                                .append($('<h4 />').text(errs[0]))
                                .append($('<p />').text(errs[1]));

                            $("#loginErrorMessage h4").cufon();

                            if (document.netminersPush) {
                                document.netminersPush(function (x) {
                                    var result = CheckAndReplaceJewelleryResult(x);
                                    return result + ' > My Pandora Access > Login Failed';
                                });
                            }

                            return;
                        }

                        if (LoginDictionary.Logout)
                            $(".topbar .topnav a[rel='login']")
                                .text(LoginDictionary.Logout)
                                .attr('href', "#")
                                .attr('onclick', 'return false')
                                .click(function () { Utils.Logout(); });

                        if (document.netminersPush) {
                            document.netminersPush(function (x) {
                                var result = CheckAndReplaceJewelleryResult(x);
                                return result + ' > My Pandora Access > Login';
                                                                });
                        }

                        User.ID = $("#tbLogin").val();
                        User.Authenticated = 1;
                        User.Guid = response;
                        User.RestartAuthentication();

                        if (callback != null)
                            callback();

                        if ($.browser.msie) {
                            dialog.parent().remove();
                            dialog.remove();
                        }
                        else
                            dialog.dialog('close');
                    },
                    function () {
                        Utils.UnblockUI();
                        setLoginSize(true);
                    }
                );
            });

            $("#formLogin input").coolinput();
            $("#tbLogin, #tbPassword").keypress(function (e) { if (Utils.isEnterKey(e)) { $("#btLogin").click(); return false; } });
            $.removeData($("#formLogin")[0], 'validator');

            $("#formLogin").validate
            (
                {
                    messages:
                    {
                        tbLogin:
                        {
                            required: LoginDictionary.EmailCannotBeEmpty,
                            notInputHint: LoginDictionary.EmailCannotBeEmpty,
                            email: LoginDictionary.InvalidEmailFormat
                        },
                        tbPassword:
                        {
                            required: LoginDictionary.PasswordCannotBeEmpty
                        }
                    },
                    errorClass: 'fancyError',
                    errorPlacement: errorPlacement
                }
            );

            $("#btForgotPassword").click(function () {
                setLoginSize(false);
                $('#loginErrorMessage').hide();
                displayForgotPassword();
            });

            $("#btSignMeUpFirst").click(function () {
                setLoginSize(false);
                displaySignMeUpFirst();
            });
            // Show error if required
            if (showError) { setLoginSize(showError); }
        }; //#endregion

        //#region Display forgot password
        var displayForgotPassword = function () {
            var oldElement = $("#formLogin .info-area");

            var newElement = $(data).find(".passwordReminder .info-area").css('display', 'none'); //.css('float', 'none').css('margin-left', '820px');

            if (oldElement.length)
                oldElement.hide('drop', {}, 500, function () {
                    oldElement.remove();
                    newElement.show('drop', {}, 500);
                });
            else
                newElement.show('drop', {}, 500);

            $("#formLogin .frame").append(newElement);
            $("#formLogin input").coolinput();
            newElement.find("h4").cufon();

            $.removeData($("#formLogin")[0], 'validator');

            $("#formLogin").validate
            (
                {
                    messages:
                    {
                        tbPasswordRemindEmail:
                        {
                            required: LoginDictionary.EmailCannotBeEmpty,
                            notInputHint: LoginDictionary.EmailCannotBeEmpty,
                            email: LoginDictionary.InvalidEmailFormat
                        }
                    },
                    errorClass: 'fancyError',
                    errorPlacement: errorPlacement
                }
            );

            $("#tbPasswordRemindEmail").keypress(function (e) { if (Utils.isEnterKey(e)) { $("#btPasswordResend").click(); return false; } });
            $("#btPasswordResend").click(function () {
                if (!$("#formLogin").valid())
                    return;

                $("#formLogin")[0].loaded = false;
                Utils.BlockUI($("#formLogin"));

                var email = $("#tbPasswordRemindEmail").val();

                AuthenticationClass.PasswordReset(email, function (response) {
                    $("#formLogin")[0].loaded = true;
                    Utils.UnblockUI();

                    if (!response.Success) {
                        setLoginSize(true);

                        $('#loginErrorMessage')
                            .empty()
                            .append($('<h4 />').text(PandoraClubLoginDictionary.CannotFindMember))
                            .append($('<p />').text(response.Message));

                        $("#loginErrorMessage h4").replace();

                        return;
                    }

                    doneElement = $(data).find(".passwordReminderDone .info-area");
                    newElement.replaceWith(doneElement);
                    setLoginSize(false);

                    doneElement.find("a").click(function () {
                        if ($.browser.msie) {
                            dialog.parent().remove();
                            dialog.remove();
                        }
                        else
                            dialog.dialog('close');

                    });

                    var messageContainer = $(".passwordConfirmationMessage", doneElement);
                    messageContainer.html(messageContainer.text().replace(/\{0\}/g, '<b>' + email + '</b>'));

                    doneElement.find("h4").cufon();
                });
            });
        }; //#endregion

        //#region Display Sign me up first

        var displaySignMeUpFirst = function () {
            var oldElement = $("#formLogin .info-area");

            var newElement = $(data).find(".newMemberRegistration .info-area").css('display', 'none');

            if (oldElement.length)
                oldElement.hide('drop', {}, 500, function () {
                    oldElement.remove();
                    newElement.show('drop', {}, 500);
                });
            else
                newElement.show('drop', {}, 500);

            $("#formLogin .frame").append(newElement);
            $("#formLogin input").coolinput();

            newElement.find("h4").cufon();

            $("#formLogin a[rel='closeDialog']").click(function () {
                if ($.browser.msie) {
                    dialog.parent().remove();
                    dialog.remove();
                }
                else
                    dialog.dialog('close');

            });

            $("#btAlreadyAMember").click(function () {
                displayLogin();
            });

            $.removeData($("#formLogin")[0], 'validator');

            jQuery.validator.addMethod("genderIsSelected", function (phone_number, element) {
                return $(element).val() != $(element).attr("title");
            }, LoginDictionary.GenderRequired);

            jQuery.validator.addMethod("termsAndConditionsAreAccepted", function (phone_number, element) {
                return $("#cbIAcceptPanndoraConditions:checked", dialog).length > 0;
            }, LoginDictionary.AcceptTermsAndConditions);

            $("#formLogin").validate
            (
                {
                    messages:
                    {
                        tbSignUpFirstName:
                        {
                            required: LoginDictionary.FirstNameRequired,
                            notInputHint: LoginDictionary.FirstNameRequired
                        },
                        tbSignUpLastName:
                        {
                            required: LoginDictionary.LastNameRequired,
                            notInputHint: LoginDictionary.LastNameRequired
                        },
                        tbSignUpEmail:
                        {
                            required: LoginDictionary.EmailCannotBeEmpty,
                            notInputHint: LoginDictionary.EmailCannotBeEmpty,
                            email: LoginDictionary.InvalidEmailFormat
                        },
                        selGender:
                        {
                            genderIsSelected: LoginDictionary.GenderRequired
                        },
                        cbIAcceptPanndoraConditions:
                        {
                            termsAndConditionsAreAccepted: LoginDictionary.AcceptTermsAndConditions
                        }
                    },
                    errorClass: 'fancyError',
                    errorPlacement: errorPlacement
                }
            );

            $("#tbSignUpFirstName, #tbSignUpLastName, #tbSignUpEmail", dialog).keypress(function (e) { if (Utils.isEnterKey(e)) { $("#btSignMeUp").click(); return false; } });
            $("#btSignMeUp", dialog).click(function () {
                if (!$("#formLogin").valid())
                    return;

                if (document.netminersPush) {
                    document.netminersPush(function (result) {
                        return result + ' > My Pandora > Join';
                    });
                }

                $("#formLogin")[0].loaded = false;
                Utils.BlockUI('#formLogin');

                var signupCallback = function (response)
                {
                    $("#formLogin")[0].loaded = true;
                    Utils.UnblockUI('#formLogin');

                    if (document.netminersPush)
                    {
                        document.netminersPush(function (result)
                        {
                            return result + ' > Sign up > ' + (response.Success ? 'Join success' : 'Join fail' + ' > My Pandora');
                        });
                    }

                    if (!response.Success)
                    {
                        alert(htmlDecode(LoginDictionary.ErrorUserAlreadyExists));
                        return;
                    }

                    if (LoginDictionary.Logout)
                        $(".topbar .topnav a[rel='login']")
                            .text(LoginDictionary.Logout)
                            .attr('href', "#")
                            .attr('onclick', 'return false')
                            .click(function () { Utils.Logout(); });

                    User.ID = $("#tbSignUpEmail").val();
                    User.Authenticated = 1;
                    User.Guid = response.Message;
                    User.RestartAuthentication();

                    var registrationCompleteElement = $(data).find(".registrationDone .info-area");
                    newElement.replaceWith(registrationCompleteElement);

                    registrationCompleteElement.find("h4").cufon();

                    $("#btPerfect").click(function ()
                    {
                        if ($.browser.msie)
                        {
                            dialog.parent().remove();
                            dialog.remove();
                        }
                        else
                            dialog.dialog('close');

                        if (callback != null)
                            callback();
                    });
                }

                var signupOptions =
                {
                    firstName: $("#tbSignUpFirstName", dialog).val(),
                    lastName: $("#tbSignUpLastName", dialog).val(),
                    email: $("#tbSignUpEmail", dialog).val(),
                    gender:  $("#selGender", dialog).val(),
                    zip: $("#tbZip", dialog).val() == $("#tbZip", dialog).attr('title') ? null : $("#tbZip", dialog).attr('title'),
                    source: '',
                    signupEventSource: Events.Signup.FromOverlay,
                    callback: signupCallback
                }

                AuthenticationClass.SignupUser(signupOptions);
            });
        }; //#endregion

        switch (startPage) {
            case "login":
                displayLogin(false);
                break;

            case "signup":
                displaySignMeUpFirst();
                break;

            case "forgotPassword":
                displayForgotPassword();
                break;
            case "showLoginError":
                displayLogin(true);
                break;
            case "showLoginErrorNoEffects":
                displayLogin(true);
                $('#tbLogin').val(params.UserEmail);
                break;

            default:
                displayLogin(false);
        }

        if ($.browser.msie) {
            $("div.t,div.c,div.b,a.close,.lightbox2 .holder", dialog).each(function (index, element) {
                $(element).css("background-image", $(element).css("background-image").replace(/\.png/gi, '.gif'));
            });
        }


        if (onOpenCallback)
            onOpenCallback(dialog);
    };
    $.get(url, onContentLoad);
};
Utils.isEnterKey = function (e) {
    var key;

    if (window.event)
        key = window.event.keyCode;
    else
        key = e.which;

    return key == 13;
};
Utils.OnError = function (callback) {
    return function (e) {
        var message = (e != null && e._message != null) ? e._message.replace(/\n/, '<br/>') : "An error occurred during processing your request.";

        Utils.ShowErrorMessage(message);

        if (callback)
            callback(e);
    };
                                    };
Utils.ShowErrorMessage = function (message) {
    $("#formMessage").remove();

    var ui = "\
        <form id='formMessage' class='message'>\
            <div id='errorMessage'>" + message +
            "</div>\
        </form>";

    var dialog = $(ui);

    var buttons = {};

    buttons["Ok"] = function () {
        $("#formMessage").dialog('close');
    };

    $.fx.speeds._default = 300;

    $(dialog).dialog
    ({
        modal: true,
        resizable: false,
        buttons: buttons,
        title: "",
        show: 'puff',
        hide: 'puff',
        width: 500,
        height: 200,
        close: function (event, ui) {
            $(this).parent().remove();
        }
    });
};
Utils.ShowConfirmationMessage = function (message, confirmationDialogSettings, title, width, height, callback) {
    $("#formMessage").remove();

    var okButtonText = confirmationDialogSettings && confirmationDialogSettings.okButtonValue ? confirmationDialogSettings.okButtonValue : "Ok";
    var cancelButtonText = confirmationDialogSettings && confirmationDialogSettings.cancelButtonValue ? confirmationDialogSettings.cancelButtonValue : "Cancel";

    var messageHtml = $("<p>&nbsp;</p><p>" + message + "</p><p>&nbsp;</p><p>&nbsp;</p>");

    var okButtonHtml = $("<a class='confirmation-dialog-ok-button button' href='#'><span class='l'>&nbsp;</span><span class='c'>" + okButtonText + "</span><span class='r'>&nbsp;</span></a>");
    var cancelButtonHtml = $("<a class='confirmation-dialog-cancel-button button' href='#'><span class='l'>&nbsp;</span><span class='c'>" + cancelButtonText + "</span><span class='r'>&nbsp;</span></a>");

    var buttonContainer = $('<div class="aligned-center" />').append(okButtonHtml);
    buttonContainer.append("&nbsp;&nbsp;&nbsp;");
    buttonContainer.append(cancelButtonHtml);

    var dialogContainer = $("<div/>").append(messageHtml);
    dialogContainer.append(buttonContainer);

    var ui = $("<form id='formMessage' class='message'></form>").append(dialogContainer);

    //    <form class="message" id="formMessage">
    //<div>
    //<p>&nbsp;</p>
    //<p>No Translation for (R/RemoveLastDesignItemConfirmation)</p>
    //<p>&nbsp;</p>
    //<div>
    //<a href="#" class="confirmation-dialog-ok-button button"><span class="l">&nbsp;</span><span class="c">Ok</span><span class="r">&nbsp;</span></a>
    //<a href="#" class="confirmation-dialog-cancel-button button"><span class="l">&nbsp;</span><span class="c">Slet</span><span class="r">&nbsp;</span></a>
    //</div>
    //</div>
    //</form>

    var dialog = $(ui);

    $(dialog).fancyDialog
    ({
        modal: true,
        draggable: false,
        resizable: false,
        title: title ? title : "",
        show: 'puff',
        hide: 'puff',
        width: width ? width : 500,
        height: height ? height : undefined,
        open: callback
    });

    //    close: function (event, ui)
    //        {
    //            $(this).parent().remove();
    //        }

    // Configure the 2 buttons
    $(".confirmation-dialog-ok-button").click(confirmationDialogSettings && confirmationDialogSettings.okCallback ? function () {
        dialog.fancyDialog("remove");
        confirmationDialogSettings.okCallback();
    } : function () {
        dialog.fancyDialog("remove");
    });

    $(".confirmation-dialog-cancel-button").click(confirmationDialogSettings && confirmationDialogSettings.cancelCallback ? function () {
        dialog.fancyDialog("remove");
        confirmationDialogSettings.cancelCallback();
    } : function () {
        dialog.fancyDialog("remove");
    });
};
Utils.ShowMessage = function (message, title, width, height, callback) {
    $("#formMessage").remove();

    var ui = $("<form id='formMessage' class='message'></form>").append($("<div class='popupMessage'></div>").append(message));

    var dialog = $(ui);

    var buttons = {};

    buttons["Ok"] = function () {
        $("#formMessage").dialog('close');
    };

    $.fx.speeds._default = 300;

    $(dialog).dialog
    ({
        modal: true,
        resizable: false,
        buttons: buttons,
        title: title ? title : "",
        show: 'puff',
        hide: 'puff',
        width: width ? width : 500,
        height: height ? height : undefined,
        open: callback,
        close: function (event, ui) {
            $(this).parent().remove();
        }
    });
};
Utils.ToUrl = function (url) {
    if (url == null)
        return url;

    var emptyString = /^\s*$/;

    if (emptyString.test(url))
        return url;

    var regexp = /^\s*https?:\/\/(.*)/im;

    if (!(regexp.test(url)))
        url = "http://" + url;

    return url;
};
Utils.IsEcomCountry = function () {
    return window.Country && window.Country.IsEcomActive;
};
Utils.Logout = function (callback, redirectToHome) {
    AuthenticationClass.Logout(
    function () {
        User.Authenticated = 0;
        User.ID = null;
        User.Guid = null;

        User.UserStateChanged.notify({ reason: 'Logged out' });

        if (callback != null)
            callback();

        if (redirectToHome == null || redirectToHome == true) {
            window.location.href = '/' + Utils.SiteLanguage();
        }
    });
};
Utils.ShowTrackWindow = function (callback) {
    $("#formTrack").remove();

    var url = '/' + Utils.SiteLanguage() + '/views/consumer/shared/trackOrder.aspx';

    var onContentLoad = function (data) {
        var dialogArea = $(data).find("div.holder");
        var dialog = $("<form id='formTrack'></form>").append(dialogArea);

        $.fx.speeds._default = 300;
        var width = 754;
        var height = 370;

        dialog.fancyDialog
        ({
            modal: true,
            resizable: false,
            draggable: false,
            show: 'puff',
            open: function () { $("h2, h3", dialog).cufon(); },
            hide: 'puff',
            width: width,
            height: height
        });

        jQuery.validator.addMethod("notInputHint", function (text, element) {
            return $(element).val() != $(element).attr("title");
        }, DictionaryItems.E.EmailRequired);

        var errorPlacement = function (error, element) { $(error).insertBefore(element); };
        $("span.text a").click(function () {
            $("span.text a").tooltip();
        });

        $("#btnTrack").click(function () {
            if (!$("#details-form").valid())
                return;

            $("#details-form")[0].loaded = false;
            BasketService.TrackOrder($("#tbEmail").val(), $("#tbOrderNumber").val(),
	        function (response) {
	            $("#details-form")[0].loaded = true;
	            if (!response) {
	                alert(htmlDecode(DictionaryItems.T.TrackignFailed));
	                return;
	            }

	            if (callback != null)
	                callback();

	            dialog.dialog('close');
	            window.open(response);
	        }, Utils.OnError());
        });

        $("#details-form input").coolinput();
        $("#tbEmail, #tbOrderNumber").keypress(function (e) { if (Utils.isEnterKey(e)) { $("#btnTrack").click(); return false; } });
        $.removeData($("#formTrack")[0], 'validator');

        jQuery.validator.addMethod("notInputHint", function (text, element) {
            return $(element).val() != $(element).attr("title");
        }, DictionaryItems.Ecom.OrderNumberRequired);

        $("#details-form").validate
            (
                {
                    messages:
                    {
                        tbEmail:
                        {
                            required: DictionaryItems.E.EmailRequired,
                            notInputHint: DictionaryItems.E.EmailRequired,
                            email: DictionaryItems.E.EmailInvalidFormat
                        },
                        tbOrderNumber:
                        {
                            required: DictionaryItems.Ecom.OrderNumberRequired,
                            notInputHint: DictionaryItems.Ecom.OrderNumberRequired
                        }
                    },
                    errorClass: 'fancyError',
                    errorPlacement: errorPlacement
                });
    };
    var ui = $.get(url, onContentLoad);
};
Utils.GetEndingForNumber = function (number, endings) {
    if (endings.length == 1) {
        return endings[0];
    }
    if (endings.length == 2) {
        return (number == 1) ? endings[0] : endings[1];
    }

    // if endings.length == 3
    number = number % 100;
    if (11 <= number && number <= 19) {
        return endings[2];
    }
    number = number % 10;
    if (number == 1) return endings[0];
    if (2 <= number && number <= 4) {
        return endings[1];
    }
    return endings[2];
};

function htmlEncode(value) {
    if (value == null)
        return value;

    return $('<div/>').text(value).html();
}

function htmlDecode(value) {
    if (value == null)
        return value;

    return $('<div/>').html(value).text();
}

Utils.IsCufonAvailable = function () {
    return window.Cufon != null;
};
Utils.ShowDeliveryInfo = function (callback, startPage) {
    var siteInfo = Utils.SiteLanguage();

    //var ui = "<form id='formInfo'><div class='top'><a href='#' class='closeDialogWhite' onclick='return false;' >asd</a></div><div id='main'><div><h2>" + htmlDecode(BasketDictionary.DeliveryDateLinkText) + "</h2><br/><p class='upper'>" + htmlDecode(BasketDictionary.DeliveryDateInformation) + "</p></div></div><div class='bottom'>&nbsp;</div></form>";
    var ui = "<form id='formInfo'><div class='top'><a href='#' class='closeDialogWhite' onclick='return false;' ><img width='23' height='23' src='/design/consumer/images/close.png'/></a></div><div id='infoPopup'><div id='infoBody'><h2>" + htmlDecode(BasketDictionary.DeliveryDateLinkText) + "</h2><br/><p class='upper'>" + htmlDecode(BasketDictionary.DeliveryDateInformation) + "</p></div></div></form>";
    var dialog = $(ui);

    dialog
        .find('a.closeDialogWhite')
            .css('position', 'absolute')
            .css('right', '8px')
            .css('top', '-8px');

    var buttons = {};

    $.fx.speeds._default = 300;

    var width = 800;
    var height = 470;

    var onOpen = function () {
        $("h2").css('text-transform', 'uppercase');
        $("p.upper").css('text-transform', 'uppercase').css('line-height', '25px').css('padding-right', '15px');

        $('.ui-dialog-titlebar').remove();

        $("h2", dialog).cufon();
        return false;
    };
    $(dialog).dialog({
        modal: true,
        resizable: false,
        title: DictionaryItems.P.ProcessingYourRequest,
        show: 'drop',
        hide: 'drop',
        open: onOpen,
        width: width,
        height: height
    }).width(width).height(height);


    $('a.closeDialogWhite', dialog).click(function () {
        if ($.browser.msie) {
            dialog.parent().remove();
            dialog.remove();
        }
        else
            dialog.dialog('close');
        return false;
    });

    if ($.browser.msie) {
        $("div.t,div.c,div.b,a.close,.lightbox2 .holder", dialog).each(function (index, element) {
            $(element).css("background-image", $(element).css("background-image").replace(/\.png/gi, '.gif'));
        });
    }
};
Utils.BlockUI = function(control, options)
{
    var element = control != null ? $(control) : $('body');
    options = options || { };
    var css = $.extend
                        (
        {
            border: 'none',
            padding: '15px 0px 15px 0px',
            backgroundColor: '#000',
            '-webkit-border-radius': '10px',
            '-moz-border-radius': '10px',
            opacity: .5,
            color: '#fff',
            margin: '0px 0px 0px 0px',
            width: element[0].tagName == 'BODY' ? 800 : element.width(),
            'font-size': '38px',
            'z-index': 12000
        }, options.css || { });

    delete options.css;

    var settings = $.extend
        (
        {
            message: '<span class="processingYourRequest">' + DictionaryItems.P.ProcessingYourRequest + '</span>',
            css: css
        },
        options
        );

    if (element[0].tagName == 'BODY')
    {
        settings.css.left = ($('body').width() - settings.css.width) / 2;
        $.blockUI(settings);
    }
    else
        element.block(settings);
};

Utils.UnblockUI = function(control)
{
    var element = control != null ? $(control) : $('body');
    element.unblock();
};

///<summary>
/// Creates Pandora-style button
/// Usage:
/// * Utils.CreateButtonLink('Click here', 'http://some.url') - creates a link button with specified text and URL and with no event handler
/// * Utils.CreateButtonLink('Click here', callback) - creates a link button with specified text and calls callback when link is clicked
///</summary>
Utils.CreateButtonLink = function(text, urlOrHandler)
{
    var result = $('<a class="link-more"/>')
        .append($('<span class="l"/>').text(' '))
        .append($('<span class="r"/>').append($('<em/>').text(text)));

    urlOrHandler = urlOrHandler || function() { return false; }; // default event handler

    if ((typeof urlOrHandler) == 'string')
        result.attr('src', urlOrHandler);
    else
        if ((typeof urlOrHandler) == 'function')
            result.click(urlOrHandler);

    return result;
};

Utils.checkNullOrUndefined = function(variable, name)
{
    if (typeof(variable) == "undefined")
    {
        throw new IllegalArgumentException("The " + name + " parameter is not defined.");
    }
    if (variable == null)
    {
        throw new IllegalArgumentException("The " + name + " parameter cannot be null.");
    }
};

Utils.isDefined = function(value)
{
    return ((typeof(value) != "undefined") && (value != null));
};

Utils.isNullOrEmpty = function(value)
{
    return !Utils.isDefined(value) || ((typeof(value) == "string") && jQuery.trim(value).length == 0);
};

Utils.checkType = function(variable, name, type)
{
    if (Utils.isDefined(variable) && typeof(variable) != type)
    {
        throw new IllegalArgumentException("The " + name + " parameter is not the " + type + " instance.");
    }
};

Utils.checkDefined = function(variable, name, type)
{
    Utils.checkNullOrUndefined(variable, name);
    if (typeof(variable) != type)
    {
        throw new IllegalArgumentException("The " + name + " parameter is not the " + type + " instance.");
    }
};

Utils.ToEmpty = function(value)
{
    return Utils.isDefined(value) ? value : "&nbsp;";
};

IllegalArgumentException = function(newMessage)
{
    var message = "" + newMessage;

    this.getMessage = function()
    {
        return message;
    };
};

function htmlDecode(value) {
    if (value == null)
        return value;

    return $('<div/>').html(value).text();
}

Utils.formatDistance = function (value, isMetric) {
    var distance = isMetric ? value / 1000.0 : value / 1609.344;

    if (distance >= 10)
        distance = Math.round(distance);

    return (distance < 10 ? distance.toFixed(1) : distance) + ' ' + (isMetric ? Dictionary.Kilometres : Dictionary.Miles);
};
Utils.formatStoreLink = function (storeInfo) {
    var result = "/"
               + Utils.SiteLanguage()
               + "/stores/"
               + storeInfo.Url;

    result = result.toLowerCase();

    return result;
};
Utils.formatAddressLines = function (storeInfo, includePhone, includePhoneLabel) {
    var result = [];

    if (!Utils.isNullOrEmpty(storeInfo.Address.Street))
        result.push(htmlDecode(storeInfo.Address.Street));

    if (!Utils.isNullOrEmpty(storeInfo.Address.City) || !Utils.isNullOrEmpty(storeInfo.Address.State) || !Utils.isNullOrEmpty(storeInfo.Address.PostalCode)) {
        var line = "";
        if (!Utils.isNullOrEmpty(storeInfo.Address.City)) {
            line = htmlDecode(storeInfo.Address.City);
        }

        if (!Utils.isNullOrEmpty(storeInfo.Address.State)) {
            if (line.length > 0) {
                line += ", ";
            }
            line += htmlDecode(storeInfo.Address.State);
        }

        if (!Utils.isNullOrEmpty(storeInfo.Address.PostalCode)) {
            if (line.length > 0) {
                line += ", ";
            }
            line += htmlDecode(storeInfo.Address.PostalCode);
        }

        result.push(line);
    }

    if (includePhone && !Utils.isNullOrEmpty(storeInfo.Contact.Phone))
        result.push((includePhoneLabel ? DictionaryItems.P.Phone + ": " : "") + storeInfo.Contact.Phone);

    return result;
};
Utils.SiteLanguage = function (useDefault) {
    /*
    var useDefault = Utils.isDefined(useDefault) && useDefault;

    var siteLanguage = $.cookie("consumer#lang");    
    if (Utils.isDefined(siteLanguage)) return siteLanguage.toLowerCase();
    return useDefault ? 'en-us' : null;
    */

    // first try to get language from url
    var pathname = window.location.pathname;
    var localRegex = /^\/(\w{2}-(?:latn-rs|\w{2}))(?:\/|$)/im;

    var locale = localRegex.exec(pathname);

    if (locale != null)
        return locale[1].toLowerCase();

    // locale is not specified, get it from cookie
    locale = $.cookie("consumer#lang");

    if ((locale == null || locale == '') && useDefault)
        return 'en-us'; // if cannot extract locale from url/cookie and we are allowed using default language - use en-us

    return locale;
};
Utils.getAddthisShareVars = function () {

    var vars = ["email_template"];

    var email_vars = [
        "pan_language",
        "pan_header_home_url",
        "pan_header_explore_url",
        "pan_header_stores_url",
        "pan_header_club_url",
        "pan_trans_header_explore",
        "pan_trans_header_club",
        "pan_trans_header_stores",
        "pan_link_store_url",
        "pan_link_contactus_url",
        "pan_link_tersmandconditions_url"
    ];

    var share = {};

    for (var i = 0; i < vars.length; ++i) {
        var a = $("#static-data-init").attr("data-addthis-" + vars[i]);
        share[vars[i]] = a;
    }

    share.email_vars = {};

    for (var i = 0; i < email_vars.length; ++i) {
        var a = $("#static-data-init").attr("data-addthis-email-" + email_vars[i]);
        share.email_vars[email_vars[i]] = a;
    }
    return share;
};
//this can be called as Utils.NumberFormatter(num, thousandsep, decimalsep)
//or used for creating a formatter for a specific locale as
//var fmt = Utils.NumberFormatter.getFormatter(thousandsep, decimalsep)
Utils.NumberFormatter = (function () {
    var formater = function (num, thSep, deSep) {
        if (!thSep || !deSep)
            throw new Error("missing arguments");

        var fraction = String(parseFloat(num));
        if (fraction.indexOf('.') < 0)
            fraction += ".00";
        else
            fraction += "00";
        fraction = fraction.substr(fraction.indexOf('.') + 1, 2);

        var num = String(parseInt(num)); //ensure integer string.

        var result = deSep + fraction;
        var cnt = 0;
        for (var i = num.length - 1; i >= 0; --i) {
            result = num.charAt(i) + result;
            if (++cnt == 3 && i > 0) {
                result = thSep + result;
                cnt = 0;
            }
        }
        return result;
    };
    formater.getFormatter = function (thSep, deSep) {
        return (function (num) { return formater(num, thSep, deSep); });
    };
    return formater;
})();

/*$(function () {
    setInterval(function () {
        $(".spot .spot-text").each(function () {
            var elem = $(this);
            var spot = elem.find("h3");
            var elemh = elem.height();
            var spoth = spot.height();
            if (elemh > 0 && spoth > elemh && !elem.hasClass('long-text')) { //new and higher than most?
                elem.addClass('long-text');
            }
            //            if (Cufon)
            //                elem.cufon();
        });
    }, 417);
});*/
/* Added to enable spot gallery */
$(function () {
    $("div.spot.spot-gallery a").click(function () {
        var self = $(this);
        var windowWidth = 0;
        var imageHeight = 0;
        var imageAreaHeight = 0;
        var galleryIndex = 0;
        var i = 0;
        var galleryPreloadLength = 3;
        var galleryItems = [];
        var scrolling = false;
        var firstAnimated = false;
        var backgroundColor = $("body").css("background-color");
        var imageBackgroundColor = $("body").css("background-color");
        var galleryContainer = $(this).parents("div.spot.spot-gallery").find("ul.image-list");
        var galleryImages = galleryContainer.find("a");
        var linkText = (galleryContainer.attr("data-link-text") != "") ? galleryContainer.attr("data-link-text") : "See the whole collection";
        $("html").addClass("overlay-gallery");
        $(window).scrollTop(0);
        windowWidth = $(window).width();

        function rgb2rgba(rgb, opacity) {
            rgb = rgb.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
            function hex(x) {
                return ("0" + parseInt(x).toString(16)).slice(-2);
            }
            return "rgba(" + rgb[1] + "," + rgb[2] + "," + rgb[3] + "," + opacity + ")";
        }

        if ($.support.opacity == true) {
            imageBackgroundColor = rgb2rgba(backgroundColor, '0.9');
            backgroundColor = rgb2rgba(backgroundColor, '0.5');
        }

        if (galleryImages.length > 0 && $("#overlay-spot-gallery").length == 0) {
            var gallery = $("<div id='overlay-spot-gallery' />")
                            .append("<div class='button button-close'/>")
                            .append("<div class='button button-next'/>")
                            .append("<div class='button button-prev'/>")
                            .append("<a class='button button-collection' href='" + self.attr("href") + "'><span class='l'></span><span class='c'>" + linkText + "</span><span class='r'></span></a>")
                            .append("<div class='images scroll-panel' data-page-size='1'><ul></ul></div>")
                            .css("background-color", backgroundColor);

            function keyPressed(e) {
                switch (e.keyCode) {
                    case 27: closeGallery(); break;
                    case 37: changePrevious(); break;
                    case 39: changeNext();  break;
                    default:

                }
            }

            function displayButtons() {
                var buttonQueryDisplay = "";
                var buttonQueryHide = "";
                if (galleryIndex == 0) {
                    buttonQueryDisplay = ".button-next, .button-close, .button-collection";
                    buttonQueryHide = ".button-prev";
                } else if (galleryIndex == (galleryImages.length - 1)) {
                    buttonQueryDisplay = ".button-prev, .button-close, .button-collection";
                    buttonQueryHide = ".button-next";
                } else {
                    buttonQueryDisplay = ".button-next, .button-prev, .button-close, .button-collection";
                }
                gallery.find(buttonQueryDisplay).fadeIn(250);
                gallery.find(buttonQueryHide).fadeOut(250);
            }

            function setupGalleryButtonPositions(imageHeight) {
                if (imageHeight > $(window).height()) {
                    imageHeight = $(window).height();
                } else {
                    gallery.find(".button-collection").css("bottom", (($(window).height() - imageHeight) + 25));
                }
                imageAreaHeight = imageHeight - ($("#top").height() + $("#menu-container").height() + $("#footer").height());

                gallery.find(".button-next, .button-prev").css("top", ((imageAreaHeight - 51) / 2) + ($("#top").height() + $("#menu-container").height()));
            }

            function appendImage(image, index) {
                if (image.Loaded == false) {
                    image.Loaded = true;
                    return $("<li class='image item' data-image-url='" + image.ImageUrl + "' data-image-alt=''/>").css({ "background-color": imageBackgroundColor })
                                                    .loadImagesAsync(index, function (image, index) {
                                                        var placeHolder = image.parent();
                                                        image.show();
                                                        placeHolder.css({ "visibility": "hidden" }).show();
                                                        setImageSize(placeHolder);
                                                        placeHolder.css({ "visibility": "visible" }).hide();
                                                        if (index == 0) {
                                                            $("#footer").hide();
                                                            placeHolder.css("z-index", "1").fadeIn(500, function () {
                                                                firstAnimated = true;
                                                                setupGalleryButtonPositions($(window).height());
                                                                displayButtons();
                                                            });
                                                        }
                                                    })
                                                    .mouseover(function () { if (firstAnimated == true) { displayButtons(); } });
                }
            }

            function closeGallery() {
                $("#overlay-spot-gallery").fadeOut(500, function () {
                    $("html").removeClass("overlay-gallery");
                    $("#overlay-spot-gallery").remove();
                    $("#footer").show();
                });
                $(document).unbind("keyup", keyPressed);
                $(window).unbind("resize", windowResized);
            }

            function changeNext() {
                if (scrolling != true) {
                    var currentItem = $(gallery.find(".images ul li.item")[galleryIndex]);
                    var nextItem = $(gallery.find(".images ul li.item")[galleryIndex + 1]);
                    nextItem.show();
                    setImageSize(nextItem);
                    if (nextItem.length > 0) {
                        scrolling = true;
                        currentItem.css({ 'left': 0 });
                        currentItem.animate({ left: (-windowWidth) }, 500, function () {
                            scrolling = false;
                        });
                        nextItem.css({ 'left': windowWidth, 'display': 'block' });
                        nextItem.animate({ left: 0 }, 500, function () {
                            currentItem.hide();
                            galleryIndex++;
                            displayButtons();
                            if (galleryIndex + galleryPreloadLength < galleryItems.length) {
                                gallery.find(".images ul").append(appendImage(galleryItems[galleryPreloadLength + galleryIndex], (galleryPreloadLength + galleryIndex)));
                            }
                            scrolling = false;
                        });
                    }
                }
            }

            function changePrevious() {
                if (scrolling != true) {
                    var currentItem = $(gallery.find(".images ul li.item")[galleryIndex]);
                    var nextItem = $(gallery.find(".images ul li.item")[galleryIndex - 1]);
                    nextItem.show();
                    setImageSize(nextItem);
                    if (nextItem.length > 0) {
                        scrolling = true;
                        currentItem.css({ 'left': 0 });
                        currentItem.animate({ left: (windowWidth) }, 500, function () {
                            scrolling = false;
                        });
                        nextItem.css({ 'left': -windowWidth, 'display': 'block' });
                        nextItem.animate({ left: 0 }, 500, function () {
                            currentItem.hide();
                            if (galleryIndex > 0) {
                                galleryIndex--;
                                displayButtons();
                            }
                            scrolling = false;
                        });
                    }
                }
            }

            function setImageSize(imageContainer) {
                imageContainer.css({ "width": $(window).width(), "height": $(window).height() });
                var image = imageContainer.find("img");
                if (image.height() > image.width()) {
                    image.css({ "width": "height", "height": $(window).height() });
                } else {
                    image.css({ "width": $(window).width(), "height": "auto" });
                }
                windowWidth = $(window).width();
            }

            function windowResized() {
                setImageSize($(gallery.find(".images ul li.item")[galleryIndex]));
                setupGalleryButtonPositions($(window).height());
            }

            galleryImages.each(function () {
                galleryItems.push({ 'ImageUrl': $(this).attr("href"), 'Loaded': false });
            });

            while (i < galleryPreloadLength + 1 && i < galleryItems.length) {
                gallery.find(".images ul").append(appendImage(galleryItems[i], i));
                i++;
            }

            /* Event binding region */
            $(document).bind("keyup", keyPressed);
            $(window).bind("resize", windowResized);
            $("#menu-container").mouseover(function () {
                gallery.find(".button-next, .button-prev, .button-close, .button-collection").fadeOut(250);
            });
            gallery.find(".button-close").click(function () {
                closeGallery();
            });
            gallery.find(".button-next").click(function () {
                changeNext();
            });
            gallery.find(".button-prev").click(function () {
                changePrevious();
            });

            $("body").append(gallery);
        }
        return false;
    });
});
(function ($) {
    $.fn.loadImagesAsync = function (index, callback) {
        return this.each(function () {
            var self = $(this);
            //self.preloadSpin();
            var url = self.attr('data-image-url');
            var alt = self.attr('data-image-alt');
            
            var myimg = $("<img />")
                .css('display', 'none')
                .attr({
                        src: url,
                        alt: alt
                     })
                .appendTo(self);

            var done = function () {
                $(self).removeClass("spot-image-preload");
                $('.spinner', self).remove();
                callback(myimg, index);
            };
            var checki = function (e) {
                if ((myimg[0].complete && e.type == "load") || (myimg[0].readyState == 'complete' && e.type == 'load')) {
                    done();
                }
                else if (myimg[0].readyState === undefined) // dont for IE
                {
                    myimg.attr('src', myimg.attr('src')); // re-fire load event
                }
            };

            myimg.bind('load readystatechange', function (e) { checki(e); });
            checki({ type: 'readystatechange' }); // bind to 'load' event...
        });
    };
})(jQuery);

Utils.parseExceptionDetails = function (htmlContent) {
    var intro = $(htmlContent).find('p.intro').text();
    var startText = "The exception message is '";
    var endText = "'. See server logs for more details.";
    var start = intro.indexOf(startText) + startText.length;
    if (start == -1)
        return "";
    var end = intro.indexOf(endText, start);
    if (end == -1)
        return "";
    return intro.substring(start, end);
};
Utils.OnWCFError = function (callback) {
    return function (e) {
        var message = (typeof e == "string") ? e : ((typeof (e.responseText) == "string" && e.responseText != "") ? Utils.parseExceptionDetails(e.responseText) : "");
        if (message == "") {
            message = "An error occurred during processing your request.";
        }

        Utils.ShowErrorMessage(message);

        if (callback)
            callback(e);
    };
};
Utils.getScripts = function (scripts, successCallback)
{
    var left = scripts.length;
    $.each(scripts, function (index, value)
    {
        $.getScript(value, function ()
        {
            if (--left == 0 && successCallback) successCallback();
        });
    });
};

Utils.truncateTextWithoutCuttingWords = function (textToCut, maxLength)
{
    var cut = textToCut.lastIndexOf(' ', maxLength);
    if (cut == -1) return textToCut;
    return textToCut.substring(0, cut);
};


Utils.getUncachedUrl = function (url)
{
    var time = new Date().getTime();
    var param = time + '=' + time;
    return url + (url.indexOf('?') == -1 ? '?' : '&') + param;
};

Utils.isGiftCardsServer = function()
{
    return location.hostname.toLowerCase() == 'giftcards.pandora.net';
}
