function Button() {
}

Button.prototype = {
    DISABLED_IMAGES_PATH : "/images/disabled/",
    ENABLED_IMAGES_PATH  : "/images/enabled/",
    IMAGE_PATH           : "..",

    /** Draws of Button object.
    *
    *   @params id - button HTML object ID.
    *   @params title - tooltip text.
    *   @params image - image file path relative from ...IMAGES_PATH directories.
    *   @params text - text appended to image from right side
    *   @params breakImage - set <BR> between image and text.
    *   @params clickCommand - callback expression witch will be executed by click on Button.
    *   @params disabled - disable the Button.
    *   @params tabindex - ordered number in control sequence 
    *   @params active - button is active (selected) 
    *   @params fullWidth - button fits into 100% width
    *   @params classPrefix - button class prefix
    *
    *   @returns new Button object
    */
    draw : 
        function (id, title, image, text, breakImage, clickCommand, disabled, tabindex, active, fullWidth, classPrefix) {
            if (!image && !text) return;
            classPrefix = classPrefix ? classPrefix : "tb";
            var className = classPrefix + (disabled ? 'ButtonDisabled' : ('Button' + (active ? "Active" : "")));
            var classNameBG = classPrefix + (disabled ? 'ButtonBGDisabled' : ('ButtonBG' + (active ? "Active" : "")));
            var tabindex = (tabindex!=null) ? (' tabindex="' + tabindex + '"') : '';
            var html = '<table ' + (title ? 'title="' + title + '" ' : '') + 'class="' + classNameBG + '" cellpadding="0" cellspacing="0"' + (fullWidth ? ' width="100%"' : '') + '>' +
                       '<tbody><tr class="' + classPrefix + '"><td ' + tabindex + ' nowrap><div style="overflow:visible" id="' + id + '" class="' + className + '" ' +
                       'onkeypress="return Button.prototype.push(event, this)" '+
                       'onmouseover="return Button.prototype.highlight(event, this)" '+
                       'onmouseout="return Button.prototype.fade(event, this)" '+
                       'onmousedown="return Button.prototype.press(event, this)" '+
                       'onmouseup="return Button.prototype.fade(event, this)" '+
                       'oncontextmenu="return false" '+
                       'onclick="Button.prototype.click(event, this, &quot;' + clickCommand + '&quot;)"'+
                       '><nobr>' + ((image!=null) ? ('<img align="absmiddle" src="' + this.IMAGE_PATH +
                       ((disabled) ? this.DISABLED_IMAGES_PATH : this.ENABLED_IMAGES_PATH) + image +'">') : "") +
                       ((text!=null) ? (((image!=null) ? ((breakImage) ? '<br>' : '&nbsp;') : "") + 
                       ((image!=null && !breakImage) ? '&nbsp;' : "") + '<span>' + text + '</span>' + ((image!=null && !breakImage) ? '&nbsp;' : "")) : '') + 
                       '</nobr></div></td></tr></tbody>' +
                       '</table>';
            document.write(html);
            var object = this.getLastDrawn();
           
            if (disabled) this.disable(object);
            return object;
        },

    active :
        function (object) {
            return object.className.indexOf("Active")>=0;
        },

    disabled :
        function (object) {
            return object.className.indexOf("ButtonDisabled")>=0;
        },

    getImageElement :
        function (object) {
            return object.getElementsByTagName("IMG") !=null ? object.getElementsByTagName("IMG")[0] : null;
        },

    getTextElement :
        function (object) {
            return object.getElementsByTagName("SPAN") !=null ? object.getElementsByTagName("SPAN")[0] : null;
        },

    setImage :
        function (object, path) {
            var imageRegExp = new RegExp("((?:" + this.ENABLED_IMAGES_PATH + ")|(?:" + this.DISABLED_IMAGES_PATH + "))", "gi");
            var image = this.getImageElement(object);
            if (image)
                image.src = image.src.replace(imageRegExp, path);
        },

    disable :
        function (object) {
            this.setEnable(object, false);
        },

    enable :
        function (object) {
            this.setEnable(object, true);
        },

    setEnable :
        function (object, state) {
            var classPrefix = this.getClassPrefix(object);
            object.className = classPrefix + (state ? "Button" : "ButtonDisabled");
            this.getBGObject(object).className = classPrefix + (state ? "ButtonBG" : "ButtonBGDisabled");
            this.setImage(object, state ? this.ENABLED_IMAGES_PATH : this.DISABLED_IMAGES_PATH);
        },

    setActive :
        function (object, state) {
            if (state && !this.active(object) && !this.disabled(object)) {
                object.className = object.className + "Active";
                object = this.getBGObject(object);
                object.className = object.className + "Active";
            } else
            if (!state && this.active(object)) {
                object.className = object.className.substring(0, object.className.indexOf("Active"));
                object = this.getBGObject(object);
                object.className = object.className.substring(0, object.className.indexOf("Active"));
            }
        },
    
    highlight :
        function (event, object) {
            event = this.getEvent(event);
            var classPrefix = this.getClassPrefix(object);
            object.className =  classPrefix + (this.disabled(object) ? "ButtonDisabled" : ("ButtonRised" + (this.active(object) ? "Active" : "")));
            this.getBGObject(object).className = classPrefix + (this.disabled(object) ? "ButtonBGDisabled" : ("ButtonBGRised" + (this.active(object) ? "Active" : "")));
            event.returnValue = false;
            return false;
        },

    fade :
        function (event, object) {
            event = this.getEvent(event);
            var classPrefix = this.getClassPrefix(object);
            object.className =  classPrefix + (this.disabled(object) ? "ButtonDisabled" : ("Button" + (this.active(object) ? "Active" : "")));
            this.getBGObject(object).className = classPrefix + (this.disabled(object) ? "ButtonBGDisabled" : ("ButtonBG" + (this.active(object) ? "Active" : "")));
            event.returnValue = false;
            return false;
        },

    push:
        function (event, object) {
            event = this.getEvent(event);
            var key = event.keyCode ? event.keyCode : event.which;
            if (key==32 || key==13) {
                this.clearEvent(event);
                this.press(event, object);
                object.onclick(event);
                this.fade(event, object);
                return false;
            }
        },

    clearEvent:
        function (event) {
            event = this.getEvent(event);
            event.returnValue = false;
            if (event.preventDefault)
                event.preventDefault();
            if (event.stopPropagation)
                event.stopPropagation();
            return false;
        },

    press:
        function (event, object) {
            event = this.getEvent(event);
            var classPrefix = this.getClassPrefix(object);
            object.className =  classPrefix + (this.disabled(object) ? "ButtonDisabled" : ("ButtonPressed" + (this.active(object) ? "Active" : "")));
            this.getBGObject(object).className = classPrefix + (this.disabled(object) ? "ButtonBGDisabled" : ("ButtonBGPressed" + (this.active(object) ? "Active" : "")));
            event.returnValue = false;
            return false;
        },

    click :
        function (event, object, command) {
           if (!this.disabled(object) && !this.active(object))
               eval(command);
        },

    getBGObject :
        function (object) {
           while (object.tagName!="TABLE" && object!=null)
                  object = object.parentNode;
           return object;
        },

    getClassPrefix :
        function (object) {
           while (object.tagName!="TR" && object!=null)
                  object = object.parentNode;
           return object.className;
        },

    getLastDrawn :
        function () {
            var button = document.getElementsByTagName("TABLE");
            if (button && button[0]!=null && button.tagName==null)
                button = button[button.length-1];
            button = button.getElementsByTagName("TD")[0];
            button = button.getElementsByTagName("DIV")[0];
            return button;
        },

    getEvent :
        function (event) {
            return typeof(event) == "undefined" ? window.event : event;
        }
}
