/*

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);
            divTag.css("width", elem.css("width"));
            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);
