/* Minification failed. Returning unminified contents.
(11141,15-16): run-time error JS1010: Expected identifier: .
(11141,15-16): run-time error JS1195: Expected expression: .
 */
$(document).ready(function () {
    
    init_mega_dropdown_menu();              //browse departments initial dropdown and logged out megamenu
        
});



var isTouch = ('ontouchstart' in window) || window.DocumentTouch && document instanceof DocumentTouch;
//isTouch = true;


var mega_menu_config = mega_menu_config || { classes: '' }

function init_mega_dropdown_menu() {

    if (mega_menu_config.classes != '') {


        $('#navMenu ul.primary.loggedOut>li>a').each(function (index) {
            if ($(this).is(mega_menu_config.classes)) {
                $(this).closest('li').remove();
            }
        });

        $('#navMenu ' + mega_menu_config.classes).remove();
        $('#navMenu .categories:empty').closest('li').remove();

    }

    

    var showEvent = isTouch ? "click" : "mouseenter";


    $('#navMenu .navMenu > ul > li').each(function (index, element) {
     


        var megaMenu = $(element).children(".megaMenu");
        if (megaMenu.length > 0) {

           
            if (isTouch) {
                $(element).on("click", function (e) { show(e) });
            }
            else {
                $(element).hoverIntent(show, hideMegaMenu);
            }
        }

    });

    //if touch, click outside the div to close it
    if (isTouch) {
        $(document).mouseup(function (e) {
            var container = $("#navMenu .navMenu > ul");
            var toHide = $("#navMenu .navMenu > ul > li > .megaMenu");

            if (!container.is(e.target) // if the target of the click isn't the container...
                && container.has(e.target).length === 0) // ... nor a descendant of the container
            {
                toHide.hide();
            }
        });
    }
}

function show(e) {


    

    var megaMenu = $(e.target).closest('li').children(".megaMenu");

    //if clicked on parent li, close mega menu
    if ($(e.target).closest('.megaMenu').length === 0)//for touch click to close
    {
        var isHidden = !megaMenu.is(":visible");

       
        hideMegaMenu();

        if (isHidden) {
            //enlarge the browsemenu to total width on first category shown 
            $("#navMenu .megaMenuWrap > .megaMenu").width($("#navMenu .megaMenuWrap > .megaMenu").css('max-width'));
            megaMenu.show();
            $(e.target).addClass("menuSelected");
        }

        //touch devices dont follow link on click
        if (isTouch) {
            e.preventDefault();
        }
    }

}


function hideMegaMenu()
{
    $('#navMenu .navMenu > ul > li > .megaMenu').hide();
    $('#navMenu .navMenu > ul > li').removeClass("menuSelected");
}

//function megaMenuVisible()
//{
//    return $('#navMenu .navMenu > ul > li .megaMenu').is(":visible");
//}

////Logged in Browse menu
////--------------------------------------------------------

//function init_mega_browsedepartment_menu() {

//    function showDepartment(e) {
//        //enlarge the browsemenu to total width on first category shown 
//        $("#nav .megaMenuWrap > .megaMenu").width($("#nav .megaMenuWrap > .megaMenu").css('max-width'));

//        $("#nav .megaMenu ul.primary > li").removeClass("active");
//        e.addClass("active");
//        $("#nav .megaMenu ul.primary > li .megaMenu").hide();
//        e.children(".megaMenu").show();        
//    }

   

//    if (isTouch) {
//        $("#nav .megaMenu ul.primary > li").click(function () {
//            showDepartment($(this));
//        });
//    }
//    else {
//        // add lag for accidental department selection. gweb-307
//        $("#nav .megaMenu ul.primary > li").hoverIntent({ out: function () { }, over: function () { showDepartment($(this)); }, timeout: 15 });
//       // $("#nav .megaMenu ul.primary > li").mouseenter(function () {
//           //showDepartment($(this));
//        //});
//    }
    

//}

//function showBrowseDepartments() {
//    $('#nav .megaMenuWrap .megaMenuOuter').show();
//}
//function hideBrowseDepartments() {
//    $('#nav .megaMenuWrap .megaMenuOuter').hide();
//}

/*!
 * hoverIntent r7 // 2013.03.11 // jQuery 1.9.1+
 * http://cherne.net/brian/resources/jquery.hoverIntent.html
 *
 * You may use hoverIntent under the terms of the MIT license.
 * Copyright 2007, 2013 Brian Cherne
 */
(function (e) { e.fn.hoverIntent = function (t, n, r) { var i = { interval: 100, sensitivity: 7, timeout: 0 }; if (typeof t === "object") { i = e.extend(i, t) } else if (e.isFunction(n)) { i = e.extend(i, { over: t, out: n, selector: r }) } else { i = e.extend(i, { over: t, out: t, selector: n }) } var s, o, u, a; var f = function (e) { s = e.pageX; o = e.pageY }; var l = function (t, n) { n.hoverIntent_t = clearTimeout(n.hoverIntent_t); if (Math.abs(u - s) + Math.abs(a - o) < i.sensitivity) { e(n).off("mousemove.hoverIntent", f); n.hoverIntent_s = 1; return i.over.apply(n, [t]) } else { u = s; a = o; n.hoverIntent_t = setTimeout(function () { l(t, n) }, i.interval) } }; var c = function (e, t) { t.hoverIntent_t = clearTimeout(t.hoverIntent_t); t.hoverIntent_s = 0; return i.out.apply(t, [e]) }; var h = function (t) { var n = jQuery.extend({}, t); var r = this; if (r.hoverIntent_t) { r.hoverIntent_t = clearTimeout(r.hoverIntent_t) } if (t.type == "mouseenter") { u = n.pageX; a = n.pageY; e(r).on("mousemove.hoverIntent", f); if (r.hoverIntent_s != 1) { r.hoverIntent_t = setTimeout(function () { l(n, r) }, i.interval) } } else { e(r).off("mousemove.hoverIntent", f); if (r.hoverIntent_s == 1) { r.hoverIntent_t = setTimeout(function () { c(n, r) }, i.timeout) } } }; return this.on({ "mouseenter.hoverIntent": h, "mouseleave.hoverIntent": h }, i.selector) } })(jQuery)
;
var gardners = (function (window, $) {
    var _settings;

    var that =
     {
         init: function (options) {

             jQuery.ajaxSettings.traditional = true;
             $.ajaxSetup({
                 // Disable caching of AJAX responses
                 cache: false
             });
             //setup defaults
             _settings = $.extend({
                 AjaxErrorTitle: 'Warning'
                 , AjaxErrorMessage: 'Server Error has occurred'
                 , AjaxErrorIcon: 'k-ext-information'
             }, options);


             //user leaving page so ignore any unfinished ajax loads
             $(window).bind('beforeunload', function () {
                 $(document).unbind('ajaxError');
             });

         

             $(document).ready(function () {
               
                 //restrict inputs to string length
                 that.restrictStringInputLengths();
                 that.addRequiredForLabels();

                 $("body").on("keypress keyup blur", '.numeric', function (event) {
                    // $(this).val($(this).val().replace(/[^\d].+/, ""));
                    // console.log(event.which);
                   
                     ////////////////////////////////////////////
                     if (event.keyCode == 8 || event.keyCode == 9 || event.keyCode == 27 || event.keyCode == 13 ||
                                             // Allow: Ctrl+A
                             (event.keyCode == 65 && event.ctrlKey === true) ||

                                             // Allow: Ctrl+C
                             (event.keyCode == 67 && event.ctrlKey === true) ||

                                             // Allow: Ctrl+V
                             (event.keyCode == 86 && event.ctrlKey === true) ||

                                             // Allow: home, end, left, right
                             (event.keyCode >= 35 && event.keyCode <= 39)) {
                                             // let it happen, don't do anything
                                             return;
                     } else {

                         if (event.which != 127 && event.which != 8 && (event.which < 48 || event.which > 57)) {
                           event.preventDefault();
                          }
                     }
                 });

                 if ($.validator != undefined) {
                     $.validator.methods.date = function (value, element) {
                         return this.optional(element) || kendo.parseDate(value, "dd/MM/yyyy");

                     }
                 }
                 $(document).ajaxError(function (event, xhr, settings, exception) {

                     if (xhr.status == 0 && exception == "")
                         return;
                     if (xhr.status == 400) {
                         gardners.kendoHelpers.PopupAlertDialog.show({
                             title: _settings.AjaxErrorTitle,
                             message: xhr.responseText,
                             icon: _settings.AjaxErrorIcon
                         });
                     }
                     else if (xhr.status == 403) {
                         var response = $.parseJSON(xhr.responseText);
                         window.location = response.LogonUrl; //Passed from AJAXAUTHORIZE
                     }

                     else if (xhr.status == 500) { //custom error messages ? reurn a HttpStatusCodeResult 500
                         var message = exception;
                         if (!exception || exception.length == 0) { message = _settings.AjaxErrorMessage; }
                         gardners.kendoHelpers.PopupAlertDialog.show({
                             title: _settings.AjaxErrorTitle,
                             message: message,
                             icon: _settings.AjaxErrorIcon
                         });
                     }

                     else {
                         gardners.kendoHelpers.PopupAlertDialog.show({
                             title: _settings.AjaxErrorTitle,
                             message: _settings.AjaxErrorMessage,
                             icon: _settings.AjaxErrorIcon
                         });
                     }
                 });
           
                
                


             });

             if ($.validator != undefined) {
                 $.validator.setDefaults({
                     ignore: []
                 });
             }
             
        }
        ,
        addRequiredForLabels: function () {
            //add .required class onto labels for required fields. 
            $('input[type=text],select,input.k-textbox').each(function () {
                var req = $(this).attr('data-val-required');
                if (undefined != req) {
                    var label = $('label[for="' + $(this).attr('id') + '"]');
                    var text = label.text();
                    if (text.length > 0) {
                        label.addClass('required');
                    }
                }
            });
        }
         ,
         restrictStringInputLengths: function () {
             //restrict inputs to string length
             $('input[data-val-length-max]').each(
              function (index) {
                  $(this).attr('maxlength', $(this).attr('data-val-length-max'));
              });
         }
         ,
         getAjaxSettings: function () {
             return _settings;
        }
        ,
        clearValidationSummary: function () {
            $("[data-valmsg-summary='true']").removeClass('alert alert-danger').addClass('validation-summary-valid');
            if ($('.messageSummary .validation-summary-errors').length > 0) {
                $('.messageSummary .validation-summary-errors').empty().removeClass('validation-summary-errors').addClass('validation-summary-valid');
            }
            else {

                $('.messageSummary').empty().removeClass('alert alert-danger validation-summary-errors').addClass('validation-summary-valid');
            }
        }
         ,
         processStandardAjaxResponse: function (data, targetElement, options) {
             options = $.extend({
                 growlAndClearOnSuccess: false,
                 growlOnSuccess:false
             }, options);

             //any validation errors from modelState?
             if (typeof data.hasValidationErrors != 'undefined' && data.hasValidationErrors) {
                 for (var i = 0; i < data.data.length; i++) {

                     var entityError = data.data[i];
                     $('[data-valmsg-for="' + entityError.valmsg_for + '"]').text(entityError.error).addClass('field-validation-error').removeClass('field-validation-valid');
                     $('[name="' + entityError.valmsg_for + '"]').addClass('input-validation-error');
                 }
             }


             if (typeof data.messages == 'undefined' && typeof data.message == 'undefined' &&  typeof data.messageList == 'undefined') 
                 //we have html returned
                 $('#' + targetElement).html(data);
             else
             {
                     //if ajax returned a url just follow it
                     if (data.returnUrl) {
                         window.location = data.returnUrl;
                         return;
                     }

                            
                    
                 var messages = $('<ul>');

                 if (data.messageList != null) {
                     if (!data.hasOwnProperty('messages')) {
                         data['messages'] = [];
                     }
                     $.each(data.messageList, function (index, value) {
                         data.messages.push(value);
                     });
                 }


                 if (data.message != null) {
                     if (!data.hasOwnProperty('messages')) {
                         data['messages'] = [];
                     }
                      data.messages.push(data.message);
                     //messages.append('<li>' + data.message + '</li>');
                 }

                 if (data.messages != 'undefined' && data.messages != null)

                     $.each(data.messages, function (index, value) {
                         messages.append('<li>' + value + '</li>');
                     });
                 messages.append('</ul>');



                 var targetContainer;

                 if (targetElement) {
                     if (typeof targetElement === 'string')
                         targetContainer = $('#' + targetElement);
                     else
                         targetContainer = targetElement;
                 }
                 else
                     targetContainer = $('body');

                 var $target;
                 // var validationSummarySelector = 'div[data-valmsg-summary="true"]';//'.messageSummary'
                 //$('.messageSummary', targetContainer).html('').removeClass('alert').removeClass('alert-success').removeClass('alert-danger');

                 //check for validation summary if found put error message in there
                 $target = $('div[data-valmsg-summary="true"]', targetContainer);

                 if ($target.length) {
                     $target.html('').removeClass('validation-summary-errors').removeClass('validation-summary-valid');
                     if(options.growlAndClearOnSuccess) {
                         $('.messageSummary', targetContainer).html('');
                     }
                 }
                 else {
                     $target = $('.messageSummary', targetContainer).html('').removeClass('alert').removeClass('alert-success').removeClass('alert-danger');;
                 }

                     if (((options.growlAndClearOnSuccess == true || options.growlOnSuccess) && data.success == true) || (options.growlOnFail == true && data.success == false)) {

                         var subTitle = data.messages.join('. ');

                         if (data.messages.length === 0)
                             subTitle = 'update success';

                         if (data.success == true) {
                             //popupNotification = $("#popupNotification").data("kendoNotification").show({ title: subTitle }, "success");
                             gardners.kendoHelpers.showSuccessNotification(subTitle);
                         }
                         else
                             gardners.kendoHelpers.PopupAlertDialog.show({
                                 title: _settings.AjaxErrorTitle,
                                 message: subTitle,
                                 icon: _settings.AjaxErrorIcon
                             });
                         return;
                     }
                     else {
                         $target.removeClass('alert alert-success validation-summary-valid').removeClass('alert alert-danger validation-summary-errors');
                         var css = '';
                         if (data.success) {
                             css = 'alert alert-success validation-summary-valid';
                         }
                         else {
                             css = 'alert alert-danger validation-summary-errors';
                         }
                         $target.addClass(css).html(messages).show();
                     }
             }

            


             //if (typeof data.messages != 'undefined') {


             //    //if ajax returned a url just follow it
             //    if (data.returnUrl) {
             //        window.location = data.returnUrl;
             //        return;
             //    }
                
             //    //we have json message


             //    var messages = $('<ul>');

             //    if (data.message != null)
             //        messages.append('<li>' + data.message + '</li>');

             //    if (data.messages != null)

             //        $.each(data.messages, function (index, value) {
             //            messages.append('<li>' + value + '</li>');
             //        });
             //    messages.append('</ul>');



             //    var targetContainer;

             //    if (targetElement) {
             //        if (typeof targetElement === 'string')
             //            targetContainer = $('#' + targetElement);
             //        else
             //            targetContainer = targetElement;
             //    }
             //    else
             //        targetContainer = $('body');

             //    var $target;
             //   // var validationSummarySelector = 'div[data-valmsg-summary="true"]';//'.messageSummary'
             //    //$('.messageSummary', targetContainer).html('').removeClass('alert').removeClass('alert-success').removeClass('alert-danger');

             //    //check for validation summary if found put error message in there
             //    $target = $('div[data-valmsg-summary="true"]', targetContainer);

             //    if ($target.length) {
             //        $target.html('').removeClass('validation-summary-errors').removeClass('validation-summary-valid');
             //        $('.messageSummary', targetContainer).html('');
             //    }
             //    else {
             //        $target = $('.messageSummary', targetContainer).html('').removeClass('alert').removeClass('alert-success').removeClass('alert-danger');;
             //    }

             //    //if (data.success == false && target.length > 0) {
             //    //    target.addClass("validation-summary-errors").removeClass("validation-summary-valid");
             //    //}
             //    //else {
                     
             //    //}
               

             //    if ((options.growlAndClearOnSuccess == true && data.success == true) || (options.growlOnFail == true && data.success == false)) {

             //        var subTitle = data.messages.join('. ');

             //        if (data.messages.length = 0)
             //            subTitle = 'update success';

             //        if (data.success == true) {
             //            //popupNotification = $("#popupNotification").data("kendoNotification").show({ title: subTitle }, "success");
             //            kendo.ui.showSuccessNotification(subTitle);
             //        }
             //        else
             //            gardners.kendoHelpers.PopupAlertDialog.show({
             //                title: _settings.AjaxErrorTitle,
             //                message: subTitle,
             //                icon: _settings.AjaxErrorIcon
             //            });
             //        return;
             //    }
             //    else {
             //        //
             //        var css = '';
             //        if (data.success) {
             //            css = 'alert alert-success validation-summary-valid';                         
             //        }
             //        else {
             //           css = 'alert alert-danger validation-summary-errors';
             //        }
             //        $target.addClass(css).html(messages).show();
             //    }

             //}
             //else {
             //    //we have html returned
             //    $('#' + targetElement).html(data);
             //}
         }
         ,

         ajaxComplete: function (customData, data, status, xhr) {
            
             if (customData != null && typeof customData != "string") {
                 that.processStandardAjaxResponse(data, customData.targetElement, customData);
             }
             else
                 that.processStandardAjaxResponse(data, customData);
         }
         ,
         ajaxBegin: function () {
           
             $('.messageSummary, #valSummary').removeClass('alert alert-success').removeClass('alert alert-danger validation-summary-errors').html('');
         }
        ,
        getRequestVerificationTokenSelector: function () {
            return "input:hidden[name=\"__RequestVerificationToken\"]"
        }
       
     }
    return that;
})(window, jQuery);


//settings 
gardners.settings = { 'LogonUrl': '', 'RootUrl': '', 'CustomerView': '', 'IsPricingVatInclusive': '', baskets: '', activeOrderId: null, primaryOrderTypeId: null, suppressCommerceManagerAjaxErrorHandling: true };

gardners.init();

;
$.fn.charlimit = function (config) {

    if (config !== undefined) {
        var options = $.extend(
            { 'limit': 10, 'this_class': 'mzrlimit', 'color': 0, 'disable': 0, 'statusshow': 1, 'statusclass': 'uiPrompt','type': 'span', 'position': 'after', 'text': '' }, config
        )
    }

    $(this).each(function () {
        $(this).removeAttr('disabled');
        if (options.statusshow == 1) {
            var current = $(this).val().length;
            var left = options.limit - current;
            if (left >= 0) {

                if (options.position == 'after') {

                    $(this).after('<' + options.type + ' class="' + options.statusclass + '">' + '+' + left + ' ' + options.text + '</' + options.type + '>');
                } else if (options.position == 'before') {
                    $(this).before('<' + options.type + ' class="' + options.statusclass + '">' + '+' + left + ' ' + options.text + '</' + options.type + '>');
                }
            }
            else {

                if (options.position == 'after') {

                    $(this).after('<' + options.type + ' class="' + options.statusclass + '">' + '0' + ' ' + options.text + '</' + options.type + '>');
                } else if (options.position == 'before') {
                    $(this).before('<' + options.type + ' class="' + options.statusclass + '">' + '0' + ' ' + options.text + '</' + options.type + '>');
                }

                if (options.disable == 1) {
                    $(this).attr('disabled', 'disabled');
                }
                if (options.color == 1) {
                    $(this).css('background', '#dd00');
                }
                var currentva = $(this).val();
                var value = currentva.substring(0, options.limit);
                $(this).val(value);
            }

        }
        $(this).addClass(options.this_class);
        $(this).on("input",function (e) {

            var current = $(this).val().replace(/\r(?!\n)|\n(?!\r)/g, "\r\n").length;
            var currentva = $(this).val();

            //var newLines = currentva.match(/[^\r]\n/g);
            //var extra = 0

            //if (newLines != null) {
            //    extra = newLines.length;
            //}

            //current += extra;
            var left = options.limit - current;
            // alert( left);
            if (left >= 0) {
                if (options.position == 'after') {
                    $(this).next('.' + options.statusclass).text('+' + left + ' ' + options.text);
                }
                else if (options.position == 'before') {
                    $(this).prev('.' + options.statusclass).text('+' + left + ' ' + options.text);
                }

            }
            else {
                left = 0;
                var value = currentva.slice(0, options.limit);
                $(this).val(value);
           
                if (options.position == 'after') {
                    $(this).next('.' + options.statusclass).text('+' + left + ' ' + options.text);
                 }
                else if (options.position == 'before') {
                    $(this).prev('.' + options.statusclass).text('+' + left + ' ' + options.text);
                }

                if (options.disable == 1) {
                    $(this).attr('disabled', 'disabled');
                }
                if (options.color == 1) {
                    $(this).css('background', '#dd00');
                }
              
            }
        });
    });
};
$.fn.scrollBottom = function () {
    return $(this).scrollTop($(this)[0].scrollHeight);
};


// CLEARABLE INPUT
function tog(v) { return v ? 'addClass' : 'removeClass'; }
$(document).on('input', '#keyword', function () {
    $(".clearable span")[tog(this.value)]('clearTerms');
});

gardners.layout = (function (window, $) {
    var _settings = { logoutUrl: '', messageSetNotifiedUrl: '', messageSetReadUrl: '', userCultureName: '', boSummaryUrl: '', showDiscountUrl: '', addToListUrl: '', appVers:''};
    var that =
    {

        init: function (settings) {
            _settings = settings;
            $(document).ready(function () {

                that.checkVersion();

                $('.stickyHeader').sticky(); //Create the sticky Header
                $('.stickyHeaderLoggedOut').sticky(); //Create the sticky Header

                that.backToTop(); //Create the 'BackToTop'
                that.bindSideNav();
                if ($('ul#breadcrumb').length > 0) { $('ul#breadcrumb li').last().addClass('last'); }

                $('.priceLeftNav').on("click",function (e) {
                    that.toggleCustomerView();
                    e.preventDefault();
                });
                $('.vatLeftNav').on("click",function (e) {

                    that.toggleIsPricingVatInclusive();
                    e.preventDefault();
                });

                //do it this way so we can replace the parent frame should the user log out whilst in spanner mode from both
                //the top menu or the account left menu

                $('.logout').on("click",function (e) {
                    var isInIFrame = (top.location !== self.location);
                    if (isInIFrame) {
                        window.parent.location = _settings.logoutUrl;
                    }
                    else { window.location.href = _settings.logoutUrl; }
                    e.preventDefault();
                });

                $(document).on('click', '.clearTerms', function (e) {
                    e.preventDefault();
                    $("#keyword").data("kendoAutoComplete").value("");
                    $(".clearable span")[tog(this.value)]('clearTerms');
                    $("#keyword").focus();
                });
                that.tooltips();
                that.messages();
                that.hamburgerMenu();

                $('.searchFacets #facetList div ul li a').on("click",function () {
                    $('body').css('cursor', 'wait');
                    $(this).css('cursor', 'wait');
                });

                $("#filterMenu p[id^='facetList']").not('.nonCollapsible').each(function () {
                    facetMore('#' + this.id);
                    facetToggle('#' + this.id);
                });

                function facetMore(facetId) {
                    $(facetId + 'More').toggle(function () {
                        $(facetId + ' .hide').show(200);
                        this.innerHTML = "Less";
                        $(this).addClass("active");
                    },
                        function () {
                            $(facetId + ' .hide').hide(200);
                            this.innerHTML = "More";
                            $(this).removeClass("active");
                        });
                }

                function facetToggle(facetId) {
                    $(facetId).on("click",function () {
                        $(facetId + "Box").slideToggle(250);
                        $(this).toggleClass('collapse');
                    });
                }
                $('.btnCopyISBN').on("click", function (e) {
                    var aux = document.createElement("input");
                    aux.setAttribute("value", $(this).attr("data-isbn"));
                    document.body.appendChild(aux);
                    aux.select();
                    document.execCommand("copy");
                    aux.remove();
                    e.preventDefault();
                });

            });
        }
        ,
        checkVersion: function () {
            var appVersion = localStorage.appVersion;
            if (typeof appVersion === 'undefined' || appVersion === null) {
                that.revert();
                localStorage.setItem("appVersion", _settings.appVers);
            }
            else if (localStorage.appVersion != _settings.appVers) {
                that.revert();
                localStorage.setItem("appVersion", _settings.appVers);
            }
        }
        ,
        isKeyAllowed: function (keycode) {
            var isOk =
                (keycode > 47 && keycode < 58) || // number keys
                keycode === 32 || keycode === 13 || // spacebar & return key(s) (if you want to allow carriage returns)
                (keycode > 64 && keycode < 91) || // letter keys
                (keycode > 95 && keycode < 112) || // numpad keys
                (keycode > 185 && keycode < 193) || // ;=,-./` (in order)
                (keycode > 218 && keycode <= 223) || keycode === 8 || keycode === 46;   // [\]' (in order) backspace, delete
            return isOk;
        }
        ,
        bindSideNav: function () {

            that.bindBOTooltip($(".lNav:not(:hidden)").find(".showBoSummary"));
            $(".lNav").on("click", ".toggle", function () {
                var container = $(this).closest(".lNav");
                var slim = "lNcollapse";
                var full = "lNexpand";
                var target = ""
                var source = "";
                if (container.hasClass(slim)) {
                    target = full;
                    source = slim;
                }
                else {
                    target = slim
                    source = full;
                }
                $("#lNav").find("." + source).hide();
                $("#lNav").find("." + target).show();

                that.bindBOTooltip($("." + target).find(".showBoSummary"));
            });
        }
        ,
        bindBOTooltip: function (ele) {
            if (!$(ele).data("kendoTooltip")) {
                $(ele).kendoTooltip({ "show": gardners.layout.backorderSummaryRefresh, "position": "right", "animation": false, "content": "\u003cdiv class=\"SummaryContent\" style=\"margin-right:10px;\"\u003eloading summary...\u003c/div\u003e" });
            }
        }

        ,
        getCultureName: function () {
            return _settings.userCultureName;
        }
        ,
        onNotificationShow: function (e) {

            //ensure notification isn't way to right on wide monitors 
            var pageWidth = $(window).width();
            if (pageWidth >= 1400) {
                var offset = Math.round((pageWidth - 1200) / 2) + 945;
                $(".k-notification").parent().css("left", offset);
            }

            //make sure that if fired from a kendo window it's on top of the window overlay
            e.element.parent().css({
                zIndex: 22222
            });

        }
        ,
        tooltips: function () {
            //placed here because we may want tooltips on grids so call ondatabound
            $('[data-tooltip]').each(function () {
                that.addTooltip(this);
            });
        }
        ,
        addTooltip: function (ele) {
            var tooltip = $(ele).attr("data-tooltip");
            var position = $(ele).attr("data-tooltip-position");
            if (!position) position = 'top';

            if ($(ele).data('kendoTooltip')) {
                $(ele).data('kendoTooltip').destroy();
            }

            $(ele).kendoTooltip({
                position: position,
                autoHide: true,
                content: function (e) {
                    //allow for any html we may want to show in the tooltip
                    return $('<div/>').html(tooltip).text();
                }
            }).data("kendoTooltip");

        }
        ,
        backToTop: function () {
            // browser window scroll (in pixels) after which the "back to top" link is shown
            var offset = 300;
            //browser window scroll (in pixels) after which the "back to top" link opacity is reduced
            offset_opacity = 1200;
            //duration of the top scrolling animation (in ms)
            scroll_top_duration = 700;
            //grab the "back to top" link
            $back_to_top = $('.cd-top');

            //hide or show the "back to top" link
            $(window).scroll(function () {
                ($(this).scrollTop() > offset) ? $back_to_top.addClass('cd-is-visible') : $back_to_top.removeClass('cd-is-visible cd-fade-out');
                if ($(this).scrollTop() > offset_opacity) {
                    $back_to_top.addClass('cd-fade-out');
                }
            });

            //smooth scroll to top
            $back_to_top.on('click', function (event) {
                event.preventDefault();
                $('body,html').animate({ scrollTop: 0 }, scroll_top_duration);
            });
        }
        ,
        hidePricing: function () {
            return gardners.settings.IsShowingDiscount == false;
        }
        ,
        toggleCustomerView: function () {

            gardners.settings.IsShowingDiscount = !gardners.settings.IsShowingDiscount;

            //update the attribute on html so css styles show/hide prices
            $('html').attr('is-showing-discount', gardners.settings.IsShowingDiscount.toString());

            //persist it on session
            $.post(
                _settings.showDiscountUrl,
                { 'value': gardners.settings.IsShowingDiscount },
                function (data) {
                    if (!data.success)
                        gardners.processStandardAjaxResponse(data);

                });
        },
        toggleIsPricingVatInclusive: function () {
            gardners.settings.IsPricingVatInclusive = !gardners.settings.IsPricingVatInclusive;

            //update the attribute on html so css styles show/hide prices
            $('html').attr('is-pricing-vat-inclusive', gardners.settings.IsPricingVatInclusive.toString());

            //persist it on session
            $.post(
                '/Account/UpdateIsPricingVatInclusive',
                { 'value': gardners.settings.IsPricingVatInclusive },
                function (data) {
                    if (!data.success)
                        gardners.processStandardAjaxResponse(data);

                });
        }
        ,
        hamburgerMenu: function () {
            var fullHeight = $(".stickyHeader").prop('scrollHeight');
            var megaMenuHeight = $("#megaMenuHeader").height()
            var barHeight = $("#barHeader").height();
            var stickyHeader = $(".stickyHeader");
            var barBorderHeight = 5;

            $("#hamburger").click(function () {
                if (stickyHeader.height() === barHeight + megaMenuHeight + barBorderHeight) {
                    //Menu visible so close
                    stickyHeader.animate({ height: fullHeight - megaMenuHeight }, 'fast', function () {
                        stickyHeader.css('overflow', 'hidden');
                    });
                }
                else {
                    //Menu not visible so open
                    stickyHeader.animate({ height: fullHeight }, 'fast', function () {
                        stickyHeader.css('overflow', 'visible');
                    });
                }
            });
        }
        ,
        messages: function () {

            var $container = $('.headerMenu .messages');

            that.checkWindowHasMessages($container);

            //wire up notification quick view window
            $container.click(function (e) {

                var $notificationDetail = $container.find('.messageDetail');

                if (!$notificationDetail.is(':visible')) {
                    e.preventDefault();
                    e.stopPropagation();

                    $(this).find('.messageDetail').css({ display: 'block' });
                    $container.find('.messageCount').remove();

                    var ids = [];
                    $notificationDetail.find('.message.newMessage').each(function (index, element) {
                        ids.push($(element).data('id'));
                    });
                    if (ids.length > 0)
                        $.post(_settings.messageSetNotifiedUrl, { ids: ids });

                    //click outside to close window
                    $('body').on('click.gardners', function (e) {

                        if (!$notificationDetail.is(e.target) // if the target of the click isn't the container...
                            && $notificationDetail.has(e.target).length === 0) // ... nor a descendant of the container
                        {
                            $notificationDetail.hide();
                            $('body').off('click.gardners');
                            $notificationDetail.find('.message.newMessage').removeClass('newMessage');
                        }
                    });
                }
            });

            //wire up x to mark message as read and remove
            $container.on('click', '.close', function () {
                $(this).closest('.message').slideUp('fast', function () {
                    $(this).remove();
                    that.checkWindowHasMessages($container);

                    var dataId = $(this).data('id');
                    $.post(_settings.messageSetReadUrl, { ids: [dataId] });

                    //if we're on the accounts screen, set the notification to read
                    $('#myAccountMessages .message.unread[data-id="' + dataId + '"]').removeClass('unread').addClass('read');
                    $('.messageHeader').removeClass('hasMessages');
                });

            });

            //wire up clear all event
            $container.on('click', '.clearAll', function () {

                var speed = 900;
                var count = $container.find('.messageList>ul>li').length;
                if (count == 1)
                    speed = 150;
                else if (count == 2)
                    speed = 200;
                else if (count == 3)
                    speed = 300;
                else if (count <= 5)
                    speed = 500;

                $container.find('.messageList>ul').slideUp(900, function () {
                    $(this).remove();
                    that.checkWindowHasMessages($container);

                    var ids = [];
                    $(this).find('.message').each(function (index, element) {
                        ids.push($(element).data('id'));
                    });
                    $.post(_settings.messageSetReadUrl, { ids: ids });

                    //if on notification screen update notification read status
                    $('#myAccountMessages .message.unread').removeClass('unread').addClass('read');
                    $('.messageHeader').removeClass('hasMessages');
                });

            });

        },
        checkWindowHasMessages: function ($container) {
            //if have messages
            if ($container.find('.messageList>ul>li').length > 0) {
                $container.find('.noMessages').hide();
            }
            else {
                $container.find('.noMessages').show();
                $container.find('.messageList').remove();
                $container.find('.clearAll').hide();
            }
        }
        ,
        backorderSummaryRefresh: function (e) {
            this.popup.wrapper.hide();

            $.ajax({
                url: _settings.boSummaryUrl,
                cache: false,
                async: true,
                success: function (result) {
                    $('.SummaryContent').html(result);

                },
                error: function () { $(".SummaryContent").html('Unable to show summary'); }
            });
            this.popup.wrapper.show();
        }
        ,
        showAddToList: function (ean, showSingle) {
            if (showSingle == null) { showSingle = false; }
            var win = 'k-window-multiadd';
            gardners.kendoHelpers.setKendoWindowTitle(win, "Add Items To List");
            var sellable = new Array();
            sellable.push(ean);
            $.ajax({
                type: "POST",
                data: { sellableeans: sellable, unavailableeans: new Array(), Id: -1, isBasket: false, showSingle: showSingle },
                url: _settings.addToListUrl,
                success: function (data) {
                    if (data.hasOwnProperty("success")) {
                        gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                    }
                    else {
                        $(".multiAddContainer").html(data);
                        gardners.kendoHelpers.openKendoWindow(win);
                    }
                }
            });
        }
        ,
        revert:function()
        {
            localStorage.clear();
        }
    };
    return that;

})(window, jQuery);
;

gardners.utils = (function (window, $) {

    String.prototype.format = function () {
        var args = arguments;
        return this.replace(/\{\{|\}\}|\{(\d+)\}/g, function (m, n) {
            if (m == "{{") { return "{"; }
            if (m == "}}") { return "}"; }
            return args[n];
        });
    };

    String.prototype.boolean = function () {
        return "True" == this || "true" == this;
    };

    var _settings = {};

    var that =
    {

        AddOptionalMinimumMaximumLength: function () {
            
            if ($.validator != undefined) {
                var identifier = 'optionalminmaxlength';
                $.validator.unobtrusive.adapters.add(identifier, ['minimumlength', 'maximumlength'], function (options) {
                    options.rules[identifier] = options.params;
                    options.messages[identifier] = options.message;
                });

                $.validator.addMethod(identifier, function (value, element, parameters) {

                    if (value == null || $.trim(value) == "") {
                        return true;
                    }
                    
                    return (value.length >= parseInt(parameters.minimumlength) && value.length <= parseInt(parameters.maximumlength));
                    
                });
            }
        }
        ,
        AddBooleanRequired: function ()
        {
                $.validator.unobtrusive.adapters.addBool("booleanrequired", "required");
        },

        AddRequiredIf: function ()
        {
                $.validator.unobtrusive.adapters.add("required", "requiredif");
        }
        ,
          resetValSummary: function () {
              $(".validation-summary-errors ul").empty();
              $(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors alert alert-danger");
        }
        ,
        fade: function (triggerControl, targetElementSelector) {
            var $triggerControl = $(triggerControl);
            var $element = $(targetElementSelector);
            if ($triggerControl.hasClass("show")) {
                $triggerControl.removeClass("show").addClass("hide");
                $triggerControl.find(".icon").removeClass("icon-arrowDown").addClass("icon-arrowUp");
                $triggerControl.find(".icon-text").text("Hide");
                $element.fadeIn();
            }
            else {
                $triggerControl.removeClass("hide").addClass("show");
                $triggerControl.find(".icon").removeClass("icon-arrowUp").addClass("icon-arrowDown");
                $triggerControl.find(".icon-text").text("Show");
                $element.fadeOut();
            }
         }
        }
    return that;


})(window, jQuery);

(function ($) {

    //re-set all client validation given a jQuery selected form or child
    $.fn.resetValidation = function (elementSelector) {

        var $form;
        
        if (elementSelector)
            $form = $(elementSelector);
        else{
            $form = this.closest('form');
            //reset jQuery Validate's internals
            $form.validate().resetForm();
        }

        //reset unobtrusive validation summary, if it exists
        $form.find("[data-valmsg-summary=true]")
            .removeClass("validation-summary-errors")
            .addClass("validation-summary-valid")
            .find("ul").empty();

        //reset unobtrusive field level, if it exists
        $form.find("[data-valmsg-replace]")
            .removeClass("field-validation-error")
            .addClass("field-validation-valid")
            .empty();

        //this is needed is this function is called whilst the form is hidden from view
         $(".input-validation-error", $form).removeClass('input-validation-error');

        return $form;
    };

    //reset a form given a jQuery selected form or a child
    //by default validation is also reset
    $.fn.formReset = function (resetValidation) {
        var $form = this.closest('form');

        if (typeof ($form[0]) != "undefined") {
            $form[0].reset();

            if (resetValidation == undefined || resetValidation) {
                $form.resetValidation();
            }
        }
        return $form;
    }


    //mainly for text area validation which ignores new lines etc
    if ($.validator && $.validator.methods && $.validator.methods.maxlength)
    {

        $.validator.methods.maxlength = function (value, element, param)
        {
            if (typeof value === 'string') {
                value = value.replace(/\r?\n/g, "\r\n");
            }

            var length = 0;

            if ($.isArray(value)) {
                length = value.length;

            }
            else {

                var lns = value.match(/[^\r]\n/g);
                if (lns) {
                    length = value.length + lns.length;
                }
                else {
                    length = value.length;
                }
            }


//            var length = $.isArray(value) ? value.length : $.validator.prototype.getLength(value), element);
            return $.validator.prototype.optional(element) || length <= param;
        };
    }
})(jQuery);







/**
 * Copyright (c) 2010 Maxim Vasiliev
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
 * THE SOFTWARE.
 *
 * @author Maxim Vasiliev
 * Date: 09.09.2010
 * Time: 19:02:33
 */


(function (root, factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(factory);
    }
    else {
        // Browser globals
        root.form2js = factory();
    }
}(this, function () {
    "use strict";

    /**
	 * Returns form values represented as Javascript object
	 * "name" attribute defines structure of resulting object
	 *
	 * @param rootNode {Element|String} root form element (or it's id) or array of root elements
	 * @param delimiter {String} structure parts delimiter defaults to '.'
	 * @param skipEmpty {Boolean} should skip empty text values, defaults to true
	 * @param nodeCallback {Function} custom function to get node value
	 * @param useIdIfEmptyName {Boolean} if true value of id attribute of field will be used if name of field is empty
	 */
    function form2js(rootNode, delimiter, skipEmpty, nodeCallback, useIdIfEmptyName, getDisabled) {
        getDisabled = getDisabled ? true : false;
        if (typeof skipEmpty == 'undefined' || skipEmpty == null) skipEmpty = false;
        if (typeof delimiter == 'undefined' || delimiter == null) delimiter = '.';
        if (arguments.length < 5) useIdIfEmptyName = false;

        rootNode = typeof rootNode == 'string' ? document.getElementById(rootNode) : rootNode;

        var formValues = [],
			currNode,
			i = 0;

        /* If rootNode is array - combine values */
        if (rootNode.constructor == Array || (typeof NodeList != "undefined" && rootNode.constructor == NodeList)) {
            while (currNode = rootNode[i++]) {
                formValues = formValues.concat(getFormValues(currNode, nodeCallback, useIdIfEmptyName, getDisabled));
            }
        }
        else {
            formValues = getFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled);
        }

        return processNameValues(formValues, skipEmpty, delimiter);
    }

    /**
	 * Processes collection of { name: 'name', value: 'value' } objects.
	 * @param nameValues
	 * @param skipEmpty if true skips elements with value == '' or value == null
	 * @param delimiter
	 */
    function processNameValues(nameValues, skipEmpty, delimiter) {
        var result = {},
			arrays = {},
			i, j, k, l,
			value,
			nameParts,
			currResult,
			arrNameFull,
			arrName,
			arrIdx,
			namePart,
			name,
			_nameParts;

        for (i = 0; i < nameValues.length; i++) {
            value = nameValues[i].value;

            if (skipEmpty && (value === '' || value === null)) continue;

            name = nameValues[i].name;
            _nameParts = name.split(delimiter);
            nameParts = [];
            currResult = result;
            arrNameFull = '';

            for (j = 0; j < _nameParts.length; j++) {
                namePart = _nameParts[j].split('][');
                if (namePart.length > 1) {
                    for (k = 0; k < namePart.length; k++) {
                        if (k == 0) {
                            namePart[k] = namePart[k] + ']';
                        }
                        else if (k == namePart.length - 1) {
                            namePart[k] = '[' + namePart[k];
                        }
                        else {
                            namePart[k] = '[' + namePart[k] + ']';
                        }

                        arrIdx = namePart[k].match(/([a-z_]+)?\[([a-z_][a-z0-9_]+?)\]/i);
                        if (arrIdx) {
                            for (l = 1; l < arrIdx.length; l++) {
                                if (arrIdx[l]) nameParts.push(arrIdx[l]);
                            }
                        }
                        else {
                            nameParts.push(namePart[k]);
                        }
                    }
                }
                else
                    nameParts = nameParts.concat(namePart);
            }

            for (j = 0; j < nameParts.length; j++) {
                namePart = nameParts[j];

                if (namePart.indexOf('[]') > -1 && j == nameParts.length - 1) {
                    arrName = namePart.substr(0, namePart.indexOf('['));
                    arrNameFull += arrName;

                    if (!currResult[arrName]) currResult[arrName] = [];
                    currResult[arrName].push(value);
                }
                else if (namePart.indexOf('[') > -1) {
                    arrName = namePart.substr(0, namePart.indexOf('['));
                    arrIdx = namePart.replace(/(^([a-z_]+)?\[)|(\]$)/gi, '');

                    /* Unique array name */
                    arrNameFull += '_' + arrName + '_' + arrIdx;

                    /*
					 * Because arrIdx in field name can be not zero-based and step can be
					 * other than 1, we can't use them in target array directly.
					 * Instead we're making a hash where key is arrIdx and value is a reference to
					 * added array element
					 */

                    if (!arrays[arrNameFull]) arrays[arrNameFull] = {};
                    if (arrName != '' && !currResult[arrName]) currResult[arrName] = [];

                    if (j == nameParts.length - 1) {
                        if (arrName == '') {
                            currResult.push(value);
                            arrays[arrNameFull][arrIdx] = currResult[currResult.length - 1];
                        }
                        else {
                            currResult[arrName].push(value);
                            arrays[arrNameFull][arrIdx] = currResult[arrName][currResult[arrName].length - 1];
                        }
                    }
                    else {
                        if (!arrays[arrNameFull][arrIdx]) {
                            if ((/^[0-9a-z_]+\[?/i).test(nameParts[j + 1])) currResult[arrName].push({});
                            else currResult[arrName].push([]);

                            arrays[arrNameFull][arrIdx] = currResult[arrName][currResult[arrName].length - 1];
                        }
                    }

                    currResult = arrays[arrNameFull][arrIdx];
                }
                else {
                    arrNameFull += namePart;

                    if (j < nameParts.length - 1) /* Not the last part of name - means object */ {
                        if (!currResult[namePart]) currResult[namePart] = {};
                        currResult = currResult[namePart];
                    }
                    else {
                        currResult[namePart] = value;
                    }
                }
            }
        }

        return result;
    }

    function getFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled) {
        var result = extractNodeValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled);
        return result.length > 0 ? result : getSubFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled);
    }

    function getSubFormValues(rootNode, nodeCallback, useIdIfEmptyName, getDisabled) {
        var result = [],
			currentNode = rootNode.firstChild;

        while (currentNode) {
            result = result.concat(extractNodeValues(currentNode, nodeCallback, useIdIfEmptyName, getDisabled));
            currentNode = currentNode.nextSibling;
        }

        return result;
    }

    function extractNodeValues(node, nodeCallback, useIdIfEmptyName, getDisabled) {
        if (node.disabled && !getDisabled) return [];

        var callbackResult, fieldValue, result, fieldName = getFieldName(node, useIdIfEmptyName);

        callbackResult = nodeCallback && nodeCallback(node);

        if (callbackResult && callbackResult.name) {
            result = [callbackResult];
        }
        else if (fieldName != '' && node.nodeName.match(/INPUT|TEXTAREA/i)) {
            fieldValue = getFieldValue(node, getDisabled);
            result = [{ name: fieldName, value: fieldValue }];
        }
        else if (fieldName != '' && node.nodeName.match(/SELECT/i)) {
            fieldValue = getFieldValue(node, getDisabled);
            result = [{ name: fieldName.replace(/\[\]$/, ''), value: fieldValue }];
        }
        else {
            result = getSubFormValues(node, nodeCallback, useIdIfEmptyName, getDisabled);
        }

        return result;
    }

    function getFieldName(node, useIdIfEmptyName) {
        if (node.name && node.name != '') return node.name;
        else if (useIdIfEmptyName && node.id && node.id != '') return node.id;
        else return '';
    }


    function getFieldValue(fieldNode, getDisabled) {
        if (fieldNode.disabled && !getDisabled) return null;

        switch (fieldNode.nodeName) {
            case 'INPUT':
            case 'TEXTAREA':
                switch (fieldNode.type.toLowerCase()) {
                    case 'radio':
                        if (fieldNode.checked && fieldNode.value === "false") return false;
                    case 'checkbox':
                        if (fieldNode.checked && (fieldNode.value === "true" || fieldNode.value === "on")) return true;
                        if (!fieldNode.checked && (fieldNode.value === "true" || fieldNode.value === "on")) return false;
                        if (fieldNode.checked) return fieldNode.value;
                        break;
                    case 'button':
                    case 'reset':
                    case 'submit':
                    case 'image':
                        return '';
                        break;

                    default:
                        return fieldNode.value;
                        break;
                }
                break;

            case 'SELECT':
                return getSelectedOptionValue(fieldNode);
                break;

            default:
                break;
        }

        return null;
    }

    function getSelectedOptionValue(selectNode) {
        var multiple = selectNode.multiple,
			result = [],
			options,
			i, l;

        if (!multiple) return selectNode.value;

        for (options = selectNode.getElementsByTagName("option"), i = 0, l = options.length; i < l; i++) {
            if (options[i].selected) result.push(options[i].value);
        }

        return result;
    }

    return form2js;

}));



jQuery(function ($) {
    $.extend({
        formCreate: function (url, data, method) {
            if (method == null) method = 'POST';
            if (data == null) data = {};

            var form = $('<form>').attr({
                method: method,
                action: url
            }).css({
                display: 'none'
            });

            var addData = function (name, data) {
                if ($.isArray(data)) {
                    for (var i = 0; i < data.length; i++) {
                        var value = data[i];
                        addData(name + '[]', value);
                    }
                } else if (typeof data === 'object') {
                    for (var key in data) {
                        if (data.hasOwnProperty(key)) {
                            addData(name + '[' + key + ']', data[key]);
                        }
                    }
                } else if (data != null) {
                    form.append($('<input>').attr({
                        type: 'hidden',
                        name: String(name),
                        value: String(data)
                    }));
                }
            };

            for (var key in data) {
                if (data.hasOwnProperty(key)) {
                    addData(key, data[key]);
                }
            }

            return form.appendTo('body');
        }
    });
});
;
gardners.search = (function (window, $) {

    var that =
    {
        results: function () {
            var _settings = {
                minPrice: 0, maxPrice: 0, searchUrl: '', downloadUrl: ''
            };
            var _temp = {isChecked:false}
            _settings.listMultiAddUrl = '';
            _settings.basketMultiAddUrl = '';
            _settings.listItemsRemoveUrl = '';
            _settings.listId = 0;
            _settings.listSearchUrl = '';
            
            var that = {
                init: function (options) {
                    _settings = options;
                    $(document).ready(function () {

                        $('.downloadResults').click(function (e) {
                            e.preventDefault();
                            var urlDwn = _settings.downloadUrl + $(this).attr('data-res') + "&hp=" + gardners.layout.hidePricing() + "&pvinc=" + $('html').attr('is-pricing-vat-inclusive');
                            window.location.href = urlDwn;
                        });


                        //BS
                        //$('.searchFacets #facetList div ul li a').click(function () {
                        //    $('body').css('cursor', 'wait');
                        //    $(this).css('cursor', 'wait');
                        //});
                

                        ////autosubmit kendo dropdownlists doesnt't work like this
                     
                        $('.ddlItemsPerPage, .ddlPageSort, .ddlProductType').kendoDropDownList({
                            change: function (e) {
                                var dataItem = this.dataItem(e.item);
                                if ($.trim(dataItem.value) != "") {
                                    $(e.sender.element).closest('form').submit();
                                }
                            }
                        });

                        $('#searchResults .saveSearch').click(function (e) {
                            gardners.account.mySearches.savesearch();
                        });
                        

                        $('#searchResults .addSelected button').click(function (e) {
                            e.preventDefault();
                            that.bulkAddToBasket($(this).parent());

                        });
                        $('#searchResults .addSelected .jq-dropdown-menu [data-addtotype]').click(function (e) {
                            e.preventDefault();
                            var orderTypeId = $(this).data('addtotype');
                            that.bulkAddToBasket($(this).parent(), orderTypeId);

                        });

                       
                        ////Facet Price filter submit button
                        //$('#priceSubmit').click(function () {
                        //    window.location.href = "/Search?" + $('#searchUrl').val() + "&PriceFrom=" + $('#priceFrom').val() + "&PriceTo=" + $('#priceTo').val();
                        //});

                        $(".resultTabular tr:nth-child(odd)").addClass("rgRow");
                        $(".resultTabular tr:nth-child(even)").addClass("rgAltRow");
                        //  $(".resultTabular tr:last-child").removeClass("rgRow").removeClass("rgAltRow").addClass("rgPager"); // Final table row

                        //bs gweb-939
                        //$("#filterMenu p[id^='facetList']").not('.nonCollapsible').each(function () {
                        //    facetMore('#' + this.id);
                        //    facetToggle('#' + this.id);
                        //});

                        //function facetMore(facetId) {
                        //    $(facetId + 'More').toggle(function () {
                        //        $(facetId + ' .hide').show(200);
                        //        this.innerHTML = "Less";
                        //        $(this).addClass("active");
                        //    },
                        //        function () {
                        //            $(facetId + ' .hide').hide(200);
                        //            this.innerHTML = "More";
                        //            $(this).removeClass("active");
                        //        });
                        //}

                        //function facetToggle(facetId) {
                        //    $(facetId).click(function () {
                        //        $(facetId + "Box").slideToggle(250);
                        //        $(this).toggleClass('collapse');
                        //    });
                        //}

                        ////product quick look
                        //$('.buy a').click(function (e) {
                        //    e.preventDefault();
                        //    var ean = $(this).closest('[data-ean]').attr('data-ean');
                        //    brownsbfs.basket.addToBasket(ean);
                        //});

                        //list multi add
                        //bind select all
                        $('#searchcontainer .selectAll input[type="checkbox"]').change(function (e) {
                            var checked = $(this).is(':checked');
                            $('#searchcontainer .selectAll input[type="checkbox"]').prop('checked', checked);
                            $('#searchcontainer .check input[type="checkbox"]').prop('checked', checked);
                        });


                        $('.buy .button').click(function (e) {
                            e.preventDefault();
                            var row = $(this).closest('[data-ean]');
                            var ean = row.attr('data-ean');
                            gardners.product.utils.showQuickView(ean, { title: 'Add To Basket', showAddToBasket: true });
                        });

                        //any search results
                        if($("#PriceFrom").length >0)
                        {
                            $("#PriceFrom").kendoNumericTextBox({format: "c",min: _settings.minPrice,max: _settings.maxPrice,step: 1,spinners:false});
                            $("#PriceTo").kendoNumericTextBox({ format: "c", min: _settings.minPrice, max: _settings.maxPrice, step: 1, spinners: false });
                            $("#frmPrice").show();
                        }
                                               
                        gardners.basket.common.setInBasketQuantities();
                           
                    });

                }
               
                ,
                navGuide:function(e)
                {
                    if (this.value() != "") {
                        var url = _settings.searchUrl + this.value();
                        location.href = url;
                    }
                }
                ,
                bulkAddToBasket : function($that, orderTypeId, orderId){
                    var eans = that.getSelectedItems();
                    
                    if (eans.length > 0) {
                        //gardners.kendoHelpers.PopupAlertDialog.show({
                        //    title: 'Add to Basket',
                        //    message: eans.length + ' products were selected'
                        //});

                        var orderLines = [];
                        $.each(eans, function (index, value) {

                            orderLines.push({ "ean": value, "quantity": 1, "lineReference": '' });
                        });

                        gardners.basket.common.addOrderLinesToBasket(orderLines, $that, orderTypeId, orderId);
                    }

                },

                getSelectedItems: function () {
                    var selectedItems = $('#searchResults .multiAdd input[type="checkbox"]:checked');
                    var items = [];

                    if (selectedItems.length == 0) {
                        gardners.kendoHelpers.PopupAlertDialog.show({
                            title: 'Invalid Selection',
                            message: 'Please select at least 1 product'
                        });
                        return items;
                    } else {
                        selectedItems.each(function (index, element) {
                            var item = $(element).closest('[data-ean]').attr('data-ean');
                            items.push(item);
                        });
                        return items;
                    }
                },

                //check multi add valid, extract values and show poup
                listMultAdd: function (postUrl, isBasket) {

                    var items = this.getSelectedItems();

                    if (items.length > 0)
                        that.showMultiAdd(postUrl, items, isBasket);
                },
                //show multi add popup
                showMultiAdd: function (postUrl, eans, isBasket) {

                    $.post(postUrl,
                    { "eans": eans }, function (data) {
                        if (data.messages) {
                            brownsbfs.processStandardAjaxResponse(data);
                        } else {
                            var kwindow = $('#listmultiadd-window').data('kendoWindow');
                            if (isBasket)
                                kwindow.title('Add items to basket');
                            else
                                kwindow.title('Add items to list');


                            kwindow.content(data);
                            kwindow.center().open().pin();
                            //pin here as ie doesnt like it as an attribute when a use case scenario see jira BBFS-77
                        }
                    });
                }
            }
            return that;
        }(),
        anonymousResults: function () {
            var that = {
                init: function () {
                    $(document).ready(function () {
                        $(".anonymousTitleClick").click(function (e) {
                            e.preventDefault();
                            gardners.kendoHelpers.openKendoWindow("k-window-anonymous-login");
                        });
                    });
                }
            }
            return that;
        }(),
        unknownItem: function () {
            var _settings = {
                ean: ''
            };
            var that = {
                init: function (ean) {

                    _settings.ean = ean;

                    $(document).ready(function () {

                        //Bind add to basket
                        $('.buy').click(function (e) {
                            e.preventDefault();
                            //Add the item to db
                            $.post(brownsbfs.settings.AddUnknownItemUrl, { 'ean': _settings.ean }, function (data) {
                                if (data.success == true) {
                                    brownsbfs.product.utils.showQuickView(_settings.ean, { title: 'Add To Basket', showAddToBasket: true });

                                } else {
                                    gardners.kendoHelpers.PopupAlertDialog.show({
                                        title: 'Add to basket failed',
                                        message: data.messages[0]
                                    });
                                }
                            });
                        });
                    });
                }
            }
            return that;
        }()
    }
    return that;
})(window, jQuery);;
gardners.accountUserList = (function (window, $) {
    var _settings = { downloadUrl: '', shareListUrl: '', listId: 0, sort: '', maxBulkFileSize: 0, multiListAddFromUrl: '', myListsUrl: '', myColleaguesListsUrl: '', delListUrl: '', removeItemsUrl: '', miniBasket: '', isAccountContext: false, gridContext: '', downloadOptions: null,notification:''};
    var _elementSelectors = { listCutAndPaste: "#ListCutAndPaste" };
    var _autoSubNewList = false;
    var _isListManager = false;

    var that =
    {

        init: function (settings) {
            _settings = settings;
            //_elementSelectors = elementSelectors;
            $(document).ready(function () {

                /*_AddToBasket.cshtml is now a shared view between userlists, product and search results.
                for layout reasons in user lists we have a slightly different layout so we neet to remove the basket alert in
                the shared partial view above */
                $(".jqd > .addToBasketWrap").find(".basketAlert").remove();

                that.setInBasketQuantities();   
                that.setToolbarItemsSelected();

                $('.downloadList').click(function (e) {
                     e.preventDefault();
                    var option = null;
                    var optionId = $(this).attr("data-option");
                    $.each(_settings.downloadOptions, function (i, item) {
                        if (item.Text == optionId) {
                            option = item.Text;
                            return false;
                        }
                    });
                    if (option != null){
                        that.downloadList(option);
                    }
                    
                });
                $('.removeListItem').click(function (e) {
                    e.preventDefault();
                    that.removeFromList(this);
                });

                $('.shareList').click(function (e) {
                    that.toggeListIsPublic($(this));
                });

                $('input[name="chckSelectAll"]').click(function (e) {
                    $('input[name="chckSelectAll"]').prop("checked", $(this).prop("checked"));
                    $('.listItem .k-checkbox').prop("checked", $(this).prop("checked"));
                    that.setToolbarItemsSelected();
                });

                $('.listItem .k-checkbox').click(function (e) {
                    that.setToolbarItemsSelected();
                });


                $('.listOption').click(function (e) {
                    if ($(this).hasClass("A")) {
                        that.showListAdd();
                    }
                    else {
                        that.showListRemove();
                    }
                });

                $('.addToBasketFromList').click(function (e) {
                    if (that.validSelection()) {
                        that.showMulitAdd(true);
                    }
                });

                $('.removeThisList').click(function (e) {
                    e.preventDefault();
                    that.removeList();
                });
                $('.editListName').click(function (e) {
                    e.preventDefault();
                    that.editListName($(".listTypeTitle:eq(0) .listHeader"));
                });

                $(".FP,.ML").click(function () {

                    $(".listIntro").hide();
                    $(".blurb").hide();
                    $(".searchResults .pager").remove();
                    $(".searchResults .pagerToolbar").remove();
                    if ($(this).hasClass("FP")) {
                        $(".fpBlurb").show();
                    }
                    else {
                        $(".mlBlurb").show();
                    }
                });

                            
                
            });

        }
        ,
        onDownloadTypeChange: function (e)
        {
            if ($.trim(this.value()) != "")
            {
                that.downloadList(gardners.kendoHelpers.getDropDownListText($(e.sender.element).attr("id")));
            }
            this.value("");
        }
        ,
        downloadList: function (downloadOption, cookieName) {
            
            var $notification = null;
            if (downloadOption != "Excel") {
                notificationRequired = true;
                $notification = $(_settings.notification).data("kendoNotification");
                $notification.show({ title: "Downloading"}, "growl-success");
            }

            var urlDwn = _settings.downloadUrl + "?ul=" + _settings.listId + "&hp=" + gardners.layout.hidePricing() + "&pvinc=" + $('html').attr('is-pricing-vat-inclusive') + "&dtype=" + downloadOption;
            if (!$.trim(_settings.sort) === "") {
                urlDwn += "&srt=" + _settings.sort;
            }
            $(location).attr("href", urlDwn);
           
        }
       ,
        clear: function () {
            clearInterval(_settings.down);
            }
        ,
       
        onNotificationShow: function (e) {

            if (e.sender.getNotifications().length == 1) {
                var lg = $(".loggedIn")[0];
                var m = $(".accountSubMenu")[0];
                var w = $(".searchResultsWrapper")[0];
                var element = e.element.parent();
                var $n = $(element).find(".k-notification");
                $n.css({ width: "100%", height: ($(window).height() - 30) + "px", display: "block" });
                element.css({ top: "10px", left: $(m).position().left+"px", width: m.clientWidth});
        }
        }
        ,
        setInBasketQuantities: function (notify)
        {
            var active = $(".mainBasketHeader").find("#activeBasket");
            if (active !== null && $(active).hasAttr("data-orderid"))
            {
                var orderId = $(active).attr("data-orderid");
                if (parseInt(orderId) > 0)
                {
                    gardners.basket.common.updateInBasketQuantities(orderId);
                    if (notify) {
                        var basket = $(".mainBasketHeader").find(".basketName").text();
                        gardners.kendoHelpers.showSuccessNotification("Titles added to " + basket);
                    }
                }
            }
        }
        ,
        setToolbarItemsSelected: function () {
            $(".toolbarOptions ul li.hid").hide();
            var count = $('.listItem .k-checkbox:checked').length;
            $(".pagerToolbar .option .toolbarOptions ul li h5 .tot").text(count);
            if (count > 0) {
                $(".toolbarOptions ul li.hid").show();
            }
            else {
                $('input[name="chckSelectAll"]').prop("checked", false);
            }
        }
        ,
        removeList: function () {
            $.when(gardners.kendoHelpers.PopupYesNoDialog.show({ close: function () { if ($.trim(_settings.gridContext).length > 0) { gardners.kendoHelpers.clearSelection(_settings.gridContext); } }, title: "Confirm Delete", message: "Are you sure you want to delete this list?" })).done(function (response) {

                if (response.button == "Yes") {
                    $.ajax({
                        type: "POST",
                        data: { userListId: _settings.listId },
                        url: _settings.delListUrl,
                        success: function (data) {
                            if (!data.success) {
                                gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                            }
                            else {
                                if (_settings.isAccountContext) {
                                    gardners.kendoHelpers.getGrid(_settings.gridContext).dataSource.read();
                                    gardners.kendoHelpers.showSuccessNotification("List deleted");
                                }
                                else {
                                    $(location).attr("href", data.returnUrl);
                                }
                            }
                        }
                    });
                }

            });
        }

        ,
        createNew: function (ele) {

            if ($(ele).hasClass("bsky")) {
                gardners.basket.common.setKdlContext("AddToId");
                gardners.basket.common.openNewBasketPopup(false);
            }
            else {
                _autoSubNewList = true;
                $("#frmCreateList .k-textbox").val("");
                $("#frmCreateList .k-checkbox").prop("checked", false);
                gardners.kendoHelpers.openKendoWindow('k-window-create-list');
            }
        }
        ,
        initializeMultiAdd: function (isSingle, isBasket) {
            $.validator.setDefaults({ ignore: null });
            if ($("#frmMultiAdd").length > 0) {
                $.validator.unobtrusive.parse($("#frmMultiAdd"));
            }
            var winTitle = isBasket ? "Add Items To Basket" : "Add Items To List";
            if (isSingle === true) {
                winTitle = isBasket ? "Add Item To Basket" : "Add Item To List";
            }
            gardners.kendoHelpers.setKendoWindowTitle("#k-window-multiadd", winTitle);
        }
        ,

        createInitialBasketOnSuccess: function (customData, data, status, xhr) {
            if (data.success) {
                gardners.kendoHelpers.showSuccessNotification(data.data.description + ' created');
                $("#frmMultiAdd").find("#AddToId").val(data.data.orderId);
                $("#frmMultiAdd").submit();
            }
            else {
                gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                gardners.kendoHelpers.closeKendoWindow('k-window-multiadd');

            }
        }
        ,
        createInitialListOnSuccess: function (customData, data, status, xhr) {

              if (data.success) {
                  gardners.kendoHelpers.showSuccessNotification(data.messages[0]);
                  that.refreshMyLists();
                  gardners.kendoHelpers.closeKendoWindow('k-window-multiadd');
                //if (customData.targetElement.length > 0)
                //    //used as a switch to reload in account lists
                //    //location.reload(true);
                //else {
                //    //gardners.kendoHelpers.showSuccessNotification(data.messages[0]);
                    
                //}
            }
            else {

                gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
            }
        }
        ,
        createListOnSuccess: function (customData, data, status, xhr) {

            if (!data.success) {
                gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
            }
            else {

                if (_isListManager) {
                    gardners.kendoHelpers.getGrid(_settings.gridContext).dataSource.read();
                    gardners.kendoHelpers.closeKendoWindow('k-window-create-list');
                    gardners.kendoHelpers.showSuccessNotification("List created");
                }
                else if (_autoSubNewList) {
                    gardners.kendoHelpers.closeKendoWindow('k-window-create-list');
                    var ddl = gardners.kendoHelpers.getDropDownList("AddToId");
                    ddl.dataSource.add({ "Text": data.description, "Value": data.id });
                    ddl.value(data.id);
                    $(".AddToId").val(data.id);
                    $("#frmMultiAdd").submit();

                }
                else $(location).attr("href", data.returnUrl);
            }
        }
        ,

        createListForMyAccount: function () {
            _isListManager = true;
            var winName = '#k-window-create-list';
            $("#frmCreateList .k-textbox").val("");
            $("#frmCreateList .k-checkbox").prop("checked", false);
            $(winName).resetValidation(winName);
            gardners.kendoHelpers.openKendoWindow(winName);
        }
        ,
        removeListForMyAccount: function (ele) {
            _settings.gridContext = "#" + $(ele).closest(".k-grid").attr("id");
            gardners.kendoHelpers.selectGridRow(_settings.gridContext, ele);
            _settings.listId = $(ele).attr("data-id");
            that.removeList();
        }
        ,
        editListName: function (ele) {

            var winName = '#k-window-list-name';
            var formName = "#frmEditName";
            $(formName + " #ListId").val(_settings.listId);
            $(formName + " .k-textbox").val($(ele).text());
            $(winName).resetValidation(winName);
            $(formName).attr("data-type", $(ele).attr("data-type"));
            gardners.kendoHelpers.openKendoWindow(winName);
        }
        ,
        updateListNameOnSuccess: function (customData, data, status, xhr) {

            if (data.success) {
                $(".listTypeTitle .listHeader").text($("#ListName").val());

                // if ($("#frmEditName").attr("data-type") === "myLists") {
                that.refreshMyLists();
                /// }
                // else {
                //     that.refreshMyColleaguesLists();
                // }
                gardners.kendoHelpers.closeKendoWindow('k-window-list-name');
            }
            gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
        }
        ,
        editListForMyAccount: function (ele) {

            _settings.gridContext = "#" + $(ele).closest(".k-grid").attr("id");
            gardners.kendoHelpers.selectGridRow(_settings.gridContext, ele);
            var winName = '#k-window-edit-list';
            var win = $(winName).data("kendoWindow");
            win.unbind("close");
            win.bind("close", function () { gardners.kendoHelpers.clearSelection(_settings.gridContext); });
            var formName = "#frmEditList";
            $(formName + " #ListId").val($(ele).attr("data-id"));
            $(formName + " .k-textbox").val(gardners.kendoHelpers.replaceQuotes($(ele).attr("data-name")));
            $(formName + " .k-checkbox").prop("checked", $(ele).attr("data-isshared") === "true");
            $(winName).resetValidation(winName);
            win.center().open();
        }
        ,
        updateListForMyAccountOnSuccess: function (customData, data, status, xhr) {

            if (!data.success) {
                gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
            }
            else {
                gardners.kendoHelpers.getGrid(_settings.gridContext).dataSource.read();
                gardners.kendoHelpers.showSuccessNotification("List updated");
                gardners.kendoHelpers.closeKendoWindow('k-window-edit-list');
            }
        }
        ,
        showListAdd: function () {
            if (that.validSelection()) {
                that.showMulitAdd(false);
            }
        }
        ,
        showMulitAdd: function (isBasket) {
            var win = 'k-window-multiadd';
            var sellableeans = $('.listItem .eansellable:checked');
            var unavailableeans = $('.listItem .eanunavailable:checked');
            var sellable = new Array();
            var unavailable = new Array();
            sellableeans.each(function (index, element) {
                var ean = $(element).attr("id");
                sellable.push(ean);
            });
            unavailableeans.each(function (index, element) {
                var ean = $(element).attr("id");
                unavailable.push(ean);
            });

            if (isBasket) {
                gardners.kendoHelpers.setKendoWindowTitle(win, "Add Items To Basket");
            }
            else {
                gardners.kendoHelpers.setKendoWindowTitle(win, "Add Items To List");
            }

            $.ajax({
                type: "POST",
                data: { sellableeans: sellable, unavailableeans: unavailable, Id: _settings.listId, isBasket: isBasket },
                url: _settings.multiListAddFromUrl,
                success: function (data) {

                    if (data.hasOwnProperty("success")) {

                        gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                    }
                    else {
                        $(".multiAddContainer").html(data);
                        gardners.kendoHelpers.openKendoWindow(win);
                    }
                }
            });
        }
        ,
        onAddToOptionChange: function (e) {
            var val = gardners.kendoHelpers.getDropDownListValue(e.sender.element[0].id);
            $("input[name='addToId']").val(val);
        }
        ,
        refreshMyLists: function () {
            $.ajax({
                type: "POST",
                data: { selectedUserListId: _settings.listId },
                url: _settings.myListsUrl,
                success: function (data) {
                    $(".myLists").html(data);

                }
            });
        }
        ,
        refreshMyColleaguesLists: function () {
            $.ajax({
                type: "POST",
                data: { selectedUserListId: _settings.listId },
                url: _settings.myColleaguesListsUrl,
                success: function (data) {
                    $(".colleaguesLists").html(data);

                }
            });
        }
        ,
        onAddMultiSuccess: function (ajaxSettings, data, status, xhr) {
             if (data.success === true) {
                gardners.kendoHelpers.closeKendoWindow('k-window-multiadd');

                if (data.hasOwnProperty("returnUrl") && data.returnUrl === _settings.miniBasket) {
                    delete data.returnUrl;
                    //pass this in so that the lists in basket quantities are updated when the mini basketis reloaded
                    var func = function () {
                        gardners.accountUserList.setInBasketQuantities(true);
                    };
                    gardners.basket.common.reloadMiniBasket(func);
                  
                    return false;
                }

            
                 if ($(".actionLinksfqp").length > 0) {
                     that.refreshMyLists();
                     //that.setInBasketQuantities();
                 }
            }

            gardners.processStandardAjaxResponse(data, null, ajaxSettings);

        }
        ,
        showListRemove: function () {
            if (that.validSelection()) {
                $.when(gardners.kendoHelpers.PopupYesNoDialog.show({ title: "Confirm Delete", message: "Are you sure you want to remove the selected titles from the list?" })).done(function (response) {
                    if (response.button == "Yes") {
                        var eans = $('.listItem .k-checkbox:checked');
                        var values = new Array();
                        eans.each(function (index, element) {
                            var ean = $(element).attr("id");
                            values.push(ean);
                        });

                        $.ajax({
                            type: "POST",
                            data: { eans: values, userListId: _settings.listId, sort: _settings.sort },
                            url: _settings.removeItemsUrl,
                            success: function (data) {
                                if (!data.success) {
                                    gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                                }
                                else {
                                    $(location).attr("href", data.returnUrl);
                                }
                            }
                        });
                    }

                });
            }
        }
        ,
        validSelection: function () {
            var count = $('.listItem input[type="checkbox"]:checked').length;
            if (count === 0) {
                gardners.kendoHelpers.PopupAlertDialog.show({ title: "Invalid Selection", message: "Please select at least 1 title" });
                return false;
            }

            return true;
        }
        ,
        toggeListIsPublic: function (ele) {

            var listId = $(this).attr("data-list");
            var isPublic = $(ele).prop("checked");

            $.ajax({
                type: "POST",
                data: { isPublic: isPublic, sort: _settings.sort, listId: _settings.listId },
                url: _settings.shareListUrl,
                success: function (data) {
                    if (!data.success) {
                        gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                    }
                    else {
                        $(location).attr("href", data.returnUrl);
                    }
                }
            });

        }
        ,
        renderBulkUpload: function () {
            var kup = $("#bulkList");
            var listId = kup.attr("data-list");
            var url = kup.attr("data-save");// + "?userListId=" + listId;

            if (!kup.data("kendoUpload")) {
                kup.kendoUpload({
                    "upload": function (e) {
                        e.data = { userListId: listId };
                    },
                    "select": gardners.accountUserList.bulkListValidate, "success": gardners.accountUserList.bulkListSuccess, "error": gardners.accountUserList.bulkListError, "multiple": false, "async": { "saveUrl": url, "autoUpload": true }
                });

            }
            gardners.kendoHelpers.setUploadButton("#bulkList");
            $.validator.unobtrusive.parse($("#frmLstBulk"));
        }
        ,
        openCutPaste: function () {

            if ($(".invalidEans").length > 0) {
                that.resetCP();
                that.clearIsbns();
            }
            gardners.kendoHelpers.openKendoWindow('k-window-cutandpaste-list');
            that.renderBulkUpload();
        }
        ,
        clearIsbns: function () {
            $(_elementSelectors.listCutAndPaste).val("");
            $(".validation-summary-errors ul").empty();
            $(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors");
        }
        ,
        updateBasketIndicators: function (orderId) {
            gardners.basket.common.setIsListContext(true);
            gardners.basket.common.updateInBasketQuantities(orderId);
            setTimeout(function () { gardners.basket.common.setIsListContext(true); }, 5000);
        }
        ,
        removeFromList: function (ele) {
            $.when(gardners.kendoHelpers.PopupYesNoDialog.show({ title: "Remove From List", message: "Are you sure you want to remove the title from the list?" })).done(function (response) {
                if (response.button == "Yes") {
                    var frm = $("#frmDelItem");
                    frm.find("#Sort").val(_settings.sort);
                    frm.find("#ListLineEan").val($(ele).attr("data-ean"));
                    frm.submit();
                }
            });
        }
        ,

        sortOptionChange: function (e) {
            _settings.sort = gardners.kendoHelpers.getDropDownListValue(e.sender.element[0].id);
            $("input[name='SelectedSort']").val(_settings.sort);
            $(".csl").val(_settings.listId);
            $(".sortForm").submit();
        }

        ,
        bulkListValidate: function (e) {
            var extOk = true;
            var fileSizeOk = true;
            var ok = true;
            var validator = $("span[data-valmsg-for='bulkList']");
            validator.hide();
            validator.removeClass('field-validation-error').addClass('field-validation-valid');
            $.each(e.files, function (index, value) {
                if (value.size == undefined) {
                    ok = false;
                    $(validator).text("There was a problem with the file - 0k");
                    return;
                }
                else if (value.extension.toUpperCase() != ".TXT" && value.extension.toUpperCase() != ".CSV") { extOk = false; }
                else if ((parseFloat(value.size) / 1024) > _settings.maxBulkFileSize) { fileSizeOk = false; }

            });

            if (!extOk) {
                ok = false;
                $(validator).text("Please upload CSV or TXT files only");
            }

            if (!fileSizeOk) {
                ok = false;
                $(validator).text("Upload file too large - maximium size is " + _settings.maxBulkFileSize + "k");
            }

            if (!ok) {
                $('.k-upload-files').empty();
                e.preventDefault();
                validator.removeClass('field-validation-valid').addClass('field-validation-error');
                validator.show();
            }
        },

        bulkListSuccess: function (e) {
            $(_elementSelectors.listCutAndPaste).val(e.response.data);
            $(".k-upload-files.k-reset").find("li").remove();
            $(".k-upload-status").hide();
        }
        ,
        bulkListError: function (e) {
            var message = "Could not bulk upload the file, please check the file format and extension and file size";
            if (e.XMLHttpRequest.responseText.length > 0) message = e.XMLHttpRequest.responseText;
            gardners.kendoHelpers.PopupAlertDialog.show({ title: "Bulk Upload", message: message });
        }
        ,
        enableValidate: function () {
            $("#btnValidateListCutAndPaste").removeClass('disabled').addClass('btn-dark').prop("disabled", false);
        }

        ,
        cancelListpad: function () {
            that.enableValidate();

        }
        ,
        showSpinner: function (target) {
            $(target).show();
        }
        ,
        hideSpinner: function (target) {
            $(target).hide();
        }
        ,
        onListPadEntrySubmitBegin: function () {
            that.showSpinner(".listCPProcessing");
            $("#btnValidateListCutAndPaste").removeClass('btn-dark').addClass('disabled').prop("disabled", true);
            $(".confirmWrapper").html('');
            return true;
        }
        ,
        listPadEntrySubmitSuccess: function (params, data, status, xhr) {

            that.processReturn(data);
        }
        ,

        processReturn: function (data) {

            if (data.hasOwnProperty("success")) {

                if (!data.success) {
                    that.enableValidate();
                    that.hideSpinner(".validateInfo");
                    gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                }
                else {
                    $(location).attr("href", data.returnUrl);
                }
            }
            else {
                //invalid partial returned
                $(".listContainer").html(data);
                that.hideSpinner(".listCPProcessing");
            }
        }
        ,

        listPadEntrySubmitFail: function (xhr, status) {
            that.enableValidate();
            that.hideSpinner(".listCPProcessing");
        }
        ,
        submitListPad: function () {
            $("#listPadForm").submit();
        }
        ,
        cancelReValidate: function () {

            that.renderBulkUpload();
            that.resetCP();

        }
        ,
        resetCP: function () {
            $(".invalidEans").html("");
            $(".invalidEans").remove();
            $(".continueP").html("");
            $(".continueP").remove();
            $(".listPad").css("display", "block");
        }
        ,
        continueAdd: function (ele) {

            $(".cancelListPad").hide();
            that.showSpinner(".listCPProcessing");

            $(ele).removeClass('btn-primary').addClass('disabled').prop("disabled", true);
            var summary = $("#uploadMessageSummary").find(".messageSummary");
            if ($(summary).length > 0) {
                $(summary).removeClass("alert alert-danger validation-summary-errors");
                $(summary).html('');
            }

            var url = $(ele).attr('data-url');
            var sort = $(ele).attr('data-sort');
            var eans = $(ele).attr('data-eans').split(",");


            $.ajax({
                type: "POST",
                data: { eans: eans, userListId: _settings.listId, srt: sort },
                url: url,
                success: function (data) {
                    that.processReturn(data);
                }
            });

        }
        

    }
    return that;
})(window, jQuery);

;
var createBasketForOrderPad = false;
gardners.basket = (function (window, $) {

    var _timeout = 700;
    var lastCheckedBoxes = {};
    var _invokedBySingleTitleOrSearch;
    var _invokedByCreateNewActiveBasket;
    var _invokedByCreateNewActiveBasketRedirectFromBackorders;
    var _lastSelectedBasket = "LastSelectedBasket";
    var _basketSortOrderId = 0;//default;
    var _basketCurrentSortOrderId = 0;//default;

    function initShiftClickCheckboxes(selector) {
      
        var $chkboxes = $(selector);
        lastCheckedBoxes[selector] = null;

        $chkboxes.click(function (e) {
            if (!lastCheckedBoxes[selector]) {
                lastCheckedBoxes[selector] = this;
                return;
            }

            if (e.shiftKey) {
                var start = $chkboxes.index(this);
                var end = $chkboxes.index(lastCheckedBoxes[selector]);

                $chkboxes.slice(Math.min(start, end), Math.max(start, end) + 1).prop('checked', lastCheckedBoxes[selector].checked);
            }

            lastCheckedBoxes[selector] = this;
        });
    }

    var confirmOnPageExit = function (e) {
        // If we haven't been passed the event get the window.event
        e = e || window.event;

        var message = "You have entered/changed information on your order without updating. Use the 'update' button to save changes";
        

        // For IE6-8 and Firefox prior to version 4
        if (e) {
            e.returnValue = message;
        }

        // For Chrome, Safari, IE8+ and Opera 12+
        return message;
    };
    var _settings = {
        deleteSelectedLinesUrl: "",
        placeOrderUrl: "",
        checkoutUrl: "",
        setQuantitySelectedLinesUrl: "",
        setLineReferenceSelectedLinesUrl: "",
        jacketImageUrl: "",
        basketGridUrl: "",
        deleteBasketUrl: "",
        downloadBasketUrl: "",
        homeDeliveryUrl: "",
        basketUrl: "",
        invalidItemsInBasket: "",
        sosItemsInBasket: "",
        maxLineRef: "",
        canProceed: "",
        stashBasketUrl: "",
       customerPriceError: ""
    };

    var $_prodContainer;
    var _createBasketCallback;
   
    var _addToBasketButtonContent = {html:"",className:"" };
    
    var that =
    {
        common: function () {
            var _kdlContext = null;
            var _contextIsSearchResults = false;
            var _isListContext = false;
            var _commonSettings = {

                addToBasketUrl: ""
                , miniBasketUrl: ""
                , itemAddedConfirmationUrl: ""
                , createBasketPopupUrl: ""
                , setActiveBasketPopupUrl: ""
                , checkoutInstantPurchaseUrl: ""
                , createInstantPurchaseUrl: ""
                , switchBasketPopupUrl: ""
                , basketUrl: ""
                , setActiveBasketUrl: ""
                , newBasketId: 0
                , getInBasketQuantitiesUrl: ""
            };
            var _enums;
            var that = {
                init: function (options, enums) {
                 
                    _commonSettings = options;
                            
                    $(document).ready(function () {
                        that.initHeader();
               
                        that.bindAddToBasket();
                       //basket visible ? otherwise reloadAddToList() fails on the each loop
                        //if ($("#basketNavigation").length > 0) {
                        //    that.reloadAddToList();
                        //}
                       
                        if($('#basketGrid').length > 0 && $('#basketGrid tbody tr').length==0)
                        {
                            that.setDisabledButton();
                        }

                        $(document).on('click', '.removeUnavailable', function (e) {
                          
                            var checked = 0;
                            $('.basketTable tbody tr.unavailable,.basketTable tbody tr.webOnlyError').each(function( index ) {
                                $(this).find('.chkIsSelected').prop('checked',true);
                                checked++;
                            });
                            if(checked > 0)
                            {
                                gardners.basket.deleteSelectedLines();
                            }
                        });

                        $(document).on('click', '.removeSOS', function (e) {

                            var checked = 0;
                            $('.basketTable tbody tr.sos.removeSOSItem').each(function (index) {
                                $(this).find('.chkIsSelected').prop('checked', true);
                                checked++;
                            });
                            if (checked > 0) {
                                gardners.basket.deleteSelectedLines();
                            }
                        });

                        $(document).on('click', '.removeBorrZeroPrice', function (e) {
                           
                            var checked = 0;
                            var chk = $('#BackorderReadyToReleaseGrid tbody tr.borrZeroPrice').find('.chkIsBOSelected');
                            $(chk).each(function (index) {
                                if (parseFloat($(this).attr("data-lcp")) == 0) {
                                    $(this).prop('checked', false);
                                    checked++;
                                }
                            });
                            if (checked > 0) {
                                $(".chkSelectAllBo").prop("checked",false)
                                $(".updateBasket").trigger("click");
                            }
                        });

                        that.binddDownloadBasketButton();
                        //that.storeAddToBasketMarkup();
                       
                     
                    });

                }
                ,
                storeAddToBasketMarkup:function($button)
                {
                    _addToBasketButtonContent.html = "";
                    _addToBasketButtonContent.className = "";
                    if ($button!=null && $button.length > 0) {
                        _addToBasketButtonContent.html = $button.html();
                        _addToBasketButtonContent.className = "." + $button.attr("data-cssselector");
                    }
                }
                ,
                binddDownloadBasketButton:function()
                {
                    $('.downloadBasket').on('click', function (e) {
                        _contextIsSearchResults = true;
                        e.preventDefault();
                        gardners.basket.common.downloadBasket($(this).attr('data-id'));
                    });
                }
                ,
                downloadBasket:function(id)
                {
                    
                    var url = _settings.downloadBasketUrl + "?id=" + id + "&hp=" + gardners.layout.hidePricing();
                    window.location.href = url;
                }
                ,
                setDisabledButton: function () {
                    $(".nonPrimary").addClass("disabled");
                    $("#btnPlaceOrder").removeClass("btn-dark").addClass("disabled");
                }
                ,
                setActiveOrderIdSelected :function()
                {
                   
                    if ($.isNumeric(gardners.settings.activeOrderId))
                    { gardners.kendoHelpers.setDropDownListValue('baskets', gardners.settings.activeOrderId); }
                }
                ,
                getBasketSelect:function()
                {
                    return $("span[aria-owns='InactiveBaskets_listbox']").find(".k-dropdown-wrap");
                }
                ,
                checkBasketSelected:function(e)
                {
                    var orderId = gardners.kendoHelpers.getDropDownListValue('baskets');
                    if ($.trim(orderId).length > 0) {
                        that.resetNoBasketSelectedError();
                    }
                }
                ,
                resetNoBasketSelectedError:function()
                {
                    var ddl = that.getBasketSelect();
                    ddl.removeClass("k-input-validation-error");
                    $(".basketNotSelected").hide();
                     
                }
                ,
                bindAddToBasket: function () {
                    that.bindAddToBasketButton();
                    $(document).on('click', '.jq-dropdown-addToBasket .addToInactiveBasket', function (e) {
                        var orderId = $(this).data('orderid');
                        //var orderId = $('.jq-dropdown-addToBasket .selectList').find(":selected").data('orderid');
                        $('#jq-dropdown-addToBasket').jqDropdown('hide');

                        gardners.basket.common.addToBasketButton($(this), orderId);
                    });
                    $(document).on('click', '.jq-add-selected-basket', function (e) {
                        gardners.basket.common.storeAddToBasketMarkup($(this));
                        var orderId = gardners.kendoHelpers.getDropDownListValue('baskets');
                      
                        $('#jq-dropdown-addToBasket').jqDropdown('hide');
                        //new basket
                        if (orderId == -1) {
                            //gardners.basket._invokedBySingleTitleOrSearch = true;
                            var ean = $(this).closest('.jq-dropdown').attr('data-ean');
                            var $this = $(".basket[data-ean='" + ean + "']");
                            var lines = that.getOrderLinesForBasket($this);
                            gardners.basket.common.openNewBasketPopup(/*setIsActive*/ false, lines.lines, lines.container);
                        }
                        else {
                            gardners.basket.common.addToBasketButton($(this), orderId);
                            gardners.kendoHelpers.setDropDownListValue('baskets', orderId);
                          
                        }
                    });
                    $(document).on('click', '.btnCreateNewBasket', function (e) {                       
                       
                        that.openNewBasketPopup(/*setIsActive*/ false );
                    });
                    $(document).on('click', '.btnCreateNewBasketAddItems', function (e) {

                        var lines = that.getOrderLinesForBasket($(this));
                        that.openNewBasketPopup(/*setIsActive*/ false, lines.lines, lines.container);
                    });
                    $(document).on('click', '.btnCreateNewActiveBasket', function (e) {
                        gardners.basket._invokedByCreateNewActiveBasket = true;
                        that.openNewBasketPopup(/*setIsActive*/ true);
                    });
                    $(document).on('click', '#switchBasket', function (e) {
                        e.preventDefault();
                        that.resetNoBasketSelectedError();
                        var orderId = gardners.kendoHelpers.getDropDownListValue('#InactiveBaskets');
                        if ($.trim(orderId).length == 0) 
                        {
                            var ddl = that.getBasketSelect();
                            ddl.addClass("k-input-validation-error");
                            $(".basketNotSelected").show();
                            return;
                        }
                        var url = $(location).attr('href');
                        var lastSegment = url.split('/').pop();
                        if (url.indexOf(_settings.basketUrl) > 0) {                            
                             url = url.replace(lastSegment, orderId);
                             $(location).attr('href', url);
                             return;
                        } 
                                               
                        if (url.indexOf(_settings.homeDeliveryUrl) > 0) {
                             url = _settings.basketUrl + '/Index/' + orderId;
                             $(location).attr('href', url);
                             return;
                        }

                        if (url.indexOf("/Account/Backorders") > 0) {
                            that.setActiveBasket(orderId, true);
                            setTimeout(function () { $(location).attr('href', url) }, _timeout);
                            return;
                        }
                        that.setActiveBasket(orderId);

                    });
                    $(document).on('click', '.setActiveBasket', function (e) {
                        e.preventDefault();
                        that.openSetActiveBasketPopup(null, null);

                    });
                    //Bind 'Add To - Instant Purhcase' on Search Results & Single Title
                    $('.jq-dropdown-addToBasket .instantPurchase, .additionalBuyButtons .instantPurchase').click(function (e) {
                        $(this).attr("data-ean", $("#jq-dropdown-addToBasket").attr("data-ean"));
                        gardners.basket.common.addToInstantPurchase($(this));
                    });
                    //Bind 'Add To - Customer Order' on Search Results & Single Title
                    $('.jq-dropdown-addToBasket .customerOrder, .additionalBuyButtons .customerOrder').click(function (e) {
                        $(this).attr("data-ean", $("#jq-dropdown-addToBasket").attr("data-ean"));
                        gardners.basket.common.addToBasketButton($(this),gardners.settings.HomeDelOrderId,gardners.settings.homeDeliveryOrderTypeId);
                    });


                }
                ,
                bindAddToBasketButton:function()
                {
                    //add to basket
                    $('.addToBasket').click(function (e) {
                        _contextIsSearchResults = true;
                        gardners.basket.common.storeAddToBasketMarkup($(this));
                        gardners.basket.common.addToBasketButton($(this));
                    });
                }
                ,
                setActiveBasket: function (orderId,isContextBackorders) {
                    $.ajax({
                        type: "POST",
                        url: _commonSettings.setActiveBasketUrl,
                        contentType: 'application/json',
                        data: JSON.stringify({SelectedExistingOrderId : orderId}),

                        success: function (data) {
                            //gardners.processStandardAjaxResponse(data, null, { growlAndClearOnSuccess: true });
                            that.setIsListContext(false);
                            that.reloadMiniBasket();
                            that.excludeActiveBasketFromBaskets();
                            gardners.kendoHelpers.showSuccessNotification("Basket changed to " + gardners.kendoHelpers.getDropDownListText("#InactiveBaskets"));
                            if (!isContextBackorders) {
                                that.updateInBasketQuantities(orderId);
                            }
                            
                        }
                    });
                }
                ,
                excludeActiveBasketFromBaskets:function()
                {
                    //refresh the datasource for the jq dropdown baskets to exlude the active basket from this items.
                    var ddl = gardners.kendoHelpers.getDropDownList("#baskets");
                    if (ddl != null) { ddl.dataSource.read(); }

                    //refresh datasource for product page basket list
                    var basketList = gardners.kendoHelpers.getDropDownList("#basketList");
                    if (basketList != null) {
                        basketList.dataSource.read();
                       
                    }
                }
                ,
                reloadAddToList: function () {
                     gardners.kendoHelpers.rebindDropDownList('baskets');
                     gardners.basket.common.setActiveOrderIdSelected();
                 }
                 ,
                getOrderLinesForBasket: function ($this)
                {
                   
                    let ean = $this.attr("data-ean");
                    let max = $this.attr("data-max");
                    let  $formValues = $(".placeOrder[data-ean='" + ean + "']");
                    let $container = $('#ean-' + ean); 
                    if ($container.length == 0) { $container = $formValues; }
                        //GWEB-891 make sure we always have a qty
                    let qty = 1;
                    let qtcl = $formValues.find(".qty[data-ean='" + ean + "']");
                    if (qtcl.length > 0) {
                        if ($.trim(qtcl.val()) == "") qtcl.val(1);
                            qty = qtcl.val();
                    }

                    let lineRef = $formValues.find(".lineRef[data-ean='" + ean + "']").val();
                    let isBackorder = $formValues.find(".backorder[data-ean='" + ean + "']");
                                                            
                    if (isBackorder.length == 0)
                    { isBackorder = gardners.settings.defaultBackorder; }
                    else
                    { isBackorder = isBackorder.is(':checked'); }

                    return { container: $container, lines: [{ "ean": ean, "quantity": qty, "lineReference": lineRef, "IsBackorder": isBackorder}] };
                }
                ,

               addToBasketButton: function ($this, orderId, orderTypeId) {
            
                    let lines = that.getOrderLinesForBasket($this);
                    that.addOrderLinesToBasket(lines.lines, lines.container, orderId, orderTypeId);
               }
               ,
               addOrderLinesToBasket: function (orderLineItems, $prodContainer, orderId, orderTypeId)
               {
                   let ean = orderLineItems[0].hasOwnProperty("ean") ? orderLineItems[0].ean : orderLineItems[0].hasOwnProperty("Ean") ? orderLineItems[0].Ean : 0;
                   let $button = $(_addToBasketButtonContent.className + "[data-ean='" + ean + "']");
                   let cssSelector = $button.attr("data-cssselector");
                   let showSpinner = cssSelector==null?false: ($(".singleTitleContainer").length == 0 && cssSelector == "jq-add-selected-basket")?false:true;
                   if (showSpinner) {
                       //if (_contextIsSearchResults == true) {
                       if ($button.length > 0 && ean > 0 && $.trim($button.text()) != "Adding") {
                           gardners.kendoHelpers.setProcessRunningButton($button, cssSelector == "addToAnotherBasket" || cssSelector == "jq-add-selected-basket" ? "Add" : "Adding");
                           if ($button.text() == "Adding") { $button.css({ "width": $button[0].clientWidth }); }
                           $button.addClass("disabled").prop("disabled", "disabled");
                       }
                   }
                   else {
                       if (cssSelector == null) {
                           _addToBasketButtonContent.html = "";
                           _addToBasketButtonContent.className = "";
                       }
                   }

                   if (!orderTypeId) {
                        orderTypeId = gardners.settings.primaryOrderTypeId;
                    }                    
                    else  if (orderTypeId == gardners.settings.homeDeliveryOrderTypeId) {
                        orderId = gardners.settings.HomeDelOrderId;
                    }


                   
                    $.ajax({
                        type: "POST",
                        url: _commonSettings.addToBasketUrl,
                        dataType:'json',
                        data: JSON.stringify({ order: { 'OrderId': orderId, 'OrderTypeId': orderTypeId, orderLineItems: orderLineItems } }),
                        success: function (data) {
                            
                            if (data.success == false) {
                                
                                //add an error container and let the global handler add any messages
                                /*
                                Success = 0,
                                IncorrectOrderType = 1,
                                IncompatibleItemTypes = 2,
                                ItemNotSellable = 3,
        
                                NoActiveBasket = 10,
                                InvalidModelState = 11,
                                InvalidOrderId = 12
                                OrderNotInCorrectStatus = 13,
                                QuantityExceeded = 14
                                */
                           
                                if (data.data !=null && data.data.hasOwnProperty('errorCode')) {//noActiveBasket
                                    switch (data.data.errorCode)
                                    {
                                        case 10:
                                            that.openSetActiveBasketPopup(orderLineItems, $prodContainer);
                                            that.storeAddToBasketMarkup(null); 
                                            return;
                                        case 11:
                                        case 12:
                                        case 13:
                                        case 14:
                                            if (showSpinner) { that.resetAddToBasketButtonForEan(ean, false); }
                                            else { that.storeAddToBasketMarkup(null); }
                                            gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                                            return;
                                        case 18:
                                            if (showSpinner) { that.resetAddToBasketButtonForEan(ean, true); }
                                            else { that.storeAddToBasketMarkup(null);}
                                            gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                                            return;
                                        default:
                                            gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                                            return;
                                    }


                                }
                                else {
                                    var $errors = $prodContainer.find('.errors');
                                    if ($errors.length == 0) {
                                        $errors = $prodContainer.append('<div class="errors" data-valmsg-summary="true"></div>');
                                    }
                                    gardners.processStandardAjaxResponse(data, $prodContainer);
                                }

                                                 
                            }
                            else {
                                //remove any previous error messages
                                $prodContainer.find('.errors').remove();                               
                                //update price in basket header
                               // that.reloadMiniBasket();
                           
                                var $activeBasket = $('.mainBasketHeader [data-orderid="' + data.data.orderId + '"]');
                                if ($activeBasket.length == 0) { //are we displaying this basket total already? (or maybe new basket/ non recent one which is now recent)
                                    that.reloadMiniBasket();
                                }
                                else {

                                    if (data.data.isActiveOrder) {
                                        $('.mainBasketHeader #activeBasket').attr('data-orderid', data.data.orderId);
                                        $activeBasket = $('.mainBasketHeader [data-orderid="' + data.data.orderId + '"]');//redo the selector incase primary basket changed
                                    }
                                    $activeBasket.find('.total').text(data.data.totalPrice);                                    
                                    $activeBasket.find('.basketName').text(data.data.basketName);                                    
                                    $activeBasket.attr('href', data.data.basketUrl);
                                }
                                
                                var lineRef = orderLineItems[0].lineReference;
                                //recent line ref
                                if (lineRef && lineRef.length > 0) {

                                    //search only this prodContainer (quicker) but will need to add to all
                                    if ($prodContainer.find('.recentLineRefs option[value="' + lineRef + '"]').length == 0) {
                                        $('.recentLineRefs').prepend('<option value="' + lineRef + '"></option>');
                                    }

                                    var noOptions = $prodContainer.find('.recentLineRefs option').length;
                                    if (noOptions > 5) {                                     
                                        $('.recentLineRefs').each(function (index) {
                                            $(this).children('option').slice(5, noOptions).remove();
                                        });

                                    }
                                }
                                         
                                //can do kendo notification or notification inside container?
                                //notification
                                    //home delivery
                                let isMaxAvailableReached = data.data.isMaxAvailableReached == 1;
                                if (data.data.orderTypeId == gardners.settings.homeDeliveryOrderTypeId) {
                                    location.href = '/CustomerOrder';//todo set _commonSettings.homeDeliveryBasketUrl
                                }
                                else if (data.data.isActiveOrder)
                                {
                                    var basketName = data.data.basketName;
                                    var title = data.data.productDetails[0].title;
                                    var jacketUrl = data.data.productDetails[0].jacketUrl;
                                    var basketTotal = data.data.totalPrice;
                                    var basketQuantity = data.data.totalQuantity + data.data.itemText;
                                    that.setInBasketQuantity(data.data.productDetails[0].ean, data.data.lines[0].quantityInBasket, false);
                                    if (showSpinner || isMaxAvailableReached) {
                                        that.resetAddToBasketButtonForEan(ean, isMaxAvailableReached);
                                    }
                                   
                                    gardners.kendoHelpers.showBasketSuccessNotification(basketName, title, jacketUrl, basketTotal, basketQuantity);
                                   
                                }
                                else {
                                    //popup added item to basket confirmation dialog.
                                    let quantityAdded = data.data.quantityAdded;
                                    that.showItemAddedConfirmation(data.data.orderId, data.data.lines,quantityAdded);
                                    if (showSpinner) {
                                        //TEST HERE 
                                        //complex set of events can be running so sanity check
                                        //i.e no active basket but adding to a new basket from single title "add to a different basket - multiple times"
                                        if ($(".singleTitleContainer").length > 0) {
                                            {
                                                let $spinningButton = $(".addToAnotherBasket").find(".k-loading");
                                                if ($spinningButton.length == 1) {
                                                    that.storeAddToBasketMarkup($spinningButton.parent());
                                                }
                                            }
                                            that.resetAddToBasketButtonForEan(ean, isMaxAvailableReached);
                                        }
                                    }
                                }

                            }
                        },
                        error: function(jqXHR, textStatus, errorThrown) {
                            if (_contextIsSearchResults == true) {
                                that.resetAddToBasketButtonForEan(ean);
                            }
                        }
                        ,
                        contentType:"application/json",
                        traditional: true
                    });

                }
                ,
               addToInstantPurchase: function ($this) {
                   let line = that.getOrderLinesForBasket($this).lines[0];
                    $.ajax({
                        type: "POST",
                        url: _commonSettings.createInstantPurchaseUrl,
                        contentType: 'application/json',
                        data: JSON.stringify({ ean: line.ean, quantity : line.quantity, lineRef : line.lineReference, isBackorder : line.IsBackorder }),
                        success: function (data) {
                            if (data) {
                                if (data.hasOwnProperty("success") && !data.success) {

                                    gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                                }
                                else {
                                    $('#k-window-createBasketPopup .windowContent').html(data);
                                    gardners.kendoHelpers.getKendoWindow('#k-window-createBasketPopup').title('Confirm quick checkout');
                                    $('#k-window-createBasketPopup').parent().css({ width: 598, height: "auto" });
                                    gardners.kendoHelpers.openKendoWindow('#k-window-createBasketPopup');
                                    $('.placeInstantPurchase #btnSubmitOrder').click(function (e) {
                                        $(this).addClass("disabled").prop("disabled", "disabled");
                                        e.preventDefault();
                                        that.CheckoutInstantPurchase();
                                    });
                                }
                            }
                        }
                    });
                }
                ,
                CheckoutInstantPurchase: function () {
                    $.ajax({
                        type: "POST",
                        data: $('.placeOrder form').serialize(),
                        url: _commonSettings.checkoutInstantPurchaseUrl,
                        success: function (data) {

                            if (data.success) {
                                //pull confirmation details from data.data
                                //show details in kendo.ui.getKendoWindow('#k-window-createBasketPopup')
                                //resize window

                                let orderId = data.data.orderId;
                                let gardnersConfirmationNumber = data.data.gardnersConfirmationNumber;
                                let confirmationTemplate = '<div class="instantPurchaseConfirmation"><h1>Thank you for your order </h1>' +
                                    '<p>Your order web reference is ' + orderId + '</p>' +
                                    '<p>Your Gardners order number is ' + gardnersConfirmationNumber + ' </p>' +
                                    '<p class="closeWrapper"><button class="btn btn-primary" onclick="gardners.kendoHelpers.closeKendoWindow(\'#k-window-createBasketPopup\');">Close</button></p></div>';

                                $('#k-window-createBasketPopup .windowContent').html(confirmationTemplate);
                                $('#k-window-createBasketPopup').parent().css({ width: 455 });
                                gardners.kendoHelpers.getKendoWindow('#k-window-createBasketPopup').title('Order Confirmation').center();

                            }
                            else {
                                gardners.processStandardAjaxResponse(data, $('.placeOrder form'), { growlOnFail: true });
                            }

                            if ($(".placeInstantPurchase #btnSubmitOrder").length > 0) {
                                $(".placeInstantPurchase #btnSubmitOrder").removeClass("disabled").prop("disabled", "");
                            }
                        }
                        ,                       
                        error: function (jqXHR, textStatus, errorThrown) {
                            if ($(".placeInstantPurchase #btnSubmitOrder").length > 0) {
                                $(".placeInstantPurchase #btnSubmitOrder").removeClass("disabled").prop("disabled", "");
                            }
                        }
                    });
                }
                ,
                showItemAddedConfirmation: function (orderId, lines,quantityAdded) {
                 
                    $.ajax({
                        type: "POST",
                        url: _commonSettings.itemAddedConfirmationUrl,
                        contentType: 'application/json',
                        data: JSON.stringify({ orderId: orderId,quantityAdded:quantityAdded,orderLineItems: lines }),

                        success: function (data) {
                            if (data) {
                               
                                $('#k-window-createBasketPopup .windowContent').html(data);

                                // kendo.ui.getKendoWindow('#k-window-createBasketPopup').title('Your item has been added to the basket')
                                $('#k-window-createBasketPopup').parent().css({ width: 598, height:"auto"});
                                gardners.kendoHelpers.openKendoWindow('#k-window-createBasketPopup');

                                $('#btnItemAddedConfirmationOk').click(function () {
                                    gardners.kendoHelpers.closeKendoWindow('#k-window-createBasketPopup');
                                });
                            }
                            
                        }
                    });
                }
                ,
                openNewBasketPopup: function (setAsActive, orderLineItems, $prodContainer,context) {

                    if(context==null || context=="undefined") {context=0;}
                   
                    $_prodContainer = $prodContainer;
                  //  var strOrderLines = JSON.stringify(orderLineItems);
                    $.ajax({
                        type: "POST",
                        url: _commonSettings.createBasketPopupUrl,
                        contentType: 'application/json',
                        data: JSON.stringify({ SetAsActiveBasket: setAsActive, orderLineItems: orderLineItems,context:context}),
                        success: function (data) {
                              if (data) {
                                $('#k-window-createBasketPopup .windowContent').html(data);                             
                                $('#k-window-createBasketPopup').parent().css({ width: 500, height: "auto" });
                                gardners.kendoHelpers.getKendoWindow('#k-window-createBasketPopup').title('Create new basket');
                                gardners.kendoHelpers.openKendoWindow('#k-window-createBasketPopup');
                               
                            }                           
                        }
                    });

                }
                ,
                closeNewBasketPopup:function(e)
                {
                    var ean = e.sender.element.attr("data-ean");
                    if (typeof ean !== typeof undefined && ean !== false) {that.resetAddToBasketButtonForEan(ean);}
                    gardners.basket._invokedBySingleTitleOrSearch = false;
                    gardners.kendoHelpers.onWindowClose();
                    e.sender.element.attr("data-ean", "");
                }
                ,
                openSwitchBasketPopup: function(){
                    $.ajax({
                        type: "POST",
                        url: _commonSettings.switchBasketPopupUrl,
                        contentType: 'application/json',
                        success: function (data) {
                            if (data) {
                                $('#k-window-createBasketPopup .windowContent').html(data);
                                $('#k-window-createBasketPopup').parent().css({ width: 480, height: 120 });
                                gardners.kendoHelpers.getKendoWindow('#k-window-createBasketPopup').title('Select a basket');
                                gardners.kendoHelpers.openKendoWindow('#k-window-createBasketPopup');
                            }
                        }
                    });
                }
                ,
                openSetActiveBasketPopup: function (orderLineItems, $prodContainer) {
                   
                    //if no active baskets and no inactive ones, open create new basket straight away
                    //if (gardners.settings.stockBaskets.length == 0 && gardners.settings.activeOrderId == false) {
                  
                     if (gardners.settings.activeOrderId == false) {
                        that.openNewBasketPopup(true, orderLineItems, $prodContainer);
                        return;
                    }

               
                    $_prodContainer = $prodContainer;
                    //  var strOrderLines = JSON.stringify(orderLineItems);
                    $.ajax({
                        type: "POST",
                        url: _commonSettings.setActiveBasketPopupUrl,
                        contentType: 'application/json',
                        data: JSON.stringify({ orderLineItems: orderLineItems }),
                        success: function (data) {
                           
                            if (data)
                            {
                                if (orderLineItems != null) { $("#k-window-createBasketPopup").attr("data-ean", orderLineItems[0].ean); }
                                $('#k-window-createBasketPopup .windowContent').html(data);
                                $('#k-window-createBasketPopup').parent().css({ width: 598, height: "auto" });
                                gardners.kendoHelpers.getKendoWindow('#k-window-createBasketPopup').title('Select a Basket');
                                gardners.kendoHelpers.openKendoWindow('#k-window-createBasketPopup');

                                $('#createNewBasketPopup').click(function (e) {
                                    that.openNewBasketPopup(true, orderLineItems, $prodContainer);
                                    e.preventDefault();
                                });

                            }
                        }
                    });

                }
                ,
            
                setKdlContext: function (ddlId)
                {
                    _kdlContext = ddlId;
                }
                ,
                createBasketAjax_onSuccess: function (data) {
             
                    if (data.success == false) {
                        gardners.basket._invokedBySingleTitleOrSearch = false;
                        gardners.processStandardAjaxResponse(data, 'createNewBasketForm', { growlOnFail : true });
                    }
                    else {
               
                        that.setIsListContext(false);
                        if (gardners.basket._invokedByCreateNewActiveBasket)
                        {
                            that.resetInBasketQuantities();
                            $("[data-cssselector=\"addToBasket\"]").each(function (index) {
                                $button = $(this);
                                $button.attr("data-max", "");
                                if ($button.prop("disabled")) {
                                    var ean = $(this).attr("data-ean");
                                    if (ean != null && $.trim(ean) != "") {
                                        that.resetAddToBasketButtonForEan(ean, false);
                                    }
                                }
                            });
                        }


                        // new functionality GWEB-1418 Backorders WebOnly Accounts
                       if ($(location).attr("href").indexOf("/Account/Backorders") > 0 && !gardners.basket._invokedByCreateNewActiveBasketRedirectFromBackorders)
                        {
                             // we are in the backorder page and basket has been created or switched to from the switch basket div on the header
                            if ($(".webOnlyAccountActiveOrderTrue").length > 0 || $(".webOnlyAccountActiveOrderFalse").length > 0) {
                                setTimeout(function () { location.reload(); }, _timeout);
                            }
                            
                        }
                        else if (gardners.basket._invokedByCreateNewActiveBasketRedirectFromBackorders) //for baskets create in backorders screen - webonly
                        {
                            gardners.basket._invokedByCreateNewActiveBasketRedirectFromBackorders = false;
                            _createBasketCallback = function () {
                                var description = data.data.description;
                                gardners.kendoHelpers.closeKendoWindow('#k-window-createBasketPopup');
                                gardners.kendoHelpers.showSuccessNotification(description + ' created');
                                setTimeout(function () { $(location).attr('href', "/Basket/Index/" + data.data.orderId) }, _timeout);

                            };
                        }
                        else if (data.data.hasOwnProperty('refresh') && data.data.refresh == true)
                        {
                                //basket created from  order and we are in view all baskets refresh
                            _createBasketCallback = function () {
                                var description = data.data.description;
                                gardners.kendoHelpers.closeKendoWindow('#k-window-createBasketPopup');
                                gardners.kendoHelpers.showSuccessNotification(description + ' created');
                                setTimeout(function () {location.reload();}, _timeout);
                               
                            };
                        }

                        if (_createBasketCallback) {
                            _createBasketCallback();
                        }
                        else {
                            var orderId = data.data.orderId;
                            var description = data.data.description;
                            //createBasketOrderLines 
                            if (typeof createBasketOrderLines !== 'undefined' && createBasketOrderLines && $_prodContainer) {
                                that.addOrderLinesToBasket(createBasketOrderLines, $_prodContainer, orderId, gardners.settings.primaryOrderTypeId);
                            } else {
                                gardners.kendoHelpers.showSuccessNotification(description + ' created');
                            }

                            let ddlId = "";
                            
                            if (gardners.basket._invokedByCreateNewActiveBasket) {
                                if (window.location.pathname.indexOf('/Basket/Index/') == 0) {
                                    $(location).attr('href', "/Basket/Index/" + orderId)
                                }
                                else if (window.location.pathname.indexOf('/Product') == 0) {
                                    gardners.basket._invokedByCreateNewActiveBasket = false;
                                    ddlId = "basketList";
                                }
                                else if (window.location.pathname.indexOf('/AccountUserList') == 0) {
                                    gardners.basket._invokedByCreateNewActiveBasket = false;
                                    ddlId = "baskets";
                                }
                            }
                            else if (window.location.pathname.indexOf('/OrderPad') > 0) {

                                if (createBasketForOrderPad == true) {
                                    ddlId = "basketList";
                                    gardners.orderPad.addOrderPadToBasket(orderId);
                                    createBasketForOrderPad = false;
                                }
                                else {
                                     ddlId = "OrderPadBasketList";
                                }
                            }
                            else if (gardners.basket._invokedBySingleTitleOrSearch == true) {
                                gardners.basket.common.newBasketId = orderId;
                                ddlId = "basketList";
                                gardners.basket._invokedBySingleTitleOrSearch = false;
                            }
                            else
                            {
                                //jq dropdown baskets NOT the one in the menu bar!
                                gardners.kendoHelpers.getDropDownList("#baskets").dataSource.read();
                            }                                                    
                            if (ddlId != "") {
                                gardners.kendoHelpers.rebindDropDownList(ddlId);
                            }
                            

                            ////gweb-860
                            //if (window.location.pathname.indexOf('/Basket/Index/') == 0 && gardners.basket._invokedByCreateNewActiveBasket)
                            //{
                            //    $(location).attr('href', "/Basket/Index/" + orderId);
                            //}
                            //else if (window.location.pathname.indexOf('/Product') == 0 && gardners.basket._invokedByCreateNewActiveBasket) {
                            //    gardners.basket._invokedByCreateNewActiveBasket = false;
                            //    gardners.kendoHelpers.rebindDropDownList("basketList");
                            //}
                            //else if (window.location.pathname.indexOf('/OrderPad') > 0) {

                            //    if (createBasketForOrderPad == true) {
                            //        gardners.kendoHelpers.rebindDropDownList("basketList");
                            //        gardners.orderPad.addOrderPadToBasket(orderId);
                            //        createBasketForOrderPad = false;
                            //    }
                            //    else {
                            //        //that.syncOrderPadAddBasket(orderId, description);
                            //        gardners.kendoHelpers.rebindDropDownList("OrderPadBasketList");
                            //    }
                            //}
                            //else if (gardners.basket._invokedBySingleTitleOrSearch == true) {
                            //    gardners.basket.common.newBasketId = orderId;
                            //    gardners.kendoHelpers.rebindDropDownList("basketList");
                            //    gardners.basket._invokedBySingleTitleOrSearch = false;
                            //}
                            
                            gardners.kendoHelpers.closeKendoWindow('#k-window-createBasketPopup');

                            gardners.basket.common.reloadMiniBasket();

                            if (_kdlContext !=null) {
                                var ddl = gardners.kendoHelpers.getDropDownList(_kdlContext);
                                ddl.dataSource.add({ "Text": description, "Value": orderId });
                                ddl.value(orderId);
                                $("." + _kdlContext).val(orderId);
                                _kdlContext = null;
                                $("#frmMultiAdd").submit();
                            }
                       }
                     
                    }
                }
                ,
                selectExistingBasketAjax_onSuccess: function (data) {
                   
                    if (data.success == false) {
                        gardners.processStandardAjaxResponse(data, 'setActiveBasketForm');
                    }
                    else {
                        var orderId = data.data.orderId;
                        var description = data.data.description;
                        //if (window.location.pathname.indexOf('/OrderPad') > 0) {
                        //    that.syncOrderPadAddBasket(orderId, description);
                        //}
                      
                      //  gardners.ajaxComplete(null, data);
                        //createBasketOrderLines 
                        if (typeof createBasketOrderLines !== 'undefined' && createBasketOrderLines && $_prodContainer) {
                            that.addOrderLinesToBasket(createBasketOrderLines, $_prodContainer, orderId, gardners.settings.primaryOrderTypeId);
                        }
                       
                        gardners.kendoHelpers.closeKendoWindow('#k-window-createBasketPopup');
                        gardners.basket.common.reloadMiniBasket();
                        that.excludeActiveBasketFromBaskets();
                        gardners.kendoHelpers.showSuccessNotification("Basket changed to " + description);
                        that.updateInBasketQuantities(orderId);
                    }
                   
                }
                ,
                onBasketsDataBound: function (e) {
                    let Id = e.sender.element.context.id;
                    let newBasketId = gardners.basket.common.newBasketId == undefined ? null:gardners.basket.common.newBasketId;
                    let lastSelected = localStorage[_lastSelectedBasket] == undefined ? null : localStorage[_lastSelectedBasket];
                    if (newBasketId != null)
                       localStorage[_lastSelectedBasket] = newBasketId;
                    
                    //Check that the basket exists in the dropdownlist it may have been deleted if so set selected index to zero
                    if (lastSelected != null) {
                        
                        if (gardners.kendoHelpers.dropDownListItemExists(Id, lastSelected))
                        {
                            gardners.kendoHelpers.setDropDownListValue(Id, lastSelected);
                            return;
                        }
                        
                    }
                    gardners.kendoHelpers.setDropDownListByIndex(Id, 0);
                }
                ,
                onBasketChange:function()
                {
                   localStorage[_lastSelectedBasket] = this.value();
                }
                ,
                initHeader: function () {
                    $(document).ready(function () {
                        var selectedItem = '';
                        $('.baskets .toolTip').kendoTooltip();
                    });
                },
                reloadMiniBasket: function (func)
                {
                    $.ajax({
                        type: "POST",
                        url: _commonSettings.miniBasketUrl,
                        success: function (data) {
                            if (data) {
                                $('#basketNavigation').replaceWith(data);
                                if (typeof func === "function") {
                                    func();
                                }
                            }
                        }
                    });

                }
                ,
                updateInBasketQuantities:function(orderId)
                {
                    
                    var isSingleTitleLocation = false;
                    var values = new Array();
                    //search results
                    if($(".resultItem").length > 0)
                    {
                        $('.resultItem').each(function (index) {
                            if ($(this).attr("data-ean") !== undefined) {
                                values.push($(this).attr("data-ean"));
                            }
                        });
                    }
                    else if ($(".singleTitleContainer").length > 0) //single title page
                    {
                        isSingleTitleLocation = true;
                        values.push($(".singleTitleContainer").attr("data-ean"));
                    }

                    $.ajax({
                        type: "POST",
                        url: _commonSettings.getInBasketQuantitiesUrl,
                        data: JSON.stringify({eans:values,orderId:orderId}),
                        dataType: 'json',
                        contentType: 'application/json',
                        success: function (data) {
                        if (data.hasOwnProperty("success") && data.success == true) {
                        let lines = data.eans;
                        //if (lines.length > 0)
                        //{
                        //    that.resetAddToBasketButtonForEan(lines[0].Ean, lines[0].MaximumAllowed == 0);
                        //}
                        $.each(lines, function (index) {
                            if (lines[index].EanQuantityInCurrentBasket > 0)
                            {
                                that.setInBasketQuantity(lines[index].Ean, lines[index].EanQuantityInCurrentBasket, false);
                            }
                            else
                            {
                                that.resetInBasketQuantity(lines[index].Ean);
                            }
                            
                            that.resetAddToBasketButtonForEan(lines[index].Ean, lines[index].MaximumAllowed==0);
                        });
                           
                            }
                        }
                    });
                }
                ,
                resetAddToBasketButtonForEan: function(ean, noMoreToAllocate)
                {
                    /*
                     * SACRIFICE 13 CHICKENS AND DRINK THE BLOOD!!!!
                     * This function is called everytime something is added to a basket
                     * (Product single title,search result or user lists) 
                     * either through the primary addToBasket button, a jqdropdown addToAnotherBasket button or
                     * after a new basket is created on single title, search results or user lists
                     * and has been complicated by the functionality of the market trader account whereby we need to limit 
                     * the quantity of a product that can be added to a basket based upon its stock level, 
                     * the quantity upto the stock level can be added to as many baskets 
                     * the quantity upto the stock level can be added to as many baskets 
                     * as the system allows. THIS RESTRICTION IS ONLY FOR MARKET TRADERS.
                     * 
                     * As a result once a stock level for a particular basket is reached and its the active basket
                     * the relevant button needs to be disabled we also use a button attribute data-selector to distinguish
                     * between unavailable to sell (IsSellable), as opposed to unavailable because a stock level has been reached.
                     * */
                    let limitReached = noMoreToAllocate == null ? false : noMoreToAllocate;
                    let $addToBasket = "";

                    if (_addToBasketButtonContent.className == "") {
                        $addToBasket = $("[data-cssselector='addToBasket'][data-ean='" + ean + "']");
                    }
                    else {
                        $addToBasket = $("[data-cssselector='" + _addToBasketButtonContent.className.substring(1) +"'][data-ean='" + ean + "']");
                    }

                    let isAnotherBasket = $addToBasket.attr("data-cssselector") == "addToAnotherBasket";

                    if ((limitReached && isAnotherBasket) || !_commonSettings.hasDailyLimit)
                    {
                       limitReached = false;
                    }

                    if ($addToBasket.length > 0 ) {
                        let $tt = $(".tt[data-ean='" + ean + "']");
                        if ($.trim(_addToBasketButtonContent.html) != "") {
                            $addToBasket.html(_addToBasketButtonContent.html);
                        }
                        $addToBasket.prop("disabled", "");
                        $addToBasket.removeClass("disabled");
                        if (!isAnotherBasket && _commonSettings.hasDailyLimit) {
                            $tt.attr("data-tooltip", "");
                            if ($tt.data("kendoTooltip")) {
                                $tt.data("kendoTooltip").destroy();
                            }
                        }
                        //sanity check
                        if ($addToBasket.find(".k-loading").length > 0) {
                            $addToBasket.find(".k-loading").removeClass("k-icon k-loading").addClass("icon icon-add");
                        }

                        if (limitReached && _commonSettings.hasDailyLimit) {
                            $addToBasket.addClass("disabled unavailableButton").prop("disabled", "disabled");
                            $addToBasket.find(".icon").removeClass("icon-add").addClass("icon-cross");
                            $addToBasket.find(".icon-text").text("Unavailable");
                            $tt.attr("data-tooltip", _commonSettings.noFurtherStockAvailableMessage);
                            gardners.layout.addTooltip($tt);
                          
                        }
                        else if ($.trim(_addToBasketButtonContent.html)=="")
                        {
                            $addToBasket.removeClass("disabled unavailableButton").addClass("addToBasket btn-with-dropdown-dark btn-primary").prop("disabled", "");
                            $addToBasket.find(".icon").removeClass("icon-cross").addClass("icon-add");
                            $addToBasket.find(".icon-text").text("Add To Basket");
                        }
                    }

                    that.storeAddToBasketMarkup(null);
                }
                ,
                resetInBasketQuantities:function()
                {
             
                    if ($('.resultItem').length > 0) //searchresults
                    {
                        $('.resultItem').each(function (index) {
                            that.resetInBasketQuantity($(this).attr("data-ean"));
                        });
                    }
                    else if ($(".singleTitleContainer").length > 0) {
                    
                        $(".quantityInBasketContainer").find(".basketAlert").html("");
                    }
                }
                ,
                setInBasketQuantities:function()
                {
                    $('.hidQuantityInBasket').each(function (index) {
                        that.setInBasketQuantity($(this).attr("id").substring(3), parseInt($(this).val()),false);
                    });
                }
                ,
                resetInBasketQuantity:function(ean)
                {

                    if ($('.resultItem').length > 0) //searchresults
                    {
                        var resultItem = $('.resultItem[data-ean="' + ean + '"]');
                        if (resultItem.length > 0)
                        {
                                resultItem.find('#hid' +ean).val("0");
                                var basketAlert = $('.basketAlert[data-ean="' + ean + '"]');
                                if (basketAlert.length > 0 && !_isListContext) {
                                    basketAlert.html("");
                                }
                        }
                    }
                    else if ($(".singleTitleContainer").length > 0)
                    {
                        $(".placeOrder[data-ean='" + ean + "']").find(".basketAlert").html("");
                    }
                }
                ,
                setIsListContext:function(val)
                {
                    _isListContext = val;
                }
                ,
                setInBasketQuantity:function(ean, quantityInBasket, accumulate)
                {
                
                    //dynamic update of in basket quantities and browser back
                
                    var quantity = 0;
                    var hid = null;
                    if ($('.resultItem').length > 0) //searchresults
                    {
                        var quantityText = "";
                        var iconSpan = "";
                        var resultItem = $('.resultItem[data-ean="' + ean + '"]');
                        if (resultItem != null) {
                            var div = resultItem.find('.basketIndicators');
                            if (div != null) {
                                 hid = resultItem.find('#hid' +ean);
                                 quantity = accumulate == true ? quantityInBasket +parseInt(hid.val()): quantityInBasket;
                                 hid.val(quantity);
                                 iconSpan = '<span class="icon-basket-plain primary icon inBasket"></span>';
                            }

                            div = $(".basketAlert[data-ean='" + ean + "']");
                            if (div.length > 0 && quantity > 0) {
                                $(div).html(iconSpan + '<span class="totaInBasket icon-text">' + quantity + ' in basket</span>');
                                $(div).show();
                            }
                        }
                    }
                    else if ($('.singleTitleContainer').length > 0) //single title
                    {
                        var basketAlert = null;
                        if ($('.basketAlert').length > 0) { basketAlert = $('.basketAlert'); }

                        if (basketAlert == null) {
                            $('.quantityInBasketContainer').prepend('<div data-qty="0" class="basketAlert"></div>');
                            basketAlert = $('.basketAlert');
                        }

                        quantity = quantity = accumulate == true ? quantityInBasket + parseInt(basketAlert.attr('data-qty')) : quantityInBasket;
                        if (quantity > 0) {
                            var quantityText = quantity + ' in basket';
                            basketAlert.attr('data-qty', quantity);
                            var span = basketAlert.find('.icon-basket-plain');
                            if (span.length == 0) {
                                $('<span class="icon-basket-plain icon"></span><span class="icon-text">' + quantityText + '</span>').prependTo(basketAlert);
                            }
                            else {
                                basketAlert.find('.icon-text').html(quantityText);
                            }
                        }
                        hid = $('.quantityInBasketContainer').find('#hid' + ean);
                        hid.val(quantity);
                    }
                }
               
            }
            return that;
        }(),
        init: function (options) {
            _settings = options;
            $(document).ready(function () {
               
                that.registerEvents();

                if (!_settings.canProceed) {
                    that.common.setDisabledButton();
                }
            });
        }
        ,

        registerCheckboxEvents:function()
        {
            initShiftClickCheckboxes('.chkIsSelected');
            initShiftClickCheckboxes('.chkIsBackorder');
            
            $('.basketTable  #chkSelectAll').on("click", function (e) {
                var $this = $(this);
                if ($this.is(':checked')) {
                    $('.basketTable .chkIsSelected').prop('checked', true);
                    that.toggleGridOptions($(".basketTable  .chkIsSelected:checked").length);
                    $(".gridOptions").show();
                }
                else {
                    that.toggleGridOptions(0)
                    $('.basketTable .chkIsSelected').prop('checked', false);
                }
            });

            $(".basketTable .chkIsSelected").on("click", function (e) {
                that.toggleGridOptions($(".basketTable .chkIsSelected:checked").length);
            });

            $('#BasketsGrid .myBaskets').on("click", function (e) {
                var checked = $(this).prop('checked');
                $('#BasketsGrid .chkMyBaskets').prop('checked', checked);
                var length = that.getCheckedLength();
                that.toggleGridOptions(length);
                if (checked === true) {
                    $(".gridOptions").show();
                }
            });
            $('#OtherUserBasketsGrid .colleaguesBaskets').on("click",function (e) {
                var checked = $(this).prop('checked');
                $('#OtherUserBasketsGrid .chkColleaguesBaskets').prop('checked', checked);
                var length = that.getCheckedLength();
                that.toggleGridOptions(length);
                if (checked===true) {
                    $(".gridOptions").show();
                }
                
            });

            $('#RecycleableBasketsBasketsGrid .chkSelectAllSelectedMyBasket').on("click", function (e) {
                var checked = $(this).prop('checked');
                $('#RecycleableBasketsBasketsGrid .chkRecycleableBaskets').prop('checked', checked);
                var length = that.getCheckedLength();
                that.toggleGridOptions(length);
                if (checked===true) {
                     $(".gridOptions").show();
                }
            });

            $(".basketContent .k-grid .chkIsSelectedBasket").on("click", function (e) {
                that.toggleGridOptions($(".basketContent .k-grid .chkIsSelectedBasket:checked").length);
            });

            $('.basketTable  #chkBoAll').click(function (e) {
                var $this = $(this);
                var chk = false;
                if ($this.is(':checked')) {
                    chk = true;
                }
                $('.basketTable .chkIsBackorder').prop('checked', chk);
            });
         
            if ($('.basketTable .chkIsBackorder').length == $('.basketTable .chkIsBackorder:checked').length)
            {
                $('.basketTable  #chkBoAll').prop("checked", true);
            }
        }
        ,
        getCheckedLength: function () {
            return parseInt($('#BasketsGrid .chkMyBaskets:checked').length + $('#OtherUserBasketsGrid .chkColleaguesBaskets:checked').length + $('#RecycleableBasketsBasketsGrid .chkRecycleableBaskets:checked').length);
        }
        ,
        registerEvents : function(){
           
            that.registerCheckboxEvents();
            $(".jacketPreviewIcon").kendoTooltip({
                show: function () {
                    gardners.kendoHelpers.repositionTooltip($(this)[0].popup.wrapper[0]);
                }
                ,
                content: function(e){
                    var target = e.target; // the element for which the tooltip is shown
                    var $container = $(target).closest('[data-imagelocation]');
                    var imagelocation = $container.attr('data-imagelocation');
                    var result = '<img class="jacketPreviewContent" src="' + imagelocation + '">';
                    return result;
                        
                },
                //width: 220,
                //height: 280,
                position: "right"
                  
            });
           
            $('#stockOrderBasket #btnPlaceOrder').click(function (e) {
                e.preventDefault();
                if (!$(this).hasClass('disabled')) {                        
                    that.PlaceOrder();
                }
            });
        
            $('.btn-cust-ord').click(function (e) {
                if ($(this).hasClass('disabled')) {
                    e.preventDefault();
                }
                else {
                    window.location.href = $(this).attr("data-target");
                }
            });

            $('.btn-cust-ord-basket').click(function (e) {
                if ($(this).hasClass('disabled')) {
                    e.preventDefault();
                }
                else {

                                      
                    window.location.href = $(this).attr("data-target");
                }
            });

           
            //user changes input, add 'are you sure' when navigate away
        
            $('.selectBoAll,.chkIsBackorder').change(function (e) {
                that.basketChanged();
            });
            $('.editCustomerOrderReference,input.lineRef,input.quantity,input.customerPrice').bind("propertychange change keyup input paste", function (e) {
                $(this).off("propertychange change click keyup input paste");
                that.basketChanged();
            });
                

            $('.updateBasket').on("click", function (e) {
                
                window.onbeforeunload = null;
                if ($(this).hasClass("hdUpdateBasket")) {
                    that.updateBasketOnClick($(this));
                }
            });

            $('#basketGrid th a').on("click",function (e) {
                e.preventDefault();
                var sort = $(this).data('sort');
                that.setGridSortOrder(sort, $(this).attr("data-currentsort"));

            });
        }
        ,
        updateBasketOnClick: function (button) {
            var isValid = true;
                $(".hdbasket tbody tr").each(function (index, element) {

                    var $customerPrice = $($(this).find("input.customerPrice")[1]).data("kendoNumericTextBox");
                    var $quantity = $(this).find("input.quantity");
                    if ($customerPrice) {
                        var price = parseFloat($customerPrice.value());
                        if (parseInt($quantity.val()) > 0 && (price <= 0 || isNaN(price))) {
                            var $summary = $($(".messageSummary")[0]);
                            var message = "<div class=\"alert alert-danger hdcustpriceerr\"><span class=\"icon-exclamation icon\"></span><span class=\"icon-text\">" + _settings.customerPriceError + "</span></div>";
                            if ($(".messageSummary").length > 1) {
                                $summary = $($(".messageSummary")[1]);
                            }
                            if ($summary.find(".hdcustpriceerr").length == 0) {
                                $summary.append(message);
                            }
                            $('html, body').animate({ scrollTop: $summary.offset().top - 100 }, { duration: 300, queue: false });
                            isValid = false;
                            return isValid;
                        }
                    }

                });

                $form = button.closest("form");
                if (isValid) {
                    $form.submit();
                }

        }
        ,
        basketChanged: function () {
            window.onbeforeunload = confirmOnPageExit;
            that.common.setDisabledButton();
            var $stash = $("#btnStash");
            var $hd = $("#btnPlaceOrderHomeDelivery");
            if ($stash.length > 0) { $stash.attr('title', 'Update changes before saving basket').kendoTooltip(); }
            if ($hd.length > 0) { $hd.attr('title', 'Update changes before checkout').kendoTooltip(); }

            $('#btnPlaceOrder').attr('title', 'Update changes before checkout').kendoTooltip();
        }
        ,
        toggleGridOptions: function (count) {
            //start here
            var $options = $(".gridOptions");
            if (count == undefined || count == 0) {
                $options.hide();
                $options.find(".tot").text(count);

            }
            else {
                $options.find(".tot").text(count);
                $options.show();
            }
        }
        ,
        deleteSelectedLines: function () {
            var $selectedLines = $('.basketForm .chkIsSelected:checked');
            
            //send POST request to delete action (not ajax)
            if ($selectedLines.length > 0) {

                $.when(gardners.kendoHelpers.PopupYesNoDialog.show({ title: "Confirm item deletion", message: "Are you sure you want to delete the selected lines?" })).done(function (response) {
                            if (response.button == "Yes") {
                                var inputs = $('#OrderId')[0].outerHTML;

                                $selectedLines.each(function (index, element) {

                                    var lineId = $(element).siblings(':first').val();

                                    inputs += '<input type="hidden" name="Items[' + index + '].LineId" value="' + lineId + '">';
                                    inputs += '<input type="hidden" name="Items[' + index + '].IsSelected" value="true">';

                                });

                                $('<form action="' + _settings.deleteSelectedLinesUrl + '" method="POST">' +
                                    inputs + '</form>').appendTo("body").submit();
                           
                            }
                           // else gardners.kendoHelpers.clearSelection('#kgrid-users');
                        });
            }
            else {                                
                gardners.kendoHelpers.PopupAlertDialog.show(that.popupAlertDialogConfig());
            }
        }
        ,
        popupAlertDialogConfig: function()
        {
            return { title: "Error", message: 'There is nothing selected', buttonText: "Please close and try again" };
        }
        ,
        moveSelectedLines: function () {

            var $selectedLines = $('.basketForm .chkIsSelected:checked');
            if ($selectedLines.length > 0) {
                var values = new Array();
                $selectedLines.each(function (index, element) {
                    var lineId = $(element).siblings('input:first').val();
                    values.push(lineId);
                });

                if ($selectedLines.length > 0) {

                    //MoveBasketItemsWindow
                    $.ajax({
                        type: "POST",
                        url: _settings.moveBasketItemsPopupUrl,
                        data: {
                            SourceOrderId: $('#OrderId').val(),
                            LineIds: values
                        }
                        ,
                        success: function (data) {
                            if (data) {
                                $("#MoveBasketItemsWindow").data("kendoWindow").content(data);
                                gardners.kendoHelpers.openKendoWindow('#MoveBasketItemsWindow');
                            }
                        }
                    });
                }
            }
            else {
                gardners.kendoHelpers.PopupAlertDialog.show(that.popupAlertDialogConfig());
            }
        }
        ,
        moveSelectedLines_onSuccess: function (data) {
       
            if (data.success) {
                gardners.processStandardAjaxResponse(data, 'prefSummary', { growlOnSuccess: true });
                if (data.isWebOnly) { //need to d forec recalculations on backordersreadytorelease etc.
                    location.reload(true);
                }
                else
                {
                    that.reloadGrid();
                    gardners.kendoHelpers.closeKendoWindow('#MoveBasketItemsWindow');
                }
            }
            else { gardners.processStandardAjaxResponse(data, 'prefSummary', { growlOnFail: true }); }
        }
        ,
        moveSelectedLinesNewBasket_onSuccess: function (data) {
           
            if (data.success) {
                var destinationOrderId = data.data.orderId;

                var $selectedLines = $('#lineIdsContainerForCreateBasket input');

                var values = new Array();
                $selectedLines.each(function (index, element) {
                    var lineId = $(element).val();
                    values.push(lineId);
                });

                $.ajax({
                    type: "POST",
                    url: _settings.moveBasketItemsUrl,
                    data: {
                        SourceOrderId: $('#OrderId').val(),
                        DestinationOrderId: destinationOrderId,
                        LineIds: values
                    }
                    ,
                    success: function (data) {
                        that.moveSelectedLines_onSuccess(data);
                    }
                });
            }
            else {
                gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
            }
        }
        ,
        setLineReferenceForSelecetdLines: function () {
            var $selectedLines = $('.basketForm .chkIsSelected:checked');

            //send POST request to delete action (not ajax)
            if ($selectedLines.length > 0) {
          
                gardners.kendoHelpers.inputDialog('Set a line reference', 'Reference', function () {
                   
                    var lineReference = gardners.kendoHelpers.inputDialogGetValue();

                    ////Set line reference on page in js. Still requires user to submit 'update'
                    //$selectedLines.each(function (index, element) {
                    //    var $parent = $(element).closest('tr').find('input.lineRef').val(lineReference);
                    //});

                    //set line references in a post back, auto submit.                    
                    var inputs = $('#OrderId')[0].outerHTML + '<input type="hidden" name="lineReference" value="' + lineReference + '">';

                    $selectedLines.each(function (index, element) {

                        var lineId = $(element).siblings('input:first').val();

                        inputs += '<input type="hidden" name="Items[' + index + '].LineId" value="' + lineId + '">';
                        inputs += '<input type="hidden" name="Items[' + index + '].IsSelected" value="true">';

                    });

                    $('<form action="' + _settings.setLineReferenceSelectedLinesUrl + '" method="POST">' +
                        inputs +
                        '</form>').appendTo("body").submit();
                    
                },  /*isNumberic*/ false, '', /*maxLength*/ _settings.maxLineRef);
            }
            else {
                
                gardners.kendoHelpers.PopupAlertDialog.show(that.popupAlertDialogConfig());
            }
        }
        ,
        setQuantityForSelectedLines: function () {

            var $selectedLines = $('.basketForm .chkIsSelected:checked');

            //send POST request to update action (not ajax)
            if ($selectedLines.length > 0) {
                
                gardners.kendoHelpers.inputDialog('Set a quantity', 'Quantity', function () {

                    var quantity = gardners.kendoHelpers.inputDialogGetValue();
                    var inputs = $('#OrderId')[0].outerHTML + '<input type="hidden" name="quantity" value="' + quantity + '">';

                    $selectedLines.each(function (index, element) {

                        var lineId = $(element).siblings(':first').val();

                        inputs += '<input type="hidden" name="Items[' + index + '].LineId" value="' + lineId + '">';
                        inputs += '<input type="hidden" name="Items[' + index + '].IsSelected" value="true">';

                    });

                    $('<form action="' + _settings.setQuantitySelectedLinesUrl + '" method="POST">' + inputs + '</form>').appendTo("body").submit();

                },true);
            }
            else {              
                gardners.kendoHelpers.PopupAlertDialog.show(that.popupAlertDialogConfig());
            }
        }
        ,
        updateCustomerOrderReference: function () {
            gardners.kendoHelpers.inputDialog('Edit Basket Name', 'New name', function () {

                var name = gardners.kendoHelpers.inputDialogGetValue();
                var orderId = $('#OrderId').val();
                if ($.trim(name) == "") {
                    gardners.kendoHelpers.PopupAlertDialog.show({ title: 'Warning', message: 'Basket Name required' });
                }
                else {
                   
                    $.ajax({
                        type: "POST",
                        data: { orderId: orderId, customerOrderReference: name },
                        url: _settings.updateCustomerOrderReferenceUrl,
                        success: function (data) {
                            
                            gardners.processStandardAjaxResponse(data, null, { growlOnSuccess: true, growlOnFail: true });

                            if (data.success == true) {
                                let $activeBasket = $('.mainBasketHeader [data-orderid="' + orderId + '"]');
                                $activeBasket.find('.basketName').text(name);
                                $("#pageHeader").text(name);
                                $("span[class~=\"customerOrderReference\"]").text(name);
                                $('#checkoutBasketName').text(name);
                                $('.cd-top').trigger("click");
                                //now update the dropdown list of other baskets in the header
                                let $ddl = $("#InactiveBaskets").data("kendoDropDownList");
                                let ds = $ddl.dataSource;
                                if (ds != null)
                                {
                                    $.each(ds["_data"], function (index, item) {
                                        if (item.OrderId == orderId) {
                                            item.CustomerOrderReference = name;
                                            $ddl.refresh();
                                            return false;
                                        }
                                    });
                                }
                            }
                        }
                    });
                }
              
            },  /*isNumberic*/ false, $('#pageHeader').text(), /*maxLength*/ 15);
        }
        ,
        deleteBasket: function (checkboxSelector) {
           
            var $selectedLines = $(checkboxSelector + ':checked');

            if ($selectedLines.length > 0) {
             
                 $.when(gardners.kendoHelpers.PopupYesNoDialog.show({ title: "Confirm basket deletion", message: "Are you sure you want to delete the selected baskets?",buttonText:"Yes, delete selected baskets" })).done(function (response) {
                    if (response.button == "Yes")
                    {
                                 var selectedOrderIds = [];
                                var $rowsToDelete = [];
                    
                                 $selectedLines.each(function (index, element) {
                
                                 var orderId = $(element).siblings('input:first').val();
                                 selectedOrderIds.push(orderId);
                                  $rowsToDelete.push($(element).closest('tr'));
                             });
          
                        $.ajax({
                            type: "POST",
                            data: { orderIds: selectedOrderIds },
                            url: _settings.deleteBasketUrl,
                            success: function (data) {
                                gardners.processStandardAjaxResponse(data, null, { growlAndClearOnSuccess: true, growlOnFail : true });
                           
                                if (data.success) {
                                    location.reload();
                                }
                            }
                        });
                           
                     }
                 });


            }
            else {
                
                gardners.kendoHelpers.PopupAlertDialog.show(that.popupAlertDialogConfig());
            }

        }
        ,
        clearMessageSummary: function ()
        {
            if ($('.messageSummary').length > 0) {
                $('.alert-success').hide();
                //$('.messageSummary').html('');

            }
        }
        ,
        PlaceOrder: function () {
            that.clearMessageSummary();
           
            $.ajax({
                type: "POST",
                data: {orderId : $('#OrderId').val()},
                url: _settings.placeOrderUrl,
                success: function (data) {
                   if (data.hasOwnProperty('success') && data.success == false)
                    {
                        if (data.hasOwnProperty('returnUrl')) { gardners.processStandardAjaxResponse(data); }
                        gardners.basket.common.setDisabledButton();

                        if (data.data && data.data.hasOwnProperty('total')) {
                            if (data.data.total == "0") {
                                $('#basketGrid tbody').empty();
                            }
                        }

                        //if ($('.messageSummary').length > 0) {
                        //    $('.messageSummary').append('<ul><li>' + data.messages[0] + '</li></ul>');
                        //}
                        //else {
                        //    $('#prefSummary').append('<div class="messageSummary alert alert-danger" style="display: none;"><ul><li>' + data.messages[0] + '</li></ul></div>');
                        //}
                        //$('.messageSummary').show();
                    }
                    else {
                        $("#PlaceOrderWindow").data("kendoWindow").content(data);
                        gardners.kendoHelpers.openKendoWindow('#PlaceOrderWindow');

                       $('#btnSubmitOrder').on("click",function (e) {
                           e.preventDefault();
                           if ($(e.currentTarget).closest("form").valid()) {
                               that.CheckoutOrder();
                           }
                           else {
                               return false;
                           }
                           
                        });
                        $('#btnCancelSubmit').on("click",function (e) {
                            gardners.kendoHelpers.closeKendoWindow('#PlaceOrderWindow');
                        });
                    }
                    
                }
            });
        }
        ,
        CheckoutOrder: function () {
            $.ajax({
                type: "POST",
                data: $('.placeOrder form').serialize(),
                url: _settings.checkoutUrl,
                success: function (data) {
                    if (data.data === "readytoreleasechanged") {
                        var anc = "<a class=\"btn btn-primary\" href=\"" + data.returnUrl + "\"><span class=\"icon-tick icon\"></span><span class=\"icon-text\">View Updated Basket</span></a>";
                        delete data["returnUrl"];
                        let $buttonsContainer = $("#btnSubmitOrder").closest(".buttons");
                        $buttonsContainer.html(anc);
                    }
                    gardners.processStandardAjaxResponse(data, $('.placeOrder form'));
                }
            });
        }
       ,
        reloadGrid: function () {
            
            that.clearMessageSummary();
            $.ajax({
                type: "POST",
                data: { sort: _basketSortOrderId, currentSort: _basketCurrentSortOrderId },
                //data: { id: $('#OrderId').val(), sort: _basketSortOrderId, currentSort: _basketCurrentSortOrderId },
                url: _settings.basketGridUrl,
                success: function (data) {
                    if (data.hasOwnProperty("success")) {
                        gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                    }
                    else {
                        $('#basketGridWrapper').html(data);
                        gardners.layout.tooltips();
                        that.writeInvalidItemsIcon();
                        that.registerEvents();
                        gardners.basket.common.reloadMiniBasket();
                        if($("#basketGrid").length==0) {$(".downloadBasket").hide();}
                    }
                }
            });
        },
        setGridSortOrder: function (sortOrder, currentSortOrder) {

            _basketCurrentSortOrderId = currentSortOrder;
            var isDefaultSort = _basketCurrentSortOrderId == 'Default';
            if ($.isNumeric(sortOrder)) {
                _basketSortOrderId = sortOrderId;
            }
            else {

                switch(sortOrder)
                {
                    case "title":
                        if (_basketSortOrderId == 1 && !isDefaultSort)
                        { _basketSortOrderId = 2; } //desc
                        else
                        { _basketSortOrderId = 1;} //asc
                        break;
                    case "format":
                        if (_basketSortOrderId == 3 && !isDefaultSort)
                        { _basketSortOrderId = 4; } //desc
                        else
                        { _basketSortOrderId = 3;} //asc
                        break;
                    case "lineRef":
                        if (_basketSortOrderId == 5 && !isDefaultSort)
                        { _basketSortOrderId = 6; } //desc
                        else
                        { _basketSortOrderId = 5;} //asc
                        break;
                    case "price":
                        if (_basketSortOrderId == 7 && !isDefaultSort)
                        { _basketSortOrderId = 8; }//desc
                        else
                        { _basketSortOrderId = 7; }//asc
                        break;
                    case "ean":
                        if (_basketSortOrderId == 9 && !isDefaultSort)
                        { _basketSortOrderId = 10; } //desc
                        else
                        { _basketSortOrderId = 9; } //asc
                        break;
                    case "weight":
                        if (_basketSortOrderId == 11 && !isDefaultSort)
                        { _basketSortOrderId = 12; } //desc
                        else
                        { _basketSortOrderId = 11; } //asc
                        break;
                    case "backorder":
                        if (_basketSortOrderId == 13 && !isDefaultSort)
                        { _basketSortOrderId = 14; } //desc
                        else
                        { _basketSortOrderId = 13; } //asc
                        break;
                    case "rrp":
                        if (_basketSortOrderId == 15 && !isDefaultSort)
                        { _basketSortOrderId = 16; } //desc
                        else
                            {_basketSortOrderId = 15;} //asc
                        break;
                    case "qualifyingdiscount":
                        if (_basketSortOrderId == 17 && !isDefaultSort)
                        { _basketSortOrderId = 18; } //desc
                        else
                        { _basketSortOrderId = 17; } //asc
                        break;
                    case "quantityinbasket":
                        if (_basketSortOrderId == 19 && !isDefaultSort)
                        { _basketSortOrderId = 20; } //desc
                        else
                        { _basketSortOrderId = 19; } //asc
                        break;
                    case "stockunits":
                        if (_basketSortOrderId == 21 && !isDefaultSort)
                        { _basketSortOrderId = 22; }//desc
                        else
                        { _basketSortOrderId = 21; } //asc
                        break
                }

            }
            that.reloadGrid();
        }
        ,
        writeInvalidItemsIcon : function ()
        {
           //for ajax uploads of ean's need to render reelvant messages
           if ($('#basketGrid tbody tr.unavailable').length > 0)
           {
               
                if ($("#prefSummary").find(".producstNoLongerAvailable").length == 0)
                {
                    $("#prefSummary").append(_settings.invalidItemsInBasket);
                }
                else if ($(".producstNoLongerAvailable").html().length == 0) {

                    $(".producstNoLongerAvailable").append(_settings.invalidItemsInBasket);
                }
            }

           if ($('#basketGrid tbody tr.sos').length > 0) {
               if ($("#prefSummary").find(".unavailableItems").length == 0)
               {
                   $("#prefSummary").append("<div class=\"messageSummary unavailableItems\"></div>");
     
               }
                if($('.alert.sos').length== 0)
                {
                    $(".unavailableItems").append("<div class=\"alert sos\"><span class=\"icon-exclamation icon\"></span><span class=\"icon-text\">" + _settings.sosItemsInBasket + "</span></div");
                }
            }

         
        }
        ,
        initViewAll: function () {
            initShiftClickCheckboxes('.myBaskets');
            initShiftClickCheckboxes('.colleaguesBaskets');

            $('.myBaskets').click(function (e) {
                 $('#BasketsGrid tbody tr td').find('.chkMyBaskets').prop('checked',$(this).is(':checked'));
              });
            $('.colleaguesBaskets').click(function (e) {
               
                $('#OtherUserBasketsGrid tbody tr td').find('.chkColleaguesBaskets').prop('checked', $(this).is(':checked'));
            });
            gardners.basket.common.binddDownloadBasketButton();
        }
        ,
        mergeBaskets: function (checkboxSelector,newNameUrl) {
            var $selectedLines = $(checkboxSelector + ':checked');
        
            if (parseInt($selectedLines.length) < 2) {
                gardners.kendoHelpers.PopupAlertDialog.show({ title: "Error", message: 'At least two baskets are required to merge',buttonText:"Please close and try again" });
                return;
            }
            
            var basketName = "";
            $.ajax({
                type: "POST",
                url: newNameUrl,
                success: function (data) {
                    basketName = data;
                    gardners.kendoHelpers.inputDialog('New Merge Basket Name', 'New name', function () {

                        var name = gardners.kendoHelpers.inputDialogGetValue();
                        if ($.trim(name) == "") {
                            gardners.kendoHelpers.PopupAlertDialog.show({ title: 'Warning', message: 'Basket Name required' });
                            return;
                        }

                        var selectedOrderIds = [];
                        var $rowsToDelete = [];
                        
                        $selectedLines.each(function (index, element) {

                            var orderId = $(element).siblings('input:first').val();
                            selectedOrderIds.push(orderId);
                            $rowsToDelete.push($(element).closest('tr'));
                        });

                        $.ajax({
                            type: "POST",
                            data: { basketIds: selectedOrderIds, BasketName: name },
                            url: _settings.mergeBasketUrl,
                            success: function (data) {
                                if (data.success) {
                                    location.reload();
                                }
                                else {
                                    gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                                }
                            }
                        });

                    },  /*isNumberic*/ false, basketName, /*maxLength*/ 15, /*buttonText*/ 'Create merged basket');
                }
            });
        }
        ,
        viewAllCreateBasket: function () {

            _createBasketCallback = function () {

                location.reload();
            };

            gardners.basket.common.openNewBasketPopup(/*setIsActive*/ true);
        }
        ,
        stash: function () {
            gardners.kendoHelpers.inputDialog("Save Basket", "Name", function () {
                var name = gardners.kendoHelpers.inputDialogGetValue();

                if ($.trim(name) == "") {
                    gardners.kendoHelpers.PopupAlertDialog.show({ title: 'Warning', message: 'Basket Name required' });
                }
                else {

                    $("#frmStash").remove();
                    var input = "<input type=\"hidden\" name=\"customerOrderReference\" value=\"" + name + "\">";
                    $("<form id=\"frmStash\" action=\"" + _settings.stashBasketUrl + "\" method=\"POST\">" + input + "</form>").appendTo("body").submit();
                }
            }, false, "", 15, "Save");
        }
        ,
        recoverBasketOnSuccess: function (data) {
            gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
        }
        ,
        recoverBasketOnFailure: function () {
            gardners.kendoHelpers.PopupAlertDialog.show({ title: "Error", message: "Failed to recover Basket" });
        }
    }
    return that;
})(window, jQuery);

gardners.backorderReadyToRelease = (function (window, $) {

    var checkedBo = {};
    var _settings = {};
    var _elementSelectors = { boReadyToReleaseGrid: "", boAllCheckBox:"", boCheckbox:""};


    var that =
    {
   
        init: function (settings, elementSelectors) {
            _settings = settings;
            _elementSelectors = elementSelectors;
            $(document).ready(function () {
                $("input[name='" + _elementSelectors.boAllCheckBox + "']").on("click", function (e) {
                    $("input[name$='" + _elementSelectors.boCheckbox + "']").prop("checked", $(this).prop("checked"));
                });
                $("input[name='" + _elementSelectors.boAllCheckBox + "']").change(function (e) {
                   gardners.basket.basketChanged();
                });
                $("input[name$='" + _elementSelectors.boCheckbox + "']").change(function (e) {
                   gardners.basket.basketChanged();
                });

            });
        }
        ,

        registerCheckboxEvents: function () {
            //gardners.basket.initShiftClickCheckboxes(_elementSelectors.boCheckboxClass);

           
        }
    }
    return that;
})(window, jQuery);;
gardners.product = (function (window, $) {
    var that =
        {
            singleTitle: function () {
                var _settings = {
                    carouselSelector: '',
                    mainImageSelector: '',
                    ean: 0,
                    hasPreviousOrdersUrl: '',
                    previousOrdersUrl:''
                };
               
                function toggleMainLanguage() {
                    $('.dvdmainLanguage').toggle();
                }
                function toggleSubTitles()
                {                           
                    $('.subTitles').toggle();
                }
                function toggleDubbing()
                {
                    $('.dubbing').toggle();
                }
                function initProductImages() {
                    //$(_settings.mainImageSelector).elevateZoom({
                    //    zoomWindowFadeIn: 500,
                    //    zoomWindowFadeOut: 300
                    //});

                    //if (typeof $(_settings.mainImageSelector).data('zoom-image') == 'undefined') {
                    //    var ez = $(_settings.mainImageSelector).data('elevateZoom');
                    //    ez.changeState('disable');
                    //}

                    var first = $(_settings.carouselSelector + ' img');
                    if (first.length > 0) {                        
                        $(first[0]).addClass('active');
                    }

                    $(_settings.carouselSelector).on('click', 'img', function (e) {

                        e.preventDefault();
                        var $img = $(this);
                      
                        $img.closest('ul').find('img').removeClass('active');
                        $img.addClass('active');

                        //no carousel implemented so when clicking smaller images replace main immage src with the clicked image src.
                        var imgIndex = $(this).parent().index();  //index of the ul li
                        var gallery = $(_settings.carouselSelector);
                        gallery.find('img').each(function (index) {

                            var img_src = '';
                           
                            if ($(this).data("medium")) {
                                img_src = $(this).data("medium");
                            }
                            else if ($(this).data("large")) {
                                img_src = $(this).data("large");
                            }

                            if (index == imgIndex) {
                                $(_settings.mainImageSelector).attr("src", img_src);
                                $(_settings.mainImageSelector).attr("title", $(this).attr("title"));
                                return;
                            }
                        });
                    });

                    $(_settings.mainImageSelector).bind("click", function (e) {
                        $.fancybox(gardners.product.singleTitle.getGalleryList());
                        return false;
                    });
                }
                function initAddToBasket() {
            
                    //user is logged in otherwise element not rendered in view
                    if($('.basketSelector').length>0)
                    {
                        if (gardners.settings.recentOrders && gardners.settings.recentOrders.length == 0) 
                        {
                               $('.basketSelector').empty();
                        }
                        else
                        {
                            $(".btnCreateNewBasket").remove();
                            $('#productListContainer').on('click', '.addToAnotherBasket', function (e) {
                                    e.preventDefault();
                                    var orderId = gardners.kendoHelpers.getDropDownListValue("#basketList");
                                    gardners.basket.common.storeAddToBasketMarkup($(this));
                                    if (orderId == -1)
                                    {
                                        gardners.basket._invokedBySingleTitleOrSearch = true;
                                        var lines = gardners.basket.common.getOrderLinesForBasket($(this));
                                        gardners.basket.common.openNewBasketPopup(/*setIsActive*/ false, lines.lines, lines.container);
                                     }
                                    else {
                                        gardners.basket.common.addToBasketButton($(this), orderId);
                                       
                                    }
                               });
                        }
                        
                    }
                }
                var that = {
                    init: function (options) {

                        _settings = options;
                        $(document).ready(function () {

                            that.checkForPreviousOrders();
                            initAddToBasket();

                            initProductImages();
                     
                            $("#jq-dropdown-addToBasket").attr("data-ean", _settings.ean);

                            //browser back
                            gardners.basket.common.setInBasketQuantities();

                            $('.salesRestrictions .showMore').click(function (e) {
                                e.preventDefault();
                                $(this).hide();
                                $('.salesRestrictions .showMore-detail').css('display', 'inline');
                                $('.salesRestrictions .showLess').css('display', 'inline');
                            });
                            $('.salesRestrictions .showLess').click(function (e) {
                                e.preventDefault();
                                $(this).hide();
                                $('.salesRestrictions .showMore-detail').css('display', 'none');
                                $('.salesRestrictions .showMore').css('display', 'inline');
                            });

                            $('.dvdMainLanguage .mainShowMore').click(function (e) {
                                e.preventDefault();
                                $(this).hide();
                                $('.dvdMainLanguage .newline').css('display', 'block');
                                $('.dvdMainLanguage .mainShowMoreDetail').css('display', 'inline');
                                $('.dvdMainLanguage .mainShowLess').css('display', 'inline');
                            });
                            $('.dvdMainLanguage .mainShowLess').click(function (e) {
                                e.preventDefault();
                                $(this).hide();
                                $('.dvdMainLanguage .mainShowMoreDetail').css('display', 'none');
                                $('.dvdMainLanguage .mainShowMore').css('display', 'inline');
                            });

                            $('.dvdSubTitles .showMore').click(function (e) {
                                e.preventDefault();
                                $(this).hide();
                                $('.dvdSubTitles .newline').css('display', 'block');
                                $('.dvdSubTitles .showMoreDetail').css('display', 'inline');
                                $('.dvdSubTitles .showLess').css('display', 'inline');
                            });
                            $('.dvdSubTitles .showLess').click(function (e) {
                                e.preventDefault();
                                $(this).hide();
                                $('.dvdSubTitles .showMoreDetail').css('display', 'none');
                                $('.dvdSubTitles .showMore').css('display', 'inline');
                            });

                            $('.dvdDubbing .dubbingShowMore').click(function (e) {
                                e.preventDefault();
                                $(this).hide();
                                $('.dvdDubbing .newline').css('display', 'block');
                                $('.dvdDubbing .dubbingShowMoreDetail').css('display', 'inline');
                                $('.dvdDubbing .dubbingShowLess').css('display', 'inline');
                            });
                            $('.dvdDubbing .dubbingShowLess').click(function (e) {
                                e.preventDefault();
                                $(this).hide();
                                $('.dvdDubbing .dubbingShowMoreDetail').css('display', 'none');
                                $('.dvdDubbing .dubbingShowMore').css('display', 'inline');
                            });
                            gardners.layout.tooltips();
                        });
                    }
                    ,

                    initOtherFormats: function () {
                        var classname = document.getElementsByClassName("otherFormatTitle");

                        var showOtherFormats = function () {
                            var firstSpan = $($(this).first()[0].children[0]);
                            var firstUl = $(this).next()[0];

                            if (firstSpan.hasClass('k-i-arrow-e')) {
                                firstSpan.addClass('k-i-arrow-s').removeClass('k-i-arrow-e');
                                firstUl.style.display = "none";
                            }
                            else {
                                firstSpan.addClass('k-i-arrow-e').removeClass('k-i-arrow-s');
                                firstUl.style.display = "block";
                            }

                        };

                        for (var i = 0; i < classname.length; i++) {
                            classname[i].addEventListener('click', showOtherFormats, false);
                        }

                    },

                    onBasketsDataBound: function (e)
                    {
                       //select first item active basket should not be in the list
                        if (e.sender.dataSource._data.length > 0) {
                            gardners.kendoHelpers.setDropDownListValue('basketList', e.sender.dataSource._data[0].Value);
                        }
                      //  gardners.kendoHelpers.setDropDownListValue('basketList', gardners.basket.common.newBasketId);
                    }
                    ,
                    getGalleryList: function () {

                        var gallery = $(_settings.carouselSelector);

                        var gallerylist = [];


                        gallery.find('img').each(function () {

                            var img_src = '';
                            if ($(this).data("large")) {
                                img_src = $(this).data("large");
                            }
                            else if ($(this).data("medium")) {
                                img_src = $(this).data("medium");
                            }


                            //put the current image at the start
                            if ($(this).hasClass('active')) {
                                gallerylist.unshift({
                                    href: '' + img_src + '',
                                    title: $(this).attr("title")
                                });
                            }
                            else {
                                gallerylist.push({
                                    href: '' + img_src + '',
                                    title: $(this).attr("title")
                                });
                            }

                        });

                        if (gallerylist.length == 0) {
                            var mainImage = $(_settings.mainImageSelector);

                            var _main_img_src = '';
                            if (mainImage.data("zoom-image")) {
                                _main_img_src = mainImage.data("zoom-image");
                            }
                            else if (mainImage.data("medium")) {
                                _main_img_src = mainImage.data("medium");
                            }
                            else
                                _main_img_src = mainImage.attr("src");


                            gallerylist.unshift({
                                href: _main_img_src,
                                title: mainImage.attr("title")
                            });

                        }

                        return gallerylist;
                    }
                    ,
                    checkForPreviousOrders:function()
                    {
                      
                        $.ajax({
                            type: "POST",
                            data:{ean: _settings.ean},
                            url: _settings.hasPreviousOrdersUrl,
                            success: function (data) {
                                $('.previouslyOrderedWrapper').html(data);
                            }
                            ,
                            error: function (xhr, ajaxOptions, thrownError) {
                                $('.previouslyOrderedWrapper').hide();
                            }
                        });
                    }
                    ,
                    getPreviousOrders:function()
                    {
                        var pos = $('.productImageWrapper').position();
                        $('#PreviouslyOrderedWindow').closest('.k-window').css({ top: pos.top +30, left: pos.left + 100 });
                        var wndw = gardners.kendoHelpers.getKendoWindow('#PreviouslyOrderedWindow');
                        wndw.title('Previous Orders');
                        wndw.refresh({ url: _settings.previousOrdersUrl, data: { ean: _settings.ean } });
                        wndw.open();
                    }
                }
                return that;
            }()
    }
    return that;
})(window, jQuery);;
gardners.account = (function (window, $) {

    var that =
    {

        customers: function () {
            var _settings = { deleteUrl: '', editUrl: '' };
            var _controls = { grid: '', customerWndw: '' };

            var that = {

                init: function (settings, controls) {
                    _settings = settings;
                    _controls = controls;
                    $(document).ready(function () {

                        $('.lookupLastNameOrPostcode').on("keypress", function (e) {
                            if (e.which === 13) {
                                e.preventDefault();
                                $('.btnLookupCustomer').click();
                            }
                        });


                        $("body").on("click", '.btnLookupCustomer', function (e) {
                            var lastNameOrPostcode = $('.lookupLastNameOrPostcode').val();
                            if ($.trim(lastNameOrPostcode) !== "") {
                                that.filterCustomers();
                            }
                        });

                        $('.clearFilters').on("click", function (e) {
                            that.clearFilters();
                        });
                    });
                }
                ,
                clearFilters: function () {
                    $('.lookupLastNameOrPostcode').val('');
                    that.filterCustomers();
                }
                ,
                filterCustomers: function () {
                    that.clearSummaryErrors();
                    $filter = new Array();
                    var lastNameOrPostcode = $('.lookupLastNameOrPostcode').val();
                    if ($.trim(lastNameOrPostcode) !== "") {
                        $lookupFilter = { logic: "or", filters: [] };
                        $lookupFilter.filters.push({ field: "LastName", operator: "startswith", value: lastNameOrPostcode });
                        $lookupFilter.filters.push({ field: "Postcode", operator: "eq", value: lastNameOrPostcode });
                        $filter.push($lookupFilter);

                    }
                    var grid = gardners.kendoHelpers.getGrid(_controls.grid);
                    grid.dataSource.filter($filter);
                }
                ,
                deleteCustomer: function (ele) {
                    that.clearSummaryErrors();
                    var Id = $(ele).attr('data-val');
                    $.when(gardners.kendoHelpers.PopupYesNoDialog.show({
                        title: "Confirm customer deletion",
                        message: "Are you sure you want to delete this customer?"
                    })
                    ).done(function (response) {
                        if (response.button === "Yes") {
                            $.post(
                                _settings.deleteUrl
                                , { 'AccountCustomerId': Id }
                                , function (data) {
                                    if (data.success === false)
                                        gardners.processStandardAjaxResponse(data);
                                    else {
                                        that.refreshCustomers(data.messages[0]);

                                    }
                                });
                        } else gardners.kendoHelpers.clearSelection(_controls.grid);
                    });

                }
                ,
                editCustomer: function (ele) {
                    that.clearSummaryErrors();
                    var Id = $(ele).attr('data-val');
                    $(_controls.customerWndw).resetValidation(_controls.customerWndw);
                    $.ajax({
                        type: "GET",
                        data: {
                            AccountCustomerId: Id
                        },
                        url: _settings.editUrl,
                        success: function (data) {

                            if (data.hasOwnProperty('success') && !data.success) {

                                gardners.processStandardAjaxResponse(data, $('.prefSummary'));
                            }
                            else {
                                $('#editCustomerDetails').html($(data));
                                $.validator.unobtrusive.parse($(_controls.customerWndw).find('form'));
                                gardners.kendoHelpers.openKendoWindow(_controls.customerWndw);
                            }
                        }

                    });
                }
                ,
                updateCustomerComplete: function (customData, data, status, xhr) {
                    if (data.success === false) {
                        gardners.processStandardAjaxResponse(data, customData.targetElement, customData);
                    }
                    else {

                        that.refreshCustomers(data.messages[0]);
                        gardners.kendoHelpers.closeKendoWindow(_controls.customerWndw);
                    }
                }
                ,
                onCloseCustomer: function () {
                    gardners.kendoHelpers.onWindowClose();
                    gardners.kendoHelpers.clearSelection(_controls.grid);
                }
                ,
                refreshCustomers: function (message) {
                    $(_controls.grid).data("kendoGrid").dataSource.read();
                    gardners.kendoHelpers.showSuccessNotification(message);
                },
                clearSummaryErrors: function () {
                    $(".messageSummary").hide();
                    $(".messageSummary ul").empty();
                }
            };
            return that;
        }()
        ,
        preferences: function () {
            var _settings = {};

            var that = {
                init: function (options) {
                    _settings = options;
                    $(document).ready(function () {

                        var showAllLangsSelected = $('#IsSearchShowingAllLangs_True').is(':checked');
                        var dropdownlist = $("#SelectedLanguages").data("kendoMultiSelect");
                        if (dropdownlist !== null) { dropdownlist.enable(!showAllLangsSelected); }


                        $('#prefLangs').on('change', 'input:radio', function () {
                            var showAllLangs = $('#IsSearchShowingAllLangs_True').is(':checked');
                            dropdownlist.enable(!showAllLangs);
                        });

                        //if yes to this we want to enable
                        var showAllDVDs = $('#IsSearchShowingAllDvdBluRayRegions_True').is(':checked');
                        if (!showAllDVDs) {
                            $('.videoRegions .regions input').removeProp('disabled');
                        }
                        else {
                            $('.videoRegions .regions input').prop('disabled', true);
                        }

                        $('input[name="IsSearchShowingAllDvdBluRayRegions"]').on('change', function () {

                            showAllDVDs = $('#IsSearchShowingAllDvdBluRayRegions_True').is(':checked');
                            if (!showAllDVDs) {
                                $('.videoRegions .regions input').removeProp('disabled');
                            }
                            else {
                                $('.videoRegions .regions input').prop('disabled', true);
                            }
                        });



                    });
                }
                ,
                UpdateSearchShowingAllRights: function (value) {
                    //$.post(
                    //    '/Account/UpdateSearchShowingAllRights',
                    //    { 'value': value },
                    //    function (data) {
                    //        if (!data.success)
                    //            gardners.processStandardAjaxResponse(data);
                    //        else
                    //            location.reload();
                    //    });
                }
                ,
                UpdateSearchShowingAllLangs: function (value) {
                    $.post(
                        '/Account/UpdateSearchShowingAllLangs',
                        { 'value': value },
                        function (data) {
                            if (!data.success)
                                gardners.processStandardAjaxResponse(data);
                            else
                                location.reload();
                        });
                },
                UpdateSearchShowingAllDvdBluRayRegion: function (value) {
                    $.post(
                        '/Account/UpdateSearchShowingAllDvdBluRayRegion',
                        { 'value': value },
                        function (data) {
                            if (!data.success)
                                gardners.processStandardAjaxResponse(data);
                            else
                                location.reload();
                        });
                }
                ,
                UpdateSearchShowingAdultTitles: function (value) {
                    $.post(
                        '/Account/UpdateSearchShowingAdultTitles',
                        { 'value': value },
                        function (data) {
                            if (!data.success)
                                gardners.processStandardAjaxResponse(data);
                            else
                                location.reload();
                        });
                },
                UpdateSearchShowingRentalTitles: function (value) {
                    $.post(
                        '/Account/UpdateSearchShowingRentalTitles',
                        { 'value': value },
                        function (data) {
                            if (!data.success)
                                gardners.processStandardAjaxResponse(data);
                            else
                                location.reload();
                        });
                }
                ,
                updatePreferencesComplete: function (customData, data, status, xhr) {
                    gardners.processStandardAjaxResponse(data, "", customData);
                    if (data.success) {
                        location.reload();
                    }
                }
            };
            return that;
        }()
        ,
        printSettings: function () {
            var _settings = { maxImageSizeBytes: 0 };
            var _controls = { grid: '', customerWndw: '' };

            var that = {
                init: function (settings, controls) {
                    _settings = settings;
                    _controls = controls;
                    $(document).ready(function () {
                        var uploadButton = $("#logoFile").closest(".k-upload-button");
                        uploadButton.addClass("btn-white").removeClass("k-button");
                        uploadButton.find("span").html("<span class=\"icon-rightChevron icon\"><span class=\"icon-text\">Select a Logo</span>");
                    });
                }
                ,
                clearSummaryErrors: function () {
                    $('.validation-summary-valid').hide();
                    $('.validation-summary-valid ul').empty();
                    $('.validation-summary-errors').hide();
                    $('.validation-summary-errors ul').empty();
                }
                ,
                accountValidateLogo: function (e) {

                    that.clearSummaryErrors();
                    let ok = true;
                    let maxSizeKiloBytes = _settings.maxImageSizeBytes / 1000.00;
                    let errorMessage = "Images must be .jpg or .gif or .png of maximum " + maxSizeKiloBytes + "kb</li></ul>"
                    $(".logoSummary").addClass("validation-summary-valid").removeClass("validation-summary-errors");
                    $(".logoSummary").empty();

                    $.each(e.files, function (index, value) {
                        if (value.size == undefined) {
                            ok = false;
                            errorMessage = "There was a problem with the file - 0 bytes"
                            return;
                        }
                        else if ((value.extension.toUpperCase() !== ".JPG" && value.extension.toUpperCase() !== ".GIF" && value.extension.toUpperCase() !== ".PNG") || e.files[index].size > _settings.maxImageSizeBytes) { ok = false; }
                    });

                    if (!ok) {
                        e.preventDefault();
                        $(".logoSummary").append("<ul><li>" + errorMessage + "</li></ul>");
                        $(".logoSummary").removeClass("validation-summary-valid").addClass("validation-summary-errors").show();
                    }
                }
                ,
                accountLogoSuccess: function (result) {
                    $('#logoPanel').resetValidation('#logoPanel');

                    $('#logoImg').attr('src', result.response.logoUrl).show();

                    $(".k-upload-files").delay(1600).slideUp("normal", function () {
                        $(this).remove();
                    });

                    // gardners.processStandardAjaxResponse({ success: true, message: '', messages: ['Logo update successful'] });
                    //var popupNotification = kendo.ui.getNotification();
                    //popupNotification.show('Logo update successful', "success");



                }
                ,
                accountLogoError: function (result) {

                    gardners.processStandardAjaxResponse({ success: false, message: '', messages: [result.XMLHttpRequest.responseText] });

                    $(".k-upload-files").delay(1600).slideUp("normal", function () {
                        $(this).remove();
                    });
                }

            };
            return that;
        }()
        ,
        userManagement: function () {
            var _settings = { delUrl: '', editUrl: '', addUrl: '', editUserPwdUrl: '', currentUserShowingDiscount: false };
            var _controls = { butAdd: '', grid: '', userWndw: '', userWndwTarget: '', userPWWndw: '', userPWWndwTarget: '' };
            var that =
            {
                init: function (settings, controls) {
                    _settings = settings;
                    _controls = controls;
                    $(document).ready(function () {
                        $(_controls.butAdd).on("click", function (e) {
                            that.addUser();
                        });
                    });
                }
                ,
                clearSummaryErrors: function () {
                    $('.validation-summary-errors').hide();
                    $('.validation-summary-errors ul').empty();
                }
                ,
                refreshUserManagement: function () {
                    var grid = gardners.kendoHelpers.getGrid(_controls.grid);
                    grid.dataSource.read();

                }
                ,
                addUser: function () {
                    that.clearSummaryErrors();
                    $(_controls.userWndw).resetValidation(_controls.userWndw);
                    $.ajax({
                        type: "GET",
                        url: _settings.addUrl,
                        success: function (data) {
                            if (data.hasOwnProperty('success') && !data.success) {

                                gardners.processStandardAjaxResponse(data);
                            }
                            else {
                                $(_controls.userWndwTarget).html(data);
                                $.validator.unobtrusive.parse($(_controls.userWndwTarget).find('form'));
                                gardners.kendoHelpers.setKendoWindowTitle(_controls.userWndw, 'Add User');
                                that.openUserWindow();
                                gardners.layout.tooltips();

                            }
                        }

                    });
                }
                ,
                editUser: function (ele) {
                    that.clearSummaryErrors();
                    var Id = $(ele).data("id");
                    var username = $(ele).data("val");
                    $(_controls.userWndw).resetValidation(_controls.userWndw);
                    $.ajax({
                        type: "GET",
                        data: {
                            id: Id
                        },
                        url: _settings.editUrl,
                        success: function (data) {

                            if (data.hasOwnProperty('success') && !data.success) {

                                gardners.processStandardAjaxResponse(data);
                            }
                            else {
                                $(_controls.userWndwTarget).html(data);
                                $.validator.unobtrusive.parse($(_controls.userWndwTarget).find('form'));
                                gardners.kendoHelpers.setKendoWindowTitle(_controls.userWndw, 'Edit ' + unescape(username));
                                that.openUserWindow();
                                gardners.layout.tooltips();
                            }
                        }

                    });
                }
                ,
                openUserWindow: function ()
                {
                    var win = gardners.kendoHelpers.getKendoWindow(_controls.userWndw);
                    win.center().open();
                }
                ,

                popupPin: function () {
                    $("#Pin").val("");
                    gardners.kendoHelpers.openKendoWindow("#k-wndw-pin");
                    $("#k-wndw-pin").resetValidation("#k-wndw-pin");

                }
                ,
                verifyPinComplete: function (customData, data, status, xhr) {

                    $("#StatementPin").val("");
                    if (data.success === false) {
                        gardners.processStandardAjaxResponse(data, null, customData);
                    }
                    else {
                        $("#StatementPin").val($("#Pin").val());
                        $("input[name='CanViewStatements']").removeAttr("disabled");
                        $("input[name='CanViewStatements'][value='False']").attr("checked", false);
                        $("input[name='CanViewStatements'][value='True']").attr("checked", true);
                        $(".verifPin").text("Click update to activate this feature");
                        $("#butVerifyPin").hide();
                        gardners.kendoHelpers.closeKendoWindow('#k-wndw-pin');
                        gardners.kendoHelpers.showSuccessNotification("Activation code verified");
                    }

                }
                ,
                discountChange: function (ele) {
                    _settings.currentUserShowingDiscount = $(ele).val().toLowerCase();
                }
                ,
                syncShowDiscount: function () {
                    if ($("#Self").val().toLowerCase() === "true") {
                        document.documentElement.setAttribute("is-showing-discount", _settings.currentUserShowingDiscount);
                    }
                }
                ,
                updateMyDetailsOnSuccess: function (customData, data, status, xhr) {

                    if (data.hasOwnProperty("success")) {
                        gardners.processStandardAjaxResponse(data);
                        $('html, body').animate({ scrollTop: parseInt($(".userDetails legend").offset().top) });
                    }
                    else {

                        $("#mydetails").html(data);
                        this.updateMyDetailsComplete();
                    }

                }
                ,
                updateMyDetailsComplete: function () {

                    var isValid = ($(".userDetails").find(".field-validation-error").length === 0);
                    if (isValid === true) {
                        that.syncShowDiscount();
                        gardners.kendoHelpers.showSuccessNotification("User updated");
                    }
                    else {
                        gardners.kendoHelpers.showSuccessNotification("Failed to update user");
                    }
                }
                ,
                updateUserOnSuccess: function (customData, data, status, xhr) {

                    if (data.hasOwnProperty("success")) {
                        gardners.processStandardAjaxResponse(data, "userSummary");
                    }
                    else {
                        $("#addEditUserDetails").html(data);
                        that.updateUserComplete();
                    }

                }

                ,
                updateUserComplete: function () {

                    var successMessage = "User updated";
                    var failMessage = "Failed to update user";

                    if (parseInt($("#UserIdNumber").val()) == -1) {
                        successMessage = "User created";
                        failMessage = "Failed to create user";
                    }


                    var isValid = ($(".userDetails").find(".field-validation-error").length == 0);
                    if (isValid == true) {
                        that.syncShowDiscount();
                        that.refreshUserManagement();
                        gardners.kendoHelpers.closeKendoWindow(_controls.userWndw);
                        gardners.kendoHelpers.showSuccessNotification(successMessage);
                    }
                    else {

                        gardners.kendoHelpers.showSuccessNotification(failMessage);
                    }

                }
                ,
                onOpenUser: function (e) {
                 
                    $(_controls.userWndw).css({ "padding-bottom": "0px" }); //, { "max-height": "700px" }, {"max-width":"700px"});
                    var win = this;
                    var height = $(window).height();
                    height = height - 100; //* 0.96;
                    $(_controls.userWndw).css("height", height + "px");
                    win.wrapper.css({ top: 5 });
                    $(_controls.userWndw).animate({ scrollTop: 0 }, "fast");

       
                    //$(win.wrapper).innerHeight(height + "px");
                    //height = height  * 0.85;
                    //var innerWrapper = $(win.wrapper).find(".userManagement");
                    //innerWrapper.css({ "height": height + "px" });
                    //innerWrapper.addClass("scrollY");
      
                    gardners.kendoHelpers.onWindowOpen(e);
                }
                ,  
                onCloseUser: function () {
                    gardners.kendoHelpers.onWindowClose();
                    gardners.kendoHelpers.clearSelection(_controls.grid);
                    $(_controls.userWndw).css({ "padding-bottom": "8px" });
                    //var win = this;
                    //var innerWrapper = $(win.wrapper).find(".userManagement");
                    //innerWrapper.removeClass("scrollY");

                }
                ,
                changePasswordForUser: function (ele) {
                    that.clearSummaryErrors();
                    var Id = $(ele).data("id");
                    var username = $(ele).data("val");
                    $(_controls.userPWWndw).resetValidation(_controls.userPWWndw);
                    $.ajax({
                        type: "GET",
                        data: {
                            id: Id
                        },
                        url: _settings.editUserPwdUrl,
                        success: function (data) {

                            if (data.hasOwnProperty('success') && !data.success) {
                                gardners.processStandardAjaxResponse(data);
                            }
                            else {
                                $(_controls.userPWWndwTarget).html(data);
                                $.validator.unobtrusive.parse($(_controls.userPWWndw).find('form'));
                                gardners.kendoHelpers.setKendoWindowTitle(_controls.userPWWndw, 'Change Password for ' + unescape(username));
                                gardners.kendoHelpers.openKendoWindow(_controls.userPWWndw);
                            }
                        }

                    });
                }
                ,
                changePasswordForUserComplete: function (customData, data, status, xhr) {

                    if (data.success === false) {
                        gardners.processStandardAjaxResponse(data, customData.targetElement, customData);
                    }
                    else {

                        gardners.kendoHelpers.showSuccessNotification(data.messages[0]);
                        gardners.kendoHelpers.closeKendoWindow(_controls.userPWWndw);
                    }
                }
                ,
                deleteUser: function (id) {
                    that.clearSummaryErrors();
                    $.when(gardners.kendoHelpers.PopupYesNoDialog.show({ title: "Confirm user deletion", message: "Are you sure you want to delete this user?" }))
                        .done(function (response) {
                            if (response.button === "Yes") {
                                $.post(
                                    _settings.delUrl,
                                    { 'UserIdNumber': id },
                                    function (data) {
                                        if (data.success === false)
                                            gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                                        else {
                                            that.refreshUserManagement();
                                            gardners.kendoHelpers.showSuccessNotification(data.messages[0]);
                                        }

                                    }
                                );

                            }
                            else gardners.kendoHelpers.clearSelection(_controls.grid);
                        });

                }
                ,
                changePasswordComplete: function (customData, data, status, xhr) {
                    if (data.success) {
                        $("#frmChangePwd")[0].reset();
                    }
                    gardners.ajaxComplete(customData, data, status, xhr);
                }
                ,
                bindToolTips: function () {
                    gardners.layout.tooltips();
                }
            };
            return that;
        }()
        ,
        backorders: function () {
            var _settings = { ean: '', cancelBackorderUrl: '', homeDeliveryDetailsUrl: '', singleTitleUrl: '', allBackorders: '', accountBackordersDownload: '', duesNumber: 0, backorderStatusNormal: 0, backorderStatusHomeDel: 0, backorderStatusComplete: 0, canCancel: false };
            var _controlIds = { gridBackorders: '', gridBackordersRecentlyReleased: '', gridBackordersRecentlyCompleted: '', gridBackordersRecentlyDeleted: '', ancClearBackorderSearch: '', btnSearch: '', ean: '', reference: '', backOrderType: '', homeDeliveryWindow: '', productWindow: '' };
            var _defaultGridParams = { reset: false, pageNumber: 1, pageSize: 30, sort: [] };
            var that =
            {
                  init: function (options, controls,defaultGridParams) {

                    _settings = options;
                    _controlIds = controls;
                    _defaultGridParams = defaultGridParams;
                    $(document).ready(function () {

                        //via ean in url
                        if ($.trim($(_controlIds.ean).val()).length > 0 || $.trim(_settings.ean).length > 0) {
                            if ($.trim(_settings.ean).length > 0) {
                                gardners.kendoHelpers.clearTextBoxes();
                                gardners.kendoHelpers.setDropDownListValue(_controlIds.backOrderType, _settings.allBackorders);
                                $(_controlIds.ean).val(_settings.ean);
                                _defaultGridParams.reset = true;
                            }
                            that.filterBackorders();
                        }
                        else {
                            /* var gridActive = gardners.kendoHelpers.getGrid(_controlIds.gridBackorders);
                             var gridRecentlyReleased = gardners.kendoHelpers.getGrid(_controlIds.gridBackordersRecentlyReleased);
                             var gridRecentlyCompleted = gardners.kendoHelpers.getGrid(_controlIds.gridBackordersRecentlyCompleted);
                             var gridRecentlyDeleted = gardners.kendoHelpers.getGrid(_controlIds.gridBackordersRecentlyDeleted);
                             var jsonActiveOptions = gridActive.getOptions();
                             var jsonRecentlyReleasedOptions = gridRecentlyReleased.getOptions();
                             var jsonRecentlyCompletedOptions = gridRecentlyCompleted.getOptions();
                             var jsonRecentlyDeletedOptions = gridRecentlyDeleted.getOptions();
                             jsonActiveOptions.autoBind = true;
                             gridActive.setOptions(jsonActiveOptions);
                             jsonRecentlyReleasedOptions.autoBind = true;
                             gridRecentlyReleased.setOptions(jsonRecentlyReleasedOptions);
                             jsonRecentlyCompletedOptions.autoBind = true;
                             gridRecentlyCompleted.setOptions(jsonRecentlyCompletedOptions);
                             jsonRecentlyDeletedOptions.autoBind = true;
                             gridRecentlyDeleted.setOptions(jsonRecentlyDeletedOptions);*/

                            _defaultGridParams.reset = false;
                            that.loadGridState(_controlIds.gridBackorders);
                            that.loadGridState(_controlIds.gridBackordersRecentlyReleased);
                            that.loadGridState(_controlIds.gridBackordersRecentlyCompleted);
                            that.loadGridState(_controlIds.gridBackordersRecentlyDeleted);
                            that.filterBackorders();
                        }

                        $(_controlIds.ancClearBackorderSearch).on("click", function (e) {
                            _defaultGridParams.reset = true;
                            gardners.kendoHelpers.clearGridState(_controlIds.gridBackorders);
                            gardners.kendoHelpers.clearGridState(_controlIds.gridBackordersRecentlyReleased);
                            gardners.kendoHelpers.clearGridState(_controlIds.gridBackordersRecentlyCompleted);
                            gardners.kendoHelpers.clearGridState(_controlIds.gridBackordersRecentlyDeleted);
                            that.clearFilters();
                        });
                        $(_controlIds.btnSearch).on("click", function (e) {
                            _defaultGridParams.reset = true;
                            that.filterBackorders();
                        });
                        $(_controlIds.homeDeliveryWindow).data("kendoWindow").bind("close", that.onCloseHomeDelivery);

                        $('.autoFilter').keypress(function (e) {
                            if (e.which === 13) {
                                e.preventDefault();
                                that.filterBackorders();
                                return false;    //<---- Add this line
                            }
                        });

                        $(document).on('click', '.webOnlyAccountActiveOrderFalse', function (e) {
                            gardners.basket._invokedByCreateNewActiveBasketRedirectFromBackorders = true;
                            gardners.basket.common.openNewBasketPopup(false);
                        });

                        gardners.kendoHelpers.attachKendoGridPagerClick(_controlIds.gridBackorders);
                        gardners.kendoHelpers.attachKendoGridPagerClick(_controlIds.gridBackordersRecentlyReleased);
                        gardners.kendoHelpers.attachKendoGridPagerClick(_controlIds.gridBackordersRecentlyCompleted);
                        gardners.kendoHelpers.attachKendoGridPagerClick(_controlIds.gridBackordersRecentlyDeleted);
                    });
                }
                ,
                cancelBackorderButton: function (isFirmSale, backorderStatus, backorderNumber) {

                    if (isFirmSale) { return "Please Call"; }
                    var onClick = "return false;";
                    var buttonText = "Cancelled";
                    var className = "tooltip backorderCancelDisabled";
                    var tooltip = "This title has been cancelled from your backorders";
                    if (backorderStatus == _settings.backorderStatusNormal || backorderStatus === _settings.backorderStatusHomeDel) {

                        buttonText = "Cancel";
                        if (_settings.canCancel) {
                            tooltip = "Cancel this Backorder";
                            onClick = "gardners.kendoHelpers.selectGridRow('kgrid-backorders', this);gardners.account.backorders.confirmBackorderCancellation(" + backorderNumber + ");";
                            className = "tooltip";
                            return "<a class=\"" + className + "\" data-tooltip=\"" + tooltip + "\" href=\"javascript:void(0);\" onclick=\"" + onClick + "\"><span>" + buttonText + "</span></a>";
                        }
                        else {
                            tooltip = "Your user profile prohibits the cancellation of Backorders";
                            return "<a class=\"" + className + "\" data-tooltip=\"" + tooltip + "\" href=\"javascript:void(0);\" onclick=\"" + onClick + "\"><span>" + buttonText + "</span></a>";

                        }
                    }
                    else if (backorderStatus == _settings.backorderStatusComplete) {
                        buttonText = "Complete";

                    }
                }
                ,
                backordersDatabound: function (e) {
                    gardners.account.common.onDataBoundTooltips();
                    gardners.account.common.bindImageTooltips();
                    $('ul.k-tabstrip-items > li.k-item:eq(0)').html("<span class=\"k-link\">Active (<span class=\"tots\">" + e.sender.dataSource._total + "</span>)</span>");
                    gardners.kendoHelpers.saveGridState(_controlIds.gridBackorders);

                }
                ,
                backordersRecentlyreleasedDatabound: function (e) {
                    gardners.account.common.onDataBoundTooltips();
                    gardners.account.common.bindImageTooltips();
                    $('ul.k-tabstrip-items > li.k-item:eq(1)').html("<span class=\"k-link\">Recently Released (<span class=\"tots\">" + e.sender.dataSource._total + "</span>)</span>");
                    gardners.kendoHelpers.saveGridState(_controlIds.gridBackordersRecentlyReleased);
                }
                ,
                backordersRecCompDatabound: function (e) {
                    gardners.account.common.onDataBoundTooltips();
                    gardners.account.common.bindImageTooltips();
                    $('ul.k-tabstrip-items > li.k-item:eq(2)').html("<span class=\"k-link\">Recently Completed (<span class=\"tots\">" + e.sender.dataSource._total + "</span>)</span>");
                    gardners.kendoHelpers.saveGridState(_controlIds.gridBackordersRecentlyCompleted);
                }
                ,
                backordersRecDelDatabound: function (e) {
                    gardners.account.common.onDataBoundTooltips();
                    gardners.account.common.bindImageTooltips();
                    $('ul.k-tabstrip-items > li.k-item:eq(3)').html("<span class=\"k-link\">Recently Deleted (<span class=\"tots recentlyDeleted\">" + e.sender.dataSource._total + "</span>)</span>");
                    gardners.kendoHelpers.saveGridState(_controlIds.gridBackordersRecentlyDeleted);
                }
                ,
                loadGridState: function (gridId) {

                    var grid = gardners.kendoHelpers.getGrid(gridId);
                    var options = localStorage["kendo-grid-options" + grid.element[0].id];
                    if (options) {
                        //fish out filter options and repopulate text inputs
                        var jsonOptions = JSON.parse(options);
                        var currFilterObj = jsonOptions.dataSource.filter;
                        var currentFilters = currFilterObj ? currFilterObj.filters : [];
                        if (currentFilters && currentFilters.length > 0) {
                            gardners.kendoHelpers.loadGridState(gridId);
                            that.setIsFilteredRow(currentFilters.length);
                            that.parseFilters(currentFilters);
                        }
                    }
                }
                ,
                clearFilters: function () {

                    gardners.kendoHelpers.clearTextBoxes();
                    gardners.kendoHelpers.setDropDownListValue(_controlIds.backOrderType, _settings.allBackorders);
                    that.filterBackorders();
                }

                ,
                filterBackorders: function () {
                    that.clearSummaryErrors();

                    $filter = new Array();

                    if ($(_controlIds.ean).val()) {

                        var isbn = $(_controlIds.ean).val();
                        $isbnFilter = { logic: "or", filters: [] };
                        if ($.trim(isbn).length === 3) {
                            $isbnFilter.filters.push({ field: "ISBN10", operator: "startswith", value: isbn.substring(0, 3) });
                        }
                        else {
                            $isbnFilter.filters.push({ field: "EAN", operator: "eq", value: isbn });
                        }
                        $filter.push($isbnFilter);
                    }


                    if ($(_controlIds.reference).val()) {
                        $filter.push({ field: "Reference", operator: "eq", value: $(_controlIds.reference).val() });
                    }

                    $filter.push({ field: "BackorderType", operator: "eq", value: gardners.kendoHelpers.getDropDownListValue(_controlIds.backOrderType) });


                    /*
                    This is what we are trying to achieve:
                    Autobind of grids have been disabled initial loading is done from document.ready with a call to this function.
                    Grid reads should happen once per grid.
                    Grids are rebound from local storage should it exist using the following options:
                    Filters
                    Sorts
                    PageNumber
                    PageSize

                    It is possible there are 
                    No filters 
                    No sorts.

                    Should the Search button be clicked filters will be applied from the search fields if populated, pageNumber will default to 1 pagesize will default to that specified in the application default sort.
                    Should the clear button be clicked NO filters will be applied from the search fields, pageNumber will default to 1 pagesize will default to that specified in the application default sort.

                    Clicking on the Backorders link should reapply what was in local storage. i.e paging, sorting and filters
                    Navigating away from the page and clicking the Backorders link should do as above
                    Navigating away from the page and clicking back should show the page in the last state.
                    In order to achieve this we have moved away from datasource.filter to datasource.query utilising the necessary parameters.
                     
                    */

                    var grid = gardners.kendoHelpers.getGrid(_controlIds.gridBackorders);
                    var sort = _defaultGridParams.reset ? _defaultGridParams.sort : grid.dataSource._sort;
                    var pageNo = _defaultGridParams.reset ? _defaultGridParams.pageNumber : grid.dataSource._page;
                    var pageSize = _defaultGridParams.reset ? _defaultGridParams.pageSize : grid.dataSource._pageSize;

                    grid.dataSource.query({ sort: sort, page: pageNo, pageSize: pageSize, filter: $filter });

                    grid = gardners.kendoHelpers.getGrid(_controlIds.gridBackordersRecentlyReleased);
                    sort = _defaultGridParams.reset ? _defaultGridParams.sort : grid.dataSource._sort;
                    pageNo = _defaultGridParams.reset ? _defaultGridParams.pageNumber : grid.dataSource._page;
                    pageSize = _defaultGridParams.reset ? _defaultGridParams.pageSize : grid.dataSource._pageSize;
                    grid.dataSource.query({ sort: sort, page: pageNo, pageSize: pageSize, filter: $filter });
                    //grid.dataSource.filter($filter);

                    grid = gardners.kendoHelpers.getGrid(_controlIds.gridBackordersRecentlyCompleted);
                    sort = _defaultGridParams.reset ? _defaultGridParams.sort : grid.dataSource._sort;
                    pageNo = _defaultGridParams.reset ? _defaultGridParams.pageNumber : grid.dataSource._page;
                    pageSize = _defaultGridParams.reset ? _defaultGridParams.pageSize : grid.dataSource._pageSize;
                    grid.dataSource.query({ sort: sort, page: pageNo, pageSize: pageSize, filter: $filter });
                    //grid.dataSource.filter($filter);

                    grid = gardners.kendoHelpers.getGrid(_controlIds.gridBackordersRecentlyDeleted);
                    sort = _defaultGridParams.reset ? _defaultGridParams.sort : grid.dataSource._sort;
                    pageNo = _defaultGridParams.reset ? _defaultGridParams.pageNumber : grid.dataSource._page;
                    pageSize = _defaultGridParams.reset ? _defaultGridParams.pageSize : grid.dataSource._pageSize;
                    grid.dataSource.query({ sort: sort, page: pageNo, pageSize: pageSize, filter: $filter });
                    //grid.dataSource.filter($filter);

                    that.setIsFilteredRow($filter.length);

                }
                ,
                setIsFilteredRow: function (filterLength) {

                    var display = "none";
                    var backOrderType = gardners.kendoHelpers.getDropDownListValue(_controlIds.backOrderType);
                    if (filterLength > 1 || backOrderType != "0") {
                        display = "block";
                    }
                    $(".isFiltered").css({ display, display });
                }
                ,
                showSingleTitle: function (ean) {
                    that.clearSummaryErrors();

                    gardners.account.common.showSingleTitle(ean, ean, _settings.singleTitleUrl, ".productDetails", _controlIds.productWindow);

                }
                ,
                viewHomeDelivery: function (ean, backorderNumber) {

                    that.clearSummaryErrors();
                    $.post(
                        _settings.homeDeliveryDetailsUrl,
                        { 'backorderNumber': backorderNumber },
                        function (data) {
                            if (data.success === false) {

                                if (data.messages) { data.messages[0] = "Unable to retrieve Home Delivery details for ISBN/Barcode " + ean; }
                                gardners.processStandardAjaxResponse(data);
                            }
                            else {

                                $(".homeDeliveryDetails").html(data);
                                //gardners.kendoHelpers.setKendoWindowTitle(_controlIds.homeDeliveryWindow, "Home Delivery Details:" + ean);
                                gardners.kendoHelpers.openKendoWindow(_controlIds.homeDeliveryWindow);
                            }
                        });
                }
                ,
                onCloseHomeDelivery: function () {
                    gardners.kendoHelpers.clearSelection(_controlIds.gridBackorders);
                }
                ,
                confirmBackorderCancellation: function (duesNumber) {
                    gardners.kendoHelpers.openKendoWindow("k-window-cancelbackup");
                    _settings.duesNumber = duesNumber;
                }
                ,
                cancelBackorderConfirm: function () {
                    _settings.duesNumber = 0;
                    gardners.kendoHelpers.clearSelection(_controlIds.gridBackorders);
                    gardners.kendoHelpers.closeKendoWindow("k-window-cancelbackup");
                }
                ,
                cancelBackorder: function () {
                    that.clearSummaryErrors();
                    $.post(
                        _settings.cancelBackorderUrl,
                        { 'duesNumber': _settings.duesNumber },
                        function (data) {
                            if (data.success === false) {
                                gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                            }
                            else {
                                $(_controlIds.gridBackorders).data("kendoGrid").dataSource.read();
                                gardners.kendoHelpers.showSuccessNotification(data.messages[0]);
                            }
                            gardners.kendoHelpers.closeKendoWindow("k-window-cancelbackup");
                        });
                }
                ,
                clearSummaryErrors: function () {
                    $('.validation-summary-errors').hide();
                    $('.validation-summary-errors ul').empty();
                }
                ,
                titleTooltips: function () {
                    $(_controlIds.gridBackorders).kendoTooltip({
                        show: function (e) {
                            if (this.content.text().length > 40) {
                                this.content.parent().css("visibility", "visible");
                            }
                        },
                        hide: function (e) {
                            this.content.parent().css("visibility", "hidden");
                        },
                        filter: "td:nth-child(3)", //this filter selects the first column cells
                        position: "top",
                        content: function (e) {
                            var dataItem = $(_controlIds.gridBackorders).data("kendoGrid").dataItem(e.target.closest("tr"));
                            var content = dataItem.Title;
                            return content;
                        }
                    }).data("kendoTooltip");
                }
                ,
                download: function (ele) {

                    var downloadType = gardners.kendoHelpers.getDropDownListText("DownloadCategory");
                    var total = $(".totalQuantity").text();

                    if (downloadType.indexOf("Active") === -1) {
                        total = $(".recentlyDeleted").text();
                    }

                    var message = "No " + downloadType + " Backorders found to download";
                    if ($.trim(total).length === 0) {
                        gardners.kendoHelpers.PopupAlertDialog.show({ title: "Download Backorders", message: message });
                        return $(".recentlyDeleted").text();
                    }
                    else if (parseInt(total) < 1) {
                        gardners.kendoHelpers.PopupAlertDialog.show({ title: "Download Backorders", message: message });
                        return;
                    }

                    //var grid = $(_controlIds.gridBackorders).data("kendoGrid");
                    //var dataSource = grid.dataSource;

                    //if (dataSource._total == 0) {
                    //    gardners.kendoHelpers.PopupAlertDialog.show({ title: "Download Backorders", message: "No Backorders found to download" });
                    //    return;
                    //}

                    //$("#d" + _controlIds.ean.substring(1)).val("");
                    //$("#d" + _controlIds.reference.substring(1)).val("");
                    //$("#d" + _controlIds.backOrderType.substring(1)).val("");
                    //var currFilterObj = dataSource.filter();
                    //var currentFilters = currFilterObj ? currFilterObj.filters : [];

                    //if (currentFilters && currentFilters.length > 0) {
                    //    that.parseFilters(currentFilters,true);
                    //}

                    gardners.account.common.download(ele, _settings.accountBackordersDownload, true);

                }
                ,
                parseFilters: function (currentFilters, isDownload) {


                    //RECURSIVE FUNCTION TO PARSE GRID FILTERS
                    for (var i = 0; i < currentFilters.length; i++) {
                        if (currentFilters[i].filters) {
                            that.parseFilters(currentFilters[i].filters, isDownload);
                        }
                        switch (currentFilters[i].field) {
                            case "EAN":
                                if (isDownload) {
                                    $("#d" + _controlIds.ean.substring(1)).val(currentFilters[i].value);
                                }
                                else {
                                    $(_controlIds.ean).val(currentFilters[i].value);
                                }
                                break;
                            case "Reference":
                                if (isDownload) {
                                    $("#d" + _controlIds.reference.substring(1)).val(currentFilters[i].value);
                                }
                                else {
                                    $(_controlIds.reference).val(currentFilters[i].value);
                                }
                                break;
                            case "BackorderType":
                                if (isDownload) {
                                    $("#d" + _controlIds.backOrderType.substring(1)).val(currentFilters[i].value);
                                }
                                else {

                                    $(_controlIds.backOrderType).data("kendoDropDownList").value(currentFilters[i].value);
                                }
                                break;
                        }
                    }
                }

            };

            return that;
        }()
        ,
        backordershomedelivery: function () {
            var _settings = { selectedBackorderNumber: '', hdTrackingUrl: '' };
            var that =
            {
                init: function (options) {
                    _settings = options;
                    $(document).ready(function () {
                    });
                }
                ,
                grid_databound: function (e) {
                    var grid = this;
                    $.each(grid.tbody.find('tr'), function () {
                        var model = grid.dataItem(this);
                        if ($.trim(model.BackorderNumber) === $.trim(_settings.selectedBackorderNumber)) {//some condition
                            $(this).removeClass("k-alt");
                            grid.select(this);
                        }
                    });
                }
                ,
                trackHomeDelivery: function (ele) {

                    $.post(
                        _settings.hdTrackingUrl
                        , { 'ParcelNumber': $(ele).data("parcelnumber"), "CarrierCode": $(ele).data("carriercode") }
                        , function (data) {
                            if (data.success === false)
                                gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                            else {
                                gardners.account.common.trackParcel(data);
                            }

                        });
                }
            }
            return that;
        }()
        ,
        orderEnquiryOrderDetails: function () {
            var _settings = { singleTitleUrl: '' };
            var _controlIds = { productWindow: '', gridOrderDetails: '' };
            var that =
            {
                init: function (options, controls) {
                    _settings = options;
                    _controlIds = controls;
                    $(document).ready(function () {
                        //GWEB-1118 that.loadGridState();
                        gardners.kendoHelpers.attachKendoGridPagerClick(_controlIds.gridOrderDetails);
                    });
                }

                ,
                loadGridState: function () {
                    gardners.kendoHelpers.loadGridState(_controlIds.gridOrderDetails);
                }
                ,
                orderEnquiryDetailsDatabound: function (e) {
                    gardners.account.common.onDataBoundTooltips();
                    //GWEB-1118 gardners.kendoHelpers.saveGridState(_controlIds.gridOrderDetails);
                    gardners.account.common.bindImageTooltips();
                }
                ,
                showSingleTitle: function (ean) {
                    //that.clearSummaryErrors();
                    $.post(

                        _settings.singleTitleUrl,
                        { 'path': ean },
                        function (data) {
                            if (data.success === false) {

                                if (data.messages) { data.messages[0] = "Unable to retrieve product for ISBN/Barcode " + ean; }
                                gardners.processStandardAjaxResponse(data);
                            }
                            else {
                                $(".productDetails").html(data);
                                //hookup single title events
                                $("#jq-dropdown-addToBasket").attr("data-ean", ean);

                                //gardners.basket.common.bindAddToTypes();
                                gardners.kendoHelpers.setKendoWindowTitle(_controlIds.productWindow, gardners.kendoHelpers.formatEAN(ean));
                                gardners.kendoHelpers.openKendoWindow(_controlIds.productWindow);
                                //gardners.basket.common.bindAddToBasketButton();
                                gardners.basket.common.bindAddToBasket();
                            }
                        });
                }

            };
            return that;
        }()
        ,
        orderEnquiry: function () {
            var _settings = {ean:0, homeDeliveryDetailsUrl: '' };
            var _controlIds = { gridOrders: '', ancClearOrderEnquirySearch: '', btnSearch: '', ean: '', customerOrderReference: '', orderId: '', sopOrderNumber: '', dateFrom: '', dateTo: '' };
            var _values = { dateFrom: '', dateTo: '' };
            var that =
            {
                init: function (options, controls) {

                    _settings = options;
                    _controlIds = controls;
                    $(document).ready(function () {

                        //via ean in url
                        if ($.trim($(_controlIds.ean).val()).length > 0 || parseInt(_settings.ean) > 0) {
                            if (parseInt(_settings.ean) > 0) {
                                gardners.kendoHelpers.clearDatePickers();
                                gardners.kendoHelpers.clearTextBoxes();
                                _values.dateFrom = '';
                                _values.dateTo = '';
                                $(_controlIds.ean).val(_settings.ean);
                            }
                            that.filterOrderEnquiry();
                        }
                        else {
                            var grid = gardners.kendoHelpers.getGrid(_controlIds.gridOrders);
                            var jsonOptions = grid.getOptions();
                            jsonOptions.autoBind = true;
                            grid.setOptions(jsonOptions);
                            that.loadGridState(_controlIds.gridOrders);
                            grid.dataSource.read();
                        }
                        

                        $(_controlIds.ancClearOrderEnquirySearch).on("click", function (e) {
                            gardners.kendoHelpers.clearGridState(_controlIds.gridOrders);
                            that.clearFilters();
                        });

                        $(_controlIds.btnSearch).on("click", function (e) {
                            that.filterOrderEnquiry();
                        });


                        $('.autoFilter').keypress(function (e) {
                            if (e.which === 13) {
                                e.preventDefault();
                                that.filterOrderEnquiry();
                                return false;    //<---- Add this line
                            }
                        });

                       
                        gardners.kendoHelpers.setDatePickerPlaceholder();
                        gardners.kendoHelpers.attachKendoGridPagerClick(_controlIds.gridOrders);

                    });
                }
                ,
                loadGridState: function () {
                    gardners.kendoHelpers.loadGridState(_controlIds.gridOrders);
                    var grid = gardners.kendoHelpers.getGrid(_controlIds.gridOrders);
                    var options = localStorage["kendo-grid-options" + grid.element[0].id];
                    if (options) {
                        //fish out filter options and repopulate text inputs
                        var jsonOptions = JSON.parse(options);
                        if (jsonOptions !== null)
                        {
                            if (jsonOptions.dataSource.filter)
                            {
                               $.each(jsonOptions.dataSource.filter.filters, function (k, filter) {
                                    if (!filter.field && $.isArray(filter.filters)) {
                                        _values.dateFrom = filter.filters[0].value;
                                        _values.dateTo = filter.filters[1].value;
                                        gardners.kendoHelpers.parseSetDatePickerValuesFromGridFilters(_controlIds.dateFrom, _controlIds.dateTo, filter);
                                    }
                                    else {
                                        switch (filter.field.toLowerCase()) {
                                            case "orderdate":
                                                if (filter.operator == "gte") {
                                                    _values.dateFrom = filter.value;
                                                    gardners.kendoHelpers.parseSetDatePickerValueFromGridFilter(_controlIds.dateFrom, filter.value);
                                                }
                                                if (filter.operator == "lte") {
                                                    _values.dateTo = filter.value;
                                                    gardners.kendoHelpers.parseSetDatePickerValueFromGridFilter(_controlIds.dateTo, filter.value);
                                                }
                                                break;
                                            case _controlIds.orderId.split("_").pop().toLowerCase():
                                                $(_controlIds.orderId).val(filter.value);
                                                break;
                                            case _controlIds.ean.split("_").pop().toLowerCase():
                                                $(_controlIds.ean).val(filter.value);
                                                break;
                                            case "reference":
                                                $(_controlIds.customerOrderReference).val(filter.value);
                                                break;
                                        }
                                    }

                                });
                            }
                           
                        }

                    }
                }
                ,
                orderEnquiryDatabound: function (e) {
                    gardners.account.common.onDataBoundTooltips();
                    gardners.kendoHelpers.saveGridState(_controlIds.gridOrders);
                }
                ,
                dateFromChange: function () {
                    _values.dateFrom = this.value();// kendo.toString(this.value(), 'd')
                }
                ,
                dateToChange: function () {
                    _values.dateTo = this.value();
                }
                ,
                clearFilters: function () {
                    _values.dateFrom = '';
                    _values.dateTo = '';
                    gardners.kendoHelpers.clearNumericTextBoxes();
                    gardners.kendoHelpers.clearDatePickers();
                    gardners.kendoHelpers.clearTextBoxes();
                    that.filterOrderEnquiry();
                }
                ,
                filterOrderEnquiry: function () {

                    $(".invalidDates").html("");
                    that.clearSummaryErrors();
                    $filter = new Array();

                    if ($(_controlIds.ean).val()) {
                        $filter.push({ field: "EAN", operator: "eq", value: $(_controlIds.ean).val() });
                    }


                    if ($(_controlIds.customerOrderReference).val()) {
                        $filter.push({ field: "Reference", operator: "startswith", value: $(_controlIds.customerOrderReference).val() });
                    }


                    if (!gardners.account.common.validateDatesForFilters(_controlIds.dateFrom.substring(1), _controlIds.dateTo.substring(1))) {
                        return;
                    }

                    if (_values.dateFrom != null && _values.dateTo != null && $.trim(_values.dateFrom) !== "" && $.trim(_values.dateTo) !== "") {

                        $filter.push({ logic: "and", filters: [{ field: "OrderDate", operator: "gte", value: _values.dateFrom }, { field: "OrderDate", operator: "lte", value: _values.dateTo }] });
                    }
                    else {
                        if (_values.dateFrom != null && $.trim(_values.dateFrom) !== "") {
                            $filter.push({ field: "OrderDate", operator: "gte", value: _values.dateFrom });
                        }

                        if (_values.dateTo != null && $.trim(_values.dateTo) !== "") {
                            $filter.push({ field: "OrderDate", operator: "lte", value: _values.dateTo });
                        }
                    }

                    gardners.kendoHelpers.getGrid(_controlIds.gridOrders).dataSource.filter($filter);

                }

                ,
                clearSummaryErrors: function () {
                    $('.validation-summary-errors').hide();
                    $('.validation-summary-errors ul').empty();
                }
            };
            return that;
        }()
        ,
        orderEnquiryHomeDelivery: function () {
            var _settings = { homeDeliveryDetailsUrl: '' };
            var _controlIds = { gridHDOrders: '', ancClearOrderEnquirySearch: '', btnSearch: '', ean: '', customerOrderReference: '', orderId: '', sopOrderNumber: '', dateFrom: '', dateTo: '' };
            var _values = { dateFrom: '', dateTo: '' };
            var that =
            {
                init: function (options, controls) {

                    _settings = options;
                    _controlIds = controls;
                    $(document).ready(function () {

                        //via ean in url
                        if ($.trim($(_controlIds.ean).val()).length > 0 || parseInt(_settings.ean) > 0) {
                            if (parseInt(_settings.ean) > 0) {
                                gardners.kendoHelpers.clearDatePickers();
                                gardners.kendoHelpers.clearTextBoxes();
                                _values.dateFrom = '';
                                _values.dateTo = '';
                                $(_controlIds.ean).val(_settings.ean);
                            }
                            that.filterOrderEnquiry();
                        }
                        else {
                            var grid = gardners.kendoHelpers.getGrid(_controlIds.gridHDOrders);
                            var jsonOptions = grid.getOptions();
                            jsonOptions.autoBind = true;
                            grid.setOptions(jsonOptions);
                            that.loadGridState(_controlIds.gridOrders);
                            grid.dataSource.read();
                            
                        }

                        $(_controlIds.ancClearOrderEnquirySearch).on("click", function (e) {
                            gardners.kendoHelpers.clearGridState(_controlIds.gridHDOrders);
                            that.clearFilters();
                        });

                        $(_controlIds.btnSearch).on("click", function (e) {
                            that.filterOrderEnquiry();
                        });

                        $('.autoFilter').keypress(function (e) {
                            if (e.which === 13) {
                                e.preventDefault();
                                that.filterOrderEnquiry();
                                return false;    //<---- Add this line
                            }
                        });

                        gardners.kendoHelpers.setDatePickerPlaceholder();
                        gardners.kendoHelpers.attachKendoGridPagerClick(_controlIds.gridHDOrders);

                    });
                }
                ,
                loadGridState: function () {

                    gardners.kendoHelpers.loadGridState(_controlIds.gridHDOrders);
                    var grid = gardners.kendoHelpers.getGrid(_controlIds.gridHDOrders);
                    var options = localStorage["kendo-grid-options" + grid.element[0].id];
                    if (options) {
                        //fish out filter options and repopulate text inputs
                        var jsonOptions = JSON.parse(options);
                        if (jsonOptions !== null) {
                            if (jsonOptions.dataSource.filter) {
                                  $.each(jsonOptions.dataSource.filter.filters, function (k, filter) {
                                    if (!filter.field && $.isArray(filter.filters)) {
                                        _values.dateFrom = filter.filters[0].value;
                                        _values.dateTo = filter.filters[1].value;
                                        gardners.kendoHelpers.parseSetDatePickerValuesFromGridFilters(_controlIds.dateFrom, _controlIds.dateTo, filter);

                                    }
                                    else {
                                        switch (filter.field.toLowerCase()) {
                                            case "orderdate":
                                                if (filter.operator == "gte") {
                                                    _values.dateFrom = filter.value;
                                                    gardners.kendoHelpers.parseSetDatePickerValueFromGridFilter(_controlIds.dateFrom, filter.value);
                                                }
                                                if (filter.operator == "lte") {
                                                    _values.dateTo = filter.value;
                                                    gardners.kendoHelpers.parseSetDatePickerValueFromGridFilter(_controlIds.dateTo, filter.value);
                                                }
                                                break;
                                            case _controlIds.orderId.split("_").pop().toLowerCase():
                                                $(_controlIds.orderId).val(filter.value);
                                                break;
                                            case _controlIds.ean.split("_").pop().toLowerCase():
                                                //case _controlIds.ean.substring(1).toLowerCase():
                                                $(_controlIds.ean).val(filter.value);
                                                break;
                                            case "reference":
                                                $(_controlIds.customerOrderReference).val(filter.value);
                                                break;
                                        }
                                    }

                                });
                            }
                        }

                    }
                }
                ,
                orderHomeDelEnquiryDatabound: function (e) {
                    gardners.account.common.onDataBoundTooltips();
                    gardners.kendoHelpers.saveGridState(_controlIds.gridHDOrders);
                }
                ,
                orderHomeDeliveryDetailsDatabound: function (e) {
                    gardners.account.common.bindImageTooltips();
                }
                ,
                dateFromChange: function () {
                    _values.dateFrom = this.value();// kendo.toString(this.value(), 'd')
                }
                ,
                dateToChange: function () {
                    _values.dateTo = this.value();
                }
                ,
                clearFilters: function () {
                    _values.dateFrom = '';
                    _values.dateTo = '';
                    gardners.kendoHelpers.clearNumericTextBoxes();
                    gardners.kendoHelpers.clearDatePickers();
                    gardners.kendoHelpers.clearTextBoxes();
                    that.filterOrderEnquiry();
                }
                ,
                filterOrderEnquiry: function () {

                    $(".invalidDates").html("");
                    that.clearSummaryErrors();
                    $filter = new Array();

                    if ($(_controlIds.ean).val()) {
                        $filter.push({ field: "EAN", operator: "eq", value: $(_controlIds.ean).val() });
                    }


                    if ($(_controlIds.customerOrderReference).val()) {
                        $filter.push({ field: "Reference", operator: "startswith", value: $(_controlIds.customerOrderReference).val() });
                    }


                    if (!gardners.account.common.validateDatesForFilters("DateFrom", "DateTo")) {
                        return;
                    }

                    if (_values.dateFrom !== null && _values.dateTo != null && $.trim(_values.dateFrom) !== "" && $.trim(_values.dateTo) !== "") {

                        $filter.push({ logic: "and", filters: [{ field: "OrderDate", operator: "ge", value: _values.dateFrom }, { field: "OrderDate", operator: "le", value: _values.dateTo }] });
                    }
                    else {
                        if (_values.dateFrom !== null && $.trim(_values.dateFrom) !== "") {
                            $filter.push({ field: "OrderDate", operator: "ge", value: _values.dateFrom });
                        }

                        if (_values.dateTo !== null && $.trim(_values.dateTo) !== "") {
                            $filter.push({ field: "OrderDate", operator: "le", value: _values.dateTo });
                        }
                    }

                    gardners.kendoHelpers.getGrid(_controlIds.gridHDOrders).dataSource.filter($filter);
                }
                ,
                clearSummaryErrors: function () {
                    $('.validation-summary-errors').hide();
                    $('.validation-summary-errors ul').empty();
                }
            };
            return that;
        }()
        ,
        credits: function () {
           // var _settings = { viewUrl: '' };
            var _controlIds = { gridCreditNotes: '', creditNoteNumber: '', dateFrom: '', dateTo: '', btnSearch: '', ancClear: '' };
            var _values = { dateFrom: '', dateTo: '' };
            var that =
            {
                init: function (controls) {

                    //_settings = options;
                    _controlIds = controls;
                    $(document).ready(function () {
                        $(_controlIds.ancClear).on("click", function (e) {
                            that.clearFilters();
                        });
                        $(_controlIds.btnSearch).on("click", function (e) {
                            that.filterCreditNotes();
                        });

                        $('.autoFilter').keypress(function (e) {
                            if (e.which == 13) {
                                e.preventDefault();
                                that.filterCreditNotes();
                                return false;    //<---- Add this line
                            }
                        });
                        gardners.kendoHelpers.setDatePickerPlaceholder();
                        gardners.kendoHelpers.attachKendoGridPagerClick(_controlIds.gridCreditNotes);
                        that.loadGridState();
                    });
                }
                ,
                loadGridState: function () {


                    var grid = gardners.kendoHelpers.getGrid(_controlIds.gridCreditNotes);
                    var options = localStorage["kendo-grid-options" + grid.element[0].id];
                    if (options) {
                        //fish out filter options and repopulate text inputs
                        var jsonOptions = JSON.parse(options);
                        if (jsonOptions !== null && jsonOptions.dataSource.filter) {
                            gardners.kendoHelpers.loadGridState(_controlIds.gridCreditNotes);
                            $.each(jsonOptions.dataSource.filter.filters, function (k, filter) {

                                if (!filter.field && $.isArray(filter.filters)) {
                                    gardners.kendoHelpers.parseSetDatePickerValuesFromGridFilters(_controlIds.dateFrom, _controlIds.dateTo, filter);

                                }
                                else {

                                    switch (filter.field) {

                                        case _controlIds.creditNoteNumber.substring(1):
                                            gardners.kendoHelpers.setNumericTextBoxValue(_controlIds.creditNoteNumber, filter.value);
                                            break;
                                    }
                                }

                            });
                        }
                    }
                }
                ,
                onDatabound: function () {
                    gardners.kendoHelpers.saveGridState(_controlIds.gridCreditNotes);

                }
                ,
                dateFromChange: function () {

                    _values.dateFrom = this.value();// kendo.toString(this.value(), 'd')

                }
                ,
                dateToChange: function () {
                    _values.dateTo = this.value();
                }
                ,
                clearFilters: function () {
                    gardners.kendoHelpers.clearNumericTextBoxes();
                    gardners.kendoHelpers.clearDatePickers();
                    _values.dateFrom = '';
                    _values.dateTo = ''
                    that.filterCreditNotes();
                }
                ,
                filterCreditNotes: function () {
                    gardners.utils.resetValSummary();
                    $(".invalidDates").html("");
                    $filter = new Array();

                    var creditNoteNumber = gardners.kendoHelpers.getNumericTextBoxValue(_controlIds.creditNoteNumber);

                    if ($.trim(creditNoteNumber) != "") {
                        $filter.push({ field: "CreditNoteNumber", operator: "eq", value: creditNoteNumber });
                    }


                    if (!gardners.account.common.validateDatesForFilters("CreditDateFrom", "CreditDateTo")) {
                        return;
                    }

                    if (_values.dateFrom !== null && _values.dateTo !== null && $.trim(_values.dateFrom) !== "" && $.trim(_values.dateTo) !== "") {

                        $filter.push({ logic: "and", filters: [{ field: "CreditDate", operator: "gte", value: _values.dateFrom }, { field: "CreditDate", operator: "lte", value: _values.dateTo }] });
                    }
                    else {
                        if (_values.dateFrom !== null && $.trim(_values.dateFrom) !== "") {
                            $filter.push({ field: "CreditDate", operator: "gte", value: _values.dateFrom });
                        }

                        if (_values.dateTo !== null && $.trim(_values.dateTo) !== "") {
                            $filter.push({ field: "CreditDate", operator: "lte", value: _values.dateTo });
                        }
                    }

                    var grid = gardners.kendoHelpers.getGrid(_controlIds.gridCreditNotes);
                    grid.dataSource.filter($filter);

                }
            };
            return that;
        }()
        ,
        statements: function () {
            var that =
            {
                updateComplete: function (customData, data, status, xhr) {

                    if (data.success == false) {
                        gardners.processStandardAjaxResponse(data, "Summary", customData);
                    }
                    else {
                        gardners.kendoHelpers.showSuccessNotification(data.messages[0]);
                        location.reload();
                    }

                }
            }
            return that;
        }()
        ,
        invoices: function () {
            //var _settings = { viewUrl: '' };
            var _controlIds = { gridInvoices: '', gridInvoicesSolr: '', invoiceNumber: '', dateFrom: '', dateTo: '', ean: '', reference: '', title: '', btnSearch: '', ancClear: '', invoices: '', solrInvoices: ''};
            var _values = { dateFrom: '', dateTo: '' };
            var _settings  = { ean:0};
            var _isSolrSearch = false;
            var _filtered = false;
            var that =
            {
                init: function (settings,controls) {

                    _settings = settings;
                    _controlIds = controls;
                    $(document).ready(function () {
                        
                        if ($.trim($(_controlIds.ean).val()).length > 0 || parseInt(_settings.ean) > 0) {
                           that.filterInvoices();
                        }
                        else
                        {
                            var gridInvoices = gardners.kendoHelpers.getGrid(_controlIds.gridInvoices);
                            var gridInvoicesSolr = gardners.kendoHelpers.getGrid(_controlIds.gridInvoicesSolr);
                            var jsonOptions = gridInvoices.getOptions();
                            var jsonOptionsSolr = gridInvoicesSolr.getOptions();
                            jsonOptions.autoBind = true;
                            gridInvoices.setOptions(jsonOptions);
                            jsonOptionsSolr.autoBind = true;
                            gridInvoicesSolr.setOptions(jsonOptionsSolr);
                            _filtered = false;
                            that.loadGridState(_controlIds.gridInvoices);
                            that.loadGridState(_controlIds.gridInvoicesSolr);
                            if (_filtered) {
                                that.filterInvoices();
                            }
                        }

                        $(_controlIds.ancClear).on("click", function (e) {
                            gardners.kendoHelpers.clearGridState(_controlIds.gridInvoices);
                            gardners.kendoHelpers.clearGridState(_controlIds.gridInvoicesSolr);
                            that.clearFilters();
                        });
                        $(_controlIds.btnSearch).on("click", function (e) {
                            var grid = gardners.kendoHelpers.getGrid(_controlIds.gridInvoices);
                            grid.dataSource.data([]);
                            localStorage.removeItem("kendo-grid-options" + grid.element[0].id);

                            grid = gardners.kendoHelpers.getGrid(_controlIds.gridInvoicesSolr);
                            grid.dataSource.data([]);
                            localStorage.removeItem("kendo-grid-options" + grid.element[0].id);

                            that.filterInvoices();
                        });

                        $('.autoFilter').keypress(function (e) {
                            if (e.which == 13) {
                                e.preventDefault();
                                that.filterInvoices();
                                return false;    //<---- Add this line
                            }
                        });
                        that.setGridView();
                        gardners.kendoHelpers.setDatePickerPlaceholder();
                        gardners.kendoHelpers.attachKendoGridPagerClick(_controlIds.gridInvoices);
                        gardners.kendoHelpers.attachKendoGridPagerClick(_controlIds.gridInvoicesSolr);
                    });
                }
                ,
                loadGridState: function (gridId) {
                    //set flag to show the correct grid also set in parsefilters
                    _isSolrSearch = false;
                    gardners.kendoHelpers.loadGridState(gridId);
                    // if ($('#hasFilteredKendoGrid').val() === 'true') {
                    var grid = gardners.kendoHelpers.getGrid(gridId);
                    var options = localStorage["kendo-grid-options" + grid.element[0].id];
                    if (options) {
                        //fish out filter options and repopulate text inputs
                        var jsonOptions = JSON.parse(options);
                        if (jsonOptions !== null) {
                            if (jsonOptions.dataSource.filter) {
                                _filtered = true;
                                var currFilterObj = jsonOptions.dataSource.filter;
                                var currentFilters = currFilterObj ? currFilterObj.filters : [];
                                if (currentFilters && currentFilters.length > 0) {
                                    that.parseFilters(currentFilters);
                                }
                            }
                            else
                            {
                                   grid.dataSource.read();
                            }
                        }

                    }
                }
                ,
                parseFilters: function (currentFilters) {
                    //RECURSIVE FUNCTION TO PARSE GRID FILTERS
                    for (var i = 0; i < currentFilters.length; i++) {
                        if (currentFilters[i].filters) {
                            that.parseFilters(currentFilters[i].filters);
                        }

                        if (!currentFilters[i].field && $.isArray(currentFilters[i].filters))
                        {
                            _values.dateFrom = currentFilters[i].filters[0].value;
                            _values.dateTo = currentFilters[i].filters[1].value;
                            gardners.kendoHelpers.parseSetDatePickerValuesFromGridFilters(_controlIds.dateFrom, _controlIds.dateTo, currentFilters[i]);
                        }
                        else {
                            switch (currentFilters[i].field) {
                                case "InvoiceDate":
                                    if (currentFilters[i].operator == "gte") {
                                        _values.dateFrom = currentFilters[i].value;
                                        gardners.kendoHelpers.parseSetDatePickerValueFromGridFilter(_controlIds.dateFrom, currentFilters[i].value);
                                    }
                                    if (currentFilters[i].operator == "lte") {
                                        _values.dateTo = currentFilters[i].value;
                                        gardners.kendoHelpers.parseSetDatePickerValueFromGridFilter(_controlIds.dateTo, currentFilters[i].value);
                                    }
                                    break;
                                case "InvoiceNumber":
                                    gardners.kendoHelpers.setNumericTextBoxValue(_controlIds.invoiceNumber, currentFilters[i].value);
                                    break;
                                case "EAN":
                                    $(_controlIds.ean).val(currentFilters[i].value);
                                    _isSolrSearch = true;
                                    break;
                                case "Reference":
                                    $(_controlIds.reference).val(currentFilters[i].value);
                                    _isSolrSearch = true;
                                    break;
                                case "Title":
                                    $(_controlIds.title).val(currentFilters[i].value);
                                    _isSolrSearch = true;
                                    break;
                            }
                        }
                    }
                }
                ,
                dateFromChange: function () {
                    _values.dateFrom = this.value();// kendo.toString(this.value(), 'd')
                }
                ,
                dateToChange: function () {
                    _values.dateTo = this.value();
                }
                ,
                clearFilters: function () {
                    $(".invalidDates").html("");
                    gardners.kendoHelpers.clearNumericTextBoxes();
                    gardners.kendoHelpers.clearDatePickers();
                    gardners.kendoHelpers.clearTextBoxes();
                    _values.dateFrom = '';
                    _values.dateTo = '';
                    var grid = gardners.kendoHelpers.getGrid(_controlIds.gridInvoices);
                    grid.dataSource.filter([]);
                    $(_controlIds.invoices).show();
                    $(_controlIds.solrInvoices).hide();
                }
                ,
                filterInvoices: function () {
                    gardners.utils.resetValSummary();
                    $(".invalidDates").html("");
                    _isSolrSearch = false;
                    $filter = new Array();

                    var invoiceNumber = $(_controlIds.invoiceNumber).val();

                    //gardners.kendoHelpers.getNumericTextBoxValue(_controlIds.invoiceNumber);

                    if ($.trim(invoiceNumber) !== "") {
                        $filter.push({ field: "InvoiceNumber", operator: "eq", value: invoiceNumber });
                    }


                    if (!gardners.account.common.validateDatesForFilters("InvoiceDateFrom", "InvoiceDateTo")) {
                        return;
                    }

                    if (_values.dateFrom != null && _values.dateTo !== null && $.trim(_values.dateFrom) !== "" && $.trim(_values.dateTo) !== "") {

                        $filter.push({ logic: "and", filters: [{ field: "InvoiceDate", operator: "gte", value: _values.dateFrom }, { field: "InvoiceDate", operator: "lte", value: _values.dateTo }] });
                    }
                    else {
                        if (_values.dateFrom !== null && $.trim(_values.dateFrom) !== "") {
                            $filter.push({ field: "InvoiceDate", operator: "gte", value: _values.dateFrom });
                        }

                        if (_values.dateTo !== null && $.trim(_values.dateTo) !== "") {
                            $filter.push({ field: "InvoiceDate", operator: "lte", value: _values.dateTo });
                        }
                    }

                    if ($.trim($(_controlIds.ean).val()).length > 0) {
                        _isSolrSearch = true;
                        $filter.push({ field: "EAN", operator: "eq", value: $(_controlIds.ean).val() });
                    }

                    if ($.trim($(_controlIds.reference).val()).length > 0) {
                        _isSolrSearch = true;
                        $filter.push({ field: "Reference", operator: "contains", value: $(_controlIds.reference).val() });
                    }

                    if ($.trim($(_controlIds.title).val()).length > 0) {
                        _isSolrSearch = true;
                        $filter.push({ field: "Title", operator: "contains", value: $(_controlIds.title).val() });
                    }

                    var grid = null;
                    if (_isSolrSearch) {
                        grid = gardners.kendoHelpers.getGrid(_controlIds.gridInvoicesSolr);

                    }
                    else {
                        grid = gardners.kendoHelpers.getGrid(_controlIds.gridInvoices);
                    }

                    grid.dataSource.filter($filter);
                    that.setGridView();
                }
                ,
                setGridView: function () {
                    $(".k-grid").find(".k-grid-norecords").hide();
                    $(_controlIds.invoices).hide();
                    $(_controlIds.solrInvoices).hide();
                    if (_isSolrSearch) {
                        $(_controlIds.solrInvoices).show();
                    }
                    else {
                        $(_controlIds.invoices).show();
                    }
                }
                //,
                //viewInvoice: function (invoiceNumber) {
                //    // that.openViewer("I" + invoiceNumber);
                //    that.openInvoice("I" + invoiceNumber);
                //}
                //,
                //viewNonSuppliedItems: function (invoiceNumber) {
                //    //that.openViewer("N" + invoiceNumber);
                //    that.openInvoice("N" + invoiceNumber);
                //}
                //,
                //openInvoice: function (invoiceNumber) {
                //    window.open(_settings.viewUrl + "?Id=" + invoiceNumber, 'Invoice Viewer', 'left=20,top=20,height=800,width=1540,toolbar=0,resizable=1,status=0,scrollbars=1');
                //}
                //,
                //openViewer: function (invoiceNumber) {
                //    window.open(_settings.viewUrl + "?Id=" + invoiceNumber + "&SearcText=''&fo=true", 'Invoice Viewer', 'left=20,top=20,height=800,width=1540,toolbar=0,resizable=1,status=0,scrollbars=1');
                //}
                ,
                invoicesDatabound: function (e) {
                    gardners.account.common.bindImageTooltips();
                    gardners.layout.tooltips();
                    gardners.kendoHelpers.saveGridState("#" + e.sender.element.context.id);
                }

            };
            return that;
        }()
        ,
        mySearches: function () {
            var _settings = { deleteUrl: '' };
            var _controls = { editSearchName: '', grid: '' };
            var that =
            {

                init: function (settings, controls) {
                    _settings = settings;
                    _controls = controls;
                    $(document).ready(function () {
                        $("body").on("click", _controls.editSearchName, function (e) {
                            that.renameSearch($(this));
                        });

                    });
                }
                ,
                onWinClose: function (e) {
                    gardners.kendoHelpers.onWindowClose();
                    gardners.kendoHelpers.clearSelection(_controls.grid);
                }
                ,
                renameSearch: function (ele) {

                    gardners.kendoHelpers.selectGridRow(_controls.grid, ele);
                    $('#k-win-savesearch').resetValidation('#k-win-savesearch');
                    $('#k-win-savesearch .id').val($(ele).attr("data-id"));
                    var curentVal = unescape($(ele).attr("data-val"));
                    $('#k-win-savesearch .k-textbox').val(curentVal);
                    gardners.kendoHelpers.openKendoWindow('#k-win-savesearch');
                }
                ,

                renameSearchcomplete: function (customData, data, status, xhr) {

                    if (data.success === false)

                        gardners.processStandardAjaxResponse(data, customData.targetElement, customData);
                    else {
                        that.refreshMySearches(data.messages[0]);
                        gardners.kendoHelpers.closeKendoWindow('#k-win-savesearch');
                    }
                }
                ,
                refreshMySearches: function (message) {
                    $(_controls.grid).data("kendoGrid").dataSource.read();

                    gardners.kendoHelpers.showSuccessNotification(message);
                }
                ,
                deleteSearch: function (ele) {

                    var Id = $(ele).attr('data-val');
                    $.when(gardners.kendoHelpers.PopupYesNoDialog.show({ title: "Confirm saved search deletion", message: "Are you sure you want to delete this search?", buttonText: "Yes, delete the search" }))
                        .done(function (response) {
                            if (response.button === "Yes") {
                                $.post(
                                    _settings.deleteUrl
                                    , { 'Id': Id }
                                    , function (data) {
                                        if (data.success === false)
                                            gardners.processStandardAjaxResponse(data);
                                        else {
                                            that.refreshMySearches(data.messages[0]);

                                        }
                                    });
                            } else gardners.kendoHelpers.clearSelection(_controls.grid);
                        });

                }
                ,
                savesearch: function (e) {
                    $('#k-win-savesearch .k-textbox').val('');
                    $('#k-win-savesearch').resetValidation('#k-win-savesearch');
                    gardners.kendoHelpers.openKendoWindow('#k-win-savesearch');
                }
                ,
                savesearchcomplete: function (customData, data, status, xhr) {
                    if (data.success == false)
                        gardners.processStandardAjaxResponse(data, customData.targetElement, customData);
                    else {

                        gardners.kendoHelpers.closeKendoWindow("#k-win-savesearch");
                        gardners.kendoHelpers.showSuccessNotification(data.messages[0]);
                    }
                }
            };
            return that;
        }()
        ,
        parcelTracking: function () {

            var _settings = { trackingUrl: '' };
            var that =
            {
                init: function (options, controls) {
                    _settings = options;
                    $(document).ready(function () {
                        $("body").on("click", '.tracker', function (e) {
                            gardners.kendoHelpers.selectGridRow('kgrid-invoices', $(this));
                            that.pickOrTrack($(this).attr("data-id"), $(this), e);
                        });

                    });

                }
                ,
                closeTracker: function (e) {
                    gardners.kendoHelpers.clearSelection('kgrid-invoices');
                    gardners.kendoHelpers.onWindowClose(e);

                }
                ,
                pickOrTrack: function (invoiceNumber, ele, e) {
                    var wndw = gardners.kendoHelpers.getKendoWindow("k-parcel-picker");
                    if (!wndw.element.is(":hidden"))
                        wndw.close();

                    $.post(
                        _settings.trackingUrl
                        , { 'Id': invoiceNumber }
                        , function (data) {

                            if (data.success === false)
                                gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                            else {


                                var parcels = data.data.Parcels;

                                if ($.isArray(parcels)) {
                                    //if (parcels.length == 1 && $.trim(parcels[0].TrackingUrl)!="") {
                                    //      gardners.account.common.trackParcel(parcels[0].TrackingUrl);
                                    //  }
                                    //  else {
                                    //if (parcels.length > 1) {

                                    var $ul = $('ul.parcelList');
                                    $ul.empty();
                                    $("<li class=\"header\">Parcel Reference</li>").appendTo($ul);

                                    var parcel = "";
                                    $.each(parcels, function (i, val) {

                                        parcel = "<span class=\"icon-box icon\"></span><span class=\"icon-text\">" + parcels[i].ParcelNumber + "</span>";
                                        if ($.trim(parcels[i].TrackingUrl) != "") {
                                            parcel = parcel + "&nbsp;<a target=\"_blank\" href=\"" + parcels[i].TrackingUrl + "\")\">Track</a>";
                                        }

                                        $("<li>" + parcel + "</li>").appendTo($ul);

                                    });
                                    wndw.title("Parcels For Invoice Number: " + invoiceNumber);
                                    wndw.center().open();

                                    // }

                                    //}
                                }
                            }
                        });
                }

                ,
                closeWindow: function () {
                    $(window)[0].self.close();
                }
            };
            return that;
        }()
        ,
        returns: function () {

            var _settings = {};
            var _controlIds = { grid: '', returnDetailsGrid: '' };

            var that =
            {
                init: function (options, controls) {
                    _settings = options;
                    _controlIds = controls;
                    $(document).ready(function () {
                        that.loadGridState(_controlIds.grid);
                        gardners.kendoHelpers.attachKendoGridPagerClick(_controlIds.grid);
                    });
                }
                ,
                loadGridState: function () {
                    gardners.kendoHelpers.loadGridState(_controlIds.grid);
                }
                ,
                returnsDatabound: function (e) {
                    gardners.account.common.onDataBoundTooltips();
                    gardners.kendoHelpers.saveGridState(_controlIds.grid);
                }
                ,
                removeReturnDetailFromLocalStoreage: function (ele) {
                    //clear the local storage for return details so each time the grid item is clicked the grid is "new" not a version held in local storeage
                    localStorage.removeItem("kendo-grid-toolbar-options" + _controlIds.returnDetailsGrid);
                    localStorage.removeItem("kendo-grid-options" + _controlIds.returnDetailsGrid);
                    $(location).attr('href', $(ele).data("url"));
                }
            };

            return that;
        }()
        ,
        returnDetails: function () {

            var _settings = { singleTitleUrl: '', Id: '', displayType: '', accountReturnPdfDownload: '', accountReturnCSVDownload:'' };
            var _controlIds = { grid: '', productWindow: '', dType: '' };

            var that =
            {
                init: function (options, controls) {
                    _settings = options;
                    _controlIds = controls;
                    $(document).ready(function () {
                        that.loadGridState(_controlIds.grid);
                        gardners.kendoHelpers.attachKendoGridPagerClick(_controlIds.grid);
                    });
                }
                ,
                loadGridState: function () {
                    var toolBar = $(_controlIds.grid + " .k-grid-toolbar").html();
                    gardners.kendoHelpers.loadGridState(_controlIds.grid);
                    $(_controlIds.grid + " .k-grid-toolbar").html(toolBar);
                    $(_controlIds.grid + " .k-grid-toolbar").addClass("k-grid-top");
                    var dType = localStorage["kendo-grid-toolbar-options" + _controlIds.grid.substring(1)];
                    if (dType != null) {
                        var ddlInput = $(_controlIds.grid + " .k-grid-toolbar").find("#DisplayType");

                        ddlInput.val(dType);
                        _settings.displayType = dType;
                        $(_controlIds.dType).val(dType);
                        var grid = gardners.kendoHelpers.getGrid(_controlIds.grid);
                        grid.dataSource.read();
                    }
                }
                ,
                returnDetailsDatabound: function (e) {
                    gardners.account.common.onDataBoundTooltips();
                    gardners.account.common.bindImageTooltips();
                    gardners.kendoHelpers.saveGridState(_controlIds.grid);
                    if (e.sender.dataSource._data.length < 1) {
                        $("#btnDownloadCSV").addClass("disabled").prop("disabled", "disabled");
                        $("#btnDownload").addClass("disabled").prop("disabled", "disabled");
                    }
                    else {
                        $("#btnDownloadCSV").removeClass("disabled").prop("disabled", "");
                        $("#btnDownload").removeClass("disabled").prop("disabled", "");
                    }
                }
                ,
                changeDisplay: function (e) {

                    localStorage["kendo-grid-toolbar-options" + _controlIds.grid.substring(1)] = this.value();
                    _settings.displayType = this.value();
                    $(_controlIds.dType).val(this.value());
                    var grid = gardners.kendoHelpers.getGrid(_controlIds.grid);
                    grid.dataSource.read();
                }
                ,
                getAdditionalData: function () {
                    return { id: _settings.Id, displayType: _settings.displayType };
                }
                ,
                showSingleTitle: function (ean) {
                    gardners.account.common.showSingleTitle(ean, ean, _settings.singleTitleUrl, ".productDetails", _controlIds.productWindow);
                }
                ,
                downloadPDF: function (ele) {
                    gardners.account.common.setAssociatedButton("#btnDownloadCSV");
                    $("#btnDownloadCSV").addClass("disabled").prop("disabled", "disabled");
                    var action = $(ele).attr("data-action");
                    $("#frmDwn").attr("action", action);
                    $("#tk").val(gardners.account.common.uuidv4());
                    gardners.account.common.download(ele, _settings.accountReturnPdfDownload);
                }
                ,
                downloadReturnDetails: function (ele) {

                    gardners.account.common.setAssociatedButton("#btnDownload");
                    $("#btnDownload").addClass("disabled").prop("disabled", "disabled");
                    var action = $(ele).attr("data-action");
                    $("#frmDwn").attr("action", action);
                    $("#tk").val(gardners.account.common.uuidv4());
                    gardners.account.common.download(ele, _settings.accountReturnCSVDownload);
                }

            };
            return that;
        }()
        ,
        newReturn: function () {

            var _settings = { singleTitleUrl: '', returnItemDetailUrl: '', addReturnItemDetailUrl: '', updateReturnsUrl: '', submitReturnsUrl: '', returnItemsCount: 0, currentWindow: null };
            var _controlIds = { gridReturnItems: '', Ean: '', Isbn: '', ReturnQuantity: '', Title: '', Format: '', Price: '', productWindow: '', chkRemoveAll: '', removeListClass: '' };
            var that =
            {
                init: function (options, controls) {
                    _settings = options;
                    _controlIds = controls;
                    $(document).ready(function () {

                        $(_controlIds.Ean).change(function (e) {
                            that.getReturnItemDetail();
                        });
                       
                        $(_controlIds.chkRemoveAll).on("click", function (e) {
                            var checked = $(this).prop("checked");
                            $(_controlIds.removeListClass).each(function () {
                                $(this).prop("checked", checked);
                            });
                        });

                        //$("body").on("keypress keyup blur", '.numeric', function (event) {
                        //    $(this).val($(this).val().replace(/[^\d].+/, ""));
                        //    if ((event.which < 48 || event.which > 57)) {
                        //        event.preventDefault();
                        //    }
                        //});
                        $("#ReturnQuantity").on("blur", function (event) {
                            $('.messageSummary').hide();
                            if (parseInt(that.validateQuantity($(this))) > 0) that.showSingleItemError("Quantity must be between 1 and 100");
                        });

                        $("body").on("blur", '#kgrid-returnitems .numeric', function (event) {

                            if (parseInt(that.validateQuantity($(this))) > 0) $('.gridError').show();
                        });

                        //$('.cp').on("click", function (e) {
                        //    that.showUP();
                        //    kendo.ui.closeKendoWindow('#CandP');
                        //});
                        //$('.upload').on("click", function (e) {
                        //    that.showCP();
                        //    kendo.ui.closeKendoWindow('#fileupwndw');
                        //});


                    });
                }
               
                ,
                showSingleItemError: function (message) {
                    var summary = $("#singleItemSummary").find("ul");
                    if (summary.length > 0) {
                        $(summary).addClass("validation-summary-errors alert alert-danger").removeClass("validation-summary-valid");
                        $(summary).append("<li>" + message + "</li>");

                    }
                }
                ,
                getReturnItemDetail: function () {

                    that.clearSummaryErrors();
                    var Ean = $(_controlIds.Ean).val();

                    if ($.trim(Ean).length > 9) {
                        $.post(_settings.returnItemDetailUrl, { Ean: Ean }, function (data) {
                            if (data.success === false) {
                               gardners.processStandardAjaxResponse(data, '');
                            }
                            if (data.data !== null) {
                                $(_controlIds.Ean).val(data.data.EAN?data.data.EAN:data);
                                $(_controlIds.Isbn).val(data.data.ISBN);
                                $(_controlIds.Title).val(data.data.Title);
                                $(_controlIds.Price).val(data.data.Price);
                                $(_controlIds.Format).val(data.data.Format);
                            }
                            $(_controlIds.ReturnQuantity).val(data.data.ReturnQuantity);
                        });
                    }
                    else {
                        that.showSingleItemError("ISBN/Barcode is required");
                    }
                }
                ,
                clearSummaryErrors: function () {
                    var summary = $("#singleItemSummary").find(".validation-summary-errors");
                    if (summary.length > 0) {
                        $(summary).removeClass("validation-summary-errors alert alert-danger").addClass("validation-summary-valid");
                        $(summary).find("ul").empty();
                    }
                }
                ,
                addItemToReturnList: function () {
                    that.clearSummaryErrors();
                    var Ean = $(_controlIds.Ean).val();
                    var qValid = true;
                    if (parseInt(that.validateQuantity($(_controlIds.ReturnQuantity))) > 0) {
                        qValid = false;
                        that.showSingleItemError("Quantity must be between 1 and 100");
                        return;
                    }

                    if ($.trim(Ean).length > 9 && qValid) {
                        $.post(_settings.addReturnItemDetailUrl,
                            {
                                EAN: $(_controlIds.Ean).val(),
                                ISBN: $(_controlIds.Isbn).val(),
                                Title: $(_controlIds.Title).val(),
                                Price: $(_controlIds.Price).val(),
                                Format: $(_controlIds.Format).val(),
                                ReturnQuantity: $(_controlIds.ReturnQuantity).val()
                            }, function (data) {

                                if (data.success === false) {
                                   
                                    gardners.processStandardAjaxResponse({ success: false, messages: data.messages }, 'singleItemSummary');
                                    return;
                                } else {
                                    //REFRESH DATASOURCE
                                    $(_controlIds.Ean).val('');
                                    $(_controlIds.Isbn).val('');
                                    $(_controlIds.Title).val('');
                                    $(_controlIds.Price).val('');
                                    $(_controlIds.Format).val('');
                                    $(_controlIds.ReturnQuantity).val('1');
                                    that.refreshGrid();
                                    that.notify(data.success);
                                }
                            });
                    }
                    else {
                        that.showSingleItemError("ISBN/Barcode is required");
                    }
                }
                ,

                updateGrid: function () {

                    var isValid = false;
                    var gridIsValid = false;
                    var message = "";
                    var returnItems = that.populateReturnList();

                    if (returnItems === "{\"returnItems\":[]}" || $.isArray(returnItems) && returnItems.length === 0) {
                        message = "No items found in the list";
                    }
                    isValid = ($.trim(message) === "");
                    gridIsValid = that.gridIsValid();
                    if (isValid && gridIsValid) {
                        $.ajax({
                            url: _settings.updateReturnsUrl,
                            async: false,
                            type: "POST",
                            contentType: "application/json",
                            data: JSON.stringify({ 'returnItems': returnItems }),
                            success: function (data) {
                                if (data.success == false) {
                                    if ($.isArray(data.messages)) {
                                        gardners.kendoHelpers.PopupAlertDialog.show({ title: "Update Return List Submission", message: data.messages[0] });

                                        if (data.messages[0].indexOf('Corrupt') >= 0) {
                                            that.refreshGrid();
                                        }
                                    }
                                    else that.notify(data.success);

                                }
                                else {
                                    that.refreshGrid();
                                    that.notify(data.success);
                                }
                            }
                        });
                    }
                    else {
                        if (!gridIsValid) {
                            if ($.trim(message) != "") message += "<br>"
                            message += "Please correct any invalid quantities.";
                        }
                        gardners.kendoHelpers.PopupAlertDialog.show({ title: "Returns Submission List", message: message, buttonText: "Close and try again" });
                    }
                }
                ,
                submitBatch: function () {
                    that.clearSummaryErrors();
                    var isValid = false;
                    var gridIsValid = false;
                    var message = "";
                    $("#ReturnDescription").removeClass("field-validation-error").removeClass("input-validation-error");
                    var description = $("#ReturnDescription").val();
                    var returnItems = that.populateReturnList(description);
                    if ($.trim(description) == "") {
                        message = "Please enter a description";
                        $("#ReturnDescription").addClass("field-validation-error").addClass("input-validation-error");
                    }
                    if (returnItems === "{\"returnItems\":[]}" || $.isArray(returnItems) && returnItems.length === 0) {
                        if ($.trim(message) != "") message += "<br>";
                        message += "No items found in the list";
                    }
                    isValid = ($.trim(message) === "");
                    gridIsValid = that.gridIsValid();
                    if (isValid && gridIsValid) {
                        $('.messageSummary').hide();
                        $('.messageSummary').html('');
                        $('.messageSummary').removeClass('alert').removeClass('alert-danger');
                        $.ajax({
                            url: _settings.submitReturnsUrl,
                            async: false,
                            type: "POST",
                            contentType: "application/json",
                            data: JSON.stringify({ returnItems: returnItems, description: description }),
                            success: function (data) {

                                if (data.success === false) {
                                    if ($.isArray(data.messages)) {
                                        gardners.kendoHelpers.PopupAlertDialog.show({ title: "Update Return Description", message: data.messages[0], buttonText: "Close and try again" });

                                        if (data.messages[0].indexOf('Corrupt') >= 0 || data.messages[0].indexOf('No items found') >= 0) {
                                            that.refreshGrid();
                                        }
                                    }
                                }
                                else {

                                    if (data.success === true) {
                                        $("#ReturnDescription").val('');
                                        //document.getElementById('prefSummary').scrollIntoView(true);
                                        that.refreshGrid();
                                    }

                                    gardners.processStandardAjaxResponse({ success: data.success, messages: data.messages }, 'prefSummary');
                                }
                            }
                        });
                    }
                    else {
                        if (!gridIsValid) {
                            if ($.trim(message) != "") message += "<br>";
                            message += "Please correct any invalid quantities.";
                        }
                        gardners.kendoHelpers.PopupAlertDialog.show({ title: "Returns Submission List", message: message, buttonText: "Close and try again" });
                    }
                }
                ,
                gridIsValid: function () {
                    var invcount = 0;
                    $('.gridError').hide();
                    $('#kgrid-returnitems .numeric').each(function (index, value) {
                        $(this).removeClass("field-validation-error").removeClass("input-validation-error");
                        invcount += that.validateQuantity($(this));
                    });

                    if (invcount !== 0) $('.gridError').show();

                    return (invcount === 0);
                }
                ,
                validateQuantity: function (ele) {
                    var invcount = 0;
                    $(ele).removeClass("field-validation-error").removeClass("input-validation-error");
                    var val = $.trim($(ele).val());

                    if (val != "") val = parseInt(val);
                    if (val < 1 || val > 100) {
                        $(ele).addClass("field-validation-error").addClass("input-validation-error");
                        invcount = 1;
                    }

                    return invcount;
                }
                ,
                populateReturnList: function () {
                    var returnItems = [];
                    $('#kgrid-returnitems .numeric').each(function (index, value) {
                        returnItems.push({ Ean: $(this).attr("data-ean"), ReturnQuantity: parseInt($(this).val()), Remove: $('#chkRemove' + $(this).attr("data-ean")).prop('checked') });
                    });
                    return returnItems;
                }

                ,
                notify: function (success) {

                    if (success === true)
                        gardners.kendoHelpers.showSuccessNotification("Returns List updated")
                    else {
                        gardners.kendoHelpers.PopupAlertDialog.show({ title: "Returns list", message: "Failed to update Returns List" });
                    }
                }
                ,
                showSingleTitle: function (ean) {
                    gardners.account.common.showSingleTitle(ean, ean, _settings.singleTitleUrl, ".productDetails", _controlIds.productWindow, true);
                }
                ,
                formatPrice: function (price) {
                    var p = '';
                    if ($.trim(price) !== '') { p = parseFloat(price).toFixed(2); }
                    return p;
                }
                ,
                refreshGrid: function () {
                    $("#chkRemoveAll").prop("checked", false);
                    var grid = gardners.kendoHelpers.getGrid(_controlIds.gridReturnItems);
                    grid.dataSource.read();
                }
                ,
                gridDataBound: function (e) {
                    var grid = gardners.kendoHelpers.getGrid(_controlIds.gridReturnItems);
                    $('#kgrid-returnitems .itemCount').html(grid.dataSource.total());
                    gardners.account.common.bindImageTooltips();
                }
            };
            return that;
        }()
        ,
        common: function () {
            var _settings = { down: '',associatedButton:'' };
            var that =
                {
                
                setAssociatedButton: function(Id) {
                   _settings.associatedButton = Id;
                }
                    ,
                onDataboundTitleToolTip: function (e) {
                    gardners.kendoHelpers.longTextTooltip();
                    gardners.layout.tooltips();
                }
                ,
                bindImageTooltips: function () {
                    $(".jacketPreviewIcon").kendoTooltip({
                        show: function () {
                            gardners.kendoHelpers.repositionTooltip($(this)[0].popup.wrapper[0]);
                        }
                        ,
                        content: function (e) {
                            var target = e.target; // the element for which the tooltip is shown
                            var $container = $(target).find('[data-imagelocation]');
                            var imagelocation = $container.attr('data-imagelocation');
                            var result = '<img class="jacketPreviewContent" src="' + imagelocation + '">';
                            return result;
                        },
                        position: "right"
                    });
                }
                ,
                trackParcel: function (url) {
                    //like this so works in safari too. GWEB-585
                    var ele = document.getElementById("TrackMe");
                    if (ele === null) {
                        $("body").append("<a id=\"TrackMe\" target=\"_blank\" href=\"" + url + "\">.</a>");
                        ele = document.getElementById("TrackMe");
                    }
                    var cle = document.createEvent("MouseEvent");
                    cle.initEvent("click", true, true);
                    ele.dispatchEvent(cle);
                    $(ele).remove();
                }
                ,
                showSingleTitle: function (ean, title, url, target, wndw, showSmallProductImage) {

                    var postData = { 'path': ean };
                    if (showSmallProductImage !== null) {
                        postData = { 'path': ean, 'showSmallProductImage': true };
                    }


                    $.post(
                        url,
                        postData,
                        function (data) {

                            if (data.success === false) {

                                if (data.messages) { data.messages[0] = "Unable to retrieve product for ISBN/Barcode " + ean; }
                                gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                            }
                            else {

                                $(target).html(data);
                                gardners.kendoHelpers.setKendoWindowTitle(wndw, unescape(title));
                                gardners.kendoHelpers.openKendoWindow(wndw);
                                gardners.basket.common.bindAddToBasket();
                            }
                        });
                }
                ,
                onDataBoundTooltips: function (e) {
                    gardners.layout.tooltips();
                }
                ,
                download: function (ele, cookieName, userOriginalText) {
                    //var buttonText = $(ele).text();
                    var eleHtml = $(ele).html();
                    var text = "Downloading...";
                    if (userOriginalText) { text = $(ele).text(); }
                    gardners.kendoHelpers.setProcessRunningButton($(ele), text);
                    var frm = $(ele).closest('form');
                    $.removeCookie(cookieName, { path: '/' });
                    frm.submit();
                    _settings.down = setInterval(function () {
                        //monitor for existence of cookie 
                        var cookieValue = $.cookie(cookieName); // **uses jquery.cookie plugin
                        if (cookieValue == $("#tk").val()) {
                            $(ele).html(eleHtml);
                            $(ele).removeClass("disabled");
                            $(ele).prop("disabled", "");
                            if ($(ele).attr("data-associated") != null) {

                            }
                            //$(ele).html("<span class=\"icon-chevronDown icon\"></span><span class=\"icon-text\">"+ buttonText + "</span>");
                            $.removeCookie(cookieName, { path: '/' });
                            that.clear();
                            if ($.trim(_settings.associatedButton).length > 0) {
                                $(_settings.associatedButton).removeClass("disabled").prop("disabled", "");
                                _settings.associatedButton = "";
                            }
                        }
                    }, 3000);
                }
                ,
                clear: function () {
                    clearInterval(_settings.down);
                }
                ,
                initMenu: function () {

                    //var h = $('div.container').height();
                    //$('#menuWrapper').css({ height: h });

                    //var slide = kendo.fx($("#slideInMenu")).slideIn("left");

                    //var visible = true;

                    //$("#slideInMenuHandle").click(function (e) {
                    //    if (visible) {
                    //        slide.reverse();

                    //    } else {

                    //        slide.play();
                    //    }
                    //    visible = !visible;
                    //    e.preventDefault();
                    //});
                }
                ,
                validateDatesForFilters: function (dateFrom, dateTo) {

                    //this is used in OrderEnquiry, Invoices and Credits when we filter a grid we dont use a form but we still need to validate the dates so the user gets notification
                    var validDates = true;
                    var errHtml = "";
                    var date = $("#" + dateFrom).closest(".k-input").val();
                    var spanInv = $(".invalidDates[data-prev='" + dateTo + "']");
                    spanInv.html("");
                    if ($.trim(date) !== "") {
                        if (!kendo.parseDate(date, ["dd/MM/yyyy", "dd-MM-yyyy"])) {
                            validDates = false;
                            errHtml = "<span class=\"field-validation-error\" style=\"display:inline-block;width:150px\">Invalid Date</span>";
                        }
                    }

                    date = $("#" + dateTo).closest(".k-input").val();

                    if ($.trim(date) !== "") {
                        if (!kendo.parseDate(date, ["dd/MM/yyyy", "dd-MM-yyyy"])) {
                            validDates = false;
                            if ($.trim(errHtml).length === 0) {
                                errHtml = "<span class=\"field-validation-error\" style=\"display:inline-block;width:150px\">&nbsp;</span>";
                            }
                            errHtml = errHtml + "<span class=\"field-validation-error\" style=\"display:inline-block;width:14%;\">&nbsp;</span><span class=\"field-validation-error\" style=\"display:inline-block;width:150px\">Invalid Date</span>";
                        }
                    }

                    if (!validDates) {
                        spanInv.html(errHtml);
                    }

                    return validDates;
                }
                ,
                uuidv4: function () {
                    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
                        var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
                        return v.toString(16);
                    });
                }
                ,
                clearSummaryErrors: function () {
                    $(".validation-summary-errors").hide();
                    $(".validation-summary-errors ul").empty();

                }
            };
            return that;
        }()
    };
    return that;
})(window, jQuery);
;
gardners.list = (function (window, $) {

    var _settings = {
        placeOrderUrl: '',
        checkoutUrl: ''
    }

    var that =
    {
        //init : function(){
        //    $('#btnPlaceOrder').click(function (e) {
        //        e.preventDefault();
        //        that.PlaceOrder();
        //    })
        //},

       
       
    }
    return that;
})(window, jQuery);;
/*
For use on forms with a large number of inputs when jquery.validation runs slowly.

How to use:
Mark the form and each input with data-val=false attribute
Then call .parse method with the formId and the selectors for the inputs you want to validate
    eg. gardners.liteUnobtrusiveValidation.parse('.basketForm', '.liteValidation');

*/

gardners.liteUnobtrusiveValidation = (function (window, $) {

    function getSelectionStart(ele)
    {
       
        if (ele.lengh == 0) return -1;
        input = ele;

        var pos = input.value.length;

        if (input.createTextRange) {
            var r = document.selection.createRange().duplicate();
            r.moveEnd('character', input.value.length);
            if (r.text == '')
                pos = input.value.length;
            pos = input.value.lastIndexOf(r.text);
        } else if (typeof (input.selectionStart) != "undefined")
            pos = input.selectionStart;

        return pos;
    }
    function validationErrorKendoNumericTextBox($element, message) {
        
       var $target = $element.wrapper;
   
        $target.next('span.field-validation-valid').remove();
        var $valMessage = $target.next('.field-validation-error')

        if ($valMessage.length == 0)
            $target.after('<span class="field-validation-error"><span>' + message + '</span></span>');
        else
            $valMessage.find('span').text(message);

        if (!$target.hasClass('input-validation-error')) {
            $target.addClass('input-validation-error')
        }
     
        if ($target.hasClass('valid')) {
            $terget.removeClass('valid')
        }

        if (!$target.hasAttr('invalid'))
            $target.attr('invalid', 'true');
        return false;
    }
    function validationError($element, message) {
        
        if ($element.data('kendoNumericTextBox')) {
            return validationErrorKendoNumericTextBox($element.data('kendoNumericTextBox'), message);
        }
      
        $element.siblings('span.field-validation-valid').remove();
        var $valMessage = $element.siblings('.field-validation-error')

            
        if ($valMessage.length == 0)
            $element.after('<span class="field-validation-error"><span>' + message + '</span></span>');
        else
            $valMessage.find('span').text(message);

        if (!$element.hasClass('input-validation-error')) {
            $element.addClass('input-validation-error')
        }
        if ($element.hasClass('valid')) {
            $element.removeClass('valid')
        }

        if (!$element.hasAttr('invalid'))
            $element.attr('invalid', 'true');
        return false;
      
    }
    function validationSuccessKendoNumericTextBox($element) {
        var $target = $element.wrapper;
       
        $target.next('span.field-validation-error').remove();
        if ($target.hasClass('input-validation-error')) {
            $target.removeClass('input-validation-error')
        }
      
        return true;
       
    }
    function validationSuccess($element) {
        

        if ($element.data('kendoNumericTextBox')) {
            return validationSuccessKendoNumericTextBox($element.data('kendoNumericTextBox'));
        }

        $element.siblings('span.field-validation-error').remove();

        var $valMessage = $element.siblings('.field-validation-valid')
        if ($valMessage.length == 0)
            $element.after('<span class="field-validation-valid"></span>');
       
        if (!$element.hasClass('valid'))
            $element.addClass('valid')
        if ($element.hasClass('input-validation-error'))
            $element.removeClass('input-validation-error')
        if ($element.hasAttr('invalid'))
            $element.removeAttr('invalid');
        return true;
    }
  
    $.fn.hasAttr = function (name) {        
        var attr = this.attr(name);
        return (typeof attr !== typeof undefined && attr !== false)            
    };

    //store the elements to validate collection
    //so don't have to rescan DOM with $form.find
    var _$elementsToValidate = null;    

    var that =
    {
        parse: function (formSelector, formElementSelector) {
            var $form = $(formSelector);

          
            _$elementsToValidate = $form.find(formElementSelector);
            _$elementsToValidate.each(function () {
                
                var $that = $(this);
              
                var maxLength = $that.data('val-length-max');
                var lengthMessage = $that.data('val-length');

                var requiredMessage = $that.data('val-required');
                var numberMessage = $that.data('val-number');

                var rangeMessage = $that.data('val-range');
                var rangeMax = $that.data('val-range-max');
                var rangeMin = $that.data('val-range-min');

                if (requiredMessage || maxLength || lengthMessage || numberMessage) {

                
                    $that.focusout(function (e) {
                        var isValid = true;
                       
                        if (requiredMessage && $that.val().length == 0) {
                            isValid = validationError($that, requiredMessage);

                        }
                        else if (maxLength && $that.val().length > maxLength) {
                            isValid = validationError($that, lengthMessage);
                        }
                        //else if (numberMessage && $that.val() != parseInt($that.val(), 10)) { decimals?
                        else if (numberMessage && ! $.isNumeric($that.val())) {
                            isValid = validationError($that, numberMessage);
                        }
                        else if (rangeMessage && ($that.val() > rangeMax || $that.val() < rangeMin)) {
                            isValid = validationError($that, rangeMessage);
                        }

                        if (isValid) {
                            validationSuccess($that);
                        }
                      
                        e.stopPropagation();
                    });
                }
            });


              $form.validate({
                  //onfocusout: false,
                  //onkeyup: false,
                  //ignore: '[data-val="false"]',
                  //cancelSubmit: true,
                  onsubmit: false
              });

            ////
              if ($form.length > 0) {
                  $form.validate().cancelSubmit = true;
                  $form.unbind('submit');
              }
            $form.submit(function (e) {

               //use the list to lookup, so dont scan DOM again
                var isValid = true;
                _$elementsToValidate.each(function () {
                    //use attribute based look up quicker as .hasClass is slow due to string class='class1 class2' .indexOf required to find class1
                    if ($(this).hasAttr('invalid'))
                    {
                        isValid = false;
                        return false;
                    }
                });
                
                
                if (!isValid) {
                    e.preventDefault();     
                    //e.stopPropagation();
                    var val = $(".input-validation-error:eq(0)");
                    if (val.length > 0) {
                        $('html, body').animate({ scrollTop: val.offset().top -100 }, { duration: 300, queue: false });
                    }
                    return false;
                }
                else
                    return true;
            });
        }
       
        ,//onkeypress="return gardners.liteUnobtrusiveValidation.numbericTextbox(event)"
        numbericTextbox: function (evt) {
            evt = (evt) ? evt : window.event;
            var charCode = (evt.which) ? evt.which : evt.keyCode;
            if (charCode > 31 && (charCode < 48 || charCode > 57)) {
                return false;
            }
            return true;
        },
        validateDecimalKeyPress :function (el, evt) {
        var charCode = (evt.which) ? evt.which : event.keyCode;
        var number = el.value.split('.');
        if (charCode != 46 && charCode > 31 && (charCode < 48 || charCode > 57)) {
            return false;
        }
            //just one dot 
        if(number.length>1 && charCode == 46){
            return false;
        }
            //get the carat position
        var caratPos = getSelectionStart(el);
        var dotPos = el.value.indexOf(".");
        if( caratPos > dotPos && dotPos>-1 && (number[1].length > 1)){
            return false;
        }
        return true;
    }

    }
    return that;
})(window, jQuery);

;

var PopupDialog = kendo.ui.Window.extend({
    _buttonTemplate: kendo.template('<div class="k-ext-dialog-buttons" style="position:absolute; bottom:60px; text-align:center; width:#= parseInt(width) - 14 #px;"><div style="display:inline-block"># $.each (buttons, function (idx, button) { # <button class="k-button btn btn-dark">#= button.name #</button> # }) # </div></div>'),
    _hyperLinkTemplate: kendo.template('<div class="k-ext-dialog-links" style="position:absolute; bottom:30px; text-align:center; width:#= parseInt(width) - 14 #px;"><div style="display:inline-block"># $.each (links, function (idx, link) { # <a href="javascript:void();" class="hyper">#= link.name #</a> # }) # </div></div>'),
    _contentTemplate: kendo.template('<div class="k-ext-dialog-content" style="height:#= parseInt(height) - 55 #px; overflow:auto;">'),
    //here mess with width
    //width:#= parseInt(width) - 14 #px;
    init: function (element, options) {
        /// <signature>
        ///   <summary>
        ///   Initialize the dialog.
        ///   </summary>
        /// </signature>

        var that = this;
       
        options.visible = options.visible || false;
        options.resizable = options.resizable || false;
        kendo.ui.Window.fn.init.call(that, element, options);
        $(element).data("kendoWindow", that);
       
        var html = $(element).html();
        $(element).html(that._contentTemplate(options));
        $(element).find("div.k-ext-dialog-content").append(html);
        $(element).after(that._buttonTemplate(options));

        $.each(options.buttons, function (idx, button) {
            if (button.click) {
                $($(element).parent().find(".k-ext-dialog-buttons .k-button")[idx]).on("click", { handler: button.click }, function (e) {
                    e.data.handler({ button: this, dialog: that });
                });
            }
        });

        if (options.links.length > 0) {
            $(element).after(that._hyperLinkTemplate(options));

            $.each(options.links, function (idx, link) {
                if (link.click) {
                    $($(element).parent().find(".hyper")[idx]).on("click", { handler: link.click }, function (e) {
                        e.data.handler({ link: this, dialog: that });
                        return false;
                    });
                }
            });
        }
        that.bind("resize", function (e) {
            that.resizeDialog();
        });
    },

    resizeDialog: function () {
        var that = this;
        var $dialog = $(that.element);
        var width = $dialog.width();
        var height = $dialog.height();
        $dialog.parent().find(".k-ext-dialog-buttons").width(width);
        $dialog.parent().find(".k-ext-dialog-content").width(width).height(height - 39);
    },

    options: {
        name: "ExtDialog"
    }
});
kendo.ui.plugin(PopupDialog);

gardners.kendoHelpers = (function (window, $) {
    var that =
    {
        init: function () {
            kendo.culture('en-GB');
            if ($.validator) {
                $.validator.methods.date = function (value, element) {
                    if (this.optional(element) && value.length == 0) {
                        return true;
                    };

                    if (kendo.parseDate(value)) {
                        return true;
                    }
                    return false;
                }
            }
            $(document).ready(function () {
                that.bindLabelClicks();
            });
        }
        ,
        bindLabelClicks: function () {

            $("label[data-target]").on("click",function (e) {
                var id = that.getId($(this).attr("data-target"));
                var role = $(id).attr("data-role");
                if (role != null) {
                    switch (role) {
                        case "datepicker":
                            that.openDatePicker(id);
                            break;
                        case "numerictextbox":
                            that.focusNumericTextBox(id);
                            break;
                        case "multiselect":
                            that.openMultiSelect(id);
                            break;
                    }
                }

            });
        }
        ,
        escapeQuotes: function (value) {
            return value.replace(/\"/g, '&dquo;');
        }
        ,
        replaceQuotes: function (value) {
            return value.replace(/&dquo;/g, '"');
        }
        ,
        boolYesNo: function (v) {
            return v ? '<span class="yes">Yes</span>' : '<span class="no">No</span>';
        }
        ,
        boolYesNoInverseColours: function (v) {
            return v ? '<span class="no">Yes</span>' : '<span class="yes">No</span>';
        }
        ,
        onWindowOpen: function (e) {
            $('body').addClass("ob-no-scroll");
            if ($('.cd-is-visible').length > 0) {
                $('.cd-is-visible').hide();
            }
        }
        ,
        onWindowClose: function (e) {
            //backorders open singletitle from home delivery when closing singltitle don't remove class also cater for quick order

            if (e != undefined && e.sender.wrapper.context.id != 'k-wndw-homedelivery') {
                var win;
                if (e.sender.wrapper.context.id == 'k-window-createBasketPopup') {
                    win = gardners.kendoHelpers.getKendoWindow('k-wndw-product');
                }
                else {
                    win = gardners.kendoHelpers.getKendoWindow('k-wndw-homedelivery');
                }
                if (win != null && win.element.is(":hidden") == false) return;
            }

            $('body').removeClass("ob-no-scroll");
            if ($('.cd-is-visible').length > 0) {
                $('.cd-is-visible').show();
            }
        }
        ,
        PopupAlertDialog: {
            show: function (options) {

                if (options.buttonText == null) options.buttonText = "OK";

                return new $.Deferred(function (deferred) {
                    var dialog = null;

                    if ($("#extAlertDialog").length > 0) {
                        $("#extAlertDialog").parent().remove();
                    }

                    options = $.extend({
                        width: "380px",
                        height: "130px",
                        buttons: [{ name: options.buttonText, click: function (e) { dialog.close(); deferred.resolve({ button: "OK" }); } }],
                        links: [],
                        modal: true,
                        visible: false,
                        message: "",
                        icon: "k-ext-information",
                        resizable: false
                    }, options);

                    $(document.body).append(kendo.format("<div id='extAlertDialog' style='position:relative;'><div class='textCentre'>{0}</div></div>", options.message));
                    dialog = $("#extAlertDialog").kendoExtDialog(options).data("kendoExtDialog");
                    //no links to close window so move the only button down in the window
                    $("#extAlertDialog").parent().find(".k-ext-dialog-buttons").css({ "bottom": "30px" });

                    dialog.center().open();
                });
            },

            hide: function () {
                $("#extAlertDialog").data("kendoExtDialog").close();
            }
        }
        ,
        PopupYesNoDialog: {
            show: function (options) {
                if (options.buttonText == null) options.buttonText = "Yes";
                if (options.linkText == null) options.linkText = "Click here to go back";
                return new $.Deferred(function (deferred) {
                    if ($("#extYesNoDialog").length > 0) {
                        $("#extYesNoDialog").parent().remove();
                    }
                    options = $.extend(true, {
                        width: "380px",
                        height: "155px",
                        buttons: [{ name: options.buttonText, click: function (e) { $("#extYesNoDialog").data("kendoExtDialog").close(); deferred.resolve({ button: "Yes" }); } }],
                        links: [{ name: options.linkText, click: function (e) { $("#extYesNoDialog").data("kendoExtDialog").close(); deferred.resolve({ link: "No" }); } }],
                        modal: true,
                        pinned: true,
                        visible: false,
                        message: "",
                        icon: "k-ext-question",
                        resizable: false
                    }, options);

                    $(document.body).append(kendo.format("<div id='extYesNoDialog' style='position:relative;'><div style=\"width:auto;\" class='textCentre'>{0}</div></div>", options.message));
                    $("#extYesNoDialog").kendoExtDialog(options);
                    $("#extYesNoDialog").data("kendoExtDialog").center().open();
                });
            }
            ,
            hide: function () {
                $("#extYesNoDialog").data("kendoExtDialog").close();
            }
        }
        ,
        inputDialog: function (title, inputLabel, onSubmit, isNumeric, defaultValue, maxLength, buttonText) {
            /* Gavin 19/08/16 - Added argument to handle alternative button names, with default of OK */
            gardners.kendoHelpers.onWindowOpen();
            if (defaultValue == null) defaultValue = '';
            if (buttonText == null) buttonText = 'OK';
            var inputValue = ' value="' + defaultValue + '" ';

            if (maxLength == null && isNumeric) maxLength = 'maxlength="3"';
            else if (maxLength == null) maxLength = '';
            else maxLength = ' maxlength="' + maxLength + '" ';


            var textBox = ((isNumeric != null && isNumeric == true) ? '<input type="text" name="userinput" id="userinput"  class="k-textbox numeric" ' + maxLength + inputValue + ' />' : '<input type="text" name="userinput" id="userinput" class="k-textbox" ' + maxLength + inputValue + '/>');

            var template = '<div id="inputWindow"><label for="userinput">' + inputLabel + '</label>' +
                textBox + '<button id="btnOk" type="button" class="btn btn-dark"><span class="icon-tick icon"></span><span class="icon-text">' + buttonText + '</span></button></div>';

            if ($("#inputWindow").length == 0)
                $('body').append(template);

            $("#inputWindow #btnOk").click(function (e) {
                onSubmit();
                gardners.kendoHelpers.closeKendoWindow('#inputWindow');
            });
            $("#inputWindow #userinput").keypress(function (e) {
                if (e.keyCode == 13) {
                    onSubmit();
                    gardners.kendoHelpers.closeKendoWindow('#inputWindow');
                }
            });

            var win = $("#inputWindow")
                .kendoWindow({
                    actions: ["Close"],
                    animation: {
                        open: {
                            effects: "slideIn:down fadeIn",
                            duration: 150
                        },
                        close: {
                            effects: "slide:up fadeOut",
                            duration: 500
                        }
                    },
                    open: function () {

                        //if (defaultValue) {
                        //    $("#inputWindow #userinput").focus().select();
                        //}
                    },
                    minWidth: 300,
                    modal: true,
                    resizable: false,
                    title: title,
                    visible: false,
                    close: gardners.kendoHelpers.inputDialogOnClose
                })
                .data("kendoWindow");
            //win.bind("open", function () {

            //});

            win.center().open();

            //kendo removes the select, wait for open to finish and set it here.
            if (defaultValue) {
                setTimeout(function () {
                    $("#inputWindow #userinput").focus().select();
                }, 250);//must be at least 20ms longer than start animation12
            }

        }
        ,
        inputDialogGetValue: function () {
            return ($("#inputWindow #userinput").val());
        }
        ,
        inputDialogOnClose: function () {
            gardners.kendoHelpers.onWindowClose();
            $("#inputWindow").remove();
        }
        ,
        attachKendoGridClick: function (targetElement, classes, clickFunction) {
            $(targetElement).on("click", "a", function (e) {
                var element = $(e.currentTarget);

                if (typeof classes == 'string')
                    classes = [classes];

                $.each(classes, function (index, value) {
                    if (element.hasClass(value)) {
                        e.preventDefault();
                        //var gview = $(targetElement).data("kendoGrid");
                        var gview = $(element.closest('.k-grid')).data("kendoGrid");
                        var dataItem = gview.dataItem(element.closest("tr"));
                        clickFunction(value, dataItem, e);
                        return;
                    }
                });
            });
        }
        ,
        attachKendoGridPagerClick: function (targetElement, scrollToElement) {

            if (scrollToElement == undefined) { scrollToElement = ".accountMenu"; }
            var pager = $(targetElement).find(".k-grid-pager");
            var scrollToPos = parseInt($(scrollToElement).offset().top);
            var ddlPager = pager.find("select[data-role='dropdownlist']").data('kendoDropDownList');
            pager.on("click", "a", function (e) {
                if (!$(this).hasClass("k-state-disabled")) {
                    $('html, body').animate({ scrollTop: scrollToPos });
                }
            });

            ddlPager.bind("change", function (e) {
                $('html, body').animate({ scrollTop: scrollToPos });
            });
        }
        ,
        openMultiSelect: function (Id) {
            $(that.getId(Id)).data("kendoMultiSelect").open();
        }
        ,
        getId: function (Id) {
            if (Id.substring(0, 1) != '#') {
                Id = '#' + Id;
            }
            return Id;
        }
        ,
        formatEAN: function (ean) {
            return kendo.toString(ean, '0000000000000');
        }
        ,
        getNotification: function () {
            return $("#popupNotification").data("kendoNotification");
        }
        ,
        showSuccessNotification: function (message) {
            that.getNotification().show({ title: message }, "growl-success");
        }
        ,
        showBasketSuccessNotification: function (basketName, title, jacketUrl, basketTotal, basketQuantity) {
            that.getNotification().show({ basketName: basketName, title: title, jacketUrl: jacketUrl, basketTotal: basketTotal, basketQuantity: basketQuantity }, "basket-success");
        }
        ,
        getGlobalKendoMenuSettings: function () {
            //set a 300ms hoverDelay before menu closes, and 100ms before it opens
            return {

                open: function (e) {
                    //hide because we have zindex issue with kendo ui menu
                    $('.megaMenu').hide();
                    //once opened, set the hoverDelay for when it closes
                    e.sender.options.hoverDelay = 300;

                },
                close: function (e) {
                    //once closed, set the hoverDelay for when it opens
                    e.sender.options.hoverDelay = 100;
                }
            };
        }
        ,
        longTextTooltip: function () {
            $(".textLong").each(function (index) {
                var title = $(this).text();
                if ($(this)[0].offsetWidth < $(this)[0].scrollWidth) {
                    //Text has over-flowed
                    $(this).kendoTooltip({ filter: "", position: "top", content: function (e) { return title; } });
                }

            });
        }
        ,
        showPriceForCulture: function (val, cultureName) {
            return kendo.toString(val, 'c2', cultureName);
        }
        ,
        setProcessRunningButton: function (element, buttonText) {
            var markup = "<span class=\"k-icon k-loading\"></span><span class=\"icon-text\">&nbsp;" + buttonText + "</span>";
            $(element).addClass("disabled").prop("disabled", "disabled");
            $(element).html(markup);
           
        }
        ,
        resetProcessButton:function(element, buttonText) {
            $(element).removeClass("disabled").prop("disabled", "");
            $(element).html(buttonText);
        }
        ,
        setUploadButton: function (child) {
            var child = that.getId(child);
            var uploadButton = $(child).closest(".k-upload-button");
            if (uploadButton.length > 0) {
                uploadButton.addClass("btn-white").removeClass("k-button");
                uploadButton.find("span").html("<span class=\"icon-rightChevron icon\"><span class=\"icon-text\">Select a file</span>");
            }
        }
        ,
        repositionTooltip: function (wrapper) {
            var left = $(wrapper).position().left + 15;
            $(wrapper).css({ "left": left });
        }
        ,
        setDatePickerPlaceholder: function () {

            $("input[data-role='datepicker']").each(function () {
                $(this).attr("placeholder", "dd/mm/yyyy");
            });
            $("input[data-role='datetimepicker']").each(function () {
                $(this).attr("placeholder", "dd/MM/yyyy HH:MM");
            });
        }
        ,
        getGrid: function (Id) {
            Id = that.getId(Id);
            return $(Id).data("kendoGrid");
        }
        ,
        onGridErrorToSummary: function (e,container) {
            var data = { success: false, messages:[] };
            if ($.isArray(e.errors)) {
                    $.each(e.errors, function (key, value) {
                        if (value.errors) {
                            $.each(value.errors, function () {
                                data.messages.push(this);
                            });
                        }
                        else {
                            data.messages.push(value);
                        }
                    });
                }
            else data.messages.push(e.errors);

            gardners.processStandardAjaxResponse(data, container);
        }
        ,
        onGridError: function (e) {
            if (e.errors) {
                var message = "<span class=\"filed-validation-error\">Errors:</span><br/>";
                if ($.isArray(e.errors)) {
                    $.each(e.errors, function (key, value) {
                        if (value.errors) {
                            $.each(value.errors, function () {
                                message += this + "<br/>";
                            });
                        }
                        else {
                            message += value + "<br/>";
                        }
                    });
                }
                else message = e.errors;
                that.PopupAlertDialog.show({ title: "Error", message: message });
            }
        }
        ,
        getKendoWindow: function (windowId) {
            windowId = that.getId(windowId);
            return $(windowId).data('kendoWindow');
        }
        ,
        closeKendoWindow: function (windowId) {
            var window = that.getKendoWindow(windowId);
            if (window != null) window.close();
        }
        ,
        openKendoWindow: function (windowId) {

            var window = that.getKendoWindow(windowId);
            if (window != null) window.center().open();
        }
        ,
        setKendoWindowTitle: function (windowId, title) {
            var window = that.getKendoWindow(windowId);
            // window.options.animation.close.effects.zoom.properties.scale = 1;
            if (window != null) {
                window.title(title);
            }
        }
        ,
        clearDatePickers: function () {
            $("input[data-role='datepicker']").each(function (index, item) {
                $(item).data("kendoDatePicker").value('');
            });
            $("input[data-role='datetimepicker']").each(function (index, item) {
                $(item).data("kendoDateTimePicker").value('');
            });
        }
        ,
        clearTextBoxes: function () {
            $(".k-textbox").each(function () {
                $(this).val('');
            });
        }
        ,
        clearNumericTextBoxes: function () {
            $("input[data-role='numerictextbox']").each(function () {
                that.setNumericTextBoxValue($(this).attr("id"), "");
            });
        }
        ,
        clearComboBoxes: function () {
            $("input[data-role='combobox']").each(function () {
                $(this).data("kendoComboBox").input.val('');
            });
        }
        ,
        clearDropDownLists: function () {
            $("input[data-role='dropdownlist']").each(function () {
                $(this).data("kendoDropDownList").select(0);
            });
        }
        ,
        exportToExcelSetClass: function (e) {
            $(".k-grid-excel").html('<span class="k-icon k-i-excel"></span>Export to Excel');
        }
        ,
        toggleClientDetailOnSelect: function (e) {

            var gridSelector = '#' + e.sender.element.attr('id');

            var grid = that.getGrid(gridSelector);

            if ($(gridSelector + ' .k-master-row.k-state-selected').next().is('.k-detail-row:visible'))
                grid.collapseRow($(gridSelector + ' .k-master-row.k-state-selected'));
            else
                grid.expandRow($(gridSelector + ' .k-master-row.k-state-selected'));
        }
        ,
        selectGridRow: function (gridId, element) {
            that.clearSelection(gridId);
            $(element).closest("tr").addClass("k-state-selected");
        }
        ,
        clearSelection: function (gridId) {
            var grid = that.getGrid(gridId);
            grid.clearSelection();
        }
        ,
        saveGridState: function (gridSelector /*optional*/) {
            if (typeof gridSelector != 'string')
                gridSelector = '.k-grid';

            var grid = $(gridSelector).data("kendoGrid");
            localStorage["kendo-grid-options" + grid.element[0].id] = kendo.stringify(grid.getOptions());
            // $('#hasFilteredKendoGrid').val('true');
        }
        ,
        loadGridState: function (gridSelector /*optional*/) {
            if (typeof gridSelector != 'string')
                gridSelector = '.k-grid';

            var grid = $(gridSelector).data("kendoGrid");
            //if ($('#hasFilteredKendoGrid').val() === 'true') {
            var options = localStorage["kendo-grid-options" + grid.element[0].id];

            if (options && options !== "null") {
                grid.setOptions(JSON.parse(options));
            }
            else {
                localStorage["kendo-grid-options" + grid.element[0].id] = null;
            }
        }
        ,
        clearGridState: function (gridSelector /*optional*/) {
            if (typeof gridSelector != 'string')
                gridSelector = '.k-grid';

            var grid = $(gridSelector).data("kendoGrid");
            if (grid.dataSource) {
                //clear sorts
                if ($.isArray(grid.dataSource._sort)) {
                    grid.dataSource._sort = [];
                }

                //clear filters
                if ($.isArray(grid.dataSource._filter)) {
                    grid.dataSource._filter = [];
                }
            }
            localStorage["kendo-grid-options" + grid.element[0].id] = null;
        }
        ,
        getDropDownList: function (Id) {
            Id = that.getId(Id);
            return $(Id).data("kendoDropDownList");
        }
        ,
        rebindDropDownList: function (Id) {
            var ddl = that.getDropDownList(Id);
            if (ddl != null) ddl.dataSource.read();
        }
        ,
        rebindDropDownListJson: function (Id, ds) {
            var ddl = that.getDropDownList(Id);
            if (ddl != null) ddl.setDataSource(ds);
        }
        ,
        dropDownListItemExists: function (Id, value) {
            var exsts = false;
            var ddl = that.getDropDownList(Id);
            if (ddl != null) {
                var ds = ddl.dataSource;
                var data = ds['_data'];
                var item = that.getByValue(data, value);
                exists = (item != null);
            }
            return exists;
        }
        ,
        getByValue: function (data, value) {
            for (var f = 0; f < data.length; f++) {
                if (data[f]['Value'] == value) {
                    return data[f];
                }
            }
            return null;
        }
        ,
        getDropDownListValue: function (Id) {
            var val = "";
            var ddl = that.getDropDownList(Id);
            if (ddl != null) val = ddl.value();
            return val;
        }
        ,
        setDropDownListValue: function (Id, val) {
            var ddl = that.getDropDownList(Id);
            if (ddl != null) ddl.value(val);
        }
        ,
        setDropDownListByIndex: function (Id, index) {
            var ddl = that.getDropDownList(Id);
            ddl.select(index);
        }
        ,
        getDropDownListText: function (Id) {
            var val = "";
            var ddl = that.getDropDownList(Id);
            if (ddl != null) val = ddl.text();
            return val;
        }
        ,
        getDatePicker: function (Id) {
            Id = that.getId(Id);
            return $(Id).data("kendoDatePicker");
        }
        ,
        getDatePickerValue: function (Id) {
            var val = "";
            var dp = that.getDatePicker(Id);
            if (dp != null) val = dp.value();
            return val;
        }
        ,
        setDatePickerValue: function (Id, val) {
            var dp = that.getDatePicker(Id);
            if (dp != null) dp.value(val);
        }
        ,
        getDateTimePicker: function (Id) {
            Id = that.getId(Id);
            return $(Id).data("kendoDateTimePicker");
        }
        ,
        getDateTimePickerValue: function (Id) {
            var val = "";
            var dtp = that.getDateTimePicker(Id);
            if (dtp != null) val = dtp.value();
            return val;
        }
        ,
        setDateTimePickerValue: function (Id, val) {
            var dtp = that.getDateTimePicker(Id);
            if (dtp != null) dtp.value(val);
        }
        ,
        openDatePicker: function (Id) {
          var dp = that.getDatePicker(Id);
           dp.open();
        }
        ,
        getNumericTextBox: function (Id) {
            Id = that.getId(Id);
            return $(Id).data("kendoNumericTextBox");
        }
        ,
        focusNumericTextBox: function (Id) {
           var numeric = that.getNumericTextBox(Id);
            numeric.focus();
        }
        ,
        getNumericTextBoxValue: function (Id) {
            var val = "";
            var ntb = that.getNumericTextBox(Id);
            if (ntb != null) val = ntb.value();
            return val;
        }
        ,
        setNumericTextBoxValue: function (Id, val) {
            var ntb = that.getNumericTextBox(Id);
            if (ntb != null) ntb.value(val);
        }
        ,
        onKendoNumericChangeUpdateHistory: function (e) {
            $(this.wrapper).siblings('input.numericHistory[for="' + this.element[0].id + '"]').val(this.value());
        }
        ,
        setNumericTextBoxValuesFromHistory: function () {

            $('input.numericHistory').each(function () {
                var $this = $(this);
                if ($this.val() != '') {
                    that.setNumericTextBoxValue($this.attr('for'), $this.val());
                }
            });
        }
        ,
        selectTabById: function (tabStripId, tabId) {
            $(tabStripId).kendoTabStrip().data("kendoTabStrip").select(tabId);
        }
        ,
        saveTabState: function (e) {
            localStorage["kendo-tabstrip-selected-tab" + $(e.item).closest(".k-tabstrip").attr("id")] = $(e.item).index();
            $('#hasKendoTabStrip').val('true');
        }
        ,
        loadTabState: function (tabSelector  /*optional*/) {
            if (typeof tabSelector != 'string')
                tabSelector = '.k-tabstrip';

            var ts = $(tabSelector).kendoTabStrip().data("kendoTabStrip");

            if ($('#hasKendoTabStrip').val() === 'true') {
                var tabIndex = Storage["kendo-tabstrip-selected-tab" + ts.element[0].id];
                if (tabIndex) {
                    ts.select(tabIndex);
                }
            } else {
                localStorage["kendo-tabstrip-selected-tab" + ts.element[0].id] = null;
            }
        }
        ,
        getSelectedRadioButtonText: function (radioButton) {
            return $(radioButton).next(".k-radio-label").text();
        }
        ,
        parseSetDatePickerValuesFromGridFilters: function (targetFrom, targetTo, filter) {
            if (filter.filters[0].field.toLowerCase().indexOf("date")) {
                that.parseSetDatePickerValueFromGridFilter(targetFrom, filter.filters[0].value);
                that.parseSetDatePickerValueFromGridFilter(targetTo, filter.filters[1].value);
            }
        }
        ,
        parseSetDatePickerValueFromGridFilter: function (target, dateVal)
        {
            that.setDatePickerValue(target, kendo.toString(kendo.parseDate(dateVal),"dd/MM/yyyy"));
        }
        ,
        addHoursToDate: function (dateVal, hours) {
            var date = kendo.parseDate(dateVal);
            return new Date(new Date(date).setHours(date.getHours() + hours));
        }
        ,
        setHoursToMidnight: function (dateVal) {
            dateVal.setHours(23, 59, 59, 999);
        }
        ,
        setDateTimeForClientDisplay: function (dateVal) {

            return kendo.toString(kendo.parseDate(dateVal), "dd/MM/yyyy HH:mm:ss");
        }
        ,
        setSelectableGridForWindow: function (element, gridId) {
            element.attr("data-sender", gridId)
        }
        ,
        closeWindowWithSelectableGrid: function (e) {
            var gridId = $(e.sender.element).attr("data-sender");
            if ($.trim(gridId) != "") {
                that.clearSelection(that.getId(gridId));
            }
            that.onWindowClose();
        }
    }
    return that;
})(window, jQuery);

gardners.kendoHelpers.init();;
gardners.homeDelivery = (function (window, $) {
    var _settings = { AddEditCustomerUrl: '', UpdateAccountCustomerUrl: '', lookupPostcodeUrl: '', deleteAddresBookUrl: '',shippingServicesUrl:'',stepIndex:0,tccp:0,ccSymb:''};
    var _controls = { addressBookWindow: '', customerEditWindow: '', selector:'',addressBookGrid:'' };
    // used in shipping calculations
    var _shipping = { booksShipping: 0, entsShipping: 0, giftwrapOrderCharge: 0 };
    // page step heading prefix
    var _pageHeadingPrefix = "Home Delivery Checkout - Step";
    // page step heading suffix
    var _pageHeadings = ["1: Address Details", "2: Your Shipping Options", "3: Delivery Note Options", "4: Confirm Details"];

    var _defaultCountryCode = "GB";
    var _valCountryPostcodes;
    var _shippingMessage = "";
    var _selectedCountry;
    var _noShipping = false;
  
    var that =
    {
        init: function (settings, controls, countries, giftwrapOrderCharge) {
            _settings = settings;
            _controls = controls;
            _valCountryPostcodes = countries.countries;
            _shipping.giftwrapOrderCharge = giftwrapOrderCharge;
            $(document).ready(function () {
                
                //checkout step divs
                $(".checkout-step:first").fadeIn(); // show first step

                $("label[for=\"UserTitleTypeId\"]").removeClass("required");
                //the find in address book button
                $("body").on("click", '.btnLookupCustomer', function (e) {
                    if ($.trim($('#LKCustomer').val()).length > 0) {
                        $('#LKCustomer').val("");
                        that.filterAddressBook();
                    }
                    gardners.kendoHelpers.openKendoWindow(_controls.addressBookWindow);
                });

                //address fields enter address manually link
                $(document).on('click', '.enterAddressManually', function (e) {
                    e.preventDefault();
                    var selector = $(this).attr("data-selector");
                    $.each($(selector + " .manualAddress input"), function () {
                        $(this).val("");
                    });
                    $(selector + " .foundDeliveryAddressContainer").hide();
                    $(selector + " .pcl").hide();
                    $(".notificationemail").hide();
                    that.toggleTrackingEmailRule(false);
                    $(selector + " .manualAddress").show();
                    $(selector + " .gsearchByPostcode").show();

                });

                //address fields search by postcode link
                $(document).on('click', '.searchByPostcode', function (e) {
                    e.preventDefault();
                    var selector = $(this).attr("data-selector");
                    $(selector + " .postcodelookup").val("");
                    $(selector + " .manualAddress").hide();
                    $(selector + " .pcl").show();
                });

                //anchors on left hand side of the page to navigate steps
                $(document).on('click', '.stepLink', function (e) {
                    e.preventDefault();
                    var index = $(".stepLink").index(this);
                    if (index > _settings.stepIndex) {
                        if ((index - _settings.stepIndex) > 1) {
                            if (that.validatePrevSteps(index, ".step1")) {
                                _settings.stepIndex = index;
                                if (index >= 3) {
                                    that.populateConfirmDetails();
                                }
                                that.setSelectedStep();
                                $(".checkout-step:visible").hide();
                                $(".checkout-step:eq(" + index + ")").fadeIn();
                            }
                        }
                        else {
                            $(".btstep").trigger("click");
                        }
                    }
                    else if (index < _settings.stepIndex) {
                        if (index === 0) { _settings.stepIndex = 1; }
                        $(".stepBack").trigger("click");
                    }

                    return false;
                });

                // the "next" step buttons
                $("body").on('click', '.btstep', function (e) {
                    var selector = $(this).attr("data-selector");
                    if ($(selector + " .manualAddress").length > 0) {
                        that.resetAddressFields(selector, false);
                    }

                    if (!that.validateStep(selector)) {
                        // yes, so prevent the form from submitting/moving to next step
                        e.preventDefault();
                        return false;
                    }
                    that.setSelectedStep();

                });

                // the "previous" step buttons (click on the first step and will return to HD Basket)
                $(document).on('click', '.stepBack', function (e) {

                    if (_settings.stepIndex === 0) {
                        window.location = $(this).attr("data-url");
                    }
                    else {
                        var $step = $(".checkout-step:visible");
                        $(".stepLink").removeClass("selected");
                        _settings.stepIndex = _settings.stepIndex - 1;
                        $(".stepLink:eq(" + _settings.stepIndex + ")").addClass("selected");
                        $step.hide();
                        $(".checkout-step:eq(" + _settings.stepIndex + ")").fadeIn();
                        that.bringElIntoView($(".basketHeader"));
                        that.setSelectedStep();
                    }
                    e.preventDefault();
                    return false;
                });

                //button that fires off post code lookup
                $(document).on('click', '.btnLookupPostcode', function (e) {
                    that.lookupPostcode($(this).attr("data-selector"));
                });

                //the "Clear All" link - clears address and customer fields
                $(document).on('click', '.clearAll', function (e) {
                    that.clearAllFields($(this).attr("data-selector"));
                });

                //Shipping Options step -on change of gift wrap  option
                $("input[name='GiftWrapServiceId']").change(function (e) {
                    that.calculateEstShipping();
                });

                //Address Details step scroll text area rather than do it on enter key as auto form submit on key down is disabled
                //$(".customerOrderInstruction").keydown(function (e) {
                   
                //    //because form submit is disabled on enter key in inputs
                //   // if (e.keyCode == 13) {
                //    //    debugger
                //        //$(this).val($(this).val() + "\n").scrollBottom();
                //       // return true;
                //   // }
                //});
                
                //delivery note options despatch messages 1 to 4
                $('.despatchMessage').keyup(function (e) {
                    if (gardners.layout.isKeyAllowed(e.keyCode)) {
                        var className = ".despatchMessage";
                        var maxLen = parseInt($(this).attr("data-val-length-max"));
                        if (maxLen === $(this).val().length) {
                            var index = $(className).index(this);
                            if (index < $(className).index($(className + ":last"))) {
                                $(className + ":eq(" + (index + 1) + ")").focus();
                            }
                        }
                    }
                });
                //safe place other no double quotes
                $('.dqs').keypress(function (e) {
                    if (e.which == 13 || e.which == 34) {
                        return false;
                    }
                });

                //address book Find button
                $(document).on("click", '.btnFilterAddressBook', function (e) {
                    that.filterAddressBook();
                });

                //address book filter input element
                $('#LKCustomer').keydown(function (e) {
                    if (e.which === 13) {
                        e.preventDefault();
                        that.filterAddressBook();
                    }
                });
                //selects a customer in the address book grid
                $(document).on('click', '.selAddressBook', function (e) {
                    that.populateDeliveryAddressFromAddressBook($(this));
                });

                //edits a customer in the address book grid
                $(document).on("click", ".editAddressBook", function (e) {
                    e.preventDefault();
                    that.addEditCustomer($(this).attr("data-id"), "Edit Customer in Address Book");
                });
                //removes a customer in the address book grid
                $(document).on("click", ".delAddressBook", function (e) {
                    e.preventDefault();
                    that.deleteFromAddressBook($(this).attr("data-id"));
                });

                //address book customer add mode
                $(document).on("click", ".btnAddToAddressBook", function (e) {
                    that.addEditCustomer("-1", "Add Customer to Address Book");
                });

                $(document).on("click", ".clearAddressFilter", function (e) {
                    e.preventDefault();
                    $('#LKCustomer').val("");
                    that.filterAddressBook();
                });

                // address book customer add/edit save button
                $("body").on("click", "#btnSaveCustomer", function (e) {
                    var selector = $(this).attr("data-selector");
                    if ($(selector + " .manualAddress").length > 0) {
                        that.resetAddressFields(selector, false);
                    }
                    if (!that.validateElements($(selector), $("#frmUpdateCustomer").validate({ errorPlacement: function () { return true; } }))) {
                        $(selector + " .gsearchByPostcode").hide();
                        //make sure we pop open all address fields here, so the user can see all invalid fields
                        $(selector + ' .manualAddress').css('display', 'block');
                        $('#addEditCustomerDetails').animate({ scrollTop: 0 }, 'fast');
                        e.preventDefault();
                        return false;
                    }
                });


                // bind the post code lookup input to auto submit on enter key
                that.bindPostcodelookup();
                // set initial step heading
                that.setPageHeading();
                //add in a custom regex validation method for elements with 'custom' class - letters only
                that.addInRegex();
                
                
                //initial set of shipping costs
                _selectedCountry = gardners.kendoHelpers.getDropDownListValue("#Country");
                that.getShippingServices();
                //that.setShippingCost(parseInt($(".customerFields").find("input:radio.despatchOption:checked").val()));

                //set character limit displays on input text boxes
                $.each($(".uiIndicator"), function () {
                   var attr = $(this)[0].hasAttribute("data-val-length-max") ? $(this).attr("data-val-length-max") : $(this).attr("maxlength");
                    if (typeof attr !== typeof undefined && attr !== false) {
                        $(this).charlimit({ "limit": attr, "color": 0, "disable": 0, "position": "after" });
                    }
                });
               // $(".uiIndicator").charlimit({ 'limit': $(".uiIndicator").attr("data-val-length-max"), 'color': 0, 'disable': 0, 'position': 'after' });
             
            });//end doc ready
            that.addPostcodeValidation();
            that.addDeliverySMSNumberValidation();
        }
        ,
        elementOnKeyDown: function ()
        {
            if (event.keyCode === 13) {
                var target = $(event.target);
                if (target.is("a") || target.is("button")) {
                    $(event.target).trigger("click");
                }
            }
            return event.keyCode !== 13;
        }
        ,
        //blue bar top of step
        setPageHeading: function () {
            $("#pageHeader").html("{0} {1}".format(_pageHeadingPrefix,_pageHeadings[_settings.stepIndex]));
        }
        ,
        //set total weight in grams on the lhs
        setTotalWeight: function(val, uom) {
            var $li = $(".totalWeightInGrams");
            $li.find("span:eq(1)").html(val + "<span>" +uom + "</span>");
        }
        ,
        //left hand side displays within steps
        setSideDisplay: function () {

            $(".totExcShipping").show();
            if (_settings.stepIndex > 0 && _settings.stepIndex < 3) {
                $(".estShipping").show();
            }
            else {
                $(".estShipping").hide();
            }

            if (_settings.stepIndex > 2) {
                $(".totExcShipping").hide();
            }
        }
        ,
        //sets the shipping cost displays single or multiple
        setShippingCost: function (despatchOption) {
            _shipping.booksShipping = 0;
            _shipping.entsShipping = 0;
            if (despatchOption === 1) {

                if ($(".singleDesp ul li").find("input:radio.bookShippingServices:checked").length > 0) {
                    _shipping.booksShipping = parseFloat($(".singleDesp ul li").find("input:radio.bookShippingServices:checked").attr("data-cst"));
                }
                if ($(".singleDesp ul li").find("input:radio.entsShippingServices:checked").length > 0)
                {
                    _shipping.entsShipping = parseFloat($(".singleDesp ul li").find("input:radio.entsShippingServices:checked").attr("data-cst"));
                }
            }
            else {
                if ($(".multiDesp ul li").find("input:radio.bookShippingServices:checked").length > 0) {
                    _shipping.booksShipping = parseFloat($(".multiDesp ul li").find("input:radio.bookShippingServices:checked").attr("data-cst"));
                }
                if ($(".multiDesp ul li").find("input:radio.entsShippingServices:checked").length > 0) {
                    _shipping.entsShipping = parseFloat($(".multiDesp ul li").find("input:radio.entsShippingServices:checked").attr("data-cst"));
                }
            }
           

            that.calculateEstShipping();
        }
        ,
        //calculate the shipping costs for products - single or multiple despatch plus gift wrap cost (if selected)
        calculateEstShipping: function () {
            
            var val = parseFloat(_shipping.booksShipping + _shipping.entsShipping);
            
            //side totals
            var estGiftWrap = $(".estGiftWrap");
            estGiftWrap.hide();

            if (parseInt($("input[name='GiftWrapServiceId']:checked").val()) === 2) {
                val += _shipping.giftwrapOrderCharge;
                estGiftWrap.show();
            }

            $(".servShippingTot").text(val.toFixed(2));

            //side totals
            $(".totShippingCost").text("£" + (_shipping.booksShipping + _shipping.entsShipping).toFixed(2));
            $(".totEstShipping").text("£" + val.toFixed(2));
        }
       
        ,
        //text box to fire off against the post code lookup api
        bindPostcodelookup: function () {
            $('.postcodelookup').keydown(function (e) {
                if (e.keyCode === 13) {
                    e.preventDefault();
                    that.lookupPostcode($(this).attr("data-selector"));
                }
            });
        }
        ,
        //actually fire the post code api
        lookupPostcode: function (selector) {
            var btnText = $(selector + ' .btnLookupPostcode').html();
            var postcode = $(selector + ' .postcodelookup').val();
            var verification = $("input[name='__RequestVerificationToken']").val();
            $(selector + ' .foundDeliveryAddressContainer').hide();
            $(selector + ' .postCodeError').hide();
            $.ajax({
                type: 'post',
                url: _settings.lookupPostcodeUrl,
                data: { postcode: postcode, __RequestVerificationToken: verification },
                beforeSend: function () {
                    $(selector + ' .btnLookupPostcode').html(btnText.replace("Find Address","Loading..."));
                },
                success: function (data) {
                    $(selector + ' .btnLookupPostcode').html(btnText);
                    //squirt postcode address found into kendo dropdownlist
                    if (data) {
                        var select = $($(selector + ' .postcoderesults')[1]).data("kendoDropDownList");
                        var ds = new kendo.data.DataSource();

                        for (var i = 0; i < data.length; i++) {
                            var toDisplay = that.GetAddressLineForSelect(data[i]);
                            ds.add({ "Text": toDisplay, "Value": data[i] });
                        }

                        select.setDataSource(ds);

                        $(selector + ' .foundDeliveryAddressContainer').show();

                    }
                    else {
                        $(selector + ' .postCodeError').show();
                        $(selector + ' .foundDeliveryAddressContainer').hide();

                    }
                },
                error: function () {
                    $(selector + ' .btnLookupPostcode').html(btnText);
                }
            });

        }
        ,
        //hike out the address from the selected postcode lookup result
        GetAddressLine1: function (address) {
            var toDisplay = '';

            if (address.Organisation)
                toDisplay += address.Organisation + ', ';

            if (address.Department)
                toDisplay += address.Department + ', ';

            if (address.Line1)
                toDisplay += address.Line1;

            return toDisplay;
        }
        ,
        //format if necessary
        GetAddressLineForSelect: function (address) {
            var toDisplay = '';

            if (address.Organisation || address.Department) {
                if (address.Organisation)
                    toDisplay += address.Organisation + ', ';

                if (address.Department)
                    toDisplay += address.Department + ', ';
            }
            else {
                if (address.Line1)
                    toDisplay += address.Line1;

                if (address.Line2)
                    toDisplay += ', ' + address.Line2;
            }

            return toDisplay;
        }
        ,
        //clear the customer/address fields
        clearAllFields: function (selector) {

           
            that.setMaxLengthUI(".manualAddress");
            that.toggleTrackingEmailRule(false);
            $(".searchByPostcode").trigger("click");
            $.each($(selector + " .manualAddress input"), function () {
                $(this).valid();
                $(this).val("");
            });
            selector = ".customerFields";
            gardners.kendoHelpers.setDropDownListByIndex($($(selector + '' + ' .salu')[1]).attr("id"), 0);
            var ddl = $(selector + " #Country").data("kendoDropDownList");
            ddl.value(_valCountryPostcodes[0]);
            ddl.trigger("change"); 
            //gardners.kendoHelpers.setDropDownListValue($($(selector + '' + ' .isocountry')[1]).attr("id"), _valCountryPostcodes[0]);
            //$(selector + " #Country").data("kendoDropDownList").trigger("change");
            _selectedCountry = _valCountryPostcodes[0];
            $(selector + ' .forename').val("");
            $(selector + ' .lastname').val("");
            that.setMaxLengthUI(selector);
            that.bringElIntoView($(".checkout-step").find("legend"));
           
        }
        ,
        //reset as valid
        resetAddressFields: function (selector, wipe) {
            that.setMaxLengthUI(selector + " .manualAddress");
            $.each($(selector + " .manualAddress input"), function () {
                $(this).valid();
                if (wipe) { $(this).val(""); }
            });
        }
        ,
        //postcode results dopdown changed selection
        onChangePostcodeResults: function (e) {
            var selector = $(e.sender.element.context).attr("data-selector");
            var dataItem = this.dataItem(e.item);
            var address = dataItem.Value;
            var line1 = that.GetAddressLine1(address);
            $(selector + ' .addressLine1').val(line1).valid();
            $(selector + ' .addressLine2').val(address.Line2).valid();
            $(selector + ' .addressLine3').val("").valid();
            $(selector + ' .town').val(address.Town).valid();
            $(selector + ' .county').val(address.County).valid();
            $(selector + ' .postcode').val(address.Postcode).valid();
            $(selector + ' .foundDeliveryAddressContainer').hide();
            $(selector + ' .pcl').hide();
            $(".notificationemail").hide();
            that.toggleTrackingEmailRule(false);
            that.setMaxLengthUI(".manualAddress");
            $(selector + ' .manualAddress').show();

        }
        //squirt into the customer and address fields in step 1 the result of selecting a customer in the address book
        ,
        populateDeliveryAddressFromAddressBook: function (ele) {
           
            var address = gardners.kendoHelpers.getGrid(_controls.addressBookGrid).dataItem($(ele).closest("tr"));
            var selector = _controls.selector;
            $(selector + ' .addressLine1').val(address.Address1).valid();
            $(selector + ' .addressLine2').val(address.Address2).valid();
            $(selector + ' .addressLine3').val(address.Address3).valid();
            $(selector + ' .town').val(address.Town).valid();
            
            $(selector + ' .county').val(address.County).valid();
            $(selector + ' .postcode').val(address.Postcode).valid();
            $(selector + ' .foundDeliveryAddressContainer').hide();
            $(selector + ' .pcl').hide();
            $(selector + ' .manualAddress').show();
            $(selector + " .notificationemail").hide();
            selector = ".customerFields";
            var ddl = $(selector + '' + ' #UserTitleTypeId').data("kendoDropDownList");
            ddl.value(address.UserTitleTypeId);
            
            _selectedCountry = address.CountryCode;
            
            var cc = $(selector + " #Country").data("kendoDropDownList");
            
            cc.value(address.CountryCode);

            if (_selectedCountry !== _defaultCountryCode)
            {
               $(".trackingnotificationemail").val(address.Email);
            }

            that.toggleTrackingEmailRule();
            that.getShippingServices();

            $(selector + ' .forename').val(address.FirstName).valid();
            $(selector + ' .lastname').val(address.LastName).valid();
            //$(selector + ' .custemail').val(address.Email).valid();
            //_hiddenFields
            //$('.hdContent .customerNotes').val(address.Notes);

            if ($.inArray(_selectedCountry, _valCountryPostcodes) === -1) {
                //if (address.CountryCode !== "GB") {
                $(_controls.selector + ' .gsearchByPostcode').hide();
            }
            else { $(_controls.selector + ' .gsearchByPostcode').show(); }


            if ($.trim(address.LastName).length > 0) {
                var ml = parseInt($(".customerOrderReference").attr("data-val-length-max"));
                $(".customerOrderReference").val(address.LastName.substring(0, ml));
                that.setMaxLengthUI(".custRef");
            }

            that.setMaxLengthUI(".customerFields");
            that.setMaxLengthUI(".manualAddress");

            //fire onhange of country code here kendo ddl
            //address.CountryCode
            gardners.kendoHelpers.closeKendoWindow(_controls.addressBookWindow);
        }
        ,
        //the last step in home delivery - hike out user input fields to the confirm details display fields
        populateConfirmDetails: function ()
        {
            
            var customer = "";
            var address2 = "";
            var address3 = "";
            //var email = "";
            var deliveryAddressSmsNumber = "";
            var deliverySafePlace = "";
            var depatchMessage1 = "";
            var depatchMessage2 = "";
            var depatchMessage3 = "";
            var depatchMessage4 = "";

           
            $(".occustomerorderreference").html($.trim($(".customerOrderReference").val()));
            $(".ocustomerorderinstruction").html($.trim($(".customerOrderInstruction").val()));
            //Step1 fields
            var sourceSelector = ".customerFields";
            var targetSelector = ".customerDetails";

            $(targetSelector + " .email").hide();

            customer = gardners.kendoHelpers.getDropDownListText($($(sourceSelector + '' + ' .salu')[1]).attr("id"));
            customer += " " + $.trim($(sourceSelector + " .forename").val());
            customer += " " + $.trim($(sourceSelector + " .lastname").val());

            $(targetSelector + " .customerName").html(customer);
            $(targetSelector + " .country").html(gardners.kendoHelpers.getDropDownListText($($(sourceSelector + '' + ' .isocountry')[1]).attr("id")));
            var countryCode = gardners.kendoHelpers.getDropDownListValue($($(sourceSelector + '' + ' .isocountry')[1]).attr("id"));
            //email = $.trim($(sourceSelector + " .custemail").val());
            //$("confEmail").hide();
            //if (email.length > 0) {
            //    $(targetSelector + " .email").html(address2);
            //    $(targetSelector + " .email").show();
            //    $(".confEmail").show();
            //}

            sourceSelector = ".manualAddress";
            $(targetSelector + " .address1").html($.trim($(sourceSelector + " .addressLine1").val()));
            address2 = $.trim($(sourceSelector + " .addressLine2").val());
            address3 = $.trim($(sourceSelector + " .addressLine3").val());
            $(targetSelector + " .address2").hide();
            $(targetSelector + " .address3").hide();

            if (address2.length > 0) {
                $(targetSelector + " .address2").html(address2);
                $(targetSelector + " .address2").show();
            }
            if (address3.length > 0) {
                $(targetSelector + " .address3").html(address3);
                $(targetSelector + " .address3").show();
            }

            $(targetSelector + " .town").html($.trim($(sourceSelector + " .town").val()));
            $(targetSelector + " .county").html($.trim($(sourceSelector + " .county").val()));
            $(targetSelector + " .postcode").html($.trim($(sourceSelector + " .postcode").val()));
            //step2 fields

            targetSource = ".reviewOptions";
            
            $(".ocgiftwrapService").html(gardners.kendoHelpers.getSelectedRadioButtonText($(".hdContent input[name='GiftWrapServiceId']:checked")));


            $(".ocdeliverySmsNumber").hide();

            var sms = $(".hdContent input[name='DeliverySmsNumber']").val();
            if ($.trim(sms).length > 0) {
                $(".ocdeliverySmsNumber:eq(1) td").html(sms);
                $(".ocdeliverySmsNumber").show();
            }


            $(".ocdeliveryTrackingEmail:eq(1) td").html("");
            $(".ocdeliveryTrackingEmail").hide();
            var email = "";
            if (countryCode !== _defaultCountryCode) {
                email = $(".trackingnotificationemail").val();
                $(".ocdeliveryTrackingEmail:eq(1) td").html(email);
                $(".ocdeliveryTrackingEmail").show();
            }

            if ($.trim(gardners.kendoHelpers.getDropDownListValue("#DeliverySafePlace")).length> 0) {
                deliverySafePlace = gardners.kendoHelpers.getDropDownListText("#DeliverySafePlace");
            }
                      
            if (deliverySafePlace.indexOf("Other") > -1) {
                var furtherText = $.trim($("#DeliverySafePlaceOther").val());
                if (furtherText.length > 0) {
                    deliverySafePlace = furtherText;
                }
            }

            if ($.trim(deliverySafePlace).length > 0) {
                $(".ocdeliverySafePlace").show();
                $(".ocdeliverySafePlace:eq(1) td").html(deliverySafePlace);
            }

            sourceSelector = ".customerFields";
            var serviceText = "";
            var serviceSelector = ".singleDesp";
            var courier = "";
            var shippingCost = 0;
            if (parseInt($(sourceSelector).find("input:radio.despatchOption:checked").val()) === 2) {
                serviceSelector = ".multiDesp";
            }

            $(".ocbooksServicing").hide();
            $(".ocentsServicing").hide();
            //get the servicing costs
            //extract service, courier and service cost from the kendo ui radiobuttons
            if ($(".bookProducts ul li").length > 0)
            {
                var $svcBK = $(serviceSelector + " .bookShippingServices:checked");
                serviceText = $svcBK.next(".k-radio-label").html();
                courier = $("<div>" + serviceText + "</div>").find(".courier").html();
                serviceText = serviceText.substring(0, serviceText.indexOf("<span"));
                shippingCost += parseFloat($svcBK.attr("data-cst")).toFixed(2);
                if ($.trim(courier).length > 0) { serviceText += "<br><strong>Courier</strong><br/>" + courier; }
                $(".ocbookServicingCourier").html(serviceText);
                $(".ocbookServicingCourier").show();
                $(".ocbooksServicing").show();
            }

            if ($(".entsProducts .ents ul li").length > 0)
            {
                var $svcENT= $(serviceSelector + " .entsShippingServices:checked");
                serviceText = $svcENT.next(".k-radio-label").html();
                courier = $("<div>" + serviceText + "</div>").find(".courier").html();
                serviceText = serviceText.substring(0, serviceText.indexOf("<span"));
                shippingCost += parseFloat($svcENT.attr("data-cst")).toFixed(2);
                if ($.trim(courier).length > 0) { serviceText += "<br><strong>Courier</strong><br/>" + courier; }
                $(".ocentServicingCourier").html(serviceText);
                $(".ocentServicingCourier").show();
                $(".ocentsServicing").show();
            }

            $(".ocmultiItemsDespatch").html(gardners.kendoHelpers.getSelectedRadioButtonText($(sourceSelector).find("input:radio.despatchOption:checked")));

            $(".totalShippingService").hide();
            var hideItemPricing = gardners.kendoHelpers.getSelectedRadioButtonText($(".hdContent").find("input[name='HideItemPricingOnDespatchNote']:checked"));
            $(".ochideItemOnDespatchNote").html(hideItemPricing);

            var deliveryCharge = 0;
            var $kntb = gardners.kendoHelpers.getNumericTextBox("#DeliveryChargeToShowOnDespatchNote");
            deliveryCharge = $kntb._value;
            var formattedDeliveryCharge = $kntb.element.parents(".k-numeric-wrap").find("input.k-formatted-value").val();
            $(".totalDeliveryChargeOnDespatchNote").html(formattedDeliveryCharge);
            $(".totalShippingService").show();
            $(".ocshippingChargeOnDespatchNote").html(formattedDeliveryCharge);
            $(".totalCustomerPrice").html(_settings.ccSymb + parseFloat(deliveryCharge + _settings.tccp).toFixed(2));

            sourceSelector = ".despatchMessages";

            $(".despatchMessage").each(function (i, obj)
            {
                if ($.trim($(obj).val()).length > 0)
                {
                    $(".ocdespatchNoteLine:eq(" + i + ")").html($.trim($(obj).val()));
                    $(".ocdespatchNoteLine:eq(" + i + ")").show();
                }
                else {
                    $(".ocdespatchNoteLine:eq(" + i + ")").hide();
                }

            });

        }
        ,
        //change event for the country dropdown in the home delivery address fields - step1
        onHDCountryChange: function (e) {
            var ddlId = "#" + e.sender.element.attr("id");
            var selector = $(e.sender.element.context).attr("data-selector");
            $(selector + " .gsearchByPostcode").hide();
            $(selector + " .foundDeliveryAddressContainer").hide();
            $(selector + " .manualAddress").hide();
            $(selector + " .postcodelookup ").val("");
            that.resetAddressFields(selector, true);

            $(selector + " .enterAddressManaually").hide();
            $(selector + " .pcl").hide();
            _selectedCountry = this.value();
         
            that.toggleTrackingEmailRule();   
            if ($.inArray(_selectedCountry, _valCountryPostcodes) !== -1) {
                //if (gardners.kendoHelpers.getDropDownListValue(e.sender.element.attr("id")) === "GB") {

                $(selector + " .pcl").show();
                $(selector + " .gsearchByPostcode").show();
            }
            else {
                $(selector + " .manualAddress").show();
                $(selector + " .notificationemail").show();
                $(selector + " .enterAddressManaually").show();
            }

            that.getShippingServices();

        }
        ,
        toggleTrackingEmailRule: function ()
        {
            var email = $(".trackingnotificationemail");
            if (_selectedCountry !== _defaultCountryCode) {
                $(".notificationemail").show();
                $(email).rules("add", { required: true, messages: { required: "Email required" } });
            }
            else {
                $(".notificationemail").hide();
                $(email).val("");
                $(email).rules("remove", "required");
                $(email).next("span").removeClass(".field-validation-error");
            }
           
            $(email).valid();
        }
        ,
        setMaxLengthUI: function (selector) {
            if (selector == null) { selector = ""; }

            $.each($(selector + " .uiIndicator"), function () {
                $(this).trigger("input");
            });
        }
        ,
        setQTYTotals: function (quantity, inclusiveVatTot, exclusiveVatTot)
        {
            $(".totExcShipping .totQTY").text("");
            $(".totExcShipping .inclusiveVatTot").text("");
            $(".totExcShipping .exclusiveVatTot").text("");

            setTimeout(function () {
                $(".totExcShipping .totQTY").text(quantity);
                $(".totExcShipping .inclusiveVatTot").text(inclusiveVatTot);
                $(".totExcShipping .exclusiveVatTot").text(exclusiveVatTot);}, 5000);

        }
        ,
        getShippingServices:function ()
        {
            _shippingMessage = "";
            var sok = $(".isShippingAv");  
           
          
            $("#ShipError").remove();
            sok.val(false);
            $("k-wndw-noshipping").html("");
            $.ajax({
                type: "POST",
                url: _settings.shippingServicesUrl,
                data: { "countryCode": _selectedCountry },
                success: function (data) {
                    if (data.hasOwnProperty('success'))
                    {
                        _shippingMessage = data.messages[0];
                        $(".customerFields").prepend("<div id=\"ShipError\"><span class=\"message field-validation-error\">" + _shippingMessage + "</span></div>");

                        //$("#ShipError").show();

                        that.bringElIntoView($("#ShipError"));
                    }
                else
                    {
                        sok.val(true);
                       
                        $(".shippingservices").html(data);
                    }
                }
            });
        
        }
        ,
        bindShippingOnChange: function ()
        {
            // $(".despatchOption,..bookShippingServices,.entsShippingServices").unbind("change");
            // Shipping Options step - toggle of single or multi despatch
            $(".despatchOption").change(function (e) {
                if ($(this).val() === "1") //single despatch
                {
                    $(".multiDesp").hide();
                    $(".singleDesp").show();
                }
                else {
                    $(".singleDesp").hide();
                    $(".multiDesp").show();
                }
                that.setShippingCost(parseInt($(this).val()));
            });

            //Shipping Options step - change of book products delivery service
            $(".bookShippingServices").change(function (e) {
                $(".bookShippingServiceId").val($(this).val());
                _shipping.booksShipping = parseFloat($(this).attr("data-cst"));
                that.calculateEstShipping();
            });

            //Shipping Options step - change of ents products delivery service
            $(".entsShippingServices").change(function (e) {
                $(".entsShippingServiceId").val($(this).val());
                _shipping.entsShipping = parseFloat($(this).attr("data-cst"));
                that.calculateEstShipping();
            });
        }
        ,
        // this allows validation and removes duplicate error message from jquery validate for the HD Form
        getHDFormValidator: function ()
        {
            // obtain validator get rid of default required message use validator for messages
            return $("#frmHD").validate({errorPlacement: function () { return true; }, onfocusout: function (element) {this.element(element);}});
        }
        ,
        noShipping: function () {
            _noShipping = true;
        }
        ,
        //sets display and button position based upon the HD step
        setSelectedStep: function () {
            $(".stepLink").removeClass("selected");
            $(".stepLink:eq(" + _settings.stepIndex + ")").addClass("selected");
            that.setPageHeading();
            that.setSideDisplay();
  
            if (_settings.stepIndex === 1 && _noShipping) {
                var windw = $("#k-wndw-noshipping");

                if (!windw.data("kendoWindow")) {

                    windw.kendoWindow({
                        width: "800px",
                        height: "500px",
                        title: "Items without available shipping",
                        actions: ["Close"],
                        modal: true,
                        pin: true,
                        close: function (e) {
                            $(".stepBlock ul li a").prop("disabled", true);
                            $(".stepButtons button").prop("disabled", true);
                            $(".stepButtons button").addClass("disabled");
                            $("#activeBasket")[0].click();
                        }
                    });
                }

                var pos = $(".customerOrderCheckout").position();
                windw.closest(".k-window").css({
                    top: pos.top,
                    left: pos.left + 200
                });
                if (windw.data("kendoWindow").element.is(":hidden")) {
                    windw.data("kendoWindow").open();
                }
            }

            $(".req").show();
            $(".btstep .icon-text").text("Next");
            $(".stepButtons").css("float", "left");
            if (_settings.stepIndex >= 3) // _confirmDetails
            {
                $(".stepButtons").css("float", "right");
                $(".req").hide();
                $(".btstep .icon-text").text("Place Order");
            }
        }
        
        ,
        //Validates all previous step when selecting a step other than the next or previous step
        validatePrevSteps: function (idx,selector)
        {
            var i = 0;
            var anyError = false;
            var isValid = true;
            var validator = that.getHDFormValidator();
            for (i; i < idx; i++)
            {
                var $step = $(".checkout-step:eq(" + i + ")");
                if (!that.validateElements($step, validator))
                {
                    if (i === 0) {
                       $(selector + " .gsearchByPostcode").hide();
                       //make sure we pop open all address fields here, so the user can see all invalid fields
                       $(selector + ' .manualAddress').css('display', 'block');
                   }
                   else
                   {
                     
                      $(".checkout-step:visible").hide();
                       $(".checkout-step:eq(" + i + ")").fadeIn();
                    }
                    var ele = $(".checkout-step:eq(" + i + ")").find(".field-validation-error:visible:eq(0)").parent();
                 
                    if (ele === null) {
                        ele = $(".checkout-step:eq(" + i + ")").find(".field-validation-error:visible:eq(0)");
                    }
                    that.bringElIntoView(ele);
                    isValid = false;
                    break;
                }
            }
            return isValid;
        }

        ,
        //validates inputs within a step
        validateStep: function (selector)
        {
            
            //are all the fields in the step valid
            var anyError = false;
            var $step = $(".checkout-step:visible"); // get current step
            if (!this.validateElements($step, that.getHDFormValidator())) {
                if (_settings.stepIndex === 0 /* address fields here */) {
                    $(selector + " .gsearchByPostcode").hide();
                    //make sure we pop open all address fields here, so the user can see all invalid fields
                    $(selector + ' .manualAddress').css('display', 'block');
                }
             
                that.bringElIntoView($step.find(".field-validation-error:visible:eq(0)").parent());
               
                return false;
            }

            if (_settings.stepIndex + 1 >= 2) { //GWEB-1363 SPANNER CHECK CANNOT CHECKOUT WITH 0 SHIPPING COST

                if (!that.validateShippingCost()) {
                    return false;
                }
                else {
                    $(".shippingservices").find(".shipError").remove();
                }
            }

            $(".stepBack").hide();
   
            if ($step.next().hasClass("checkout-step"))
            {
                // is there any next step?
                $step.hide().next().fadeIn();  // show it and hide current step
                $step = $step.next();
                _settings.stepIndex = _settings.stepIndex + 1;
                that.setSelectedStep();
                $(".stepBack").show();   // recall to show backStep button
                that.bringElIntoView($(".basketHeader"));

                that.toggleRequiredMobileNumber();

                if (_settings.stepIndex >= 3) // _confirmDetails
                {
                  that.populateConfirmDetails();
                }
                return true;
            }
            else
            { // this is last step, submit form
               
                  $("#frmHD").submit();
               
            }
        }
        ,
        validateShippingCost: function () {
            var val = parseFloat(_shipping.booksShipping + _shipping.entsShipping);

            if (val > 0) {
                return true;
            }
            else {
                if ($(".shippingservices").find(".shipError").length == 0) {
                    $(".shippingservices").prepend("<div id=\"ShipError\" class=\"shipError\"><span class=\"message field-validation-error\">Unable to continue invalid shipping cost of £" + val.toFixed(2) + "</span></div>");
                    
                }
                that.bringElIntoView("#ShipError");
                return false;
            }
        }
        ,
        toggleRequiredMobileNumber: function () {
            if (_selectedCountry !== "GB") {
                $("#mobileNumberLabel").html("Mobile number* ");
                $("#deliveryInstructionsLegend").html("Leave delivery instructions")
            }
            else {
                $("#mobileNumberLabel").html("Mobile number ");
                $("#deliveryInstructionsLegend").html("Leave delivery instructions (optional)")
            }
        }
        ,
        //validated the elements within a step
        validateElements: function (startElement, validator) {

            var isValid = true;
            startElement.find("input").each(function () {
                if (!validator.element(this)) { // validate every input element inside this step
                   // console.log($(this).attr("id"));
                    isValid = false;
                }
            });
            
            startElement.find(".TextArea").each(function () {
                if (!validator.element(this)) { // validate every input element inside this step
                    //console.log($(this).attr("id"));
                    isValid = false;
                }
            });

          
           //
            var shipOk = startElement.find(".isShippingAv");
            if (shipOk.length > 0) {
                if ($(shipOk).val() === "false") {
                    isValid = false;
                   // if ($.trim(_shippingMessage).length === 0) {
                   //     _shippingMessage = "Invalid Home Delivery Basket - Shipping Options not available";
                   // }

                   // $(".customerFields").prepend("<div id=\"ShipError\"><span class=\"message field-validation-error\">" +  _shippingMessage + "</span></div>");

                   // //$("#ShipError").show();

                   //that.bringElIntoView($("#ShipError"));
                  
                }
            }
            
            return isValid;
        }
        ,
        //scroll to an element
        bringElIntoView: function (el)
        {
            if ($(el).length > 0) {
                $('html, body').animate({ scrollTop: $(el).offset().top - 100 });
            }
        }
       
        ,
        //for fields that must contain letters only such as town etc
        addInRegex:function()
        {
            $.validator.addMethod("custom", function (value, element) {
                return this.optional(element) || /^[a-zA-Z\u0080-\u024F\s\/\-\)\(\!\`\.\"\']+$/.test(value);
            }, function (params, element) {
                return $(element).attr("id").substring($(element).attr("id").indexOf("_") + 1) + " is invalid ";
            });

            $.validator.classRuleSettings.custom = { custom: true };
        }
        ,
        addPostcodeValidation: function()
        {
           if ($.validator != undefined)
           {
               var jsFunctionName = "postcodecheckforireland"
               $.validator.unobtrusive.adapters.add(jsFunctionName, ["dependentproperty", "country", "postcodeprefix", "postcodeproperty"],
                    function (options)
                    {
                        options.rules[jsFunctionName] = options.params;
                        options.messages[jsFunctionName] = options.message;
                });

               $.validator.addMethod(jsFunctionName, function (value, element, parameters) {
                    var postcodePrefix = parameters.postcodeprefix;
                    var country = parameters.country;
                    var postcode = $("#" + parameters.postcodeproperty).val();
                    var actualvalue = $("#" + parameters.dependentproperty).val();
                    if ($.trim(actualvalue).toUpperCase() === country.toUpperCase() && $.trim(postcode).toUpperCase().indexOf(postcodePrefix.toUpperCase())==0) {
                        return false;
                    }
                    return true;
                });
            }
        }
        ,
        addDeliverySMSNumberValidation: function () {
           if ($.validator != undefined) {
                var jsFunctionName = "deliverysmsnumbercheckforinternational"
                $.validator.unobtrusive.adapters.add(jsFunctionName, ["dependentproperty","country","deliverysmsnumberproperty"],
                    function (options) {
                        options.rules[jsFunctionName] = options.params;
                        options.messages[jsFunctionName] = options.message;
                    });

                $.validator.addMethod(jsFunctionName, function (value, element, parameters) {
                    var country = parameters.country;
                    var deliverysmsnumber = $("#" + parameters.deliverysmsnumberproperty).val();
                    var actualvalue = $("#" + parameters.dependentproperty).val();
                    if ($.trim(actualvalue).toUpperCase() !== country.toUpperCase() && $.trim(deliverysmsnumber).length === 0) {
                        return false;
                    }
                    return true;
                });
            }
        }
        ,
        remCustomerPCVal: function (target) {
                var attrs = $(target)[0].attributes;
                for (var i = 0; i < attrs.length; i++) {
                    if (attrs[i].nodeName.indexOf("data-val-postcodecheckforireland") != -1)
                    {
                        $(target).removeAttr(attrs[i].nodeName);
                    }
                };
        }
        ,
        //on selecting other in delivery safe place show an associated text box for futher data entry
        onDeliverySafePlaceChange: function (e) {
         
            if (this.value().indexOf("Other") > -1) {
                $("#DeliverySafePlaceOther").focus();
                $(".other").show();
            }
            else
            {
                $("#DeliverySafePlaceOther").val("");
                $(".other").hide();
            }
        }
        /*ADDRESS BOK FUNCTIONS */
        ,
        //add/edits get for customers in the address book
        addEditCustomer: function (id, title) {
            that.clearValidationSummary();
           
            $('#addEditCustomerDetails').html("");
            $(_controls.customerEditWindow).resetValidation(_controls.customerEditWindow);
            $.ajax({
                type: "GET",
                data: {
                    AccountCustomerId: id
                },
                url: _settings.AddEditCustomerUrl,
                success: function (data) {
                    if (data.hasOwnProperty('success') && !data.success) {
                        gardners.processStandardAjaxResponse(data, $('.existingCustomerLookup'));
                    }
                    else {
                        $('#addEditCustomerDetails').html(data);
                        gardners.kendoHelpers.setKendoWindowTitle(_controls.customerEditWindow, title);
                        gardners.kendoHelpers.openKendoWindow(_controls.customerEditWindow);
                    }
                }

            });

        }
        ,
        //ajax for update for address book customer 
        updateCustomerComplete: function (customData, data, status, xhr)
        {
            if (data.success === false)
            {
                gardners.processStandardAjaxResponse(data, customData.targetElement, customData);
            }
            else {
                //populate from form fields
                that.refreshAddressBook();
                gardners.kendoHelpers.closeKendoWindow(_controls.customerEditWindow);
                gardners.kendoHelpers.showSuccessNotification('Updated');
                }
        }
        ,
        //filters the address book
        filterAddressBook: function () {
            var lastNameOrPostcode = $('#LKCustomer').val();
            $filter = new Array();
            if ($.trim(lastNameOrPostcode) != "") {
                $lookupFilter = { logic: "or", filters: [] };
                $lookupFilter.filters.push({ field: "LastName", operator: "startswith", value: lastNameOrPostcode });
                $lookupFilter.filters.push({ field: "Postcode", operator: "contains", value: lastNameOrPostcode });
                $filter.push($lookupFilter);
            }
            var grid = gardners.kendoHelpers.getGrid(_controls.addressBookGrid);
            grid.dataSource.filter($filter);
        }
        ,
        //refreshs the address book grid after an insert/update/delete
        refreshAddressBook: function () {
            gardners.kendoHelpers.getGrid(_controls.addressBookGrid).dataSource.read();
        }
        ,
        //a soft delete in the address book as it's tied to existing orders - new functionality is we don't stamp an order with an account customer
        deleteFromAddressBook: function (Id) {
            $.when(gardners.kendoHelpers.PopupYesNoDialog.show({
                title: "Confirm address book deletion",
                message: "Are you sure you want to delete this customer?"
            })
            ).done(function (response) {
                if (response.button === "Yes") {
                    $.post(
                        _settings.deleteAddresBookUrl
                        , { 'AccountCustomerId': Id }
                        , function (data) {
                            if (data.success == false)
                            {
                                gardners.processStandardAjaxResponse(data);
                            }
                            else
                            {
                                gardners.kendoHelpers.showSuccessNotification(data.messages[0]);
                                that.refreshAddressBook();
                            }
                        });
                }
            });
        }
        ,
        //self explanatory
        clearValidationSummary: function () {
            gardners.clearValidationSummary();
        }

       
        
        ///############ old code
         //,

        //showShippingCosts: function (typeId) {
        //    $.ajax({
        //        type: "POST",
        //        url: _settings.shippingCostsUrl,
        //        data: { "id": typeId },
        //        success: function (data) {
        //            if (data.hasOwnProperty('success') && data.success == false) {
        //                gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
        //            }
        //            else {

        //                $("#shippingCosts").html(data);
        //                gardners.kendoHelpers.openKendoWindow(_controls.shippingCostsWindow);
        //            }
        //        }
        //    });
        //}
        //,
        //switchOffDeliveryPostCodeRule: function () {
        //    $("#Delivery_PostCode").rules('remove', 'required');
        //}
        //,
        //togglePostcodeRule: function (country, eleId) {
        //    var label = $("label[for=" + eleId + "]");
        //    var target = $("#" + eleId);
        //    //target.removeClass("input-validation-error");
        //    var showDeliveryOptions = false;
        //    if ($.inArray(country, _valCountryPostcodes) != -1) {
        //        showDeliveryOptions = true;
        //        target.rules('add', {
        //            required: true, messages: { required: 'Postcode required' }
        //        });
        //        label.addClass('required');
        //        if (eleId.indexOf("Customer") !=-1) {
        //            that.setCustomerCustomValidation(country);
        //        }
        //        if (eleId.indexOf("Delivery") != -1) {
        //            that.setDeliveryCustomValidation(country);
        //        }
        //    }
        //    else {
        //        target.rules('remove', 'required');
        //        target.removeClass("input-validation-error");
        //        target.addClass("valid");
        //        label.removeClass('required');
        //        $("span[data-valmsg-for=" + eleId + "]").removeClass("field-validation-error").addClass("field-validation-valid").text("");
        //    }

        //    that.toggleDeliveryOptions(showDeliveryOptions);
        //}
        //,
        //validateForm: function () {

        //    that.clearValidationSummary();
        //    that.removeRules(_rules);
        //    that.removeRules(_delivery_rules);
        //    if ($('#IsHomeDelivery_True').prop('checked') == true) {
        //        if ($('#IsSameDeliveryAddress').prop('checked') == true) {
        //            that.addRules(_rules);
        //            that.switchOffDeliveryPostCodeRule();
        //        }
        //        else that.addRules(_delivery_rules);
        //    }
        //    else {
        //        //     that.addRules(_rules);
        //        that.switchOffDeliveryPostCodeRule();
        //    }

        //    if (!$('.customerOrderCheckout form').valid()) {
        //        $("html, body").animate({ scrollTop: 0 }, "slow");
        //        return false;
        //    }
        //    return true;

        //}
        //,
        //onItemPricingOptionsChange: function (data) {
        //    if (this.value() === 3) {
        //        $('.itemPricing').show();
        //    }
        //    else {
        //        $('.itemPricing').hide();
        //    }
        //}
    };
    return that;
})(window, jQuery);

;
gardners.advancedSearch = (function (window, $) {
    var _settings = { isLoggedIn: false, isEdit: false, productCategory: 0 };

    var _controls = {
        bicClassification: '',
        bicClassificationBooks: '',
        bicClassificationEBooks: '',
        genreVideo: '',
        genresVideo: '',
        genreMusic: '',
        genresMusic: '',
        userSelectedMusicGenres: '',
        userSelectedDVDGenres:''

    }

    var that = {
        init: function (settings,controls) {
            _settings = settings;
            _controls = controls;
            $(document).ready(function () {

                $("body").on("click", '.advTooltipBic', function (event) {
                   // that.unbindClassificationTarget();
                    _controls.bicClassification = $(this).attr("data-target");
                    that.OpenBicTree();
                });

                $("body").on("click", '.advTooltipVideo', function (event) {
                    _controls.genreVideo = $(this).attr("data-target");
                    that.OpenVideoTree();
                });

                $("body").on("click", '.advTooltipMusic', function (event) {
                    _controls.genreMusic = $(this).attr("data-target");
                    that.OpenMusicTree();
                });
                              
                $("body").on("click", "#btnBicAdd", function (event) {
                    that.AddBic();
                });

                $("body").on("click", "#btnVideoGenreAdd", function (event) {
                    that.AddGenreVideo();
                });

                $("body").on("click", "#btnMusicGenreAdd", function (event) {
                    that.AddGenreMusic();
                });

                $("#advSearch li").on("click", "a", function (event) {

                    $('#advSearch li').removeClass('current');
                    $(this).parent('div').parent('li').addClass('current');

                    if ($(this).hasClass('mySavedSearches') && _settings.isLoggedIn) {
                        $('.container .advancedSearchFields').hide();
                        $('.savedSearches').show();
                    }
                    else {
                        that.ShowSearch("#" + $(this).data('field-id'));
                    }
                    
                });
               
                $('.advTooltipBic').each(function () {
                    var tooltip = $(this).attr("data-tooltip");
                    $(this).kendoTooltip({
                        filter: "span",
                        position: "top",
                        content: function (e) {
                            return tooltip;
                        }
                    }).data("kendoTooltip");
                });

                $("body").on("click", "#Biccodes_tagList li .k-i-close", function (event) {
                    $(this).closest("li").remove();
                });
               

                $("body").on("click", "#VideoGenreCodes_tagList li .k-i-close", function (event) {
                    $(this).closest("li").remove();
                });
                $("body").on("click", "#MusicGenreCodes_tagList li .k-i-close", function (event) {
                    $(this).closest("li").remove();
                });

                $("body").on("click", _controls.bicClassificationBooks + "_tagList li .k-i-close", function (event) {
                    that.syncBicClassifications(_controls.bicClassificationBooks, $(this));
                });

                $("body").on("click", _controls.bicClassificationEBooks + "_tagList li .k-i-close", function (event) {
                    that.syncBicClassifications(_controls.bicClassificationEBooks, $(this));
                });

                $("body").on("click", "#DVDSearch_DVDGenre_tagList li .k-i-close", function (event) {
                    var closestLI = $(this).closest("li");
                    var attr = closestLI.attr("data-id") + '#';
                    var selGenres = $(_controls.userSelectedDVDGenres);
                    selGenres.val(selGenres.val().replace(attr, ''));
                    closestLI.remove()
                });

                $("body").on("click", "#MusicSearch_MusicGenre_tagList li .k-i-close", function (event) {
                    var closestLI = $(this).closest("li");
                    var attr = closestLI.attr("data-id") + '#';
                    var selGenres = $(_controls.userSelectedMusicGenres);
                    selGenres.val(selGenres.val().replace(attr, ''));
                    closestLI.remove()
                });


                // KENDO UI TREEVIEW DOES NOT FIRE SELECT ON A SELECTED NODE HENCE
                var treeview =  $("#bic-treeview").data("kendoTreeView");
                treeview.wrapper.on("click", ".k-state-selected", function(e) {
                    treeview.trigger("select", {
                        node: $(e.target).closest(".k-item")[0]
                    });
                });

                var treeviewVideo = $("#video-genre-treeview").data("kendoTreeView");
                treeviewVideo.wrapper.on("click", ".k-state-selected", function (e) {
                    treeviewVideo.trigger("select", {
                        node: $(e.target).closest(".k-item")[0]
                    });
                });

                var treeviewMusic = $("#music-genre-treeview").data("kendoTreeView");
                treeviewMusic.wrapper.on("click", ".k-state-selected", function (e) {
                    treeviewMusic.trigger("select", {
                        node: $(e.target).closest(".k-item")[0]
                    });
                });


                that.ViewSearchForEdit();
                gardners.kendoHelpers.setDatePickerPlaceholder();

            });
        }
        ,
        ShowSearch:function(Id)
        {
            $('.container .advancedSearchFields').hide();
            if (_settings.isLoggedIn) {
                $('.savedSearches').hide();
            }
            $(Id).show();
        }
        ,
        ViewSearchForEdit:function()
        {
            if (_settings.isEdit) {
                var sel = $("#advSearch li.current");
                if (sel.length == 1) {
                    var a = $(sel).children().find('a');
                    that.ShowSearch("#" + $(a).data('field-id'));
                }
            }
            else {

                if (_setings.productCategory == 0) {
                    $("#advancedSearchFieldsAllProducts").show();
                }
            }
        }
        ,
        UserSearchesDataBound: function (e) {
            if (this.dataSource.view().length == 0) {
                var currentPage = this.dataSource.page();
                if (currentPage > 1) {
                    this.dataSource.page(currentPage - 1);
                }
            }
            gardners.layout.tooltips();
        }
        ,
        OpenBicTree: function () {
            var treeView = $("#bic-treeview").data("kendoTreeView");
            treeView.select($());
            $('#BicCodes').val('');
            $('#SelBic').val('')
            $("#bic-treeview").data("kendoTreeView").dataSource.read();
            gardners.kendoHelpers.openKendoWindow('#bicTreeWndw');
        }
        ,
        OpenVideoTree: function () {
            var treeView = $("#video-genre-treeview").data("kendoTreeView");
            treeView.select($());
            $('#VideoGenreCodes').val('');
            $('#SelVideoGenre').val('')
            $("#video-genre-treeview").data("kendoTreeView").dataSource.read();

            var sourceList = _controls.genreVideo + "_tagList";
            var targetList = "#VideoGenreCodes_tagList";
            $(targetList).empty();

            var li = "";
            $(sourceList + " li").each(function (index) {
                li += "<li data-id=\"" + $(this).attr("data-id") + "\" class=\"k-button\">" + $(this).html() + "</li>";
            });

            if ($.trim(li) != "") {
                $(targetList).append(li);
            }

            gardners.kendoHelpers.openKendoWindow('#dvdTreeWndw');
        }
        ,
        OpenMusicTree: function () {
            var treeView = $("#music-genre-treeview").data("kendoTreeView");
            treeView.select($());
            $('#MusicGenreCodes').val('');
            $('#SelMusicGenre').val('')
            $("#music-genre-treeview").data("kendoTreeView").dataSource.read();

            var sourceList = _controls.genreMusic + "_tagList";
            var targetList = "#MusicGenreCodes_tagList";
            $(targetList).empty();

            var li = "";
            $(sourceList + " li").each(function (index) {
                li += "<li data-id=\"" + $(this).attr("data-id") + "\" class=\"k-button\">" + $(this).html() + "</li>";
            });

            if ($.trim(li) != "") {
                $(targetList).append(li);
            }

            gardners.kendoHelpers.openKendoWindow('#musicTreeWndw');
        }
        ,
        syncBicClassifications:function(Id,ele)
        {
            var code = "";
            var codes = "";
            code = ele.closest("li").attr("data-id");
            var arr = $(Id).val().split(" ");
            $(Id).val("");
            $.each(arr, function (n, val) {
                if ($.trim(val) != "") {
                    if (val.toUpperCase() != code.toUpperCase()) {
                        $(Id).val($(Id).val() + val + " ");
                    }
                }
            });
            ele.closest("li").remove();
            $(Id).val($.trim($(Id).val()));
        }
        ,
        syncVideoClassifications: function (Id, ele) {
            var code = "";
            var codes = "";
            code = ele.closest("li").attr("data-id");
            var arr = $(Id).val().split(" ");
            $(Id).val("");
            $.each(arr, function (n, val) {
                if ($.trim(val) != "") {
                    if (val.toUpperCase() != code.toUpperCase()) {
                        $(Id).val($(Id).val() + val + " ");
                    }
                }
            });
            ele.closest("li").remove();
            $(Id).val($.trim($(Id).val()));
        }
        ,
        syncMusicClassifications: function (Id, ele) {
            var code = "";
            var codes = "";
            code = ele.closest("li").attr("data-id");
            var arr = $(Id).val().split(" ");
            $(Id).val("");
            $.each(arr, function (n, val) {
                if ($.trim(val) != "") {
                    if (val.toUpperCase() != code.toUpperCase()) {
                        $(Id).val($(Id).val() + val + " ");
                    }
                }
            });
            ele.closest("li").remove();
            $(Id).val($.trim($(Id).val()));
        }
        ,
        AddBic: function () {
           
            //hidden input for the model
           // that.bindClassificationTarget();
            var target = _controls.bicClassification;

           // the target list for the list of descriptions
            var sourceList = "#Biccodes_tagList";
            var bicCodes = "";
            //var li = "";
            $(sourceList + " li").each(function (index) {
                bicCodes += $(this).attr("data-id") + " ";
           //     li += "<li data-id=\"" + $(this).attr("data-id") + "\" class=\"k-button\">" + $(this).html() + "</li>";
            });

            if ($.trim(bicCodes) != "")
            {
             //   $(targetList).empty();
             //   $(targetList).append(li);
                $(target).val($.trim(bicCodes));
            }

            $(sourceList).empty();
            gardners.kendoHelpers.closeKendoWindow('#bicTreeWndw');
        }
        ,
        AddGenreMusic: function () {
            var target = _controls.genreMusic + "_tagList";
            $(target).empty();

            // the target list for the list of descriptions
            var sourceList = "#MusicGenreCodes_tagList";
            var li = "";
            var modelList = "";

            $(sourceList + " li").each(function (index) {
                li += "<li data-id=\"" + $(this).attr("data-id") + "\" class=\"k-button\">" + $(this).html() + "</li>";

                if (modelList === "")
                    modelList += $(this).attr("data-id");
                else
                    modelList += "#" + $(this).attr("data-id");
            });

            if ($.trim(li) != "") {
                $(target).append(li);
            }

            $(sourceList).empty();
            $(_controls.genresMusic).val(modelList);
            gardners.kendoHelpers.closeKendoWindow('#musicTreeWndw');
        }
        ,
        AddGenreVideo: function () {
            var target = _controls.genreVideo + "_tagList";
            $(target).empty();

            // the target list for the list of descriptions
            var sourceList = "#VideoGenreCodes_tagList";
            var li = "";
            var modelList = "";

            $(sourceList + " li").each(function (index) {
                li += "<li data-id=\"" + $(this).attr("data-id") + "\" class=\"k-button\">" + $(this).html() + "</li>";

                if (modelList === "")
                    modelList += $(this).attr("data-id");
                else
                    modelList += "#" + $(this).attr("data-id");
            });

            if ($.trim(li) != "") {
                $(target).append(li);
            }

            $(sourceList).empty();
            $(_controls.genresVideo).val(modelList);
            gardners.kendoHelpers.closeKendoWindow('#dvdTreeWndw');
        }
        ,
        SelectBic: function (e) {          
            var Id = "#Biccodes_tagList";

            if ($(Id + " li").length < 500) {
                var dataItem = this.dataItem(e.node);
                var code = dataItem.id;
                var text = dataItem.name;
                var li = "<li class=\"k-button\" data-id=\"" + code + "\" ><span>" + text + "</span><span class=\"k-icon k-i-close\">delete</span></li>";
                var f = $(Id).find("li[data-id='" + code + "']");

                if (f.length == 0) {
                    $(Id).append(li);
                }
            }
        }
        ,
        SelectVideoGenre: function (e) {
            var Id = "#VideoGenreCodes_tagList";

            if ($(Id + " li").length < 500) {
                var dataItem = this.dataItem(e.node);
                var code = dataItem.id;
                var text = dataItem.name;
                var li = "<li class=\"k-button\" data-id=\"" + code + "\" ><span>" + text + "</span><span class=\"k-icon k-i-close\">delete</span></li>";
                var f = $(Id).find("li[data-id=\"" + code + "\"]");

                if (f.length == 0) {
                    $(Id).append(li);
                }
            }
        }
        ,
        SelectMusicGenre: function (e) {
            var Id = "#MusicGenreCodes_tagList";

            if ($(Id + " li").length < 500) {
                var dataItem = this.dataItem(e.node);
                var code = dataItem.id;
                var text = dataItem.name;
                var li = "<li class=\"k-button\" data-id=\"" + code + "\" ><span>" + text + "</span><span class=\"k-icon k-i-close\">delete</span></li>";
                var f = $(Id).find("li[data-id=\"" + code + "\"]");

                if (f.length == 0) {
                    $(Id).append(li);
                }
            }
        }
        ,
        clearSearchParams: function (ele)
        {
            var frm = $(ele).closest('form');

            $(frm).find(".k-textbox").each(function () {
                $(this).val('');
            });

            $(frm).find("input[data-role='datepicker']").each(function () {
                gardners.kendoHelpers.setDatePickerValue($(this).context.id, null);
            });

            $(frm).find(".k-checkbox").each(function () {
                $(this).prop("checked", false);
            });

            $(frm).find("input[data-role='numerictextbox']").each(function () {
                var ntb = $(this).data("kendoNumericTextBox");
                ntb.value("");
            });

            $(frm).find("[data-role='multiselect']").each(function (e) {
                var multi = $(this).data("kendoMultiSelect");
                multi.value([]);
            });

            $(frm).find("#BookSearch_BicClassification_tagList").each(function () {
                $(this).find("li .k-i-close").each(function () {
                    $(this).closest("li").remove();
                });
                //clear associated hidden
                $("#BookSearch_BicClassification").val("");
            });

            $(frm).find("#EBookSearch_BicClassification_tagList").each(function () {
                $(this).find("li .k-i-close").each(function () {
                    $(this).closest("li").remove();
                });
                //clear associated hidden
                $("#EBookSearch_BicClassification").val("");
            });

        }
    }
    return that;
})(window, jQuery);;
gardners.searchSuggest = (function (window, $) {

    var options = {        
        searchBoxSelector: '#keyword',
        searchFormSelector: '#SearchForm'
    };
    var _settings = { delay: 0 };
    var _searchTimer;
    var that =
     {
        init: function (settings) {
            _settings = settings;
            $("#keyword").on("keydown", function (e) {
                if (e.keyCode === 13) {
                    $(this).closest("form").submit();
                }
            });
        }
        ,
        onFiltering: function (e)
        {
            /* GWEB-1160
             * Override the kendo filtering event so we don't overload, delay the read for xxx milliseconds
             */ 
            //var date1 = new Date();
            e.preventDefault();
            var val = $.trim($(e.sender.element.context).val())
            if (val.startsWith(978) || val.startsWith(979)) val = "";
            if ($.trim(val).length > 2)
            {
                clearTimeout(_searchTimer);
                _searchTimer = setTimeout(
                    function ()
                    {
                        e.sender.dataSource.read({ term: val });
                    //var date2 = new Date();
                    //var diff = date2 - date1;
                    //console.log("diff= " + diff);
                   }, _settings.delay);
            }
         }
         ,
         onSelect : function(e){
             if (e.item) {
                 $(options.searchBoxSelector).val(e.item.text());
                 $(options.searchFormSelector).append($("<input>").attr("type", "hidden").attr("name", "isSuggestion").val(true));
             }
             $(options.searchFormSelector).submit();
         }
         ,
         getInputValue : function(){
                 return { term: $(options.searchBoxSelector).data("kendoAutoComplete").value() };
         }
     }
    return that;

})(window, jQuery);
;
gardners.importEans = (function (window, $) {

    var _settings = {
        validateCandPUrl: '',
        submitDiscardErrorsUrl: '',
        refresh: false,
        refreshGridEvent: function () { },
        currentWindow: null,
        maxBulkFileSize: 0,
        maxPasteLines: 999
    };

    var _controlIds = {
        cutPaste: "#CutAndPaste"
    }

    var _isFileUpload = false;

    var that = {

        init: function (settings) {

            _settings = settings;

            // default to 500 items if not specified
            _settings.maxPasteLines = typeof (_settings.maxPasteLines) == 'undefined' || _settings.maxPasteLines === null ?
                999 : _settings.maxPasteLines;

            $(_controlIds.cutPaste).on("keyup contextmenu input", function (e) { that.updateLineCount(); });
            $('#CutAndPasteFile').on("keyup contextmenu input", function (e) { that.updateLineCount(); });

            $('.cp').on("click", function (e) {
                gardners.kendoHelpers.closeKendoWindow('#CandP');
                that.showUP();
            });

            $('.upload').on("click", function (e) {
                gardners.kendoHelpers.closeKendoWindow('#fileupwndw');
                that.showCP();
            });

            $('.clearIsbns').click(function (e) {
               
                e.preventDefault();
                that.clearIsbns();
               
            });
        },
        clearIsbns: function ()
        {
            $(_controlIds.cutPaste).val("");
            $('#CutAndPasteFile').val("");
            $("span[data-valmsg-for='" + _controlIds.cutPaste + "']").hide();
            $("span[data-valmsg-for='CutAndPasteFile']").hide();
            $(".validation-summary-errors ul").empty();
            $(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors");
            $(".validation-summary-errors").hide();

            if ($("#singleItemSummary").length > 0) {
                $("#singleItemSummary").find("ul").empty();
            }
            if ($(".lineCount").length > 0) {
                $(".lineCount").text(0);
            }
        }
        ,
        showCP: function () {
            $(_controlIds.cutPaste).removeClass('field-validation-error input-validation-error');
            var validator = $("span[data-valmsg-for='CutAndPaste']");
            validator.removeClass('field-validation-error').addClass('field-validation-valid');
            validator.hide();
            $('#candpmain').show();
            $('#candpadd').hide();
            $('#candpadd').html('');
            $(_controlIds.cutPaste).val('');
            gardners.kendoHelpers.openKendoWindow('#CandP');
            gardners.kendoHelpers.setKendoWindowTitle('#CandP', 'Cut & Paste');
            _settings.currentWindow = gardners.kendoHelpers.getKendoWindow('#CandP');
            that.updateLineCount($(_controlIds.cutPaste).val());
            _isFileUpload = false;
        },

        showUP: function () {
            $('.k-upload-files,.k-upload-selected').hide();
            $('.k-dropzone').removeClass('field-validation-error input-validation-error');
            $('.k-upload-files').empty();
            var validator = $("span[data-valmsg-for='bulkFile']");
            validator.removeClass('field-validation-error').addClass('field-validation-valid');
            validator.hide();
            $('#bulkpadd').html('');
            $("#uploadCSV").show();
            $('#bulkAddCorrect').hide();
            gardners.kendoHelpers.openKendoWindow('#fileupwndw');
            gardners.kendoHelpers.setKendoWindowTitle('#fileupwndw', 'Bulk Load EAN / ISBN - Upload');
            _settings.currentWindow = gardners.kendoHelpers.getKendoWindow('#fileupwndw');
            _isFileUpload = true;
        },

        bulkFileValidate: function (e) {
            $('.k-upload-files,.k-upload-selected').hide();
            $('.k-dropzone').removeClass('field-validation-error input-validation-error');
            var extOk = true;
            var fileSizeOk = true;
            var ok = true;
            var validator = $("span[data-valmsg-for='bulkFile']");
            validator.hide();
            validator.removeClass('field-validation-error').addClass('field-validation-valid');
            $.each(e.files, function (index, value) {
                if (value.size == undefined) {
                    ok = false;
                    $(validator).text("There was a problem with the file - 0k");
                    return;
                }
                else if (value.extension.toUpperCase() != ".TXT" && value.extension.toUpperCase() != ".CSV") { extOk = false; }
                else if ((parseFloat(value.size) / 1024) > _settings.maxBulkFileSize) { fileSizeOk = false; }
              

            });

            if (!extOk) {
                ok = false;
                $(validator).text("Please upload CSV or TXT files only");
            }

            if (!fileSizeOk) {
                ok = false;
                $(validator).text("Upload file too large - maximium size is " + _settings.maxBulkFileSize + "k");
            }

            if (!ok) {
                $('.k-upload-files').empty();
                e.preventDefault();
                validator.removeClass('field-validation-valid').addClass('field-validation-error');
                validator.show();
            }

        },

        bulkFileSuccess: function (e) {
        
            //if all ok we will refresh the grid in the underlying view as valid items added to the datasource
            //the window will show a list of invalid isbns and a count of valid ones
            $("#uploadCSV").hide();
            $('#bulkpadd').show();
            $('#bulkpadd').html(e.response.data);
            $(".k-upload-files.k-reset").find("li").remove();
            $(".k-upload-status").hide();
            that.refreshGrid();
            that.notify(e.response.data);

            var btnsubmit = $('#btnSubmitDiscard');

            if (btnsubmit.text() == 'Return 0 Lines') {
                btnsubmit.addClass('disabled').prop('disabled', true);
                $('#pReturnMessage').text("There are no valid lines to process, cancel to correct and try again.");
            }
            else {
                btnsubmit.removeClass('disabled').prop('disabled', false);
                $('#pReturnMessage').text("You have the option to discard the above failures and continue, or cancel to correct and try again.");
            }
        },

        bulkFileSuccessForBasket: function (e) {
             $(_controlIds.cutPaste).val(e.response.data);
            $(".k-upload-files.k-reset").find("li").remove();
            $(".k-upload-status").hide();
        },

        refreshGrid: function () {
            _settings.refreshGridEvent();
        },

        notify: function (data) {
            //any of these in the returned data
            var success = (data.indexOf('gardners.importEans.closeCurrentWindow()') > 0 || data.indexOf('class="validItems"') >= 0);

            if (success == true) {
                gardners.kendoHelpers.showSuccessNotification("Updated");
            }
        },

        bulkFileError: function (e) {
            var message = "Could not bulk upload the file, please check the file format and extension";
            if (e.XMLHttpRequest.responseText.length > 0) message = e.XMLHttpRequest.responseText;
            gardners.kendoHelpers.PopupAlertDialog.show({ title: "Bulk Upload", message: message });
        },

        showSpinner: function () {
            if ($(".validateInfo").length > 0) {
                $(".validateInfo").show();
                $(".validateCP").removeClass('btn-primary').addClass('disabled').prop("disabled", true);
            }
        },

        hideSpinner: function () {
            if ($(".validateInfo").length > 0) {
                $(".validateInfo").hide();
                $(".validateCP").removeClass('disabled').addClass('btn-primary').prop("disabled", false);
            }
        }
        ,
        validateCandPEans: function () {
            // validate and send string to ajax to get partial displaying chosen products
        
            var textControl = null;

            if (_isFileUpload)
                textControl = '#CutAndPasteFile';
            else
                textControl = _controlIds.cutPaste;

            var validator = $("span[data-valmsg-for='" + textControl.substring(1) + "']");
            validator.hide();
            validator.removeClass('field-validation-error').addClass('field-validation-valid');
            $(textControl).removeClass('field-validation-error input-validation-error');
            var CandP = $(textControl).val().trim();
           
            if (that.lineCountExceeded(CandP) || CandP === '') {
                $(textControl).addClass('field-validation-error input-validation-error');
                validator.removeClass('field-validation-valid').addClass('field-validation-error');
                validator.show();
            }
            else if (CandP !== '') {
                that.showSpinner();
                $.post(_settings.validateCandPUrl, { CSV: CandP }, function (data) {

                    if (data.hasOwnProperty("success") && data.success == false) {
                        gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                    }
                    else {
                        if (_settings.refresh == true) {
                            that.refreshGrid();
                            that.notify(data);
                        }

                        if (_isFileUpload) {
                            $('#uploadCSV').hide();
                            $('#bulkAddCorrect').hide();
                            $('#bulkpadd').html(data);
                            $('#bulkpadd').show();
                        }
                        else {
                            $('#candpmain').hide();
                            $('#candpadd').html(data);
                            $('#candpadd').show();
                        }

                        var btnsubmit = $('#btnSubmitDiscard');

                        if (btnsubmit.text() == 'Return 0 Lines') {
                            btnsubmit.addClass('disabled').prop('disabled', true);
                            $('#pReturnMessage').text("There are no valid lines to process, cancel to correct and try again.");
                        }
                        else {
                            btnsubmit.removeClass('disabled').prop('disabled', false);
                            $('#pReturnMessage').text("You have the option to discard the above failures and continue, or cancel to correct and try again.");
                        }
                    }
                    that.hideSpinner();
                });
            }
        }
        ,
        submitDiscardErrors: function (ele) {
            var isFile = $(ele).attr("data-isfile");
            var CandP = isFile === "true" ? $("#CutAndPasteFile").val().trim() : $(_controlIds.cutPaste).val().trim();

            $.post(_settings.submitDiscardErrorsUrl, { csvData: CandP,isFile:isFile  }, function (data) {

                if (data.hasOwnProperty("success") && data.success === false) {
                    gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                }
                else {
                    if (_settings.refresh == true) {
                        that.refreshGrid();
                        that.notify(data);
                    }
                    $('#candpmain').hide();
                    $('#candpadd').html(data);
                    $('#candpadd').show();
                }
                that.hideSpinner();
            });

        },

        cancelReValidate: function (e) {
            $(".validation-summary-errors").hide();
            $(".field-validation-valid").hide();
            if ($('#AllItems').length > 0) {
                var uploadedItems = $('#AllItems').val();
                $(".bulkText").val(uploadedItems);
            }
            if (_isFileUpload) {
                $('#bulkpadd').hide();
                $('#bulkpadd').html("");
                $('#bulkAddCorrect').show();
            }
            else {
                $('#candpadd').hide();
                $('#candpadd').html("");
                $('#candpmain').show();
            }
            that.updateLineCount();
        },

        continueAddOnSuccess: function (data) {
            if (data.hasOwnProperty("success") && data.success == false) {
                that.resetButtons(".addOrderPad");
                $(".cancelOrderPad").show();
                gardners.processStandardAjaxResponse(data, "uploadMessageSummary", { growlOnFail: false });
            }
            else {
                $(location).attr("href", data.url);
            }
        },

        continueAddOnFailure: function (ele) {
            that.resetButtons(ele);
        },

        resetButtons: function (ele) {
            if ($(ele).length > 0) {
                $(ele).removeClass('disabled').addClass('btn-primary').prop("disabled", false);
                if ($(ele).attr("data-spin") != null) {
                    $($(ele).attr("data-spin")).hide();
                }
            }

        },

        closeCutAndPastePopup: function () {
            gardners.kendoHelpers.onWindowClose();
            $('#candpmain').hide();
            $('#candpadd').hide();

        },

        closeCurrentWindow: function () {
            _settings.currentWindow.close();
        },

        lineCountExceeded: function (t) {
            var totalLines = t.split("\n").length;

            return (totalLines > _settings.maxPasteLines);
        },

        updateLineCount: function (e) {
            var textControl = null;
            var lineCountSpan = null;

            if (_isFileUpload) {
                textControl = $('#CutAndPasteFile');
                lineCountSpan = $('#lineCountValueFile');
            }
            else {
                textControl = $(_controlIds.cutPaste);
                lineCountSpan = $('#lineCountValue');
            }

            var lines = $.trim($(textControl).val()) === "" ? null : $.trim($(textControl).val()).split('\n');
            var lineCount = lines === null ? 0 : lines.length;

            if ($.trim(textControl.val()) === '')
                lines = 0;

            var newLines = '';

            // remove blank lines
            for (var i = 0; i < lines.length; i++) {
                if ($.trim(lines[i]) === '')
                    continue;

                newLines += lines[i] + '\n';
            }

            var newLineCount = $.trim(newLines).split('\n');

            if (lineCountSpan === 'undefined' || lineCountSpan === null)
                return;

            if (newLineCount.length < (_settings.maxPasteLines + 1))
                lineCountSpan.css("color", "forestgreen");
            else
                lineCountSpan.css("color", "red");

            if (newLineCount.length < (lineCount + 1)) {
                lineCountSpan.text(newLineCount.length);
            }
            else {
                lineCountSpan.text(lineCount);
            }
        }
    };
    return that;
})(window, jQuery);;
var CookieConsent = {

    init: function () {
        var results = document.cookie.match('(^|;) ?CookieConsent.Accepted=([^;]*)(;|$)');
        if (results) {
            if (1 == unescape(results[2])) {
                CookieConsent.Accept();
            }
        } else {
            window.onload = function () {
                for (var i = 0, L = document.links.length; i < L; i++) {
                    var link_href = document.links[i].getAttribute('href');
                    if (!/Cookie-?Policy/i.test(link_href) && (!/^[\w]+:/.test(link_href) || (new RegExp('^[\\w]+://[\\w\\d\\-\\.]*' + window.location.host)).test(link_href))) {
                        document.links[i].onclick = (function () {
                            var origOnClick = document.links[i].onclick;
                            return function (e) {
                                CookieConsent.Accept();
                                if (origOnClick != null) {
                                    return origOnClick();
                                }
                            }
                        })();
                    }
                }

                var storefront_cookie_widget = CookieConsent.GetHtml();
                document.body.insertBefore(storefront_cookie_widget, document.body.childNodes[0]);

            };
        }
    },

    RemoveWidget: function () {
        var widget = document.getElementById('storefront_cookie_widget');
        if (widget) {
            widget.parentNode.removeChild(widget);
        }
    },

    //FUNCTION used when CLOSE button is Clicked 
    Accept: function () {

        var date = new Date();
        date.setTime(date.getTime() + (10 * 365 * 24 * 60 * 60 * 1000));
        var expires = "; expires=" + date.toGMTString();

        document.cookie = 'CookieConsent.Accepted=1; path=/' + expires;
        CookieConsent.RemoveWidget();
    },

    //find the footer link url for cookie policy
    PolicyUrl: function () {
        for (var i = 0, L = document.links.length; i < L; i++) {
            var link_href = document.links[i].getAttribute('href');
            if (/Cookie-?Policy/i.test(link_href)) {
                return link_href;
            }
        }
        return '';
    },

    GetHtml: function () {
        var html = '<div id="storefront_cookie_widget">We use cookies to give you the best possible experience on our site. By continuing to use the site you agree to our use of cookies. ' +            '<a href="' + CookieConsent.PolicyUrl() + '" onclick="CookieConsent.Accept();">Find out more.</a> ' +            '<button id="CookieConsent_Accept" class="btn btn-dark" style="vertical-align: middle;" onclick="CookieConsent.Accept();return false;">Close</button></div>';

        var div = document.createElement('div');
        div.innerHTML = html;
        return div;
    }

}
$(document).ready(function () {
    CookieConsent.init();
});

;
// Sticky Plugin v1.0.3 for jQuery
// =============
// Author: Anthony Garand
// Improvements by German M. Bravo (Kronuz) and Ruud Kamphuis (ruudk)
// Improvements by Leonardo C. Daronco (daronco)
// Created: 02/14/2011
// Date: 07/20/2015
// Website: http://stickyjs.com/
// Description: Makes an element on the page stick on the screen as you scroll
//              It will only set the 'top' and 'position' of your element, you
//              might need to adjust the width in some cases.

(function (factory) {
    if (typeof define === 'function' && define.amd) {
        // AMD. Register as an anonymous module.
        define(['jquery'], factory);
    } else if (typeof module === 'object' && module.exports) {
        // Node/CommonJS
        module.exports = factory(require('jquery'));
    } else {
        // Browser globals
        factory(jQuery);
    }
}(function ($) {
    var slice = Array.prototype.slice; // save ref to original slice()
    var splice = Array.prototype.splice; // save ref to original slice()

    var defaults = {
        topSpacing: 0,
        bottomSpacing: 0,
        className: 'is-sticky',
        wrapperClassName: 'sticky-wrapper',
        center: false,
        getWidthFrom: '',
        widthFromWrapper: true, // works only when .getWidthFrom is empty
        responsiveWidth: false
    },
        $window = $(window),
        $document = $(document),
        sticked = [],
        windowHeight = $window.height(),
        scroller = function () {
            var scrollTop = $window.scrollTop(),
                documentHeight = $document.height(),
                dwh = documentHeight - windowHeight,
                extra = (scrollTop > dwh) ? dwh - scrollTop : 0;

            for (var i = 0, l = sticked.length; i < l; i++) {
                var s = sticked[i],
                    elementTop = s.stickyWrapper.offset().top,
                    etse = elementTop - s.topSpacing - extra;
                //debugger;

                if (!s.stickyElement.hasClass('stickyHeaderLoggedOut')) {
                    //alert('yes login')
                    //update height in case of dynamic content
                    s.stickyWrapper.css('height', s.stickyElement.outerHeight());
                    var logo = $("#logo a");
                    var hamburgerMenu = $("#hamburgerMenu a");
                    var barHeader = $("#barHeader");

                    //Close the Switch Basket drop down
                    $(document).find('#jq-dropdown-basketMenu:visible').each(function () {
                        var jqDropdown = $(this);
                        jqDropdown
                            .hide()
                            .removeData('jq-dropdown-trigger')
                            .trigger('hide', { jqDropdown: jqDropdown });

                        var jqDropdownParent = jqDropdown.parent();

                        jqDropdownParent.removeClass('basketDropDownActive');
                        jqDropdownParent.find('.basketDropDownActive').addClass('basketDropdown').removeClass('basketDropDownActive jq-dropdown-open');
                    });
                }
                else {
                    //alert('yes logout')
                }

                if (scrollTop <= etse) {
                    if (s.currentTop !== null) {
                        if (!s.stickyElement.hasClass('stickyHeaderLoggedOut')) {
                            logo.addClass("normal");
                            logo.removeClass("sticky");
                            hamburgerMenu.addClass("normal");
                            hamburgerMenu.removeClass("sticky");
                            s.stickyElement.css('overflow', 'visible');
                        }
                        s.stickyElement
                            .css({
                                'width': '100%',
                                'position': '',
                                'top': ''
                            });
                        s.stickyElement.parent().removeClass(s.className);
                        s.stickyElement.trigger('sticky-end', [s]);
                        s.currentTop = null;
                    }
                }
                else {

                    var newTop = documentHeight - s.stickyElement.outerHeight()
                        - s.topSpacing - s.bottomSpacing - scrollTop - extra;

                    if (!s.stickyElement.hasClass('stickyHeaderLoggedOut')) {
                        s.stickyElement.css('overflow', 'hidden');
                        s.stickyElement.css('height', barHeader.outerHeight());
                    }

                    if (newTop < 0) {
                        newTop = newTop + s.topSpacing;
                    } else {
                        newTop = s.topSpacing;
                    }
                    if (s.currentTop !== newTop) {
                        var newWidth;

                        if (!s.stickyElement.hasClass('stickyHeaderLoggedOut')) {
                            logo.removeClass("normal");
                            logo.addClass("sticky");
                            hamburgerMenu.removeClass("normal");
                            hamburgerMenu.addClass("sticky");
                            s.stickyElement.css('overflow', 'hidden');
                        }
                        //s.stickyElement.animate({ height: '55px' }, 'slow');

                        if (s.getWidthFrom) {
                            newWidth = $(s.getWidthFrom).width() || null;
                        } else if (s.widthFromWrapper) {
                            newWidth = s.stickyWrapper.width();
                        }
                        if (newWidth == null) {
                            newWidth = s.stickyElement.width();
                        }
                        s.stickyElement
                            // .css('width', newWidth)
                            .css('width', '100%')
                            .css('position', 'fixed')
                            .css('top', newTop);

                        s.stickyElement.parent().addClass(s.className);

                        if (s.currentTop === null) {
                            s.stickyElement.trigger('sticky-start', [s]);
                        } else {
                            // sticky is started but it have to be repositioned
                            s.stickyElement.trigger('sticky-update', [s]);
                        }

                        if (s.currentTop === s.topSpacing && s.currentTop > newTop || s.currentTop === null && newTop < s.topSpacing) {
                            // just reached bottom || just started to stick but bottom is already reached
                            s.stickyElement.trigger('sticky-bottom-reached', [s]);
                        } else if (s.currentTop !== null && newTop === s.topSpacing && s.currentTop < newTop) {
                            // sticky is started && sticked at topSpacing && overflowing from top just finished
                            s.stickyElement.trigger('sticky-bottom-unreached', [s]);
                        }

                        s.currentTop = newTop;
                    }
                }
            }
        },
        resizer = function () {
            windowHeight = $window.height();

            for (var i = 0, l = sticked.length; i < l; i++) {
                var s = sticked[i];
                var newWidth = null;
                if (s.getWidthFrom) {
                    if (s.responsiveWidth) {
                        newWidth = $(s.getWidthFrom).width();
                    }
                } else if (s.widthFromWrapper) {
                    newWidth = s.stickyWrapper.width();
                }
                if (newWidth != null) {
                    //   s.stickyElement.css('width', newWidth);
                }
            }
        },
        methods = {
            init: function (options) {
                var o = $.extend({}, defaults, options);
                return this.each(function () {
                    var stickyElement = $(this);

                    var stickyId = stickyElement.attr('id');
                    var stickyHeight = stickyElement.outerHeight();
                    var wrapperId = stickyId ? stickyId + '-' + defaults.wrapperClassName : defaults.wrapperClassName;
                    var wrapper = $('<div></div>')
                        .attr('id', wrapperId)
                        .addClass(o.wrapperClassName);

                    stickyElement.wrapAll(wrapper);

                    var stickyWrapper = stickyElement.parent();

                    if (o.center) {
                        stickyWrapper.css({ width: stickyElement.outerWidth(), marginLeft: "auto", marginRight: "auto" });
                    }

                    if (stickyElement.css("float") === "right") {
                        stickyElement.css({ "float": "none" }).parent().css({ "float": "right" });
                    }

                    stickyWrapper.css('height', stickyHeight);

                    o.stickyElement = stickyElement;
                    o.stickyWrapper = stickyWrapper;
                    o.currentTop = null;

                    sticked.push(o);
                });
            },
            update: scroller,
            unstick: function (options) {
                return this.each(function () {
                    var that = this;
                    var unstickyElement = $(that);

                    var removeIdx = -1;
                    var i = sticked.length;
                    while (i-- > 0) {
                        if (sticked[i].stickyElement.get(0) === that) {
                            splice.call(sticked, i, 1);
                            removeIdx = i;
                        }
                    }
                    if (removeIdx !== -1) {
                        unstickyElement.unwrap();
                        unstickyElement
                            .css({
                                'width': '',
                                'position': '',
                                'top': '',
                                'float': ''
                            })
                            ;
                    }
                });
            }
        };

    // should be more efficient than using $window.scroll(scroller) and $window.resize(resizer):
    if (window.addEventListener) {
        window.addEventListener('scroll', scroller, false);
        window.addEventListener('resize', resizer, false);
    } else if (window.attachEvent) {
        window.attachEvent('onscroll', scroller);
        window.attachEvent('onresize', resizer);
    }

    $.fn.sticky = function (method) {
        if (methods[method]) {
            return methods[method].apply(this, slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.init.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.sticky');
        }
    };

    $.fn.unstick = function (method) {
        if (methods[method]) {
            return methods[method].apply(this, slice.call(arguments, 1));
        } else if (typeof method === 'object' || !method) {
            return methods.unstick.apply(this, arguments);
        } else {
            $.error('Method ' + method + ' does not exist on jQuery.sticky');
        }
    };
    $(function () {
        setTimeout(scroller, 0);
    });
}));;

gardners.orderPad = (function (window, $) {
    var lastCheckedBoxes = {};
    var confirmOnPageExit = function (e) {
      
        // If we haven't been passed the event get the window.event
        e = e || window.event;

        var message = "You have entered/changed information on your order without updating. Use the 'update' button to save changes";


        // For IE6-8 and Firefox prior to version 4
        if (e) {
            e.returnValue = message;
        }

        // For Chrome, Safari, IE8+ and Opera 12+
        return  message;
    };
    var _settings = { maxBulkFileSize: 0, addOrderPadToBasketUrl: '', jacketImageUrl: '', invalidItemsInBasket: '', sosItemsInBasket: '', none: 0, del: 0, lineRef: 0, qty: 0, orderPadType: 0, maxLineRef: 0};
    var _controlIds = { cutPaste: '', action: '', quantityForAll: 0, lineRef: '' };
    var _subButton = '';
    var that =
    {
        init: function (settings,controls) {

            _settings = settings;
            _controlIds = controls;
            $(document).ready(function () {
                gardners.basket.registerCheckboxEvents();
                gardners.kendoHelpers.setUploadButton("#bulkFile");
                $('.clearIsbns').click(function (e) {
                    e.preventDefault();
                    $(_controlIds.cutPaste).val("");
                    $(".validation-summary-errors ul").empty();
                    $(".validation-summary-errors").addClass("validation-summary-valid").removeClass("validation-summary-errors");
                });

               

                that.registerEvents();
            });
        },
        initHeader: function () {
                var selectedItem = '';
                $('.baskets .toolTip').kendoTooltip();
        }
        ,
        registerEvents: function () {
           
            if ($(_controlIds.action).length>0) {
                $(_controlIds.action).val(_settings.none);
                $(_controlIds.quantityForAll).val(0);
                $(_controlIds.lineRef).val('');
            }
            
            $(".jacketPreviewIcon").kendoTooltip({
                show: function () {
                    gardners.kendoHelpers.repositionTooltip($(this)[0].popup.wrapper[0]);
                }
                ,
                content: function(e){
                    var target = e.target; // the element for which the tooltip is shown

                    var $container = $(target).closest('[data-imagelocation]');
                    var imagelocation = $container.attr('data-imagelocation');

                    var result = '<img class="jacketPreviewContent" src="' + imagelocation + '">';
                    return result;
                        
                },
                //width: 220,
                //height: 280,
                position: "right"
                  
            });

            $('#chkSelectAll').click(function (e) {                 
                var $this = $(this);                    
                if ($this.is(':checked')) {                        
                    $('.chkIsSelected').prop('checked', true);
                }
                else {
                    $('.chkIsSelected').prop('checked', false);
                }                   
            });

          
            $('#stockOrderBasket #btnPlaceOrder').click(function (e) {
                e.preventDefault();
                if (!$(this).hasClass('disabled')) {                        
                    that.PlaceOrder();
                }
            });
            $('.selectBoAll,.chkIsBackorder').change(function (e) {
                that.orderPadChanged();
            });
        
            //user changes input, add 'are you sure' when navigate away
            $('.editCustomerOrderReference,input.lineRef,input.quantity,input.chkIsBackorder,input.customerPrice').bind("propertychange change  keyup input paste", function (e) {
                $(this).off("propertychange change click keyup input paste"); 
                that.orderPadChanged();
            });
                

            $('#butOrderPadUpdate').click(function (e) {
                window.onbeforeunload = null;
            });

            $('.newBasket').click(function (e) {
                createBasketForOrderPad = true;
                $("#Context").val(_settings.orderPadType);
            });
        }
        ,
        orderPadChanged:function()
        {
            window.onbeforeunload = confirmOnPageExit;
            $('.newBasket').attr('title', 'Update changes before adding to basket').kendoTooltip();
            $('.btnAddToBasketList').attr('title', 'Update changes before adding to basket').kendoTooltip();
            //$('#btnAddToBasket').removeClass('btn-dark').addClass('disabled');
            $('.btnAddToBasketList').removeClass('btn-dark').addClass('disabled');
            $('.newBasket').removeClass('btn-dark').addClass('disabled');
            $("#OrderPadBasketList").data("kendoDropDownList").enable(false);
            $(".opBasketName").prop("disabled", "disabled").addClass("k-state-disabled");
        }
        ,
        bulkFileValidate: function (e) {
            var extOk = true;
            var fileSizeOk = true;
            var ok = true;
            var validator = $("span[data-valmsg-for='bulkFile']");
            validator.hide();
            validator.removeClass('field-validation-error').addClass('field-validation-valid');
            $.each(e.files, function (index, value) {
                if (value.size == undefined) {
                    ok = false;
                    $(validator).text("There was a problem with the file - 0k");
                    return;
                }
                else if (value.extension.toUpperCase() != ".TXT" && value.extension.toUpperCase() != ".CSV")
                { extOk = false; }
                else if ((parseFloat(value.size) / 1024) > _settings.maxBulkFileSize) { fileSizeOk = false; }
                
            });

            if (!extOk)
            {
                ok = false;
                $(validator).text("Please upload CSV or TXT files only");
            }

            if (!fileSizeOk) {
                ok = false;
                $(validator).text("Upload file too large - maximium size is " + _settings.maxBulkFileSize + "k");
            }

            if (!ok) {
                 $('.k-upload-files').empty();
                e.preventDefault();
                validator.removeClass('field-validation-valid').addClass('field-validation-error');
                validator.show();
            }
        },
        bulkFileSuccess: function (e) {
            $(_controlIds.cutPaste).val(e.response.data);
            $(".k-upload-files.k-reset").find("li").remove();
            $(".k-upload-status").hide();
        }
        ,
        bulkFileError: function (e) {

                var message = "Could not bulk upload the file, please check the file format and extension and file size";
                if (e.XMLHttpRequest.responseText.length > 0) message = e.XMLHttpRequest.responseText;
                gardners.kendoHelpers.PopupAlertDialog.show({ title: "Bulk Upload", message: message });
        }
        ,
        closeBulk:function(e)
        {
            that.cancelOrderpad();
        }
        ,
        onOrderPadEntrySubmitBegin: function ()
        {
            that.showSpinner(".validateInfo");
            $("#btnValidateOrderPad").removeClass('btn-dark').addClass('disabled').prop("disabled", true);
            $(".confirmWrapper").html('');
            return true;
        }
        ,
        showSpinner:function(target)
        {
          $(target).show();
        }
        ,
        hideSpinner:function(target)
        {
            $(target).hide();
        }
        ,
        orderPadEntrySubmitSuccess: function (params, data, status, xhr) {
       
            if (data.hasOwnProperty("success"))
            {
               
                if (!data.success)
                {
                    that.enableValidate();
                    that.hideSpinner(".validateInfo");
                    gardners.processStandardAjaxResponse(data, null, { growlOnFail: true });
                }
                else  
                {
                    $(location).attr("href", data.returnUrl);
                }
            }
            else {
                //invalid partial returned
                $(".invalidEans").html(data);
                that.hideSpinner(".validateInfo");
                gardners.kendoHelpers.openKendoWindow(params);
                
            }
        }
        ,
        enableValidate:function()
        {
            $("#btnValidateOrderPad").removeClass('disabled').addClass('btn-dark').prop("disabled", false);
        }
        ,
        orderPadEntrySubmitFail:function(xhr, status)
        {
            that.enableValidate();
            that.hideSpinner(".validateInfo");
        }
        ,
        cancelOrderpad:function()
        {
            that.enableValidate();
           
        }
        ,submitOrderPad:function()
        {
            $("#orderPadForm").submit();
        }
       
        ,
        deleteSelectedLines: function () {
                
            var $selectedLines = $('.orderPadForm .chkIsSelected:checked');

            //send POST request to delete action (not ajax)
            if ($selectedLines.length > 0) {

                $.when(gardners.kendoHelpers.PopupYesNoDialog.show({ title: "Confirm item deletion", message: "Are you sure you want to delete the selected lines?" })).done(function (response) {
                    if (response.button == "Yes") {
                        $(_controlIds.action).val(_settings.del);
                        that.submitOrderPad();
                    }
                    // else gardners.kendoHelpers.clearSelection('#kgrid-users');
                });
            }
            else {
                gardners.kendoHelpers.PopupAlertDialog.show(that.popupAlertDialogConfig());
            }
        }
        ,
        setQuantityForSelectedLines: function () {

            var $selectedLines = $('.orderPadForm .chkIsSelected:checked');

                //send POST request to update action (not ajax)
                if ($selectedLines.length > 0) {
                
                    gardners.kendoHelpers.inputDialog('Set a quantity', 'Quantity', function () {
                        var quantity = gardners.kendoHelpers.inputDialogGetValue();
                        if ($.trim(quantity).length > 0 && parseInt(quantity)) {
                            $(_controlIds.quantityForAll).val(quantity);
                            $(_controlIds.action).val(_settings.qty);
                            that.submitOrderPad();
                        }
                    },true);
                }
                else {              
                    gardners.kendoHelpers.PopupAlertDialog.show(that.popupAlertDialogConfig());
                }
        }
        ,
       setLineReferenceForSelecetdLines: function () {
           var $selectedLines = $('.orderPadForm .chkIsSelected:checked');

                //send POST request to delete action (not ajax)
           if ($selectedLines.length > 0) {
             
               gardners.kendoHelpers.inputDialog('Set a line reference', 'Reference', function () {
                   var lineRef = gardners.kendoHelpers.inputDialogGetValue();
                        if ($.trim(lineRef).length > 0) {
                            $(_controlIds.lineRef).val(lineRef);
                            $(_controlIds.action).val(_settings.lineRef);
                            that.submitOrderPad();
                        }
                        
                    },  /*isNumberic*/ false, '', /*maxLength*/ _settings.maxLineRef);
                }
                else {
                
                    gardners.kendoHelpers.PopupAlertDialog.show(that.popupAlertDialogConfig());
                }
            }
        ,
        popupAlertDialogConfig: function () {
            return { title: "Error", message: 'There is nothing selected', buttonText: "Please close and try again" };
        }
        ,
        useBasket:function()
        {
            _subButton = '.btnAddToBasketList'
            that.addOrderPadToBasket(gardners.kendoHelpers.getDropDownListValue("#OrderPadBasketList"));
        }
        
        ,
        //showNewBasketPopup:function()
        //{
          
        //    createBasketForOrderPad = true;
        //    gardners.basket.common.openNewBasketPopup(false,null,null,_settings.orderPadType);
        //}
        //,
        //addOrderPadToCurrentBasket:function()
        //{
           
        //    var addToBasketId = $("#AddToBasketId").val();
        //    if ($.trim(addToBasketId).length == 0 || addToBasketId == "0") {
        //        that.showNewBasketPopup();
        //    }
        //    else { that.addOrderPadToBasket(addToBasketId); }
        //}
        
        continueAdd:function(ele)
        {
         
            $(".cancelOrderPad").hide();
            that.showSpinner(".continueInfo");
            //gardners.importEans.continueAdd($(ele));
            $(ele).removeClass('btn-primary').addClass('disabled').prop("disabled", true);
            var summary = $("#uploadMessageSummary").find(".messageSummary");
            if ($(summary).length > 0) {
                $(summary).removeClass("alert alert-danger validation-summary-errors");
                $(summary).html('');
            }
      
            var attr = $(ele).attr('data-href');

            // For some browsers, `attr` is undefined; for others, `attr` is false. Check for both.
            if (typeof attr !== typeof undefined && attr !== false) {
                window.location = attr;
            }
        }
        
        ,
        addOrderPadToBasket:function(addToBasketOrderId)
        {
            $(".btnAddToBasketList").removeClass('btn-dark').addClass('disabled').prop("disabled", true);

            //reposition spinner based on the button that was clicked
            if ($.trim(_subButton).length > 0) {
                 var pos = $(_subButton).position();
                $(".orderPadToBasket").css({ "position": "absolute", "top": pos.top + 40, "left": pos.left - 100 });
            }

            that.showSpinner(".orderPadToBasket");
          
            var orderId = $("#OrderId").val();
            $.ajax({
                type: "POST",
                url: _settings.addOrderPadToBasketUrl,
                dataType: 'json',
                data: { sourceId: orderId,targetId:addToBasketOrderId },
                success: function (data) {
                    if (data.success == false) {
                        gardners.processStandardAjaxResponse(data, null, { growlOnFail: false });
                        that.scrollToErrors();
                        that.hideSpinner(".orderPadToBasket");
                        $(".btnAddToBasketList").removeClass('disabled').addClass('btn-dark').prop("disabled", false);
                    }
                    else $(location).attr("href", data.url);
                }
                ,
                error: function (xhr, ajaxOptions, err) {
                    that.hideSpinner(".orderPadToBasket");
                    $(".btnAddToBasketList").removeClass('disabled').addClass('btn-dark').prop("disabled", false);
                }
            });
        }
        ,
        scrollToErrors:function()
        {
            $('.cd-top')[0].click();
        }
    }
    return that;
})(window, jQuery);;
var logCount = 0;
var lastErrorMessage = "";
gardners.logging = (function (window, $) {

  
    var _settings = { loggingUrl: ""};
    var that =
    {
        init: function (settings) {
            _settings = settings;
        }
        ,
        logError: function (errorMessage) {
        
            var host = window.location.href;

            errorMessage = "Url:" + host + " Error:" + errorMessage;

            if (host.indexOf("local") > -1)
                gardners.kendoHelpers.PopupAlertDialog.show({ title: "Error", message: errorMessage });
            else {
                logCount++;
                var logMessage = {browserDetails: that.getBrowser(), message: errorMessage };

                if (logCount < 6 && lastErrorMessage != errorMessage) {
                    lastErrorMessage = errorMessage;
                    var token = $('input:hidden[name="__RequestVerificationToken"]').val();
                    // Post the log message
                    $.ajax({
                        type: 'POST',
                        url: _settings.loggingUrl,
                        data: { details: JSON.stringify(logMessage), __RequestVerificationToken: token},
                       
                    });
                }
            }
           
        }
        ,
        getBrowser: function() {
           
           
            var ua = window.navigator.userAgent;
            var browser = "";
            var version = "";
            var isTouchDevice = 'ontouchstart' in document.documentElement;
            var isMobile = false;

            if (ua.match(/Android/i) || ua.match(/webOS/i) || ua.match(/iPhone/i) || ua.match(/iPad/i) || ua.match(/iPod/i) || ua.match(/BlackBerry/i) || ua.match(/Windows Phone/i)) {
                isMobile = true;
            }



            var msie = ua.indexOf('MSIE ');
            if (msie > 0) {
                browser = "IE"; // IE 10 or older => return version number
                version = parseInt(ua.substring(msie + 5, ua.indexOf('.', msie)), 10);
            }

            var trident = ua.indexOf('Trident/');
            if (trident > 0) {
                browser = "IE"; // IE 11 => return version number
                var rv = ua.indexOf('rv:');
                version = parseInt(ua.substring(rv + 3, ua.indexOf('.', rv)), 10);
            }

            var edge = ua.indexOf('Edge/');
            if (edge > 0) {
                browser = "Edge"; // Edge (IE 12+) => return version number
                version = parseInt(ua.substring(edge + 5, ua.indexOf('.', edge)), 10);
            }
            else {
                //Have to detect for 'Edge' first as Edge contains both 'Edge' and 'Chrome' in its user agent.
                var chrome = ua.match(/Chrom(e|ium)\/([0-9]+)\./);
                if (chrome) {
                    browser = "Chrome";
                    version = parseInt(chrome[2], 10);
                }
            }

            var ff = ua.match(/Firefox\/([0-9]+)\./);
            if (ff) {
                browser = "FireFox";
                version = parseInt(ff[1]);
            }

            return  "browser:" +  browser + ", version:" + version + ", isMobile:" + isMobile +  ", isTouchDevice:" +  isTouchDevice;
        }
      
    }
    return that;

})(window, jQuery);;
gardners.paymentProvider = (function (window, $) {

    var _controlSelectors = { form: "", nonceId: "", threeDAuthId: "", deviceData:"", button: "", cardContainer: "", dropinContainer: "", addressLine1: "", addressLine2: "", town: "", county: "", postCode: "", country: "", cardholderName:""};
    var _settings = { clientToken: "", payable:null,jsVoid:"",action:""};
    var threeDCancelled = false;
    var that =
    {
        init: function (settings, controlSelectors) {
            _settings = settings;
            _controlSelectors = controlSelectors;

           // $(document).ready(function () {
                that.createDropin();
           // });
        }
        ,
        createDropin: function () {
            braintree.dropin.create({
                authorization: _settings.clientToken,
                container: _controlSelectors.dropinContainer,
                dataCollector: {},
                threeDSecure: true//,
                //card: { overrides: { fields: { postalCode: null } } }
            }).then(function (dropinInstance) {
           
                var threeDSInstance = dropinInstance._threeDSecure._instance;
                threeDSInstance.on("customer-canceled", function () {
                    threeDCancelled = true;
                });

                document.getElementById(_controlSelectors.button).addEventListener('click', function (e) {
                    
                    e.preventDefault();
                    that.toggleButton(false);
                    dropinInstance.requestPaymentMethod({
                       threeDSecure: that.get3DParams()
                    }).then(function (payload) {
                     
                        if (threeDCancelled || payload.type !== 'CreditCard') {
                            threeDCancelled = false;
                            dropinInstance.clearSelectedPaymentMethod();
                            that.toggleButton(true);
                        }
                        else
                        {
                                              
                            if ($(_controlSelectors.form).valid()) {
                                document.getElementById(_controlSelectors.nonceId).value = payload.nonce;
                                document.getElementById(_controlSelectors.threeDAuthId).value = payload.threeDSecureInfo.threeDSecureAuthenticationId;
                                document.getElementById(_controlSelectors.deviceData).value = payload.deviceData;
                                $(_controlSelectors.form).attr("action", _settings.action);
                                $(_controlSelectors.form).submit();
                            }
                            else
                            {
                                that.toggleButton(true);
                                return false;
                            }
                        }
                    }).catch(function (err) {
                        
                        $(_controlSelectors.form).attr("action", _settings.jsVoid);
                        that.toggleButton(true);
                        dropinInstance.clearSelectedPaymentMethod();
                        if (err.name != "DropinError")  //when user hits button and form is invalid
                        {
                           gardners.logging.logError(JSON.stringify(err));
                           that.notifyClient();
                        }
                      
                    });
                });

            }).catch(function (err) {

                $(_controlSelectors.form).attr("action", _settings.jsVoid);
             
                that.toggleButton(true);
                gardners.logging.logError(JSON.stringify(err));
                that.notifyClient();
           
            });
        }
        ,
        notifyClient: function () {
            //uncomment the if should you want the client to always alert should the logging not be upto the job.
            if (window.location.href.indexOf("local") == -1) {
                gardners.kendoHelpers.PopupAlertDialog.show({ title: "Error", message: "Tokenization Error" });
            }
        }
        ,
        toggleButton: function (enable) {

            if (enable) {
                $("#" + _controlSelectors.button).removeClass("disabled").prop("disabled", "");
            }
            else {

                $("#" + _controlSelectors.button).addClass("disabled").prop("disabled", "disabled");
            }
        }
        ,
        get3DParams: function () {
            var fullname = $(_controlSelectors.cardholderName).val();
            var name = fullname.split(' ');
            var firstname = name[0];
            var surname = fullname.substring($.trim(name[0].length));
            surname = surname.trimStart();
            return {
                amount: _settings.payable,
                email: "",
                challengeRequested: true,
                billingAddress:
                {
                    givenName: firstname,
                    surname: surname,
                    streetAddress: $(_controlSelectors.addressLine1).val(),
                    extendedAddress: $(_controlSelectors.addressLine2).val(),
                    locality: $(_controlSelectors.town).val(),
                    postalCode: $(_controlSelectors.postCode).val(),
                    countryCodeAlpha2: $(_controlSelectors.country).val()
                }
            };
        }

    }
    return that;

})(window, jQuery);;
