
function Odometer (parentDiv, opts) {
    if (!parentDiv) throw "ERROR: Odometer object must be past a document element.";
	
    this.digits       = 6;
    this.tenths       = 0;
    this.digitHeight  = 20;
    this.digitPadding = 0;
    this.digitWidth   = 20;
    this.bustedness   = 2;
    this.fontStyle    = "font-family: Helvetica, sans-serif; font-weight: 500;";
    this.value        = -1;

    for (var key in opts) { this[key] = opts[key]; }

    var style = {
        digits:        "position:absolute; height:"+this.digitHeight+"px; width:"+(this.digitWidth-(2*this.digitPadding))+"px; "+
                       "padding:"+this.digitPadding+"px; font-size:"+(this.digitHeight-(2*this.digitPadding))+"px; "+
                       "background:#616365; color:#F3C852; text-align:center; "+ this.fontStyle + " line-height: normal;",
        columns:       "position:relative; float:left; overflow:hidden;"+
                       "height:"+this.digitHeight+"px; width:"+this.digitWidth+"px;" + "line-height: normal;",
        highlight:     "position:absolute; background:white; opacity:0.05; filter:alpha(opacity=15); width:100%; left:0px;",
        lowlight:      "position:absolute; background:black; opacity:0.05; filter:alpha(opacity=15); width:100%; left:0px;",
        sidehighlight: "position:absolute; background:white; opacity:0.15; filter:alpha(opacity=25); height:100%; top:0px;",
        sidelowlight:  "position:absolute; background:black; opacity:0.15; filter:alpha(opacity=25); height:100%; top:0px;"
    };

    var highlights = [
        "top:20%;   height:32%;" + style.highlight,
        "top:27.5%; height:16%;" + style.highlight,
        "top:32.5%; height:6%;"  + style.highlight,
        "right:0%;  width:6%;"   + style.sidelowlight,
        "left:0%;   width:4%;"   + style.sidehighlight,
        "top:0%;    height:14%;" + style.lowlight,
        "bottom:0%; height:25%;" + style.lowlight,
        "bottom:0%; height:8%;"  + style.lowlight
    ];

    this.setDigitValue = function (digit, val, frac) {
        var di = digitInfo[digit];
        var px = Math.floor(this.digitHeight * frac);
        px = px + di.offset;
        if (val != di.last_val || frac != 0) {
			var tmp   = di.digitA;
			di.digitA = di.digitB;
			di.digitB = tmp;
			di.digitA.innerHTML = val;
			if (frac != 0) {
				di.digitB.innerHTML = (1 + val) % 10;
			} else {
				di.digitB.innerHTML = val;
			}
			di.last_val = val;
        }
		if (px != di.last_px) {
			di.digitA.style.top = (0 - px) + "px";
			di.digitB.style.top = (0 - px  + this.digitHeight) + "px";
			di.last_px = px;
		}
    };


    this.set = function (inVal) {
        if (inVal < 0) throw "ERROR: Odometer value cannot be negative.";
        this.value = inVal;
        if (this.tenths) {
        	inVal = inVal * 10;
       	}
        var numb = Math.floor(inVal);
        var frac = inVal - numb;
        numb = String(numb);
        for (var i = 0; i < this.digits; i++) {
        	var digitOffset = this.length - i - 1;
            var num = 0;
            if (i < numb.length) {
            	num = Number(numb.substr(numb.length - i - 1, 1));
            }
            this.setDigitValue(this.digits - i -1, num, frac);
            if (num != 9) frac = 0;
        }
    };

    this.get = function () {
        return(this.value);
    };


    var odometerDiv = document.createElement("div")
    odometerDiv.setAttribute("id","odometer");
    odometerDiv.style.cssText="text-align: left";
    parentDiv.appendChild(odometerDiv);

    var digitInfo = new Array();
    for (var i=0; i < this.digits; i++) {
        var digitDivA = document.createElement("div");
        digitDivA.setAttribute("id","odometer_digit_"+i+"a");
        digitDivA.style.cssText=style.digits;

        var digitDivB = document.createElement("div");
        digitDivB.setAttribute("id","odometer_digit_"+i+"b");
        digitDivB.style.cssText = style.digits;

        var digitColDiv = document.createElement("div");
        digitColDiv.style.cssText = style.columns;

        digitColDiv.appendChild(digitDivB);
        digitColDiv.appendChild(digitDivA);

        for (var j in highlights) {
            var hdiv = document.createElement("div");
            hdiv.innerHTML="<p></p>"; // For Dumb IE
            hdiv.style.cssText = highlights[j];
            digitColDiv.appendChild(hdiv);
        }
        odometerDiv.appendChild(digitColDiv);
        var offset = Math.floor(this.bustedness);
        digitInfo.push({digitA:digitDivA, digitB:digitDivB, last_val:-1, last_px: -1, offset:offset});
    };


    if (this.tenths) {
        digitInfo[this.digits - 1].digitA.style.background = "#cccccc";
        digitInfo[this.digits - 1].digitB.style.background = "#cccccc";
        digitInfo[this.digits - 1].digitA.style.color = "#000000";
        digitInfo[this.digits - 1].digitB.style.color = "#000000";
    }

    if (this.value >= 0) this.set(this.value);
}

