

window.parcelpoint = window.parcelpoint || {};

parcelpoint.protocol = 'https:' === document.location.protocol ? 'https:' : 'http:';


    parcelpoint.apiRoot = parcelpoint.protocol + "//api.parcelpoint.com.au";
    parcelpoint.cdnRoot = parcelpoint.protocol + "//api.parcelpoint.com.au";
    parcelpoint.ppwebRoot = parcelpoint.protocol + "//parcelpoint.com.au";
    parcelpoint.staticRoot = parcelpoint.protocol + "//connect.parcelpoint.com.au";
    parcelpoint.bApiRoot = parcelpoint.protocol +  "//api.wow.parcelpoint.com.au";
    parcelpoint.apiCoreRoot = parcelpoint.protocol +  "//api.parcelpoint.com.au/api";


parcelpoint.Store = (function () {

    var widget_;

    var widgetArray_ = [];
    var isWidgetInitialising_ = false;

    var searchHeight_ = 160;

    var iframeId_ = "ppIframeWidget";
    
    var hasMigratedAPI = null;
    
    var createErrorMessage = function (widget) {
        var errorMessage = document.createElement('div');
        errorMessage.style.textAlign = 'center';
        errorMessage.style.position = 'relative';
        errorMessage.style.top = '130px';
        errorMessage.style.margin = '0 auto';
        errorMessage.style.maxWidth = '400px';

        if (widget.init_options.messages && widget.init_options.messages.loadingError) {
            errorMessage.innerHTML = widget.init_options.messages.loadingError;
        } else if (widget.init_options.apiKey === '09BH1TXV') {
            errorMessage.innerHTML = 'Sorry, there was a problem loading this page. Please try again. If you continue experiencing problems, please call our Contact Centre on 1300 244 999.';
        } else if (widget.init_options.apiKey === 'HZ1MHIJW') {
            errorMessage.innerHTML = 'OOPS Looks like something has gone wrong! Please contact Glue Customer Service';
        } else if(widget.init_options.overrideCSS && widget.init_options.overrideCSS.toLowerCase().indexOf('collectplus') > 0){
            errorMessage.innerHTML = "There appears to be a problem, please refresh your browser and try again.";
        } else {
            errorMessage.innerHTML = 'There was an issue when loading the widget. Please contact ParcelPoint support service.';
        }

        return errorMessage;
    }

    var setWidgetLoaded = function (targetDiv) {
        var widget = widgetArray_[getWidgetIndex(targetDiv)];
        widget.widgetLoaded = true;
    };

    var checkClientWidget = function(apiKey) {
        
            if (apiKey === "R2KT56Y9" || apiKey ===  "8V1NLC0E" || apiKey === "09BH1TXV") {
                parcelpoint.apiRoot = parcelpoint.bApiRoot;
            }
        
    };

    var getWidgetContainer = function () {};

    var getWidgetIndexByContainer = function (targetDiv) {

        for (var i = 0; i < widgetArray_.length; i++ ) {
            if (widgetArray_[i].init_options.targetDiv === targetDiv) {
                return i;
            }
        }

        return -1;
    };

    var init = function (init_options) {
        if (typeof init_options !== "undefined" && typeof init_options.targetDiv !== "undefined") {

            var widgetContainer = document.getElementById(init_options.targetDiv);
            checkClientWidget(init_options.apiKey);

            if (widgetContainer) {
                if (getWidgetIndexByContainer(init_options.targetDiv) < 0) {
                    var widget = {
                        container: widgetContainer,
                        init_options: init_options
                    };

                    widgetArray_.push(widget);
                    waitForWidgetToInitialise(widget);
                } else {
                    console.error("An error occured: a widget cannot be initialised twice within the same container");
                }
            } else {
                console.error("An error occured: the widget container was not found.");
            }
        }
        else {
            console.error("An error occured: the widget container was not specified.");
        }

        return this;
    };

    var waitForWidgetToInitialise = function (widget) {
        if (!isWidgetInitialising_) {
            initialiseWidget(widget);
        } else {
            window.setTimeout(waitForWidgetToInitialise, 100, widget);
        }
    };

    var waitForWidgetFiles = function () {
        if (!widget_.filesLoaded) {
            if (!widget_.errorWhileLoading) {
                window.setTimeout(waitForWidgetFiles, 100);
            }
        }
        else {
            widget_.iframeWindow.parcelpoint.StoreWidget.init(widget_.init_options);

            isWidgetInitialising_ = false;
        }
    };

    var determineBrowserAndVersion = function () {
        var isIOS = navigator.userAgent.match(/iPhone|iPad|iPod/i);
        var isAndroid = navigator.userAgent.indexOf('Android') >= 0;

        if (isIOS) {
            return {name: "iOS", version: "unknown"};
        } else if (isAndroid) {
            var webkitVer = parseInt((/WebKit\/([0-9]+)/.exec(navigator.appVersion) || 0)[1], 10) || void 0; // also match AppleWebKit
            var isNativeAndroid = isAndroid && webkitVer <= 534 && navigator.vendor.indexOf('Google') == 0;

            var name = isNativeAndroid ? "Stock Browser" : "Android Chrome";

            return {name: name, version: webkitVer};

        } else {
            var N = navigator.appName, ua = navigator.userAgent, tem;
            var M = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
            if (M && (tem = ua.match(/version\/([\.\d]+)/i)) != null) M[2] = tem[1];
            M = M ? {"name": M[1], "version": M[2]} : [N, navigator.appVersion, '-?'];

            return M;
        }
    };

    var isOldBrowser = function () {
        return parcelpoint.browser.name === "MSIE"
            && (parcelpoint.browser.version === "7.0" || parcelpoint.browser.version === "8.0")
    };

    var isMobileBrowser = function () {
        return parcelpoint.browser.name === "iOS"
            || parcelpoint.browser.name === "Stock Browser"
            || parcelpoint.browser.name === "Android Chrome";
    };

    var destroy = function (option) {

        var targetDiv = getTargetDivFromOptions(option);
        var widgetIndex = getWidgetIndex(targetDiv);

        if (widgetIndex >= 0) {
            if (widgetArray_[widgetIndex]) {
                parcelpoint.jQuery(widgetArray_[widgetIndex].iframe).remove();
                widgetArray_.splice(widgetIndex, 1);
            } else {
                console.error("An error occurred: cannot destroy the widget as no widget exists yet.");
            }
        } else {
            console.error("An error occurred: cannot destroy the widget for the given container as it does not exist.");
        }
    };

    var getTargetDivFromOptions = function (option) {
        if (option && option.targetDiv) {
            return option.targetDiv;
        }

        return null;
    };

    var display = function (option) {

        var targetDiv = getTargetDivFromOptions(option);
        var widget = widgetArray_[getWidgetIndex(targetDiv)];

        if (widget) {
            if (widget.widgetLoaded && !widget.widgetUpdating) {
                processWidgetDisplay(widget, option);
            } else if (widget.container) {
                widget.container.style.minHeight = "317px";
                widget.container.style.background = "url(" + parcelpoint.staticRoot + "/images/widget/ajax-loader.gif) no-repeat 50% 50%";

                waitForWidgetToLoadAndUpdate(widget, option);
            }
        } else {
            console.error("An error occurred: cannot display the widget for the given container as it does not exist");
        }
    };

    var displayIframe = function (widget) {
        if (widget.iframeHeight) {
            widget.iframe.style.height = widget.iframeHeight + "px";
        }
    };

    var getWidgetIndex = function (targetDiv) {
        if (targetDiv) {
            return getWidgetIndexByContainer(targetDiv);
        } else {
            return 0;
        }
    };

    var initialiseIframe = function () {

        var iframe, iframeWindow, iframeDocument, iframeHeader;

        iframe = document.createElement("iframe");
        iframe.setAttribute("src", "");
        iframe.setAttribute("frameBorder", "0");
        iframe.setAttribute("scrolling", "no");
        iframe.style.width = 100 + "%";
        iframe.style.height = 0;

        iframe.style.display = "block";
        iframe.style.border = "none";
        iframe.style.overflow = "hidden";
        iframe.id = iframeId_ + "-" + widget_.init_options.targetDiv;

        var done = false;

        iframe.onload = iframe.onreadystatechange = function () {
            if (!done && (!this.readyState ||
                this.readyState === "loaded" || this.readyState === "complete")) {
                done = true;

                iframeWindow = iframe.contentWindow ? iframe.contentWindow : iframe.contentDocument.document ? iframe.contentDocument.document : iframe.contentDocument;
                iframeDocument = iframeWindow.document;

                var iframeContent = "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN\'   'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\'>"
                    + "<html><head></head>"
+ "<body></body></html>";

                iframeDocument.open();
                iframeDocument.write(iframeContent);
                iframeDocument.close();

                iframeHeader = iframeDocument.getElementsByTagName('head')[0] || iframeDocument.documentElement;

                iframeWindow.parcelpoint = {
                    Store: parcelpoint.Store,
                    Property: parcelpoint.Property,
                    cdnRoot: parcelpoint.cdnRoot,
                    apiRoot: parcelpoint.apiRoot,
                    apiCoreRoot: parcelpoint.apiCoreRoot,
                    protocol: parcelpoint.protocol,
                    browser: parcelpoint.browser
                };

                widget_.iframe = iframe;
                widget_.iframeHeader = iframeHeader;
                widget_.iframeWindow = iframeWindow;

                initialiseLibraries();
            }
        };

        widget_.container.appendChild(iframe);
    };

    var registerWidget = function () {

    }

    var initialiseWidget = function (widget) {
        isWidgetInitialising_ = true;

        widget_ = widget;

        widget_.filesLoaded = false;
        widget_.widgetLoaded = false;
        widget_.errorWhileLoading = false;
        widget_.widgetUpdating = false;

        initialiseIframe();
    };

    var hide = function (option) {
        var targetDiv = getTargetDivFromOptions(option);
        var widget = widgetArray_[getWidgetIndex(targetDiv)];

        if (widget) {
            widget.iframe.style.height = "0";
            widget.iframeWindow.parcelpoint.StoreWidget.hide();
        } else {
            console.error("An error occurred: cannot hide the widget for the given container as it does not exist");
        }
    };

    var initialiseLibraries = function () {
        loadScript(parcelpoint.staticRoot+"/js/md5.js", function(){
            loadScript(parcelpoint.protocol + "//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js", loadStoreWidgetFiles);            
        });

    };

    var loadStoreWidgetFiles = function () {
        if (!parcelpoint.jQuery) {
            parcelpoint.jQuery = widget_.iframeWindow.jQuery;
        }

        if (parcelpoint.browser.name == "MSIE" && parcelpoint.browser.version == "7.0") {
            loadScript(parcelpoint.cdnRoot + "/widgets/v1/jsonwidget.js");
        }

        loadScript(parcelpoint.cdnRoot + "/widget/v3/store-js-bundle", waitForWidgetFiles, 'typeof widget_.iframeWindow.parcelpoint.StoreWidget === "undefined"');
    };

    var loadScript = function (src, callback, timeoutCondition) {
        var script = document.createElement('script');
        script.src = src;
        script.async = true;

        if (callback) {
            var done = false;

            script.onload = script.onreadystatechange = function () {
                if (!done && (!this.readyState ||
                    this.readyState === "loaded" || this.readyState === "complete")) {
                    done = true;

                    callback();
                }
            };
        }

        widget_.iframeHeader.appendChild(script);

        if (timeoutCondition) {
            loadScriptWithTimeout(timeoutCondition);
        }
    };

    var loadScriptWithTimeout = function (timeoutCondition) {
        loadingStart_ = new Date;
        timeLimit_ = 5;
        if (widget_.init_options.timeLimit) {
            timeLimit_ = widget_.init_options.timeLimit;
        }

        var checkIfFileLoadedOnTime = setInterval(function () {
            if (eval(timeoutCondition)) {
                if ((new Date - loadingStart_) / 1000 >= timeLimit_) {
                    clearInterval(checkIfFileLoadedOnTime);

                    var errorMessage = createErrorMessage(widget_);

                    widget_.container.innerHTML = "";
                    widget_.container.style.background = "none";
                    widget_.container.appendChild(errorMessage);

                    widget_.errorWhileLoading = true;
                    isWidgetInitialising_ = false;
                }
            }
            else {
                clearInterval(checkIfFileLoadedOnTime);
            }
        }, 100);
    };

    var resizeIframe = function (targetDiv, isStoreSelected) {
        var widget = widgetArray_[getWidgetIndex(targetDiv)];

        widget.container.style.minHeight = 0;

        var properties = {
            height: parcelpoint.jQuery(widget.iframe).contents().find("body").height()
        }

        if (widget.init_options.initialView === "search" && !isStoreSelected) {
            properties.height += searchHeight_;
            properties.marginBottom  = searchHeight_ * -1;
            properties.position = "relative";
            properties.zIndex = "99999";
        }

        parcelpoint.jQuery(widget.iframe).css(properties);

        widget.iframeHeight = properties.height;
    };

    var reinitialiseIframe = function (targetDiv) {
        var widget = widgetArray_[getWidgetIndex(targetDiv)];

        var properties = {
            height: parcelpoint.jQuery(widget.iframe).contents().find("body").height(),
            marginBottom: 0,
            position: "initial",
            zIndex: "auto"
        }

        parcelpoint.jQuery(widget.iframe).css(properties);

        widget.iframeHeight = properties.height;
    };

    var animateIframe = function (targetDiv, height, callback) {
        var widget = widgetArray_[getWidgetIndex(targetDiv)];

        parcelpoint.jQuery(widget.iframe).animate({height: height}, function() {
            if (callback) {
                callback();
            }
        });
    };

    var setFilesLoaded = function (targetDiv) {
        widget_.filesLoaded = true;
    };

    var setWidgetUpdating = function (value) {
        widgetUpdating_ = value;
    };

    var update = function (option) {

        var targetDiv = getTargetDivFromOptions(option);
        var widget = widgetArray_[getWidgetIndex(targetDiv)];

        if (widget) {
            if (widget.widgetLoaded) {
                widget.iframeWindow.parcelpoint.StoreWidget.update(option);
            } else {
                waitForWidgetToLoad(widget, option);
            }
        } else {
            console.error("An error occurred: cannot update the widget for the given container as it does not exist");
        }
    };

    var processWidgetDisplay = function (widget, option) {
        displayIframe(widget);
        widget.iframeWindow.parcelpoint.StoreWidget.display(option);
    };

    var updateStoreSelected = function (targetDiv, storeDetails) {

        for (var i = 0; i < widgetArray_.length; i++ ) {
            if (widgetArray_[i].init_options.targetDiv !== targetDiv) {
                update({
                    isCustomerSelection: false,
                    targetDiv: widgetArray_[i].init_options.targetDiv,
                    storeExternalId: storeDetails.storeId
                });
            }
        }

        parcelpoint.Property.storeDetails(storeDetails);
    };

    var waitForWidgetToLoadAndUpdate = function (widget, option) {
        if (widget.widgetLoaded && !widget.widgetUpdating) {
            widget.container.style.background = "none";
            processWidgetDisplay(widget, option);
        } else if (!widget.errorWhileLoading) {
            window.setTimeout(function () { waitForWidgetToLoadAndUpdate(widget, option) }, 100);
        }
    };

    var waitForWidgetToLoad = function (widget, option) {
        if (widget.widgetLoaded) {
            widget.iframeWindow.parcelpoint.StoreWidget.update(option);
        } else if (!widget.errorWhileLoading) {
            window.setTimeout( function () { waitForWidgetToLoad(widget, option) }, 100);
        }
    };
    
    var shouldUseV4API = function(){
        if(!widget_) return false;
        
        if(hasMigratedAPI == null){
            var migratedKeys = ["b18159f17c3184af75c060b7bbcecea8","c164c5bbd12c8b2914c1adcc0dcd69b9","944b3fb89499a3f0c7467a6c8fc2be89","c97f28923447aac53a3558dd6e52d1b8","944b3fb89499a3f0c7467a6c8fc2be89","f35f747d228d91caeb9c252694d290f3","80d69bd09161c03c99bc12cd5cf20200","8063662bc1a1e4da02efadb46c8737fb","bc99a704c2ce04b0ccf3a91bc8b0a6fe","037cbb601549cb4f86274ea8e766b10e","dd1b0b1f286c9402c12b5619c66c34bd","e8f73e968d2ca284f13f94eda0df7d39","6b5209b6496b875d526a1abdcb71b532","5f97b6bfbdadebf74ebfc0d563940c5d","503deb04f2ac2f37fe9b4028335a1251","4ddefba81d97739ba0eb298de0365253","1c5eff8628c761cca3101d2f8851edc6","d3b3df2ef10fc590014a7ca44caffe43","ace44775fdf1bf99d1303c83fd4337b6","abebcaccbeae3e23097d7b5673210980","01faf8ee3d3b5461ed49bc3226d63117","fa5dd9f415450a2da5308baf16881fa9","0c10ea8796a775954379b5cd41eff595","8dc183f9af07d6b981dd6b625c683d3b","6702210d6528f223664f0bb59269f651","80e5197e69f8af9d275d9dd9c7955bd9","accae836360f00d9d967d9f3b2bf339d","4512dc6b62a5604c494b9318234c2465","f8d557ebe6a8fde2b51bd574c1230282","76949036cec744a4e19402fc66dcafa9","155dbb1dc15d20d95d436aaa513e5964"];
            hasMigratedAPI = (parcelpoint.jQuery.inArray(widget_.iframeWindow.md5(widget_.init_options.apiKey), migratedKeys) >= 0);
        }
    
        return hasMigratedAPI;
    }

    return {
        animateIframe: animateIframe,
        init: init,
        determineBrowserAndVersion: determineBrowserAndVersion,
        destroy: destroy,
        display: display,
        getWidgetContainer: getWidgetContainer,
        setWidgetLoaded: setWidgetLoaded,
        hide: hide,
        isMobileBrowser: isMobileBrowser,
        isOldBrowser: isOldBrowser,
        loadScript: loadScript,
        resizeIframe: resizeIframe,
        reinitialiseIframe: reinitialiseIframe,
        setFilesLoaded: setFilesLoaded,
        setWidgetUpdating: setWidgetUpdating,
        update: update,
        updateStoreSelected: updateStoreSelected,
        shouldUseV4API: shouldUseV4API
    }

})();

parcelpoint.browser = parcelpoint.Store.determineBrowserAndVersion();

parcelpoint.Property = (function () {

    var propertyCache = {};
    var propertyCacher = function (name, cachable) {
        return function (value) {
            if (value === undefined) {
                return (propertyCache[name]);
            } else {
                propertyCache[name] = value;
                fireEvents("*", name, value);
                fireEvents(name, name, value);
                return this;
            }
        }
    };

    var events = {};
    var onChange = function (keys, callback) {
        if (typeof keys === 'string') {
            keys = [keys];
        } else if (typeof(keys) == "function") {
            callback = keys;
            keys = ["*"]
        }

        for (var i = 0; i < keys.length; i++) {
            events[keys[i]] = events[keys[i]] || [];
            events[keys[i]].push(callback);
        }

        return this;
    };

    var fireEvents = function (eventKey, attributeKey, value) {
        if (events[eventKey]) {
            for (var i = 0; i < events[eventKey].length; i++) {
                events[eventKey][i](attributeKey, value);
            }
        }
    };

    return {
        onChange: onChange,
        storeDetails: propertyCacher("storeDetails")
    }

})()
