/**
 * @fileoverview Compare Tool Redesign (zip).
 * @name Zip
 * Requires Prototype version 1.6.0 or greater.
 */

/**
 * Compare Tool Redesign Model class.
 * @author Neil Green
 */
var Zip = Class.create();

/**
 * Compare Tool Redesign Zip prototype.
 * @scope Zip.prototype
 */
Zip.prototype =
{
    /**
     * Instantiates the Zip code persistant (multi-session) cookie
     */
    persistantZipCookie: new Cookie("ISP_SF"),

    /**
     * Instantiates the Zip code session cookie
     */
    sessionZipCookie: new Cookie("USER"),

    /**
     * Constructor.
     * @constructor
     * @throws exception if Prototype 1.6.0 or greater is not loaded.
     */
    initialize: function()
    {
        // Make sure Prototype is included.
        var exception = "Prototype version 1.6.0 or greater is required.";
        if (typeof Prototype == "undefined")
        {
            throw(exception);
        }
        // Make sure it is version 1.6.0 or greater.
        var ver = Prototype.Version.split(".");
        var major = ver[0];
        var minor = ver[1];
        if (major < 1)
        {
            throw(exception);
        }
        if (minor < 6)
        {
            throw(exception);
        }

        this.persistantZipCookie.setExpireDays(365);
        this.persistantZipCookie.setDomain(".autotrader.com");
    },

    loadZip: function()
    {
        var isOEM = ATC.cs.research.ctr.model.isOEM();
        var zip = null;

        var zipFromCookie = this.getZipFromCookie();
        var zipFromUrl = this.getZipFromURL();

        if (zipFromCookie != null)
        {
            zip = zipFromCookie;
        }
        if (zipFromUrl != null)
        {
            zip = zipFromUrl;
        }
        if (zip != null)
        {
            ATC.cs.research.ctr.model.setZIP(zip);
        }

        if (isOEM)
        {
            if (zip != null)
            {
                this.initializeZipCode(zip);
            }
        }
        else if ((zip == null) || (zip == ''))
        {
            this.promptUserForZip();
        }
        else
        {
            this.initializeZipCode(zip);
        }
    },

    initializeZipCode: function(zip)
    {
        var hasZipCodeBeenChanged = this.hasZipCodeBeenChanged(zip);
        var isOEM = ATC.cs.research.ctr.model.isOEM();
        var oldZIP = ATC.cs.research.ctr.model.getZIP();

        if (this.isValidZipFormat(zip))
        {
            ATC.cs.research.ctr.model.setZIP(zip);
            this.setZipToCookie(zip);
            $('address').value = zip;
            $('update-address').value = zip;
            $('address-backup').value = zip;
            $('zip-code').update(zip);
            var callback = function(distance)
            {
                $('distance').value = distance;
            }
            ModelSearchUtil.findDistance(zip, callback);
            // refresh cars on zip code change
            if (hasZipCodeBeenChanged)
            {
                ATC.cs.research.ctr.controller.updateCars();
            }
            //refresh leaderboard ad (if not OEM) on enter new zip or change zip (not entering with zip or "updating" with same zip
            if (!isOEM && ( oldZIP == null || oldZIP == "" || hasZipCodeBeenChanged))
            {
                var adManager = new AdManager();
                adManager.updateAdsByZip(zip);
            }
        }
    },

    /**
     * Determine whether we are setting the ZIP code or changing it.
     */
    hasZipCodeBeenChanged: function(newZip)
    {
        var zipChanged = false;

        var oldZIP = ATC.cs.research.ctr.model.getZIP();
        if (newZip != oldZIP)
        {
            zipChanged = true;
        }
        return zipChanged;
    },

    isValidZipFormat: function(zip)
    {
        var zipRegex = /^\d{5}$/;

        return zipRegex.test(zip);
    },

    getZipFromURL: function()
    {
        var isSeoUrl = ATC.cs.research.ctr.controller.isSeoUrl();

        var zip = isSeoUrl ? this.getZipFromSeoURL() : this.getZipFromQueryURL();

        return zip;
    },

    getZipFromQueryURL: function()
    {
        var url = ATC.cs.research.ctr.url;
        var zip = null;
        zip = url.getParameter("zip");
        if (zip == null)
        {
            zip = url.getParameter("address");
        }
        return zip;
    },

    getZipFromSeoURL: function()
    {
        var url = window.location.href;
        var seoZipString = '/zip/';
        var zip = null;

        if (url.indexOf(seoZipString) != -1)
        {
            var urlParts = url.split('/');

            if (urlParts.length > 2)
            {
                zip = urlParts[urlParts.indexOf("zip") + 1];
            }
        }
        return zip;
    },

    getZipFromCookie: function()
    {
        var zip = null;

        var sessionZip = this.sessionZipCookie.getParam("zip");

        if (sessionZip != null)
        {
            zip = sessionZip;
        }
        else
        {
            var persistantZip = this.persistantZipCookie.getParam("zip");
            if (persistantZip != null)
            {
                zip = persistantZip;
            }
        }
        return zip;
    },

    setZipToCookie: function(zip)
    {
        this.persistantZipCookie.setParam("zip", zip);
        this.persistantZipCookie.save();
        this.sessionZipCookie.setParam("zip", zip);
        this.sessionZipCookie.save();
    },

    promptUserForZip: function()
    {
        // attempting to preload backdrop image
        if (document.images) {
            var boxImage = new Image();
            boxImage.src = '/img/research/compare/bg-modal.change-zip2.gif';
        }

        /**
         * Modifying lightbox init method
         */
        Lightbox.init = function ()
        {
            var lightboxtext = '<div id="overlay" style="display:none"></div>';
            lightboxtext += '<div id="box" style="display:none; background:transparent url(/img/research/compare/bg-modal.change-zip2.gif) left top no-repeat">';
            lightboxtext += '<img id="close" src="close.gif" onClick="Lightbox.hideBox()" alt="Close" title="Close this window" />';
            lightboxtext += '<div id="boxContents"></div>';
            lightboxtext += '</div>';

            var bod = $("compare-tool");
            bod.insert(lightboxtext);
        }

        Lightbox.init();
        ATC.cs.research.ctr.view.addEventsToZipModal();

        Lightbox.showBoxByID('change-zip-code', 260, 150);

        var zindex = $("box").style.zIndex - 1;
        var dElement = $("overlay");
        dElement.style.zIndex = zindex;
        dElement.setOpacity(".5");

        var address = $('address');
        address.focus();

        setTimeout("ATC.utils.BIUtils.getBIEvent('e10az')", 3000);

    },

    /**
     *  This function is called when the Light box zip form is submitted
     */
    zipValidator: function()
    {
        var zip = $F("address");
        if (!this.isValidZipFormat(zip))
        {
            ATC.utils.BIUtils.getBIEvent("e10y");

            $('invalid-zip-message').show();
            $('change-zip-label').setStyle({color:'red'});
        }
        else
        {
            this.validateZipWithMarket(zip, "zipValidator");
        }
    },

    /**
     *  This function is called when the zip form on CTR page is submitted
     */
    zipValidator_CTR: function()
    {
        var zip = $F("update-address");
        if (!this.isValidZipFormat(zip))
        {
            ATC.utils.BIUtils.getBIEvent("e10y");

            $('update-invalid-zip-message').show();
            $('update-zip-label').setStyle({color:'red'});
        }
        else
        {
            this.validateZipWithMarket(zip, "zipValidator_CTR");
        }
    },

    /**
     * Zip code validation against market table
     */
    validateZipWithMarket: function (zip, callingFunction)
    {
        if (zip == null)
        {
            return;
        }
        var url = "/ac-servlets/research/compare/ctr/validateZipAgainstMarket?zip=" + zip + "&callingFunction=" + callingFunction;
        var options = {method: "get", onSuccess: this.getMarketZip};
        new Ajax.Request(url, options);
    },

    getMarketZip: function(tx)
    {
        // Verify parameters.
        if (tx == null)
        {
            return;
        }
        if (typeof tx != "object")
        {
            return;
        }
        // Get the car.
        var txt = tx.responseText;
        var Zip = txt.evalJSON();
        if (typeof Zip == "object")
        {
            if (Zip.zip == "")
            {
                ATC.cs.research.ctr.zip.zipValid_Action(Zip.zip, Zip.callingFunction, true)
            }
            else
            {
                ATC.cs.research.ctr.zip.zipValid_Action(Zip.zip, Zip.callingFunction, false)
            }
        }
    },

    /**
     * This function is called to display the response after validating the Zip with market table.
     */
    zipValid_Action: function (zip, callingFunction, zipError)
    {
        if (callingFunction == "zipValidator")
        {
            if (zipError)
            {
                ATC.utils.BIUtils.getBIEvent("e10y");

                $('invalid-zip-message').show();
                $('change-zip-label').setStyle({color:'red'});
            }
            else
            {
                this.initializeZipCode(zip);
                $('invalid-zip-message').hide();
                $('change-zip-label').setStyle({color:'black'});

                Lightbox.hideBox();
                ATC.cs.research.ctr.view.removeEventsFromZipModal();
            }
        }

        if (callingFunction == "zipValidator_CTR")
        {
            if (zipError)
            {
                ATC.utils.BIUtils.getBIEvent("e10y");

                $('update-invalid-zip-message').show();
                $('update-zip-label').setStyle({color:'red'});
            }
            else
            {
                this.initializeZipCode(zip);

                $('update-zip-code').hide()
                $('zip-code').show()
                $('open-change-zip-modal').show()
                $('update-invalid-zip-message').hide()
                $('update-zip-label').setStyle({color:'black'});
            }
        }

    }
}

ATC.cs.research.ctr.zip = new Zip();
