(function($) {
	$.fn.jNice=function(options) {
		var self=this; var safari=$.browser.safari;
		$(document).mousedown(checkExternalClick);
		return this.each(function() {
			$('input:checkbox',this).each(CheckAdd);
			$('input:radio',this).each(RadioAdd);
			$('select',this).each(function(index) { SelectAdd(this,index); });
			$(this).bind('reset',function() { var action=function() { Reset(this); }; window.setTimeout(action,10); });
			$('.form-hidden').css({opacity:0});
		});
	};

	var Reset=function(form) {
		var sel;
		$('.select-wrapper select',form).each(function() {
			sel=(this.selectedIndex<0)?0:this.selectedIndex;
			$('ul',$(this).parent()).each(function() { $('a:eq('+sel+')',this).click(); });
		});
		$('a.jNiceCheckbox,a.jNiceRadio',form).removeClass('form-checked');
		$('input:checkbox,input:radio',form).each(function(){
			if (this.checked) { $('a',$(this).parent()).addClass('form-checked'); }
		});
	};

	var RadioAdd = function(){
		var $input = $(this).addClass('form-hidden').wrap('<span class="jRadioWrapper form-wrapper"></span>');
		var $wrapper = $input.parent();
		var $a = $('<span class="jNiceRadio"></span>');
		$wrapper.prepend($a);
		/* Click Handler */
		$a.click(function(){
				var $input = $(this).addClass('form-checked').siblings('input').attr('checked',true);
				/* uncheck all others of same name */
				$('input:radio[name="'+ $input.attr('name') +'"]').not($input).each(function(){
					$(this).attr('checked',false).siblings('.jNiceRadio').removeClass('form-checked');
				});
				return false;
		});
		$input.click(function(){
			if(this.checked){
				var $input = $(this).siblings('.jNiceRadio').addClass('form-checked').end();
				/* uncheck all others of same name */
				$('input:radio[name="'+ $input.attr('name') +'"]').not($input).each(function(){
					$(this).attr('checked',false).siblings('.jNiceRadio').removeClass('form-checked');
				});
			}
		}).focus(function(){ $a.addClass('jNiceFocus'); }).blur(function(){ $a.removeClass('jNiceFocus'); });

		/* set the default state */
		if (this.checked){ $a.addClass('form-checked'); }
	};

	var CheckAdd=function() {
		var $input=$(this).addClass('form-hidden').wrap('<span class="form-wrapper"></span>');
		var $wrapper=$input.parent().append('<span class="form-checkbox"></span>');
		var $a=$wrapper.find('.form-checkbox').click(function() {
			var $a=$(this); var input=$a.siblings('input')[0];
			if (input.checked===true) { input.checked=false; $a.removeClass('form-checked'); }
			else { input.checked=true; $a.addClass('form-checked'); }
			return false;
		});
		$input.click(function() {
			if (this.checked) { $a.addClass('form-checked');	} else { $a.removeClass('form-checked'); }
		});
		if (this.checked) { $('.form-checkbox',$wrapper).addClass('form-checked'); }
	};

	var SelectHide=function() { $('.select-wrapper ul:visible').hide(); };

	var checkExternalClick=function(event) {
		if ($(event.target).parents('.select-wrapper').length===0) { SelectHide(); }
	};

	var SelectAdd=function(element,index) {
		var $select=$(element); index=index||$select.css('zIndex')*1; index=(index)?index:0;
		$select.wrap($('<div class="form-wrapper"></div>').css({zIndex:100-index}));
		var width=$select.width();
		$select.addClass('form-hidden').after('<div class="select-wrapper"><div><span class="select-text"></span>'+
																																								'<span class="select-open"></span></div><ul></ul></div>');
		var $wrapper=$(element).siblings('.select-wrapper').css({width:width+'px'});
		$('.select-text,.select-wrapper ul',$wrapper).width(width-$('.select-open',$wrapper).width());
		if ($.browser.msie&&jQuery.browser.version<7) {
			$select.after($('<iframe src="javascript:\'\';" marginwidth="0" marginheight="0" align="bottom" '+
																			'scrolling="no" tabIndex="-1" frameborder="0"></iframe>')
										.css({height:$select.height()+4,width:width}));
			$select.width(width-4);
		}
		SelectUpdate(element);
		$('div',$wrapper).click(function() {
			var $ul=$(this).siblings('ul');
			$ul.width(width-2);
			if ($.browser.msie&&jQuery.browser.version<7) $ul.width(width-3);
			if ($ul.css('display')=='none') { SelectHide(); }
			$ul.slideToggle();
			var offSet=($('a.selected',$ul).offset().top-$ul.offset().top);
			$ul.animate({scrollTop:offSet});
			return false;
		});
		$select.keydown(function(e) {
			var selectedIndex=this.selectedIndex;
			switch(e.keyCode) {
				case 40: if (selectedIndex<this.options.length-1) { selectedIndex+=1; } break;
				case 38: if (selectedIndex>0) { selectedIndex-=1; } break;
				default: return; break;
			}
			$('ul a',$wrapper).removeClass('selected').eq(selectedIndex).addClass('selected');
			$('span:eq(0)',$wrapper).html($('option:eq('+selectedIndex+')',$select).attr('selected','selected').text());
			return false;
		});
	};

	var SelectUpdate=function(element) {
		var $select=$(element);
		var $wrapper=$select.siblings('.select-wrapper');
		var $ul=$wrapper.find('ul').find('li').remove().end().hide();
		$('option',$select).each(function(i) {
			$ul.append('<li><a href="javascript://" index="'+i+'">'+this.text+'</a></li>');
		});
		$ul.find('a').click(function() {
			$('a.selected',$wrapper).removeClass('selected');
			$(this).addClass('selected');	
			if ($select[0].selectedIndex!=$(this).attr('index')&&$select[0].onchange) {
				$select[0].selectedIndex=$(this).attr('index'); $select[0].onchange();
			}
			$select[0].selectedIndex=$(this).attr('index');
			$('span:eq(0)',$wrapper).html($(this).html());
			$ul.hide();
			return false;
		});
		$('a:eq('+$select[0].selectedIndex+')',$ul).click();
	};

	var SelectRemove=function(element) {
		var zIndex=$(element).siblings('.select-wrapper').css('zIndex');
		$(element).css({zIndex:zIndex}).removeClass('form-hidden');
		$(element).siblings('.select-wrapper').remove();
	};

	$.jNice={
		SelectAdd: function(element,index) { SelectAdd(element,index); },
		SelectRemove: function(element) { SelectRemove(element); },
		SelectUpdate: function(element) { SelectUpdate(element); }
	};

	$(function() { $('form.jNice').jNice();	});
})(jQuery);
