;(function($j){
	
	$j.fn.stylishCheckbox = function(params){
		
		var params = $j.extend({

			jExtTargets: [],
			callBack: function(jInput, checked){}
		}, params);
		
		params.jExtTargets = $j(params.jExtTargets);
		
		return this.each(function(){
			
			var jInputs = $j(this).find(":checkbox");
			var sInputType = jInputs.attr("type");
			var jClickElts;
			
			if (sInputType == "checkbox"){
			
				var jInput = jInputs.filter(":checkbox").each(function(){
					var jThis = $j(this);
					var jFakeInput = $j('<span class="checkbox"></span>').insertBefore(jThis);
					
					if( jThis.is(":checked")){
						jFakeInput.addClass("checkbox-checked").hover(
							function(){
								jFakeInput.addClass("checked-hover");
							},
							function(){
								jFakeInput.removeClass("checked-hover");
							}
						);
					}
					
					if( jThis.is(":disabled") ) {
						jFakeInput.addClass("disabled");
					}
					
					if ( $j.browser.msie && $j.browser.version < 8) {
						$j("label[for=" + this.id+ "]").click(function(e){
							e.preventDefault();
							jThis.click().change();
						});
					}
					
					jThis.change(function(e){
						e.preventDefault();
						if (jThis.is(":checked")){
							jFakeInput.addClass("checkbox-checked");
						} else {
							jFakeInput.removeClass("checkbox-checked");
						}
					});
					
					jFakeInput.hover(
						function(){
							$j(this).addClass("hover");
						},
						function(){
							$j(this).removeClass("hover");
						}
					);
					
					jClickElts = (params.jExtTargets.find(jFakeInput).length > 0)? params.jExtTargets : jFakeInput.add(params.jExtTargets);
					
					jClickElts.click(function(){
						jThis.click().change();
						params.callBack(jThis, jThis.is(":checked"));
					});
					
				}).hide();
				
			} 
			
		});
	}
	
})(jQuery);