﻿//Get User agent and version
var agt = navigator.userAgent.toLowerCase();
var version_major = parseInt(navigator.appVersion);
var version_minor = (navigator.appMinorVersion);
var is_ie = (agt.indexOf("msie") != -1) && (agt.indexOf("opera") == -1);
var is_ielt6 = (version_major < 5) && is_ie && (window.XMLHttpRequest == undefined);



//Cannot use this because there is some plugin that we need to change from $ to j for example by default jquery.validationEngine.en.js use $.document.ready.
//var j = jQuery.noConflict();

/*Module Pattern http://stackoverflow.com/questions/3722820/examples-of-practical-javascript-object-oriented-design-patterns */
//define framework / namespace - which need to be defined in the master page
if (!SiteUI)
    var SiteUI = {};


//In production you can turn this off for debuging
//how to use $.log( 'hello world' ); or $('ul.properties').debug();
var DEBUG = true;
var BaseUI = null; //so all page will have this default functionality

//must be located outside
//this to indication a form validator after call back - (CommonFormValidator.js option)                
var formValidator_CallBack = null;


//*************Document ready***********
$(document).ready(function ()
{
    //Init base UI
    BaseUI = new SiteUI.BaseUI({}); //see setup event for more function
    BaseUI.bindDefaultBehaviour(); //only this base ui can bind default bindDefaultBehaviour

    //Assign that call back function
    formValidator_CallBack = BaseUI.formValidator_CallBack;
});




/*Module Pattern http://stackoverflow.com/questions/3722820/examples-of-practical-javascript-object-oriented-design-patterns */
//Define a function or class with default conttructor
/*

Example How to use it
var obj = new SiteUI.ProductListing([options]);
obj.publicMethod();
*/
/*
BaseUI Class - put in this namespace so it won't be a conflict
Require 
<script src="/scripts/js/jquery/jquery.query.js" type="text/javascript"></script>
<script src="/scripts/js/CommonFunction.js" type="text/javascript"></script>
<script src="/scripts/js/jQuery/jquery.format.FilterTextBox.js" type="text/javascript"></script>
*/
SiteUI.BaseUI = function (options)
{
    //default options
    var defaultsOpt = {
        //set it to false otherwise, when you disable from the ajax, it when postback it will enable all your control
        //but if you have other reason you can do so.
        disableAllButtonOnSubmit: false,
        ajaxProcessMessage: "Processing..."
    };

    var options = $.extend(defaultsOpt, options);


    //optional value - to disable all button on submit or not
    var disableAllButtonOnSubmit = options.disableAllButtonOnSubmit;
    var setDisableAllButtonOnSubmit = function (value)
    {
        disableAllButtonOnSubmit = value;
    }

    var ajaxProcessMessage = options.ajaxProcessMessage;
    var setAjaxProcessMessage = function (value)
    {
        ajaxProcessMessage = value;
    }

    //Shopping Cart Control
    var shoppingCartControl = null;

    var ddlPostbackSelector = '.ddlPostback';
    var txtPostbackSelector = '.txtPostback';
    var btnPostbackSelector = '.btnPostback';
    var chkPostbackSelector = '.chkPostback';

    var loadingSelector = '.postbackLoading';
    var loaderHtml = "<img src='/images/ajax-loader.gif' class='postbackLoading' style='width:15px;height:15px;position:absolute; z-index:9999;' />";

    var globalProductSearchSelector = ".globalProductSearch";
    var globalProductSearchButtonSelector = ".globalProductSearchButton";


    var isHideLoadingBeforePostbackTemporary = false;
    //this to indication a form validator after call back - (CommonFormValidator.js option)        
    var formValidator_CallBack = function (source, isValid)
    {
        //alert('formValidator_CallBack : ' + isValid);
        if (!isValid)
        {
            //not valid - hide loading temporary - because this will be called first before click happen                
            isHideLoadingBeforePostbackTemporary = true;
        }
    };

    //Show loading
    var showLoadingBeforePostback = function (source, addLoadingToParent)
    {
        //alert('showLoadingBeforePostback isHideLoadingBeforePostbackTemporary: ' + isHideLoadingBeforePostbackTemporary);
        if (!isHideLoadingBeforePostbackTemporary)
        {
            //add loader html after
            if (addLoadingToParent)
            {
                $(source).parent().after(loaderHtml);
                showPageLoader(); //show page loader
            }
            else
            {
                $(source).after(loaderHtml);
                showPageLoader(); //show page loader
            }
        }
        else
        {
            //set it to false again
            isHideLoadingBeforePostbackTemporary = false;
        }
    };

    //Clear Loading Function
    var clearLoading = function ()
    {
        $(loadingSelector).remove();
        hidePageLoader();
    };

    //show Page loader - this using jquery.loader this will disable all the button automatically
    var showPageLoader = function ()
    {
        $.loader({
            className: "loaderBox",
            content: ''
        });

    };

    //hide page loader
    var hidePageLoader = function ()
    {
        $.loader('close');
    };

    //Show Hide Loading On Content
    var showHideLoadingOnContent = function (contentSelector, isShow)
    {
        if (isShow)
        {
            $(contentSelector).before(loaderHtml); //add loader after it fades                    

            //show loading        
            showPageLoader(); //show page loader to hide
            $(contentSelector).animate({ opacity: 0 }, 150); //doesn't work in IE 8
            //$(contentSelector).effect('fade',null,150); //cannot because the paging will go up

        }
        else
        {
            //hide loading - remove all loading selector
            $(loadingSelector).remove(); //remove loader first
            hidePageLoader(); // hide page loader
            //just in case if in the beginning it hides this
            $(contentSelector).animate({ opacity: 1 }, 150); //doesn't work in IE 8           
            //$(contentSelector).effect('fade',null,150); //cannot because the paging will go up
        }
    };

    //redirect content
    var redirectContent = function (url, contentSelector)
    {
        if (contentSelector)
        {  //only if they pass content selector we can redirect with show and hide loading
            showHideLoadingOnContent(contentSelector, true);
        }

        window.location = url;
    };

    //update content
    var updateContent = function (responseText, contentSelector, updateContent_Callback)
    {

        $(contentSelector).html(responseText);


        if (updateContent_Callback)
            updateContent_Callback(responseText);

        //hide loading on content
        showHideLoadingOnContent(contentSelector, false);
    };

    //Used to track last Request Ajax URL
    var lastRequestAjaxUrl = "";
    //load content
    var loadContent = function (ajaxUrl, relatedData, contentSelector, updateContent_Callback)
    {
        showHideLoadingOnContent(contentSelector, true);

        lastRequestAjaxUrl = ajaxUrl;
        $.ajax({
            type: "POST",
            url: ajaxUrl,
            data: relatedData,
            complete: function (data, stat)
            {
                //only process last request ajax url
                if (this.url == lastRequestAjaxUrl)
                {
                    //$.log("Update this " + this.url + " VS " + lastRequestAjaxUrl);
                    if (stat == "success")
                    {
                        var isError = true;
                        updateContent(data.responseText, contentSelector, updateContent_Callback);
                    }
                    else
                    {
                        updateContent("<p>Error Loading Data : " + stat + ' : ' + data.responseText + "</p>", contentSelector, updateContent_Callback);
                    }
                }
                else
                {
                    //$.log("Dispose this ajax " + this.url + " VS " + lastRequestAjaxUrl);
                }
            }
        });
    };


    // *************** MICROSOFT AJAX INIT - HANDLE ALL AJAX CALL*******************
    var initMicrosoftAjaxRequest = function ()
    {
        /// <reference name="MicrosoftAjax.js"/>
        if (typeof (Sys) != 'undefined' && typeof (Sys.WebForms) != 'undefined')
        {
            Sys.Application.add_init(microsoftAJAX_App_Init);
        }
    };

    var microsoftAJAX_App_Init = function ()
    {
        Sys.WebForms.PageRequestManager.getInstance().add_beginRequest(microsoftAJAX_BeginRequest);
        Sys.WebForms.PageRequestManager.getInstance().add_endRequest(microsoftAJAX_EndRequest);
        Sys.WebForms.PageRequestManager.getInstance().add_pageLoaded(microsoftAJAX_pageLoaded);
    };



    var postbackTriggerElement;
    var lastLoadTime = new Date();

    //check availability for partial postback for FF fixed. FF will abort the partial postback call after 2 mins unless it call ajax to other page first
    var checkConnectionForPartialPostback = function ()
    {
        $.ajax({
            url: "/usercontrols/testconnection.aspx",
            async: false
        });
    };

    //check availability for partial postback for FF fixed. FF will abort the partial postback call after 2 mins unless it call ajax to other page first
    var checkAvailabilityForPartialPostback = function ()
    {
        //firefox fix for time diff        
        if ($.browser.mozilla && GetTimeDiff(new Date(), lastLoadTime).getMinutes() >= 2)
        {
            //refresh this page            
            checkConnectionForPartialPostback();
        }
        else
        {
            lastLoadTime = new Date();
        }
    };

    var microsoftAJAX_BeginRequest = function (sender, args)
    {
        if (disableAllButtonOnSubmit)
        {
            //disable all button
            disableAllSubmitButtons(true);
        }
        postbackTriggerElement = args.get_postBackElement()
        var ctrl = $(postbackTriggerElement);

        //remove all validation error
        removeAllValidationError();

        if (ctrl.is("input:checkbox") || ctrl.is("input:radio"))
        {
            ctrl.hide(); //hide this check box
            if (!ctrl.hasClass("noLoaderOnPostback"))
            {
                showLoadingBeforePostback(ctrl, true); //show loading on this control   
            }
        }
        else if (ctrl.is("input:submit"))
        {  //you can change it to other
            if (ctrl.hasClass("waitLabelOnPostback"))
            {
                if (ajaxProcessMessage != "")
                {
                    ctrl.val(ajaxProcessMessage);
                }
            }

            if (ctrl.hasClass("disableOnPostback"))
            {
                ctrl.attr('disabled', true); //disable but later on postback it will enable or disable based on the behaviour
            }


            if (!ctrl.hasClass("noLoaderOnPostback"))
            {
                showLoadingBeforePostback(ctrl);
            }
        }
        else
        {   //other items show loading
            //show loading on this control                
            if (!ctrl.hasClass("noLoaderOnPostback"))
            {
                showLoadingBeforePostback(ctrl);
            }
        }


        checkAvailabilityForPartialPostback();

    };

    var microsoftAJAX_pageLoaded = function (sender, args)
    {
        if (!postbackTriggerElement)
        {
            return;
        }

        //get updated panels and referesh
        var updatedPanels = args.get_panelsUpdated();
        for (i = 0; i < updatedPanels.length; i++)
        {
            //apply filter textbox
            setFilterTextbox(updatedPanels[i].id);
            //set rating 
            setRating(updatedPanels[i].id);
            //set date picker
            setDatePicker(updatedPanels[i].id);
            //set text area counter
            setTextAreaCounter(updatedPanels[i].id);


            //Call Microsoft AJAX_EndRequest_AdditionalFunciton() if available            
            if (typeof (microsoftAJAX_PageLoaded_AdditionalFunction) == 'function')
            {
                microsoftAJAX_PageLoaded_AdditionalFunction(updatedPanels[i].id);
            }
        }

        //remove Hide first before loading (this is for product list
        removeHideFirstBeforeJSLoading();
        

    };


    //end request
    var microsoftAJAX_EndRequest = function (sender, args)
    {
        if (args.get_error() != undefined)
        {
            var errorMessage = args.get_error().message;
            args.set_errorHandled(true);
            alert("Error in ajax call : " + errorMessage);
            clearLoading(); //clear loading
            return;
        }

        if (disableAllButtonOnSubmit)
        {
            //enable all button
            disableAllSubmitButtons(false);
        }

        //Call Microsoft AJAX_EndRequest_AdditionalFunciton() if available            
        if (typeof (microsoftAJAX_EndRequest_AdditionalFunction) == 'function')
        {
            microsoftAJAX_EndRequest_AdditionalFunction();
        }


        //empty the postback element
        postbackTriggerElement = null;

        hidePageLoader(); //hide page loader

        //set the load time again
        lastLoadTime = new Date();
    };


    //this can be override by calling set ajax page loaded
    var microsoftAJAX_PageLoaded_AdditionalFunction = function (updatedPanelId)
    {
        //baseUI. microsoft AJAX Page Loaded Additional funxtion
        //you can write default function here
    };

    //this can be override by calling set ajax end request
    var microsoftAJAX_EndRequest_AdditionalFunction = function ()
    {
        //baseUI. microsoft AJAX End Request Additional funxtion
        //you can write default function here 
    };

    //override ajax end request
    var overrideMicrosoftAJAX_EndRequest_AdditionalFunction = function (func)
    {
        microsoftAJAX_EndRequest_AdditionalFunction = func;
    };

    //override ajax page loaded
    var overrideMicrosoftAJAX_PageLoaded_AdditionalFunction = function (func)
    {
        microsoftAJAX_PageLoaded_AdditionalFunction = func;
    };
    //-----------------------------------------------



    //use for postback
    var setupPostbackControlEvents = function ()
    {
        //show loading before postback
        $(ddlPostbackSelector).live("change", function (e)
        {
            //e.preventDefault();//cannot prevent default, it won't go to onclick
            showLoadingBeforePostback(this);
        });

        //filter search keyword
        $(txtPostbackSelector).live("change", function (e)
        {
            //e.preventDefault();//cannot prevent default, it won't go to onclick
            showLoadingBeforePostback(this);
        });

        $(btnPostbackSelector).live("click", function (e)
        {
            //e.preventDefault(); //cannot prevent default, it won't go to onclick
            showLoadingBeforePostback(this);

            if ($(this).hasClass("clearValidation"))
            {
                //check if it has class clear validation
                removeAllValidationError();
            }
        });


        $(chkPostbackSelector + " input").live("change", function (e)
        {
            //e.preventDefault(); //cannot prevent default, it won't go to onclick
            showLoadingBeforePostback(this, true);
            removeAllValidationError(); //it will clear validation - usually this will change the view
        });


        setupGlobalProductSearchEvent();

    };

    //Bind global product search event
    var setupGlobalProductSearchEvent = function ()
    {

        //bind for global search        
        $(globalProductSearchSelector).live("change", function (e)
        {
            e.preventDefault();

            var strSearch = $(this).val();


            //alert(strSearch);
            if (strSearch === 'Search...') return;


            var url = "/products#search=" + strSearch;

            //remember if there is other value;
            var currUrl = window.location.toString();
            var qs = $.query.load(currUrl);
            var tagValue = qs.get('tag');
            var lstViewModeValue = qs.get('listViewMode');
            var pageSizeValue = qs.get('size');

            if (tagValue != "")
            {
                url += "&tag=" + tagValue;
            }
            if (lstViewModeValue != "")
            {
                url += "&listViewMode=" + lstViewModeValue;
            }
            if (pageSizeValue != "")
            {
                url += "&size=" + pageSizeValue;
            }

            redirectContent(url);
            $(this).val(''); //clear the box
        });


        //add keypress
        $(globalProductSearchSelector).live("keypress", function (e)
        {
            //no need to prevent default
            return runFunctionOnEnter(e, function ()
            {
                $(e.target).change(); //change this.
            });
        });

        //try to use bind for IE 7 instead of live
        //for the button
        $(globalProductSearchButtonSelector).bind("click", function (e)
        {
            e.preventDefault();
            $(globalProductSearchSelector).change();
        });
    };

    var setupTriggerButton = function ()
    {
        //for login trigger       
        //DON'T DO ONCHANGE - only use keypress, because browser (Chrome) can automatically fill and cause postback
        /*
        $(".txtTriggerButton").live("change", function (e)
        {
        var rel = $(this).attr("rel");
        if (rel && rel != "")
        {
        $(rel).click();
        }
        });
        */
        //trigger login
        $(".txtTriggerButton").live("keypress", function (e)
        {
            var rel = $(this).attr("rel");
            if (rel && rel != "")
            {
                //$.log('run from DISABLE DEFAULT BUtton');
                return runFunctionOnEnter(e,
                    function ()
                    {
                        $(rel).click();
                    }
                );
            }
        });
    }

    /* ----------------- CONTENT - Side Content Collapser */
    var setupTriggerCollapse = function ()
    {
        $('.sideContent .collapseTrigger').each(function (e)
        {
            // Bind click event
            $(this).click(function (e)
            {
                e.preventDefault();

                if ($(this).hasClass('active'))
                {

                    $(this).removeClass('active').parent().next().find(':first')
					.slideUp(400, function ()
					{
					    $(this).removeClass('active');
					});

                } else
                {

                    $(this).addClass('active').parent().next().find(':first')
					.slideDown(400, function ()
					{
					    $(this).addClass('active');
					});

                }
            });

            // Init Collapsed.
            $(this).trigger('click');
        });
    }


    /*Setup Events - This will be call unsynchronously*/
    var setupEvents = function ()
    {   //setup postback control events
        setupPostbackControlEvents();


        setupTriggerButton();

        setupTriggerCollapse();

        // Removes SEO text in navItems
        $(".clearText").html("");
        $(".clearText").removeClass("clearText");

        //set watermark field
        setWatermarkField();

    };

    /*Constructor*/
    var bindDefaultBehaviour = function ()
    {
        //init ajax request behaviour
        initMicrosoftAjaxRequest();
        //disable default button
        disableDefaultButton();
        //shopping cart
        shoppingCartControl = new SiteUI.ShoppingCartControl();
        //set ajax
        $(".hdnJsEnabled input").val("1");



        // ************social header    
        $('#socialTag .holder').controlToggleItem({
            'object': '#socialTag .holder',
            'event': 'mouseenter',
            'action': 'show',
            'effect': 'slide',
            'effectoff': '-175',
            'effectactive': '-90'
        });
        $('#socialTag .close').controlToggleItem({
            'object': '#socialTag .holder',
            'event': 'click',
            'action': 'hide',
            'effect': 'slide',
            'effectoff': '-175',
            'effectactive': '-90'
        });

        //****** Select Country Dropdown
        $('#topContainer .topControlPanel .navCountry a').controlToggleItem({
            'object': '#holderContainer .popupCountrySelector',
            'event': 'click',
            'action': 'show'
        });
        $('#holderContainer .popupCountrySelector .header a').controlToggleItem({
            'object': '#holderContainer .popupCountrySelector',
            'event': 'click',
            'action': 'hide'
        });

        //****** Retailer Login Dropdown        
        $('.navLogin a').controlToggleItem({
            'object': '#holderContainer .popupSignInBox',
            'event': 'click',
            'action': 'show'
        });
        $('#holderContainer .popupSignInBox .header a').controlToggleItem({
            'object': '#holderContainer .popupSignInBox',
            'event': 'click',
            'action': 'hide'
        });

        //****** Select My Account Dropdown
        $('#topContainer .topControlPanel .navMyAccount a').controlToggleItem({
            'object': '#holderContainer .popupMyAccountSelector',
            'event': 'click',
            'action': 'show'
        });
        $('#holderContainer .popupMyAccountSelector .header a').controlToggleItem({
            'object': '#holderContainer .popupMyAccountSelector',
            'event': 'click',
            'action': 'hide'
        });

        //****** Shopping cart
        $(shoppingCartControl.openerSelector).controlToggleItem({
            'object': shoppingCartControl.popupControlSelector,
            'event': 'click',
            'action': 'show',
            'beforeEventTriggerCallback': shoppingCartControl.checkToReload
        });

        $(shoppingCartControl.popupControlSelector + ' .header a').controlToggleItem({
            'object': shoppingCartControl.popupControlSelector,
            'event': 'click',
            'action': 'hide'
        });
        //for shopping control
        $(shoppingCartControl.popupControlSelector + ' .stepBack a').controlToggleItem({
            'object': shoppingCartControl.popupControlSelector,
            'event': 'click',
            'action': 'hide'
        });

        //run this async
        setTimeout(function ()
        {
            setupEvents();

            //apply filter textbox
            setFilterTextbox();

            setRating();
            setDatePicker();
            setTextAreaCounter();
            setAnchorHrefReplaceWithHash();
            //set dialog iframe coz for terms and condition, etc
            setDialogIFrame();

            setHideBoxTrigger();
            setShowBoxTrigger();
        }, 0);


    };

    var init = function ()
    {

    } ();

    //return public method
    return {
        bindDefaultBehaviour: bindDefaultBehaviour,
        formValidator_CallBack: formValidator_CallBack,
        redirectContent: redirectContent,
        setupPostbackControlEvents: setupPostbackControlEvents,

        loadContent: loadContent,
        updateContent: updateContent,

        clearLoading: clearLoading,
        showLoadingBeforePostback: showLoadingBeforePostback,
        showHideLoadingOnContent: showHideLoadingOnContent,

        showPageLoader: showPageLoader,
        hidePageLoader: hidePageLoader,

        setAjaxProcessMessage: setAjaxProcessMessage,
        setDisableAllButtonOnSubmit: setDisableAllButtonOnSubmit,
        overrideMicrosoftAJAX_EndRequest_AdditionalFunction: overrideMicrosoftAJAX_EndRequest_AdditionalFunction,
        overrideMicrosoftAJAX_PageLoaded_AdditionalFunction: overrideMicrosoftAJAX_PageLoaded_AdditionalFunction
    };
}


