var oPxBar = (function() {
    var sPxBarId = null;
    var oPxBar = null;
    var sPxBarWidthId = null;
    var fnReleaseCallback = null;

    var bInitOk = false;
    var bEnabled = false;

    var bIsTracking = false;
    var iStartX = 0;
    var iOrigWidth = 0;
    var iMaxWidth = 0;

        function init(sBarId, sBarWidthId, iMaxBarWidth, fnCallback) {
        if (/\S/.test(sBarId) && /\S/.test(sBarWidthId)) {
            iMaxWidth = iMaxBarWidth;
            sPxBarId = sBarId;
            oPxBar = document.getElementById(sPxBarId);

            sPxBarWidthId = sBarWidthId;
            if (fnCallback) {
                fnReleaseCallback = fnCallback;
                bInitOk = true;
            } else {
                alert('Fatal Error(oPxBar): No JavaScript callback function specified.');
            }
        } else {
            alert('Fatal Error(oPxBar): The identifiers for the pixel bar and width display must be non-blank.');
        }
    }

        function enable() {
        if (!bInitOk) {
            alert('Fatal Error(oPxBar): The pixel bar has not been properly initialized.');
            return;
        }
        if (document.captureEvents) {
                        document.captureEvents(Event.MOUSEDOWN |
                                   Event.MOUSEMOVE |
                                   Event.MOUSEUP);
        }

        oPxBar.onmousedown = engageMouse;
        oPxBar.onmousemove = trackMouse;
        oPxBar.onmouseup = releaseMouse;
        bEnabled = true;
        return;
    }

        function disable() {
        if (bEnabled) {
            bEnabled = false;
        }
    }

    function suspend() {
        if (bEnabled) {
        }
    }

    function resume() {
        if (bEnabled) {
        }
    }

        function engageMouse(oEvt) {
        oEvt = (oEvt
                ? oEvt
                : event);
        if (getEvtTargetId(oEvt) == sPxBarId) {
            var oStartMousePos = getMousePagePos(oEvt);
            iStartX = oStartMousePos.iPageX;
            var oPxBar = document.getElementById(sPxBarId);
            iOrigWidth =
                parseInt(oPxBar.currentStyle
                         ? oPxBar.currentStyle['width']
                         : (window.getComputedStyle
                            ? document.defaultView.getComputedStyle(oPxBar, null)
                              .getPropertyValue('width')
                            : '0'));

            bIsTracking = true;
            return false;
        }
    }

        function trackMouse(oEvt) {
        oEvt = (oEvt
                ? oEvt
                : event);
        if (bIsTracking) {
            var oMousePos = getMousePagePos(oEvt);
            adjustPxBarWidth((oMousePos.iPageX - iStartX));
            oEvt.cancelBubble = true;
        }
        return false;
    }

        function releaseMouse(oEvt) {
        oEvt = (oEvt
                ? oEvt
                : event);
        if (bIsTracking) {
                        bIsTracking = false;
            if (fnReleaseCallback) {
                fnReleaseCallback(getPxBarWidthVal());
            }
        }
    }

        function adjustPxBarWidth(iDelta) {
        var iNewWidth = iOrigWidth + iDelta;
        if ((iNewWidth > 0) && (iNewWidth <= iMaxWidth)) {
            oPxBar.style.width = iNewWidth + 'px';
            setPxBarWidthVal(iNewWidth);
        }
    }

        function setPxBarWidthVal(iVal) {
        document.getElementById(sPxBarWidthId).firstChild.nodeValue = iVal;
    }

        function getPxBarWidthVal() {
        return document.getElementById(sPxBarWidthId).firstChild.nodeValue;
    }

        function getEvtTargetId(oEvt) {
        var oTarget = ((oEvt.target)
                       ? oEvt.target
                       : oEvt.srcElement);
        return oTarget.id;
    }

        function getMousePagePos(oEvt) {
        oEvt = (oEvt
                ? oEvt
                : event);

        var oPos = {
            iPageX: 0,
            iPageY: 0
        };

        if (typeof(oEvt.clientX) != "undefined") {
                        oPos.iPageX = oEvt.clientX;
            oPos.iPageY = oEvt.clientY;
        } else if (typeof(oEvt.pageX) != "undefined") {
                        oPos.iPageX = oEvt.pageX;
            oPos.iPageY = oEvt.pageY;
        } else if (typeof(oEvt.offsetX) != "undefined") {
                        oPos.iPageX = oEvt.offsetX;
            oPos.iPageY = oEvt.offsetY;
        }
                return oPos;
    }

        return {
        'init': init,
        'enable': enable,
        'disable': disable,
        'suspend': suspend,
        'resume': resume,
        'getPxBarWidthVal': getPxBarWidthVal
    }
})();
