/*

Uniform v1.0
Copyright © 2009 Josh Pyles / Pixelmatrix Design LLC
http://pixelmatrixdesign.com

Requires jQuery 1.3 or newer

Much thanks to Thomas Reynolds and Buck Wilson for their help and advice on this

License:
MIT License - http://www.opensource.org/licenses/mit-license.php

Usage:

$(function(){
            
            $("select, :radio, :checkbox").uniform();
            
});

You can customize the classes that Uniform uses:

$("select, :radio, :checkbox").uniform({
            selectClass: 'mySelectClass', 
            radioClass: 'myRadioClass', 
            checkboxClass: 'myCheckboxClass', 
            checkedClass: 'myCheckedClass', 
            focusClass: 'myFocusClass'
});

Enjoy!

*/

(function($) {
  $.uniform = {
    options: {
      selectClass:   'selector',
                                    radioClass: 'radio',
                                    checkboxClass: 'checker',
                                    checkedClass: 'checked',
      focusClass: 'focus'
    }
  };

            if($.browser.msie && $.browser.version < 7){
                        $.selectOpacity = false;
            }else{
                        $.selectOpacity = true;
            }

  $.fn.uniform = function(options) {
    
                        options = $.extend($.uniform.options, options);
            
                        function doSelect(elem){
                                    
                                    var divTag = $('<div />'),
                                                spanTag = $('<span />');
                        
                                    divTag.addClass(options.selectClass);
                                    
                                    spanTag.html(elem.children(":selected").text());
                                    
                                    elem.css('opacity', 0);
                                    elem.wrap(divTag);
                                    elem.before(spanTag);
                                    
                                    //redefine variables
                                    
                                    divTag = elem.parent("div");
                                    spanTag = elem.siblings("span");
                                    
                                    elem.change(function() {
            spanTag.text(elem.children(":selected").text());
            })
            .focus(function() {
            divTag.addClass(options.focusClass);
            })
            .blur(function() {
            divTag.removeClass(options.focusClass);
            });
                        }
                        
                        function doCheckbox(elem){
                                    
                                    var divTag = $('<div />'),
                                                spanTag = $('<span />');
                                    
                                    divTag.addClass(options.checkboxClass);
                                    
                                    //wrap with the proper elements
                                    $(elem).wrap(divTag);
                                    $(elem).wrap(spanTag);
                                    
                                    //redefine variables
                                    
                                    spanTag = elem.parent();
                                    divTag = spanTag.parent();

                                    //hide normal input and add focus classes
                                    $(elem)
                                    .css("opacity", 0)
                                    .focus(function(){
                                                
                                                divTag.addClass(options.focusClass);
                                    })
                                    .blur(function(){
                                                
                                                divTag.removeClass(options.focusClass);
                                    })
                                    .click(function(){
                                                
                                                if(!$(elem).attr("checked")){    
                                                            //box was just unchecked, uncheck span
                                                            spanTag.removeClass(options.checkedClass);          
                                                }else{
                                                            //box was just checked, check span
                                                            spanTag.addClass(options.checkedClass);
                                                }
                                    });

                                    //handle defaults
                                    if($(elem).attr("checked")){
                                                //box is checked by default, check our box
                                                spanTag.addClass(options.checkedClass);    
                                    }
                        }
                        
                        function doRadio(elem){
                                    
                                    var divTag = $('<div />'),
                                                spanTag = $('<span />');
                                    
                                    divTag.addClass(options.radioClass);
                                    
                                    //wrap with the proper elements
                                    $(elem).wrap(divTag);
                                    $(elem).wrap(spanTag);

                                    //redefine variables
                                    
                                    spanTag = elem.parent();
                                    divTag = spanTag.parent();

                                    //hide normal input and add focus classes
                                    $(elem)
                                    .css("opacity", 0)
                                    .focus(function(){
                                                divTag.addClass(options.focusClass);
                                    })
                                    .blur(function(){
                                                divTag.removeClass(options.focusClass);
                                    })
                                    .click(function(){
                                                if(!$(elem).attr("checked")){
                                                            //box was just unchecked, uncheck span
                                                            spanTag.removeClass(options.checkedClass);          
                                                }else{
                                                            //box was just checked, check span
                                                            $("."+options.radioClass+" span."+options.checkedClass).removeClass(options.checkedClass);
                                                            spanTag.addClass(options.checkedClass);
                                                }
                                    });

                                    //handle defaults
                                    if($(elem).attr("checked")){
                                                //box is checked by default, check span
                                                spanTag.addClass(options.checkedClass);    
                                    }
                        }
                        
    return this.each(function() {
                                    if($.selectOpacity){
                                                var elem = $(this);

                                                if(elem.is("select")){
                                                            //element is a select
                                                            doSelect(elem);

                                                }else if(elem.is(":checkbox")){
                                                            //element is a checkbox
                                                            doCheckbox(elem);

                                                }else if(elem.is(":radio")){
                                                            //element is a radio
                                                            doRadio(elem);
                                                }
                                    }
    });
  };
})(jQuery);
