/*
Uniform v1.1 Beta
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
Also, thank you to David Kaneda and Eugene Bond for their contributions to the plugin

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',
			disabledClass: 'disabled',
			activeClass:   'active',
			hoverClass:    'hover',
			useID:         true,
			idPrefix:      'uniform'
		}
	};
	
	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);
			
			if (options.useID) {
				divTag.attr('id', options.idPrefix + '-' + elem.attr('id'));
			}
			
			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);
			})
			.mousedown(function () {
				divTag.addClass(options.activeClass);
			})
			.mouseup(function () {
				divTag.removeClass(options.activeClass);
			})
			.hover(function () {
				divTag.addClass(options.hoverClass);
			}, function () {
				divTag.removeClass(options.hoverClass);
			});
			
			// handle disabled state
			if ($(elem).attr('disabled')) {
				// box is checked by default, check our box
				divTag.addClass(options.disabledClass);	
			}
		}
		
		function doCheckbox (elem){
			
			var divTag  = $('<div />'),
			    spanTag = $('<span />');
			
			divTag.addClass(options.checkboxClass);
			
			// assign the id of the element
			if (options.useID) {
				divTag.attr('id', options.idPrefix + '-' + elem.attr('id'));
			}
			
			// 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);
				}
			})
			.mousedown(function () {
				divTag.addClass(options.activeClass);
			})
			.mouseup(function () {
				divTag.removeClass(options.activeClass);
			})
			.hover(function () {
				divTag.addClass(options.hoverClass);
			}, function () {
				divTag.removeClass(options.hoverClass);
			});
			
			// handle defaults
			if ($(elem).attr('checked')) {
				// box is checked by default, check our box
				spanTag.addClass(options.checkedClass);	
			}
			
			// handle disabled state
			if ($(elem).attr('disabled')) {
				// box is checked by default, check our box
				divTag.addClass(options.disabledClass);	
			}
		}
		
		function doRadio (elem){
			var divTag  = $('<div />'),
			    spanTag = $('<span />');
			
			divTag.addClass(options.radioClass);
			
			if (options.useID) {
				divTag.attr('id', options.idPrefix + '-' + elem.attr('id'));
			}
			
			// 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 + ":has([name='" + $(elem).attr('name') + "'])").removeClass(options.checkedClass);
					spanTag.addClass(options.checkedClass);
				}
			})
			.mousedown(function () {
				divTag.addClass(options.activeClass);
			})
			.mouseup(function () {
				divTag.removeClass(options.activeClass);
			})
			.hover(function () {
				divTag.addClass(options.hoverClass);
			}, function () {
				divTag.removeClass(options.hoverClass);
			});
			
			// handle defaults
			if ($(elem).attr('checked')) {
				// box is checked by default, check span
				spanTag.addClass(options.checkedClass);	
			}
			
			// handle disabled state
			if ($(elem).attr('disabled')) {
				// box is checked by default, check our box
				divTag.addClass(options.disabledClass);	
			}
		}
		
		function resetFields (){
			// function to reset all classes
			var elem = $(this);
			
			if (elem.is('select')) {
				// element is a select
				spanTag = elem.parent('span');
				divTag  = elem.parent('div');
				
				spanTag.html(elem.children(':selected').text());
				
				if (elem.attr('disabled')) {
					
				}
			
			} else if(elem.is(':checkbox')) {
				// element is a checkbox
			
			} else if(elem.is(':radio')) {
				// element is a radio
				
			}
		}
		
		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);