(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); });
			$('.jNiceHidden').css({opacity:0});
		});
	};

	var Reset=function(form) {
		var sel;
		$('.jNiceSelectWrapper 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('jNiceChecked');
		$('input:checkbox,input:radio',form).each(function() {
			if(this.checked) { $('a',$(this).parent()).addClass('jNiceChecked'); }
		});
	};

	var RadioAdd=function() {
		var $input=$(this).addClass('jNiceHidden').wrap('<span class="jRadioWrapper jNiceWrapper"></span>');
		var $wrapper=$input.parent();
		var $a=$('<span class="jNiceRadio"></span>');
		$wrapper.prepend($a);
		$a.click(function() {
			var $input=$(this).addClass('jNiceChecked').siblings('input').attr('checked',true);
			$('input:radio[name="'+$input.attr('name')+'"]').not($input).each(function() {
				$(this).attr('checked',false).siblings('.jNiceRadio').removeClass('jNiceChecked');
			});
			return false;
		});
		$input.click(function() {
			if (this.checked) {
				var $input=$(this).siblings('.jNiceRadio').addClass('jNiceChecked').end();
				$('input:radio[name="'+$input.attr('name')+'"]').not($input).each(function() {
					$(this).attr('checked',false).siblings('.jNiceRadio').removeClass('jNiceChecked');
				});
			}
		}).focus(function() { $a.addClass('jNiceFocus'); }).blur(function() { $a.removeClass('jNiceFocus'); });
		if (this.checked) { $a.addClass('jNiceChecked'); }
	};

	var CheckAdd=function() {
		var $input=$(this).addClass('jNiceHidden').wrap('<span class="jNiceWrapper"></span>');
		var $wrapper=$input.parent().append('<span class="jNiceCheckbox"></span>');
		var $a=$wrapper.find('.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;
		});
		$input.click(function() {
			if (this.checked) { $a.addClass('jNiceChecked'); } else { $a.removeClass('jNiceChecked'); }
		}).focus(function() { $a.addClass('jNiceFocus'); }).blur(function() { $a.removeClass('jNiceFocus'); });
		if (this.checked) { $('.jNiceCheckbox',$wrapper).addClass('jNiceChecked'); }
	};

	var SelectHide=function() { $('.jNiceSelectWrapper ul:visible').hide(); };
	var checkExternalClick=function(event) {
		if ($(event.target).parents('.jNiceSelectWrapper').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="jNiceWrapper"></div>').css({zIndex:100-index}));
		var width=$select.width();
		$select.addClass('jNiceHidden').after('<div class="jNiceSelectWrapper"><div><span class="jNiceSelectText"></span><span class="jNiceSelectOpen"></span></div><ul></ul></div>');
		var $wrapper=$(element).siblings('.jNiceSelectWrapper').css({width:width+'px'});
		$('.jNiceSelectText,.jNiceSelectWrapper ul',$wrapper).width(width-$('.jNiceSelectOpen',$wrapper).width());
		/* IF IE 6 */
		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+'px'}));
		}
		SelectUpdate(element);
		$('div',$wrapper).click(function() {
			var $ul=$(this).siblings('ul');
			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;
		}).focus(function() { $wrapper.addClass('jNiceFocus'); }).blur(function() { $wrapper.removeClass('jNiceFocus'); });
	};

	var SelectUpdate=function(element) {
		var $select=$(element);
		var $wrapper=$select.siblings('.jNiceSelectWrapper');
		var $ul=$wrapper.find('ul').find('li').remove().end().hide();
		$('option',$select).each(function(i) { $ul.append('<li><a href="#" 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('.jNiceSelectWrapper').css('zIndex');
		$(element).css({zIndex:zIndex}).removeClass('jNiceHidden');
		$(element).siblings('.jNiceSelectWrapper').remove();
	};

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

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