﻿glp = {
    $get:function(elementId) {
        return document.getElementById(elementId);
    },
    altmsg:"",
    wsUrl:window.location,
    unitID:0,
    isLibrary:false,
    sendConfirm:false,
    sendNotice:false,
    sendXml:false,
    stateList:"",
    mode:0,
    mfg:"",
    make:"",
    box:{
        main:null,
        request:null,
        requestMenu:null,
        error:null,
        errorMenu:null,
        loading:null,
        alternate:null,
        response:null,
        responseMenu:null,
        emailUs:null,
        make:null,
        mfg:null,
        unitDesc:null,
        dealerPhone:null,
        init:function() 
        {
            glp.box.main = glp.$get("GetLowestPrice");
            glp.box.request = glp.$get("glpRequestTable");
            glp.box.requestMenu = glp.$get("glpCommandBar1");
            glp.box.loading = glp.$get("glpLoading");
            glp.box.error = glp.$get("glpError");
            glp.box.errorMenu = glp.$get("glpCommandBar2");
            glp.box.alternate = glp.$get("glpAltMsg");
            glp.altmsg = $(glp.box.alternate).html();
            glp.box.response = glp.$get("glpResultsTable");
            glp.box.responseMenu = glp.$get("glpCommandBar3");
            glp.box.emailUs = glp.$get("glpEmailUs");
            glp.box.make = glp.$get("glpMake");
            glp.box.mfg = glp.$get("glpMfg");
            glp.box.unitDesc = glp.$get("glpUnitDesc");
            glp.box.priceContext = glp.$get("glpPriceContext");
            glp.box.lowestPrice = glp.$get("glpLowestPrice");
            glp.box.dealerPhone = glp.$get("glpDealerPhone");
            glp.addShowHide(glp.box.main);
            glp.addShowHide(glp.box.request);
            glp.addShowHide(glp.box.requestMenu);
            glp.addShowHide(glp.box.loading);
            glp.addShowHide(glp.box.error);
            glp.addShowHide(glp.box.errorMenu);
            glp.addShowHide(glp.box.alternate);
            glp.addShowHide(glp.box.response);
            glp.addShowHide(glp.box.responseMenu);
            glp.addShowHide(glp.box.emailUs);
            glp.addShowHide(glp.box.make);
            glp.addShowHide(glp.box.mfg);
            glp.addSetContent(glp.box.make);
            glp.addSetContent(glp.box.mfg);
            glp.addSetContent(glp.box.error);
            glp.addSetContent(glp.box.unitDesc);
            glp.addSetContent(glp.box.priceContext);
            glp.addSetContent(glp.box.lowestPrice);
            glp.addSetContent(glp.box.dealerPhone);
            glp.box.error.clear = function() {
                glp.box.error.innerText = "";
                glp.box.error.hide();
            }
            glp.box.response.clear = function() {
                glp.removeChildren(glp.box.alternate);
                glp.removeChildren(glp.box.priceContext);
                glp.removeChildren(glp.box.lowestPrice);
            }
        },
        showRequest:function() {
            glp.box.main.show();
            glp.box.request.show();
            glp.box.requestMenu.show();
            glp.box.loading.hide();
            glp.box.error.hide();
            glp.box.errorMenu.hide();
            glp.box.response.hide();
            glp.box.responseMenu.hide();
            glp.box.alternate.hide();
            glp.box.emailUs.hide();
        },
        showLoading:function() {
            glp.box.main.show();
            glp.box.request.hide();
            glp.box.requestMenu.hide();
            glp.box.loading.show();
            glp.box.error.hide();
            glp.box.errorMenu.hide();
            glp.box.response.hide();
            glp.box.responseMenu.hide();
            glp.box.alternate.hide();
            glp.box.emailUs.hide();
        },
        showError:function() {
            glp.box.main.show();
            glp.box.request.hide();
            glp.box.requestMenu.hide();
            glp.box.loading.hide();
            glp.box.error.show();
            glp.box.errorMenu.show();
            glp.box.response.hide();
            glp.box.responseMenu.hide();
            glp.box.alternate.hide();
            glp.box.emailUs.show();
        },
        showResponse:function() {
            glp.box.main.show();
            glp.box.request.hide();
            glp.box.requestMenu.hide();
            glp.box.loading.hide();
            glp.box.error.hide();
            glp.box.errorMenu.hide();
            glp.box.response.show();
            glp.box.responseMenu.show();
            glp.box.alternate.hide();
            glp.box.emailUs.show();
        },
        showAlternate:function() {
            glp.box.main.show();
            glp.box.request.hide();
            glp.box.requestMenu.hide();
            glp.box.loading.hide();
            glp.box.error.hide();
            glp.box.errorMenu.hide();
            glp.box.response.hide();
            glp.box.responseMenu.show();
            glp.box.alternate.show();
            glp.box.emailUs.show();
        }
    },
    fld:{
        fname:null,
        lname:null,
        phone:null,
        email:null,
        zip:null,
        list:null,
        low:null,
        save:null,
        getRequestFields:function() { var f = glp.fld; return new Array(f.fname,f.lname,f.phone,f.email,f.zip); },
        init:function() {
            glp.fld.fname = glp.$get("glpFirstName");
            glp.fld.lname = glp.$get("glpLastName");
            glp.fld.phone = glp.$get("glpPhone");
            glp.fld.email = glp.$get("glpEmail");
            glp.fld.zip = glp.$get("glpZip");
            var flds = glp.fld.getRequestFields();
            for(var x = 0; x < flds.length; x++)
            {
                flds[x].onfocus = glp.onSetFocus;
                flds[x].onblur = glp.onSetBlur;
            }
            if (typeof usrctx != "undefined")
            {
                usrctx.fill("glpFirstName","glpLastName","glpPhone","glpEmail","glpZip");
            }
        }
    },
    cmd:{
        request:null,
        close1:null,
        close2:null,
        close3:null,
        tryAgain:null,
        init:function() 
        {
            glp.cmd.request = glp.$get("glpRequestButton");
            glp.cmd.close1 = glp.$get("glpCloseButton1");
            glp.cmd.close2 = glp.$get("glpCloseButton2");
            glp.cmd.close3 = glp.$get("glpCloseButton3");
            glp.cmd.tryAgain = glp.$get("glpTryAgain");
            glp.cmd.close1.onclick = glp.hide;
            glp.cmd.close2.onclick = glp.hide;
            glp.cmd.close3.onclick = glp.hide;
            glp.cmd.request.onclick = function() { glp.submit(); };
            glp.cmd.tryAgain.onclick = function() { glp.box.showRequest(); };
        }
    },
    init:function(wsUrl) {
        glp.box.init();
        glp.fld.init();
        glp.cmd.init();
        glp.wsUrl = wsUrl;
    },
    show:function(element, unitID, isLibrary, mfg, make, sendConfirm, sendNotice, sendXml, stateList, mode) {
        glp.unitID = unitID;
        glp.isLibrary = isLibrary;
        glp.sendConfirm = sendConfirm;
        glp.sendNotice = sendNotice;
        glp.sendXml = sendXml;
        glp.stateList = stateList;
        glp.mode = mode;
        glp.setMessage(mfg, make);
        glp.move(element, glp.box.main);
        glp.box.showRequest();   
        return false;
    },
    hide:function() {
        glp.box.main.hide();
        return false;
    },
    move:function(clicked, target) {
		var pos = $(clicked).position();
        var ctx = { t:$(document).scrollTop(), l:$(document).scrollLeft(), 
            h:$(window).height(), w:$(window).width(), 
            b:0, r:0, fh:314, fw:350 };
        ctx.b = ctx.t + ctx.h;
        ctx.r = ctx.l + ctx.w;
        pos.top = pos.top - (ctx.fh / 2);
        pos.left = pos.left - ctx.fw;
        pos.top = (pos.top + ctx.fh > ctx.b) ? ctx.b - ctx.fh : pos.top;
        pos.left = (pos.left + ctx.fw > ctx.r) ? ctx.r - ctx.fw : pos.left;
        pos.top = (pos.top < ctx.t) ? ctx.t : (pos.top < 0) ? 0 : pos.top;
        pos.left = (pos.left < ctx.l) ? ctx.l : (pos.left < 0) ? 0 : pos.left;
		$(target).css({left:""+pos.left+"px",top:""+pos.top+"px"});
    },
    setError:function(message) {
        glp.box.error.innerHTML = message;
        glp.box.showError();
    },
    evalResponse:function(responseText) {
        var jsonResult = responseText; //executor.get_responseData();
        var regexp = /<[/]?string[^<>]*>|<\?xml[^<>]+>/gi;
        jsonResult = jsonResult.replace(regexp, "");
        regexp = /\&lt\;/gi;
        jsonResult = jsonResult.replace(regexp, "<");
        regexp = /\&gt\;/gi;
        jsonResult = jsonResult.replace(regexp, ">");
        var result;
        try
        {
            result = eval('(' + jsonResult + ')');
        } catch (e) {
            result = {errorNum:4,errorText:"Your request could not be handled at this time."};
        }
        return result;
    },
    submit:function() {
        glp.box.showLoading();
        try
        {
            timerID = setTimeout("glp.submitAsync()", 250);
        } catch (e) {
            glp.setError("Your browser does not support the functionality required for this feature.");
        }
    },
    submitAsync:function() {
        //do not call this method directly, always call submit;
        if (typeof timerID != "undefined")
        {
            clearTimeout(timerID);
        }
        
        if (typeof usrctx != "undefined")
        {
            usrctx.init();
            usrctx.user.fname = glp.fld.fname.value;
            usrctx.user.lname = glp.fld.lname.value;
            usrctx.user.phone = glp.fld.phone.value;
            usrctx.user.email = glp.fld.email.value;
            usrctx.user.zip = glp.fld.zip.value;
            usrctx.save();
        }
        
        var oXmlHttp = false;
        /*@cc_on @*/
        /*@if (@_jscript_version >= 5)
        // JScript gives us Conditional compilation, we can cope with old IE versions.
        // and security blocked creation of the objects.
         try 
         {
             oXmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
         } catch (e) {
             try 
             {
                  oXmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
             } catch (e) {
                 oXmlHttp = false;
             }
         }
        @end @*/
        if (!oXmlHttp && typeof XMLHttpRequest != "undefined") {
	        try 
	        {
		        oXmlHttp = new XMLHttpRequest();
	        } catch (e) {
		        oXmlHttp=false;
	        }
        }
        if (!oXmlHttp && window.createRequest) {
	        try 
	        {
		        oXmlHttp = window.createRequest();
	        } catch (e) {
		        oXmlHttp = false;
	        }
        }

        if (!oXmlHttp)
		{
		    glp.setError("Your browser does not support the functionality required for this feature.");
		}
		
        oXmlHttp.open('POST',glp.wsUrl,true);
        var requestBody = glp.buildRequest();
        oXmlHttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        oXmlHttp.setRequestHeader('Content-Length', requestBody.length.toString());
        
		oXmlHttp.onreadystatechange=function() {
//            0 = uninitialized
//            1 = loading
//            2 = loaded
//            3 = interactive
//            4 = complete
			if (oXmlHttp.readyState==4) 
			{
			    var responseText = oXmlHttp.responseText;
				var result = glp.evalResponse(responseText);
				if (result.errorNum == 0)
                {
                    if (result.showPrice == true)
                    {
                        glp.box.lowestPrice.innerHTML = result.priceHtml;
                        glp.box.unitDesc.setContent(result.unitDescription);
                        glp.box.dealerPhone.setContent(result.dealerPhone);
                        glp.box.showResponse();
                    }
                    else
                    {
                        glp.box.alternate.appendChild(glp.renderTextNode("p", glp.altmsg.replace(/DEALERPHONE/,result.dealerPhone)));
                        glp.box.showAlternate();
                    }
                }
                else
                {
                    var innerText = (result.errorNum == 1) ? result.errorText :
                        result.errorText + " [" + result.errorNum + "]";
                    glp.setError(innerText);
                }
			}
		}
		glp.box.response.clear();
		glp.box.error.clear();
		oXmlHttp.send(requestBody);
    },
    buildRequest:function(){
        var sb = "";
        sb += glp.qs("firstname", glp.fld.fname.value);
        sb += glp.qs("lastname", glp.fld.lname.value);
        sb += glp.qs("phone", glp.fld.phone.value);
        sb += glp.qs("email", glp.fld.email.value);
        sb += glp.qs("zipcode", glp.fld.zip.value);
        sb += glp.qs("unitID", glp.unitID);
        sb += glp.qs("isLibraryUnit", glp.isLibrary);
        sb += glp.qs("sendConfirmation", glp.sendConfirm);
        sb += glp.qs("sendNotification", glp.sendNotice);
        sb += glp.qs("sendAsXml", glp.sendXml);
        sb += glp.qs("stateList", glp.stateList);
        sb += glp.qs("mode", glp.mode);
        return sb;
    },
    qs:function(name, value)
    {
        return name + "=" + escape(value) + "&";
    },
    setMessage:function(mfg,make) {
        if (glp.box.make) { glp.box.make.innerHTML = make; }
        if (glp.box.mfg) { glp.box.mfg.innerHTML = mfg; }
    },    
    elementOffset:function (obj) 
    {
        var curleft = curtop = 0;
        if (typeof obj != 'undefined' && obj != null && obj.offsetParent) 
        {
            curleft = obj.offsetLeft;
            curtop = obj.offsetTop;
            while (obj = obj.offsetParent) 
            {
                curleft += obj.offsetLeft;
                curtop += obj.offsetTop;
            }
        }
        return {x:curleft,y:curtop};
    },
    onSetFocus:function()
    {
        glp.insertClass(this, "Focus");
    },
    onSetBlur:function()
    {
        glp.removeClass(this, "Focus");
    },
    addShowHide:function(element) {
        if (!element) { element = {}; }
        element.show = function() { glp.showIt(this); };
        element.hide = function() { glp.hideIt(this); };
    },
    addSetContent:function(element) {
        if (!element) { element = { firstChild:{} }; }
        var textNode = element.firstChild;
        if(!textNode) 
        {
            textNode = document.createTextNode('');
            element.appendChild(textNode);
            element.setContent = function(html) { element.firstChild.nodeValue = html; }
        }
    },
    renderTextNode:function(nodeType, text){
        var elem = document.createElement(nodeType);
        elem.appendChild(document.createTextNode(text));
        return elem;
    },
    renderLabeledPrice:function(price, id, label){
        var div = document.createElement("div");
        var labelSpan = document.createElement("span");
        labelSpan.className = id + "Label";
        labelSpan.appendChild(document.createTextNode(label + ":"));
        var valueSpan = document.createElement("span");
        valueSpan.className = id + "Text";
        valueSpan.appendChild(document.createTextNode(glp.formatCurrency(price)));
        var spacer = document.createTextNode("");
        spacer.nodeValue = "\u00a0";
        div.appendChild(labelSpan);
        div.appendChild(spacer);
        div.appendChild(valueSpan);
        return div;
    },
    showIt:function(element) {
        glp.removeClass(element, "Hide");
    },
    hideIt:function(element) {
        glp.insertClass(element, "Hide");
    },
    insertClass:function(element, className)
    {
        if (typeof element.className != "undefined" && element.className.indexOf(className) == -1)
            element.className+=" " + className;
    },
    removeClass:function(element, className)
    {
        if (typeof element.className != "undefined")
            element.className=element.className.replace(new RegExp(" " + className + "\\b"), "");
    },
    removeChildren:function(element) {
        if (typeof element.childNodes != "undefined")
        {
            while(element.childNodes.length > 0)
            {
                element.removeChild(element.childNodes[0]);
            }
        }
    },
    formatPercent:function(num)
    {
        num = num.toString().replace(/\$|\%|\,/g,'');
        num *= Math.pow(10,2);
        num = Math.round(Math.abs(num));
        num /= Math.pow(10,2);
        if(isNaN(num)) 
        { 
            num = "0";
        }
        return num;
    },
    formatCurrency:function (num) 
    {
        num = num.toString().replace(/\$|\%|\,/g,'');
        if(isNaN(num))
        {
            num = "0";
        }
        sign = (num == (num = Math.abs(num)));
        num = Math.floor(num*100+0.50000000001);
        cents = num%100;
        num = Math.floor(num/100).toString();
        if(cents<10)
        {
            cents = "0" + cents;
        }
        for (var i = 0; i < Math.floor((num.length-(1+i))/3); i++)
        {
            num = num.substring(0,num.length-(4*i+3))+','+
            num.substring(num.length-(4*i+3));
        }
        return (((sign)?'':'-') + '$' + num + '.' + cents);
    },
    parseCurrency:function(num)
    {
        num = num.toString().replace(/\$|\%|\,/g,'');
        if(isNaN(num))
        {
            num = "0";
        }
        return Math.abs(num);
    }
}