var Events = function (elements) {
    this.elements = (typeof(elements) === 'undefined') ?
        {
            "input": ["highlight", "swapimage"],
            "select": "jump",
            "textarea": ["highlight", "resize"],
            "img": "swapimage",
            "a": ["popup", "confirm"]
        } : elements;
    this.initialize();
};

Events.prototype = {
    focusColor: "#ffffcc",
    initialize: function () {
        for (element in this.elements) {
            if (typeof(this.elements[element]) === "object") {
                for (var i = 0; i < this.elements[element].length; i++) {
                    var eventsName = "_addEvent" + this.elements[element][i].substr(0, 1).toUpperCase() + this.elements[element][i].substr(1).toLowerCase();
                    eval("this." + eventsName + "(document.getElementsByTagName(element));");
                }
            } else {
                var eventsName = "_addEvent" + this.elements[element].substr(0, 1).toUpperCase() + this.elements[element].substr(1).toLowerCase();
                eval("this." + eventsName + "(document.getElementsByTagName(element));");
            }
        }
    },
    _addEventHighlight: function (element) {
        for (var i = 0; i < element.length; i++) {
            element[i].onfocus = this._focus(element[i], this.focusColor);
            element[i].onblur  = this._blur(element[i]);
        }
        return true;
    },
    _focus: function (element, color) {
        return function () {
            element.style.backgroundColor = color;
        };
    },
    _blur: function (element) {
        return function () {
            element.style.backgroundColor = "";
        };
    },
    _addEventResize: function (element) {
        for (var i = 0; i < element.length; i++) {
            this.rows = (element[i].getAttribute("rows") === null) ? 2 : element[i].getAttribute("rows");
            element[i].onkeyup = this._resize(element[i]);
            element[i].onclick = this._resize(element[i]);
        }
        return true;
    },
    _resize: function (element) {
        var rows = this.rows;

        return function () {
            var line = 1;

            for (var i = 0; i < element.value.length; i++) {
                if (element.value.charAt(i) === "\n") {
                    line++;
                }
            }

            line = (line > rows) ? line : rows;
            element.setAttribute('rows', line);
        };
    },
    _addEventSwapimage: function (element) {
        for (var i = 0; i < element.length; i++) {
            if (element[i].getAttribute("src")) {
                if (element[i].getAttribute("src").match("_out")) {
                    new Image().src = element[i].getAttribute("src").replace("_out", "_over");
                    element[i].onmouseout  = this._swap(element[i]);
                    element[i].onmouseover = this._swap(element[i]);
                    if (element[i].getAttribute("type") === "image") {
                        element[i].onclick = "void(this.form.submit()); return false";
                    }
                }
            }
        }
        return true;
    },
    _swap: function (element) {
        return function () {
            (element.getAttribute("src").match("_out")) ?
                element.setAttribute("src", element.getAttribute("src").replace("_out", "_over")) :
                element.setAttribute("src", element.getAttribute("src").replace("_over", "_out"));
        };
    },
    _addEventPopup: function (element) {
        for (var i = 0; i < element.length; i++) {
            if (typeof(element[i].getAttribute('rel')) === 'string') {
                var rel = element[i].getAttribute('rel').split(":");
                (rel[0] === 'events' && rel[1] === 'popup') ? element[i].onclick = this._windowOpen(element[i]) : null;
            }
        }
        return true;
    },
    _windowOpen: function (element) {
        return function () {
            window.open(element.getAttribute('href'));
            return false;
        }
    },
    _addEventConfirm: function (element) {
        for (var i = 0; i < element.length; i++) {
            if (typeof(element[i].getAttribute('rel')) === 'string') {
                var rel = element[i].getAttribute('rel').split(":");
                (rel[0] === 'events' && rel[1] === 'confirm') ? element[i].onclick = this._confirm(rel[2]) : null;
            }
        }
        return true;
    },
    _confirm: function (message) {
        return function () {
            if (!confirm(message)) return false;
        }
    },
    _addEventJump: function (element) {
        for (var i = 0; i < element.length; i++) {
            if (typeof(element[i].getAttribute('rel')) === 'string') {
                var rel = element[i].getAttribute('rel').split(":");
                (rel[0] === 'events' && rel[1] === 'jump') ? element[i].onchange = this._jump(element[i], rel[2]) : null;
            }
        }
        return true;
    },
    _jump: function (element, option) {
        return function () {
            (element.options[element.selectedIndex].value === "") ? null : window.open(element.options[element.selectedIndex].value, "_blank", option);
            return false;
        }
    }
};

