/*
Copyright (c) 2007, Mixam Com. All rights reserved.
Author: Effie Nadiv
version: 0.88.2
*/

/**
 * The offer module provides a way to calculate an offer made of several printing job.
 * @module offer
 * @requires yahoo, event, dom, mixam, catalog,
 */

/**
 * @class MIXAM.Offer
 * offer.isSplitRequired()
 */

MIXAM.shop = function() {
	var force250gsm = true;
    var CSS_CLASS_HIDDEN = "hidden",
        COPIES_MIN = 50,
        COPIES_MAX = 99999999,
            MAX_STITCH_PAGES = 64,
            MIN_PERFECTBIND_PAGES = 48,
            CSS_CLASS_DISABLED = "disabled",
            product, form,
            timer1,
            display, offer,
            currency, invoice,
            cObj, callback,
            tooltipOthers, tooltipBind;

    function _queueRefresh(){
        if (timer1){
            clearTimeout(timer1);
        }
        timer1 = setTimeout(getQuote, 600);
    }

    function getQuote2(){
        _getQuote(getNextInterestingQuantity(strToInt(form.Copies.value)));
    }

    function getQuote(){
        _getQuote(null);
    }

    function strToInt(text){
        return parseInt(text.replace(/,/g, "").trim());
    }

    function _getQuote(numberOfCopies){
        var url = getUrlParmetersString(numberOfCopies);

        //$("copiesOfItems").innerHTML = MIXAM.util.Format.formatNumber2(strToInt(form.Copies.value), 0);
        function responseSuccess(o) {
        	//window.alert("responseSuccess: " + o.responseText);
            var obj = eval('(' + o.responseText + ')');
            cObj = null;
        }


        function responseFailure(o) {
            //window.alert("responseFailure: " + o.statusText);
            cObj = null;
        }

        if (url){
            if (cObj && YAHOO.util.Connect.isCallInProgress(cObj)){
                YAHOO.util.Connect.abort(cObj, callback, 1000);
                cObj = null;
            }
            if (!numberOfCopies){
                display.hide();
            }
            callback = {success: responseSuccess, failure: responseFailure};
            // cObj = YAHOO.util.Connect.asyncRequest('GET', "santa?" + url, callback);
            cObj = YAHOO.util.Connect.asyncRequest('GET', "/santa?" + url, callback);
            //window.alert("http://www.mixam.co.uk/santa?" + url);
        }
    }

    function getUrlParmetersString(numberOfCopies){
        var copies = numberOfCopies ? numberOfCopies : strToInt(form.Copies.value),
            colors = strToInt(form.Colors.value) + (form.Colors2 ? strToInt(form.Colors2.value) : 0);

        function getFormFieldValue(name, def){
            return form[name] ? form[name].value  : 0;
        }

        if (isNaN(copies)){
            display.dispError("Number of Copies Error!<br/>try <a href='#' onclick='MIXAM.shop.setQuantity(50)'>50</a>");
        } else if (copies < COPIES_MIN) {
            display.dispError("Number of Copies too low!<br/>try <a href='#' onclick='MIXAM.shop.setQuantity(50)'>50</a>");
        } else if (copies > COPIES_MAX) {
            display.dispError("Number of Copies too high!");
        } else if (colors == 0) {
            display.dispError("No Print! Set The Colours");
        } else {
            return "copies=" + copies +
                   (form.Pages ? "&pages=" + form.Pages.value : "") +
                   "&colors=" + form.Colors.value +
                   (form.Colors2 ? "&colors2=" + form.Colors2.value : "") +
                   "&format=" + form.FormatSize.value +
                   "&paper=" + form.Paper.value +
                   "&paperfin=" + form.PaperFinish.value +
                   "&productId=" +  form.ProductId.value +
                   "&mode=" + (numberOfCopies ? "1" : "0") +
                   "&verbose=" + (form.Calculation && form.Calculation.checked ? 1 : 0) +
                   "&ctype=" + getFormFieldValue("CoverType", -1) +
                   "&cpaperfin=" + getFormFieldValue("CoverPaperFinish", 0) +
                   "&ccolors=" + getFormFieldValue("CoverColors", 0) +
                   "&ccolors2=" + getFormFieldValue("CoverColors2", 0) +
                   "&coat0=" + getFormFieldValue("CoatingMode0", 0) +
                   "&coat1=" + getFormFieldValue("CoatingMode1", 0) +
                   "&coat2=" + getFormFieldValue("CoatingMode2", 0) +
                   "&coat3=" + getFormFieldValue("CoatingMode3", 0) +
                   "&sfold=" + getFormFieldValue("SimpleFold", 0) +
                   "&bind=" + getFormFieldValue("Bind", 0) +
                   "&ts=" + (new Date()).getTime();
        }
    }

    function doPromote(quantity, price, name){
        display.promote(quantity, price, name);
    }

    function doOffer(total, info, weight){
        var copies = strToInt(form.Copies.value) * (form.Quantity && form.Quantity.value ? strToInt(form.Quantity.value) : 1);

        display.show(total, weight, copies, $("productName").value);
        //$("copiesOfItems").innerHTML = MIXAM.util.Format.formatNumber2(copies, 0);
        if (total > 1000){
            $D.removeClass("call-promo", "hidden");
        } else {
            $D.addClass("call-promo", "hidden");
        }
        if (info && form.Calculation.checked){
            displayCalcInfo(info);
        }
        setTimeout(getQuote2, 1000);
    }

    function displayCalcInfo(info){
        var verboseDiv = $("verbose");

        if (!verboseDiv){
            verboseDiv = document.createElement("DIV");
            form.parentNode.appendChild(verboseDiv);
            verboseDiv.id = "verbose";
        }
        verboseDiv.innerHTML = info;
    }

    function _initCurrency(){
        var i,
                index = MIXAM.util.Cookie.read("currency2", 999); 

        if (index == 999){
            for (i = 0; i < MIXAM.catalog.currency.length; i++){
                if (MIXAM.catalog.currency[i]["default"]){
                    index = i;
                    break;
                }
            }
        }
        _setCurrency(index);
    }

    function _setCurrency(index){
        if (index == null){
            index = (parseInt(currency.id) + 1) % MIXAM.catalog.currency.length;
        }
        currency = MIXAM.catalog.currency[index];
        form.currencyId.value = index;
        MIXAM.util.Cookie.write("currency2", index);
    }

    function _initVerbose(){
        if (form.Calculation){
            form.Calculation.checked = MIXAM.util.Cookie.read("isverbose", "0") != "0";
        }

    }

	function onTooltipTextChange(type, args, obj){
            var text = args[0];
            if (text) {
            	tooltipOthers.unsubscribe("changeBody", onTooltipTextChange);
                tooltipOthers.setBody(MIXAM.util.formatText(text));
            	tooltipOthers.subscribe("changeBody", onTooltipTextChange);
            }
	}
    function _initTooltip(){
        var tt = $("bindingToolTip"),
            bind = $("label-bind"),
            contextElements = ["colorsLabel", "colors2Label", "coverColorsLabel", "coverColors2Label",
                    "copiesLabel", "formatLabel", "paperLabel", "paperFinishLabel", "coatingMode0Label",
                    "coatingMode1Label", "coatingMode2Label", "coatingMode3Label", "flyerFoldsLable",
                    "label-pages", "coverTypeLabel"];

        if (bind && tt){
            $D.removeClass(tt, "hidden");
            tooltipBind = new YAHOO.widget.Tooltip(tt, { context: bind, autodismissdelay: 10000, zIndex: 101 });
        }
        tt = $("otherToolTip");
        if (tt){
            $D.removeClass(tt, "hidden");
            tooltipOthers = new YAHOO.widget.Tooltip(tt, { context: contextElements, autodismissdelay: 10000, zIndex: 101 });
            tooltipOthers.subscribe("changeBody", onTooltipTextChange);
        }
    }

    function _doOnUnload(){
        if (cObj && YAHOO.util.Connect.isCallInProgress(cObj)){
            YAHOO.util.Connect.abort(cObj, callback, 1000);
            cObj = null;
        }
    }


    function _doOnVerboseChange(){
        var value = form.Calculation && form.Calculation.checked ? "1" : "0",
                verboseDiv = $("verbose");

        MIXAM.util.Cookie.write("isverbose", value);
        if (value == "0"){
            if (verboseDiv){
                verboseDiv.parentNode.removeChild(verboseDiv);
            }
        } else {
            _queueRefresh();
        }
    }

    function _doOnCoverTypeChange(){
        var select = $("coverType");
        var type;
        var bind = $("bind");
        var bindValue = parseInt(bind.value ? bind.value : 0, 10);

        if (select){
            if ("-1" == select.value){
            	if (bindValue > 1) {
            		// New condition on price calculator, for Brochures/Magazines/Books category. If "Binding = Perfect Cover", then should auto select "Cover = 250GSM Coated" and disable (grey-out) the option "Cover = Self Cover". If a user attempts to select this then Pop-up message.
            		select.value = 7;
            		window.alert('Perfect Cover binding is not compatible with the Self Cover option');
            	} else {
                	$D.addClass("cover", "hidden");
                	$("coverPaperFinish").value = $('paperFinish').value;
                	$("coverPaperFinish").disabled = true;
            	}
            } else {
                $D.removeClass("cover", "hidden");
                $("coverPaperFinish").disabled = false;
            }
            _initPagesAndBind();
        }
        _queueRefresh();
    }

    function getNextInterestingQuantity(quantity){
        var stations = [1000, 2000, 5000, 7500, 10000, 12500, 15000, 30000, 50000, 75000, 100000],
                i;

        for (i = 0; i < stations.length; i++){
            if (quantity < stations[i]){
                return stations[i];
            }
        }
        return  Math.round(quantity * 1.25);
    }

    /* Flyer fold */


    function _setSimpleFold(ev){
        form.SimpleFold.value = $E.getTarget(ev).value;
        _queueRefresh();
    }

    function _doOnPaperFinishChange(ev){
        var coverType = $("coverType");

        if (coverType && '-1' == coverType.value){
            $("coverPaperFinish").value = $E.getTarget(ev).value;
        }
    }

    function _doOnPagesChange(ev){
        var pages = $E.getTarget(ev).value;

        _refreshPagesChange(pages);
        _queueRefresh();
    }

    function _doOnBindChange(ev){
    	var pages = $("pages").value;
        _refreshPagesChange(pages);
        _queueRefresh();
        _doOnCoverTypeChange();
    }

    function _refreshPagesChange(pages){
        var bind = $('bind'),
            coverType = $("coverType"),
            isCover = (coverType && '-1' != coverType.value),
            currentValue = parseInt(bind.value ? bind.value : 0, 10);

        bind.options.length = 0;

        if (pages == 4 && !isCover) {
            bind.options[bind.options.length] = new Option(String.fromCharCode(160), '0');
        } else {
        	if (pages <= MAX_STITCH_PAGES) {
                bind.options[bind.options.length] = new Option('Saddle Stitched Portrait','0');
                bind.options[bind.options.length] = new Option('Saddle Stitched Landscape','1');
            }
            if (pages >= MIN_PERFECTBIND_PAGES) {
                bind.options[bind.options.length] = new Option('Perfect Bound Portrait','2');
                bind.options[bind.options.length] = new Option('Perfect Bound Landscape','3');
            }
        }
		
        if (pages > MAX_STITCH_PAGES && currentValue < 2) {
            currentValue += 2;
        }
        if (pages < MIN_PERFECTBIND_PAGES && currentValue > 1) {
            currentValue -= 2;
        }
		
		if (currentValue > 1 && force250gsm==true) {
			coverType.value = 7;
			force250gsm = false; // forcing to 250gsm should work one time only
		}
		
        if (bind.options.length > 1) {
            bind.value = currentValue;
        }
        bind.disabled = bind.options.length < 2;
        
        if (currentValue > 1 && coverType.value == -1) {
        	coverType.value = 7; // autoselect 250GSM coated when perfect bind
        }
        
        if (currentValue > 1) {
        	coverType.options[0].style.background='#eeeeee';
        	coverType.options[0].style.color='#888888';
        } else {
        	coverType.options[0].style.background='';
        	coverType.options[0].style.color='';
        }
    }

    function _initPagesAndBind(){
        var pages = $("pages");

        if (pages){
            _refreshPagesChange(pages.value);
        }
    }

    return {
        init: function(){

            if(MIXAM.util.Browser.isGecko){
                $D.addClass(document.body, "gecko");
                // prevent page "select all text" on mozilla
                $E.on($D.getElementsByClassName("body-mask", "div", document.body), "mousedown", function(e){
                    var target = $E.getTarget(e);

                    if (target == document.body || "body-mask" == target.className){
                        $E.stopEvent(e);
                    }
                });
            } else if (MIXAM.util.Browser.isIE){
                $D.addClass(document.body, "ie");
            } else if (MIXAM.util.Browser.isOpera){
                $D.addClass(document.body, "opera");
            } else if (MIXAM.util.Browser.isSafari){
                $D.addClass(document.body, "safari");
            }

            form = $('offers');
            if (form){
                display = new MIXAM.Display(MIXAM.shop, $("display"), $("data"), $("hint"), $("disperror"));
                $D.setStyle("display", "display", "inline");
                _initCurrency();
                _initVerbose();
                _initTooltip();
                _initPagesAndBind();
                $E.on(["quantity", "copies"], "keyup", _queueRefresh);
                $E.on(["folds0", "folds1", "folds2", "folds3"], "click", _setSimpleFold);
                $E.on(["colors", "colors2", "format", "paper", "coverColors", "coverPaper", "coverColors2", "coatingMode0", "coatingMode1", "coatingMode2", "coatingMode3"], "change", _queueRefresh);
                $E.on("pages", "change", _doOnPagesChange);
                $E.on("bind", "change", _doOnBindChange);
                $E.on("coverType", "change", _doOnCoverTypeChange);
                $E.on("paperFinish", "change", _doOnPaperFinishChange);
                $E.on("sendme", "click", function(e){
                    $E.stopEvent(e);
                    var copies = strToInt(form.Copies.value);
                    if (copies >= COPIES_MIN && copies < COPIES_MAX) {
                    	form.submit();
                    }
                });
                $E.on("calculation", "click", _doOnVerboseChange);
                $E.on(window, "unload", _doOnUnload);

                _queueRefresh();
            }

        },

        flipCcurrency: function(){
            _setCurrency();
            _queueRefresh();
        },

        getCurrency: function(){
            return currency;
        },

        setQuantity: function(quantity){
            form.Copies.value =  quantity;
            _queueRefresh();
        },

        refresh: function(){
            _queueRefresh();
        }
    };
}();

/**
 * @class MIXAM.Offer
 * offer.isSplitRequired()
 */

$E.onDOMReady(MIXAM.shop.init);

