(function($){
    $.fn.jNice = function(options){
        var self = this;
        var safari = $.browser.safari;
        this.each(function(){
            var setButton = function(){
                $(this).replaceWith('<button id="' + this.id + '" name="' + this.name + '" type="' + this.type + '" class="' + this.className + '"><span><span>' + $(this).attr('value') + '</span></span>')
            };
            
            $('input:submit, input:reset', this).each(setButton);
            
            var setText = function(){
                var $input = $(this);
                $input.addClass("jNiceInput").wrap('<div class="jNiceInputWrapper"><div class="jNiceInputInner"><div></div></div></div>');
                var $wrapper = $input.parents('div.jNiceInputWrapper');
                $wrapper.css("width", $(this).width() + 14);
                $input.focus(function(){
                    $wrapper.addClass("jNiceInputWrapper_hover")
                }).blur(function(){
                    $wrapper.removeClass("jNiceInputWrapper_hover")
                })
            };
            
            $('input:text:visible, input:password', this).each(setText);
            
            if (safari) {
                $('.jNiceInputWrapper').each(function(){
                    $(this).addClass('jNiceSafari').find('input').css('width', $(this).width() + 11)
                })
            }
            
            $('textarea', this).each(function(){
                var $textarea = $(this);
                $textarea.addClass("jNiceInput").wrap('<div class="jNiceTextareaWrapper"><div class="jNiceTextareaInner"><div><div></div></div></div></div>');
                var $wrapper = $textarea.parents('div.jNiceTextareaWrapper');
                $wrapper.css("width", $(this).width() + 14);
                $textarea.focus(function(){
                    $wrapper.addClass("jNiceTextareaWrapper_hover")
                }).blur(function(){
                    $wrapper.removeClass("jNiceTextareaWrapper_hover")
                })
            });
            
            $('input:checkbox', this).each(function(){
                $(this).addClass('jNiceHidden').wrap('<span class="jCheckboxWrapper"></span>');
                var $wrapper = $(this).parent();
                $wrapper.prepend('<a href="#" class="jNiceCheckbox"  relname="' + $(this).attr("name") + '"></a>');
                $(this).siblings('a.jNiceCheckbox').click(function(){
                    var $a = $(this);
                    var input = $a.siblings('input')[0];
                    if (input.checked === true) {
                        input.checked = false;
                        $a.removeClass('jNiceChecked')
                    }
                    else {
                        input.checked = true;
                        $a.addClass('jNiceChecked')
                    }
                    return false
                });
                if (this.checked) {
                    $('a.jNiceCheckbox', $wrapper).addClass('jNiceChecked')
                }
            });
            
            $('input:radio', this).each(function(){
                $input = $(this);
                
                $text = $input.parent().text();
                $input.parent().addClass('jNiceHidden').wrap('<div class="jRadioWrapper"></div>');
                var $wrapper = $input.parents('.jRadioWrapper');
                $wrapper.prepend('<a href="#" class="jNiceRadio" rel="' + $(this).attr('id') + '" relname="' + $(this).attr('name') + '">' + $text + '</a>');
                
                $('a.jNiceRadio', $wrapper).click(function(){
                    var $a = $(this);
                    
                    //return false
                    relname = $a.attr("relname");
                    
                    //$("input:radio[name="+relname+"]").removeAttr("checked");
                    $("a[relname=" + relname + "]").removeClass("jNiceChecked");
                    
                    $a.addClass('jNiceChecked');
                    $("input:radio[name=" + relname + "]").attr("checked", "checked");
                    //$a.siblings("input").attr("checked",true);
                    return false;
                });
                
                if (this.checked) {
                    $('a.jNiceRadio', $wrapper).addClass('jNiceChecked')
                }
            });
            
            $('select', this).each(function(index){
                var $select = $(this);
                $(this).addClass('jNiceHidden').wrap('<div class="jNiceSelectWrapper"></div>');
                var $wrapper = $(this).parent().css({
                    zIndex: 100 - index
                });
                $wrapper.prepend('<div><a href="#" class="jNiceSelectOpen ' + $select.attr('name') + '" relname="' + $select.attr('name') + '" ><span></span></a></div><ul relname="' + $select.attr('name') + '"></ul>');
                var $ul = $('ul', $wrapper);
                $('option', this).each(function(i){
                    $ul.append('<li><a href="#" class="jNiceSelectItem" index="' + i + '" relname="' + $select.attr('name') + '">' + this.text + '</a></li>')
                });
                $ul.hide().find('a').click(function(){
                    $('a.selected', $wrapper).removeClass('selected');
                    $(this).addClass('selected');
                    $select[0].selectedIndex = $(this).attr('index');
                    $('span:eq(0)', $wrapper).html($(this).html());
                    $ul.hide();
                    $($select[0]).trigger("change");
                    return false
                });
                $('a:eq(' + this.selectedIndex + ')', $ul).click()
            });
            $('a.jNiceSelectOpen', this).click(function(){
                var $ul = $(this).parent().siblings('ul');
                if ($ul.css('display') == 'none') {
                    hideSelect()
                }
                $ul.slideToggle();
                var offSet = ($('a.selected', $ul).offset().top - $ul.offset().top);
                $ul.animate({
                    scrollTop: offSet
                });
                return false
            })
        });
        
        var checkExternalClick = function(event){
            if ($(event.target).parents('.jNiceSelectWrapper').length === 0) {
                hideSelect()
            }
        };
        $(document).mousedown(checkExternalClick);
        var jReset = function(f){
            var sel;
            $('.jNiceSelectWrapper select', f).each(function(){
                sel = (this.selectedIndex < 0) ? 0 : this.selectedIndex;
                $('ul', $(this).parent()).each(function(){
                    $('a:eq(' + sel + ')', this).click()
                })
            });
            $('a.jNiceCheckbox, a.jNiceRadio', f).removeClass('jNiceChecked');
            $('input:checkbox, input:radio', f).each(function(){
                if (this.checked) {
                    $('a', $(this).parent()).addClass('jNiceChecked')
                }
            })
        };
        this.bind('reset', function(){
            var action = function(){
                jReset(this)
            };
            window.setTimeout(action, 10)
        })
    };
    $(function(){
        $('form.jNice').jNice()
    })
})(jQuery);

renderSelectOption = function(selObject){

    relname = $(selObject).attr('name');
    var $ul = $('ul[relname=' + relname + ']');
    $wrapper = $ul.parent();
    
    $select = $(selObject);
    
    $ul.html('');
    $indexSeleted = 0;
    $('option', selObject).each(function(i){
        if ($(this).attr('selected')) {
            $indexSeleted = i;
        };
        $ul.append('<li><a href="#" class="jNiceSelectItem" index="' + i + '" relname="' + relname + '">' + this.text + '</a></li>');
    });
    $selectedItem = $('a', $ul).eq($indexSeleted);
    $selectedItem.addClass("selected");
    setjNiceSelectOpenText(relname, $selectedItem.text());
    
    
    $('a.jNiceSelectItem[relname=' + relname + ']').click(function(){
        var $ul = $('ul[relname=' + relname + ']');
        $('a', $ul).removeClass('selected');
        $(this).addClass('selected');
        selectedIndex = $(this).attr('index');
        relname = $(this).attr('relname');
        selObject = $('select[name=' + relname + ']')[0];
        selObject.selectedIndex = selectedIndex;
        setjNiceSelectOpenText(relname, selObject.options[selectedIndex].text);
        $(selObject).trigger("change");
        $ul.hide();
        return false;
    });
}

var setjNiceSelectOpenText = function(relname, text){
    $('a.jNiceSelectOpen[relname=' + relname + '] span').text(text);
}

var hideSelect = function(){
    $('.jNiceSelectWrapper ul:visible').hide()
};


