﻿function getById(id) {
    return document.getElementById(id);
}

function navImgSwitch(imgCtrl) {
    var on = imgCtrl.getAttribute("on");
    var off = imgCtrl.getAttribute("off");
    imgCtrl.src = (imgCtrl.src.match(off) ? on : off);
}

function redirect(url) {
    document.location.href = url;
}

function clearSelectList(selObj) {
    while (selObj.options.length > 0) {
        selObj.remove(0);
    }
}

function getOptionIndexByValue(ctrl, value) {
    for (var i = 0; i < ctrl.options.length; i++) {
        if (ctrl.options[i].value == value) return i;
    }
    return 0;
}

function addOpt(selObj, text, value) {
    var optObj = document.createElement("option");
    optObj.text = text;
    optObj.value = value;
    try {
        selObj.add(optObj, null); //breaks IE
    }
    catch (ex) {
        selObj.add(optObj); //IE only
    }
}

function swapImage(imgID, url) {
    getById(imgID).src = url;
}

function fixedIE(tl, n, el) {
    var sc = 'scroll' + tl, d = document, c = 'compatMode', b = d[c] && d[c] == 'CSS1Compat' ? d.documentElement : d.body;
    n = n - 0; if (typeof n != 'number') return 0;
    if (/^(Top|Left)$/.test(tl))
        return b[sc] + n + 'px';
    if (/^(Bottom|Right)$/.test(tl) && typeof el == 'object') {
        tl = tl == 'Right' ? 'Left' : 'Top', sc = 'scroll' + tl;
        var dim = 'client' + (tl == 'Top' ? 'Height' : 'Width');
        return b[sc] + b[dim] - el[dim] - n + 'px';
    }
    return 0;
}

function openModal(divID) {
    return openModal_(divID, null);
}

function openModal_(divId, align) {
    var element = getById(divId);
    var overlay = getById("main_Overlay");
    if (align == null || align == "center") align = "center"
    else align = "top";

    if (element && overlay) {
  		//dojo.style(dojo.documentElement, { "height": "100%", "overflow": "hidden" });
    	var vp = dijit.getViewport();
    	var oh = dojo.style(dojo.body(), "height");
    	//IE8 was still in beta when Dojo 1.3 was finalized, so IE8 support was not quite ready. This get around one such issue until CarSoup.Web
    	//is upgraded to Dojo 1.4
    	if (dojo.isIE==8) oh = document.documentElement.scrollHeight;
    	if (vp.h > oh) oh = vp.h;
    	dojo.style("main_Overlay", { "height": oh + "px", "opacity": 0});
    	dojo.anim("main_Overlay", { "opacity": .5 }, 500);
        overlay.style.display = "block";
        element.style.display = "block";
        if (align == "center") center(element, vp);
        else topalign(element, vp);
        if (dojo.attr(divId, "onShow"))
        	eval(dojo.attr(divId, "onShow"));
       }
       return false;
}

function closeModal(divId) {
    var element = getById(divId);
    var overlay = getById("main_Overlay");
    var anim = null;
    if (element && overlay) {
    	anim = dojo.anim("main_Overlay", { "opacity": .0 }, 500, null, function(){dojo.style("main_Overlay","display", "none")});
    	element.style.display = "none";
    	//dojo.attr(dojo.body(), "");
        //overlay.style.display = "none";
    }
    return anim;	//this is to allow "hooks" into the animation. Do Not Touch if you don't understand this;
}

function center(object, vp) {
	var top = (vp.h / 2 + vp.t) - dojo.style(object, "height") / 2;
	object.style.left = (vp.w / 2 + vp.l) - dojo.style(object, "width") / 2 + "px"; //"-" + parseInt(object.offsetWidth / 2) + "px";
	object.style.top = top < 0 ? "0px" : top + "px"; // not being able to close might be anoying //"-" + parseInt(object.offsetHeight / 2) + "px";
    
}

function topalign(object, vp) {
    object.style.left = "20px";
    object.style.top = "20px";
}

function getPageSize(returnVal) {
    var xScroll, yScroll;
    if (window.innerHeight && window.scrollMaxY) {
        xScroll = window.innerWidth + window.scrollMaxX;
        yScroll = window.innerHeight + window.scrollMaxY;
    } else if (document.body.scrollHeight > document.body.offsetHeight) { // all but Explorer Mac
        xScroll = document.body.scrollWidth;
        yScroll = document.body.scrollHeight;
    } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
        xScroll = document.body.offsetWidth;
        yScroll = document.body.offsetHeight;
    }

    var windowWidth, windowHeight;

    if (self.innerHeight) {	// all except Explorer
        if (document.documentElement.clientWidth) {
            windowWidth = document.documentElement.clientWidth;
        } else {
            windowWidth = self.innerWidth;
        }
        windowHeight = self.innerHeight;
    } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
        windowWidth = document.documentElement.clientWidth;
        windowHeight = document.documentElement.clientHeight;
    } else if (document.body) { // other Explorers
        windowWidth = document.body.clientWidth;
        windowHeight = document.body.clientHeight;
    }

    // for small pages with total height less then height of the viewport
    if (yScroll < windowHeight) {
        pageHeight = windowHeight;
    } else {
        pageHeight = yScroll;
    }

    // for small pages with total width less then width of the viewport
    if (xScroll < windowWidth) {
        pageWidth = xScroll;
    } else {
        pageWidth = windowWidth;
    }

    if (returnVal == "width") {
        return pageWidth;
    }
    else {
        return pageHeight;
    }
}


function isNumeric(number) {
    var rtn = false;
    number = replaceAll(number, ",", "");
    number = replaceAll(number, "$", "");
    if (number.indexOf(".") > -1) {
        rtn = (number == parseFloat(number));
    } else {
        rtn = (number == parseInt(number));
    }
    return rtn;
}

function fixMoney(money) {
    var rtn = 0;
    money = money.toString();
    money = replaceAll(money, ",", "");
    money = replaceAll(money, "$", "");
    money = replaceAll(money, " ", "");
    if (money == "" || money == null) money = 0;
    if (isNumeric(money)) {
        rtn = money;
    }
    return rtn;
}

function replaceAll(str, from, to) {
    str = str.toString();
    var idx = str.indexOf(from);
    while (idx > -1) {
        str = str.replace(from, to);
        idx = str.indexOf(from);
    }
    return str;
}

function currency(anynum) {
    //-- Returns passed number as string in $xxx,xxx.xx format.
    anynum = eval(anynum);
    workNum = Math.abs((Math.round(anynum * 100) / 100));
    workStr = "" + workNum;
    if (workStr.indexOf(".") == -1) {
        workStr += ".00";
    }
    dStr = workStr.substr(0, workStr.indexOf("."));
    dNum = dStr - 0;
    pStr = workStr.substr(workStr.indexOf("."));
    while (pStr.length < 3) {
        pStr += "0";
    }

    //--- Adds comma in ten thousands place.
    if (dNum >= 10000) {
        dLen = dStr.length;
        dStr = parseInt("" + (dNum / 1000)) + "," + dStr.substring(dLen - 3, dLen);
    }
    retval = dStr + pStr;

    //-- Put numbers in parentheses if negative.
    if (anynum < 0) {
        retval = "(" + retval + ")";
    }

    return "$" + retval;
}

function calculateMonthlyPayment(intPrinciple, intEquity, decRate, intTerm) {
    var payment = 0;
    try {
        //if (intPrinciple == null || intPrinciple == "") alert("test");// intPrinciple = 0;
        if (intEquity == null || intEquity == "") intEquity = "0"; // intPrinciple = 0;
        intPrinciple = fixMoney(intPrinciple);
        intEquity = fixMoney(intEquity);
        intTerm = parseInt(intTerm);

        var intRate = (fixMoney(decRate) / 100) / 12;

        intPrinciple -= intEquity;
        if (decRate == 0) {
            payment = intPrinciple / intTerm;
        } else {
            payment = intPrinciple * intRate / (1 - Math.pow(1 / (1 + intRate), intTerm));
        }
        payment = Math.round(100 * payment) / 100;
    } catch (e) {
        payment = 0;
    }
    var cur = currency(payment);
    if (cur.indexOf("(") > -1) cur = "$0.00";
    return cur;
}

function CalculatePurchasePrice(intMonthlyPayment, intEquity, decRate, intTerm) {
    var purchaseprice = 0;
    try {
        if (intEquity == null || intEquity == "") intEquity = 0; // intPrinciple = 0;
        intMonthlyPayment = fixMoney(intMonthlyPayment);
        intEquity = fixMoney(intEquity);
        intTerm = fixMoney(intTerm);
        if (decRate == 0) { decRate = .1; }
        var intRate = (fixMoney(decRate) / 100) / 12;

        //alert(intEquity + "\n" + intMonthlyPayment + "\n" + intTerm + "\n" + decRate);

        purchaseprice = ((intMonthlyPayment * (1 - (Math.pow(1 / (1 + intRate), intTerm)))) / intRate) + parseInt(intEquity);

    }
    catch (e) {
        purchaseprice = 0;
    }

    var cur = currency(purchaseprice);
    if (cur.indexOf("(") > -1) cur = "$0.00";
    return cur;
}

function calcBudget(monthlyID, downPaymentID, rateID, termID, priceID) {
    var rObj = getById(rateID);
    var tObj = getById(termID);
    var m = getById(monthlyID).value;
    var d = getById(downPaymentID).value;
    var r = rObj[rObj.selectedIndex].value;
    var t = tObj[tObj.selectedIndex].value;
    getById(priceID).value = CalculatePurchasePrice(m, d, r, t);
}

function calcPayment(priceID, downPaymentID, rateID, termID, paymentID) {
    var p = getById(priceID).value;
    var e = getById(downPaymentID).value;
    var rateCtrl = getById(rateID);
    var r = rateCtrl.options[rateCtrl.selectedIndex].value;
    var termCtrl = getById(termID);
    var t = termCtrl.options[termCtrl.selectedIndex].value;
    getById(paymentID).value = calculateMonthlyPayment(p, e, r, t);
}


function populateUsedYears(yearCtrl, selectedYear) {
    if (yearCtrl.length > 0) clearSelectList(yearCtrl);
    dojo.xhrGet({
        "url": "/data.aspx?fn=UsedInventoryYears",
        "handleAs": "json",
        "load": function(response) {
            if (yearCtrl.id == "ddlYearFrom") { addOpt(yearCtrl, "Year From", 0); }
            else { addOpt(yearCtrl, "Year To", 0); }
            for (var i = 0; i < response.Records.length; i++) {
                addOpt(yearCtrl, response.Records[i].ModelYear, response.Records[i].ModelYear);
            }
            if (selectedYear > 0) yearCtrl.selectedIndex = getOptionIndexByValue(yearCtrl, selectedYear);
            else yearCtrl.selectedIndex = 0;
        },
        "error": function(err) { console.error("Error getting years: " + err); }
    });
}

function populateUsedMakes(makeCtrl, selectedMakeID) {
    if (makeCtrl.length > 0) clearSelectList(makeCtrl);
    dojo.xhrGet({
        "url": "/data.aspx?fn=UsedInventoryMakes",
        "handleAs": "json",
        "load": function(response) {
            addOpt(makeCtrl, "Make", 0);
            for (var i = 0; i < response.Records.length; i++) {
                addOpt(makeCtrl, response.Records[i].Make, response.Records[i].MakeID);
            }
            if (selectedMakeID > 0) makeCtrl.selectedIndex = getOptionIndexByValue(makeCtrl, selectedMakeID);
            else makeCtrl.selectedIndex = 0;
        },
        "error": function(err) { console.error("Error getting makes: " + err); }
    });
}

function populateUsedModels(modelCtrl, makeID, selectedModelID) {
    if (modelCtrl.length > 0) clearSelectList(modelCtrl);
    dojo.xhrGet({
        "url": "/data.aspx?fn=UsedInventoryModels&makeID=" + makeID,
        "handleAs": "json",
        "load": function(response) {
            addOpt(modelCtrl, "Model", 0);
            for (var i = 0; i < response.Records.length; i++) {
                addOpt(modelCtrl, response.Records[i].ModelName, response.Records[i].ModelID);
            }
            
            if (selectedModelID > 0) modelCtrl.selectedIndex = getOptionIndexByValue(modelCtrl, selectedModelID);
            else modelCtrl.selectedIndex = 0;
            
            modelCtrl.disabled = false;
        },
        "error": function(err) { console.error("Error getting models for makeID " + makeID + ": " + err); }
    });
}

function populateUsedBodyStyleTypes(bodyStyleTypeCtrl, selectedBstid) {
    if (bodyStyleTypeCtrl.length > 0) clearSelectList(bodyStyleTypeCtrl);
    dojo.xhrGet({
        "url": "/data.aspx?fn=UsedInventoryBodyStyleTypes",
        "handleAs": "json",
        "load": function(response) {
            addOpt(bodyStyleTypeCtrl, "Body Style", 0);
            for (var i = 0; i < response.Records.length; i++) {
                addOpt(bodyStyleTypeCtrl, response.Records[i].BodyStyleType, response.Records[i].BodyStyleTypeID);
            }
            if (selectedBstid > 0) bodyStyleTypeCtrl.selectedIndex = getOptionIndexByValue(bodyStyleTypeCtrl, selectedBstid);
            else bodyStyleTypeCtrl.selectedIndex = 0;
        },
        "error": function(err) { console.error("Error getting body style types: " + err); }
    });
}


