﻿/**
Javascript(C)  by Tonno Saverio (saverionet@gmail.com)

	Script per la visualizzazione di un'immagine al posto del checkbox input tramite label
	
	CHANGELOG
	
	v1.01 - 2/04/2008
		- L'immagine grafica del checkbox non viene piu' impostata con una classe sul LABEL ma viene aggiunto uno SPAN con classi CSS per i vari stati.

	v1.01 - 24/02/2008
		- Supporto checkbox con stato "disabled"
		- I sub-checkbox disabilitati non vengono considerati quando cambia lo stato del checkbox padre
		- HACK IE && OPERA usando attributi CSS - quando il checkbox e'e' in stato HIDE (display: none), cliccando sul label non viene eseguita la funzione .click e quindi non cambia lo stato del checkbox 
		
	v1.00 - 08/02/2008
		- Versione base, con sostituzione del checkbox con le immagini
		- Supporto change status padre con tutti i relativi figli
	
	
	Default settings 
	
	var settings = {
		azione					: '', //single, onlychecked, <null>
		hideCheckBox			: true,
		classLabelNormal		: 'checkbox-label-normal',
		classLabelHover			: 'checkbox-label-hover',
		classInputOff			: 'checkbox-off',
		classInputOn			: 'checkbox-on',
		classInputDisabledOff	: 'checkbox-disabled-off',
		classInputDisabledOn	: 'checkbox-disabled-on',
		colorInput				: '#fff',
		spanInputPrefix			: 'span_'
	};

	$(document).ready(function(){
		$("#cssCheckbox")
			.cssCheckbox({
				azione:'onlyChecked'
			})
			.addClass("checkBox1");
	});
	
	
	<input type="checkbox" id="ProvaCheckbox1" name="ProvaCheckbox1" value="Prova Checkbox 1" />
	<label for="ProvaCheckbox1">Prova checkbox 1</label>
**/
$.fn.cssCheckbox = function(options) {

	/* Default settings */
	var $form = $(this.form);
	
	var settings = {
		azione					: '', //single, onlychecked, <null>
		hideCheckBox			: true,
		classLabelNormal		: 'checkbox-label-normal',
		classLabelHover			: 'checkbox-label-hover',
		classInputOff			: 'checkbox-off',
		classInputOn			: 'checkbox-on',
		classInputDisabledOff	: 'checkbox-disabled-off',
		classInputDisabledOn	: 'checkbox-disabled-on',
		colorInput				: '#fff',
		spanInputPrefix			: 'span_',
		
		consideraStatoPrincipale: false,
		statoPrincipale			: false
	};
	/* Processing settings */
	settings = $.extend(settings, options || {});
	
	
	/* Wrapping all passed elements */
	return this.each(function() 
	{

		$(":checkbox", $form)
		
			.each(function(){
			
				var $checkbox = $(this, $form);
  				
				// Nasconde il checkbox se impostato
				if (settings.hideCheckBox==true){
					if($.browser.msie || $.browser.opera){
						// HACK FOR IE! Quando il checkbox e' nascosto, non viene generato l'evento "CLICK" cliccando sul LABEL
						$checkbox.css({color:settings.colorInput, width: '0px', height: '0px', overflow: 'hidden'});
					} else{
						$checkbox.hide();
					}
				} else {
					$checkbox.show();
				}
	
				// Cerca il relativo label del checkbox ed esegue le opportuni operazioni
	
				var $jlabel = $("label[@for='"+$checkbox.attr("id")+"']", $form);
	
					$jlabel.removeClass(settings.classLabelHover).addClass(settings.classLabelNormal);
	
				// Recupera lo stato del checkbox e setta la classe per il label
				//$jlabel
				//	.removeClass(settings.classInputOn)
				//	.removeClass(settings.classInputDisabled)
				//	.removeClass(settings.classInputDisabledOn);
				
//				alert($(this).next("span#"+settings.spanInputPrefix+$checkbox.attr("id")).size());
				if ($(this).next("span#"+settings.spanInputPrefix+$checkbox.attr("id")).length<=0){
//					alert($(this).next("span#span_"+$checkbox.attr("id")).size());
					$checkbox.after('<span id="'+settings.spanInputPrefix+$checkbox.attr("id")+'">&nbsp;</span>');
				}
//				alert($(this).next("span#"+settings.spanInputPrefix+$checkbox.attr("id")).size());
				
				var $jSpan = $("span#"+settings.spanInputPrefix+$checkbox.attr("id"), $form);
				
				$jSpan
					.removeClass(settings.classInputOn).removeClass(settings.classInputDisabledOff).removeClass(settings.classInputDisabledOn).addClass(settings.classInputOff)
					.click(function(){
						var $checkboxClick = $(":checkbox[@id="+$jSpan.attr("id").replace(settings.spanInputPrefix, "")+"]", $form);
						
						settings.consideraStatoPrincipale=true;
						if ($checkboxClick.attr("checked")==true){
							settings.statoPrincipale = false;
						} else {
							settings.statoPrincipale = true;
						}
						$checkboxClick.click();
					});

				if ($checkbox.attr("checked")==true) {
					$jSpan.removeClass(settings.classInputOff).removeClass(settings.classInputDisabledOn).removeClass(settings.classInputDisabledOff).addClass(settings.classInputOn);
//					$jlabel.addClass(settings.classInputOn);
				}
				if ($checkbox.attr("disabled")==true) {
					if ($checkbox.attr("checked")==true) {
						$jSpan.removeClass(settings.classInputOff).removeClass(settings.classInputOn).removeClass(settings.classInputDisabledOff).addClass(settings.classInputDisabledOn);
//						$jlabel.removeClass(settings.classInputOn).addClass(settings.classInputDisabledOn);
					} else{
						$jSpan.removeClass(settings.classInputOff).removeClass(settings.classInputOn).removeClass(settings.classInputDisabledOn).addClass(settings.classInputDisabledOff);
//						$jlabel.addClass(settings.classInputDisabled);
					}
				}
	
				// Label -> Mouseover/Mouseout
				$jlabel.hover(
					function() { $(this).removeClass(settings.classLabelNormal).addClass(settings.classLabelHover); },
					function() { $(this).removeClass(settings.classLabelHover).addClass(settings.classLabelNormal); }
				);
			})
	

			// Checkbox -> click
			.click(function(){
				$(this).cssCheckboxToggle(settings, $form);
			});
	});
};
$.fn.cssCheckboxToggle = function (settings, $form) {
				var $checkbox = $(this, $form);
				var checkStato = $checkbox.attr("checked");
				
				if (settings.consideraStatoPrincipale){
					checkStato = settings.statoPrincipale;
					settings.consideraStatoPrincipale = false;
				}

				var $jSpan = $("span#"+settings.spanInputPrefix+$checkbox.attr("id"), $form);

//				var labelfor = $checkbox.attr("id");
//				var $jLabel = $("label[@for='"+labelfor+"']", $form);

				$jSpan.removeClass(settings.classInputOn).addClass(settings.classInputOff);
//				$jLabel.removeClass(settings.classInputOn);
				if (checkStato==true){
					$jSpan.removeClass(settings.classInputOff).addClass(settings.classInputOn);
//					$jLabel.addClass(settings.classInputOn);
				}
				//check tutti i box sotto livello del checkbox attuale
				if (! (settings.azione=='single' || (settings.azione=='onlyChecked' && checkStato!=true))){

					var $jSpan = $("span[@id^="+settings.spanInputPrefix+$checkbox.attr("id")+"]", $form).not("span#"+settings.spanInputPrefix+$checkbox.attr("id"));
//					var $jLabelInt = $("label[@for^="+labelfor+"]", $form);

//					$jLabelInt.each( function() {
					$jSpan.each( function() {

//						var $jLabelInt = $(this, $form);
						var $jSpanInt = $(this, $form);
						
						$jSpanInt.removeClass(settings.classInputOn).removeClass(settings.classInputDisabledOff).removeClass(settings.classInputDisabledOn).addClass(settings.classInputOff);
//						$jLabelInt.removeClass(settings.classInputOn);

						var $checkboxInt = $(":checkbox[@id="+$jSpanInt.attr("id").replace(settings.spanInputPrefix, "")+"]", $form);
//						var $checkboxInt = $(":checkbox[@name="+$jLabelInt.attr("for")+"]", $form);

						if ($checkboxInt.attr("disabled")!=true){
							if (checkStato==true){
								$checkboxInt.attr("checked", "checked");
							} else {
								$checkboxInt.removeAttr("checked");
							}
						}
						if ($checkboxInt.attr("disabled")==true){
							if ($checkboxInt.attr("checked")==true){
								$jSpanInt.removeClass(settings.classInputDisabledOff).removeClass(settings.classInputOff).removeClass(settings.classInputOn).addClass(settings.classInputDisabledOn);
//								$jLabelInt.addClass(settings.classInputDisabledOn);
							} else {
								$jSpanInt.removeClass(settings.classInputDisabledOn).removeClass(settings.classInputOff).removeClass(settings.classInputOn).addClass(settings.classInputDisabledOff);
//								$jLabelInt.addClass(settings.classInputDisabled);
							}
						} else if (checkStato==true){
							$jSpanInt.removeClass(settings.classInputDisabledOff).removeClass(settings.classInputDisabledOn).removeClass(settings.classInputOff).addClass(settings.classInputOn);
//							$jLabelInt.addClass(settings.classInputOn);
						}
					});
				}
}
