(function($) {

$.fn.replaceInputs = function(options) {
    var opts = $.extend({
        extraSpans: 0,
        className: null,
        onclick: null
    }, options);
    
    return $($.map(this, function(element) {
        var input = $(element);
        if (input.is(":checkbox,:radio")) {
            var isRadio = input.is(":radio");
            var cp = opts.className || (isRadio ? "Avenla_Radio" : "Avenla_Checkbox");
            
            var el = $("<a href=\"#\"></a>");
            el.addClass(cp);
            
            var setChecked = function setChecked(checked) {
                if (checked && isRadio) {
                    $("input:radio[name=" + input.attr("name") + "]").each(function() {
                        this.checked = false;
                        if (this._el && this._isRadio)
                            this._el.removeClass(cp + "_Checked");
                    });
                }
                input[0].checked = checked;
                el[input[0].checked ? "addClass" : "removeClass"](
                    isRadio ? cp + "_Checked" : cp + "_Checked");
            }
            
            el.click(function() {
                if (isRadio && !input[0].checked)
                    setChecked(true);
                else
                    setChecked(!input[0].checked);
                return false;
            });
            
            input.click(function() {
                if (this.checked || !isRadio)
                    setChecked(this.checked);
            });
            
            input[0]._el = el;
            input[0]._isRadio = isRadio;
            setChecked(input[0].checked);
            input.after(el);
            input.css("display", "none");
            
            return el[0];
        } else if (input.is("input:submit,input:reset,button")) {
            var value = input.attr("ihateie") || input.val();
            var el = $("<a href=\"#\"></a>");
            el.addClass(opts.className || "Avenla_Button");
            el.click(function() {
                if (opts.onclick && !opts.onclick.apply(el[0]))
                    return false;
                
                var valInput = $("<input type=\"hidden\" />");
                valInput.attr("name", input.attr("name") || input.attr("id"));
                valInput.val(value);
                el.after(valInput);
                el.parents("form").eq(0).submit();
                return false;
            });
            
            var innerEl = el;
            for (var i = 0; i < opts.extraSpans; i++) {
                innerEl = innerEl.append($("<span></span>"));
            }
            
            if (input.is("button"))
                innerEl.html(input.html() || input.val());
            else
                innerEl.text(input.val());
            
            input.after(el);
            input.remove();
            el.attr("id", input.attr("id"));
            el.data("value", value);
            
            return el[0];
        } else if (input.is("select")) {
            var ul = $('<ul />').addClass('select');
            
            var submitInput = $('<input type="hidden" />')
            .attr('name', input.attr('name'))
            .attr('id', input.attr('id'));
            
            //var selectedLi = $('<li />').addClass('SelectedValue');
            //ul.append(selectedLi);
            
            var selectedIndex = Math.max(input[0].selectedIndex, 0);
            
            var options = input.find('option');
            options.each(function(i) {
                var option = $(this);
                
                var li = $('<li />').text(option.text()).data("value", option.val()).data("text", option.text().toLowerCase());
                
                var close = function(e) {
                    ul.removeClass('Active');
                    $(document).unbind("click", close).unbind("keypress", handleKey);
                };
                
                var handleKey = function(e) {
                     var c = String.fromCharCode(e.which).toLowerCase();
                     if ('a' <= c && c <= 'z') {
                        var selected = ul.find("li.Selected");
                        if (!selected.length)
                            selected = ul.find("li:first");
                        if (!selected.length)
                            return false;
                        
                        var item = selected.next();
                        while (item && item.length && item[0] != selected[0]) {
                            if (item.data("text").charAt(0) == c) {
                                ul.find("li").removeClass("Selected").removeClass("Hover");
                                item.addClass("Selected").addClass("Hover");
                                submitInput.val(item.data("value"));
                                ul.scrollTop(item.position().top + ul.scrollTop());
                                break;
                            }
                            item = item.next();
                            if (!item.length)
                                item = ul.find("li:first");
                        }
                        
                        return false;
                     }
                };

                ul.append(li);
                if(i == selectedIndex) { 
                    li.addClass('Selected');
                    submitInput.val(li.data("value"));
                    //selectedLi.html(li.html());
                }
                li.bind('click focus', function(e) {
                    if(ul.hasClass('Active')) {
                        ul.find('li').removeClass('Selected');
                        li.addClass('Selected');
                        ul.removeClass('Active');
                        submitInput.val(li.data("value"));
                        //selectedLi.html(li.html());
                    } else {
                        ul.addClass('Active');
                        ul.scrollTop(ul.find("li.Selected").position().top);
                        setTimeout(function() {
                            $(document).bind("click", close);
                            $(document).bind("keypress", handleKey);
                        }, 0);
                    }
                }).bind('mouseover', function() {
                    li.addClass('Hover');
                }).bind('mouseout', function() {
                    ul.find('li').removeClass('Hover');
                });
            });
            input.parent().append(ul);
            input.remove();
            ul.after(submitInput);
            
            return ul[0];
        }
        
        return this;
    }));
};

})(jQuery);