var updatePrice;

(function($) {
	
	/**
	 * @see http://stackoverflow.com/questions/1184624/serialize-form-to-json-with-jquery
	*/
	$.fn.serializeObject = function(base) {
	    var o = {};
	    var a = this.serializeArray();
	    $.each(a, function() {
	    	
	    	if (this.name && (base !== undefined && this.name.indexOf(base) > -1) ) {
	    		
	    		var name = this.name.replace(base, '');
	    		
	    		if (o[name] !== undefined) {
	    			if (!o[name].push) {
	    				o[name] = [o[name]];
	    			}
	    			o[name].push(this.value || '');
	    		} else {
	    			o[name] = this.value || '';
	    		}
	    		
	    	}
	    });
	    return o;
	};
	
	updatePrice = function() {
		
		var totalPrice = 0,
			totalPriceString = '--',
			qty = parseInt($('input[name="wizard_qty"]').val()),
			customizationType = $('#tipo_personalizzazione').val(),
			optionFormulaValueId = (customizationType != 'busta' ? $('.personalizzazione_plus_formula:checked').val() : null),
    		numColors = 0,
			specialColors = ['blu_reflex', 'oro', 'argento'],
			selectedSpecialColor = null,
			selectedColors = [];
		
    	// Determino il numero di colori. E' dato dalla somma del numero di colori per la formula augurale + il numero di colori per logo o ragione sociale.
    	// Blu Reflex, Oro e Argento, se scelti in congiunzione di un altro colore, valgono come un Pantone normale (es. BluReflex per formula e Oro per logo == 2 Colori Pantone)
    		
    	// Per la personalizzazione Base c'è solo il Blu Reflex
    	if (customizationType == 'base') {
    		
    		numColors = 1;
    		selectedSpecialColor = 'blu_reflex';
    		
    	// Se sia per formula che per logo/rag.soc. viene scelto uno stesso colore vale come 1. Serve un match tra stringhe se è stato scelto almeno un colore Pantone per entrambi.
    	} else if (($('#personalizzazione_plus_tipo_personalizzazione').val() == 'ragione_sociale' && $('#personalizzazione_plus_colore_formula').val() == $('#personalizzazione_plus_colore_ragione_sociale').val())
    		|| ($('#personalizzazione_plus_tipo_personalizzazione').val() == 'logo' && $('#personalizzazione_plus_colore_formula').val() == $('#personalizzazione_plus_colore_logo').val())) {
    		
    		// Blu Reflex, Oro e Argento costano meno
    		if ($.inArray($('#personalizzazione_plus_colore_formula').val(), specialColors) != -1) {
    			numColors = 1;
    			selectedSpecialColor = $('#personalizzazione_plus_colore_formula').val();
    		
    		// E' stato scelto un colore Pantone per entrambi... è lo stesso?
    		} else {
    			
    			// Pantone della formula
    			firstColor = $.trim($('#personalizzazione_plus_pantone_formula').val());
    			// Pantone della personalizzazione (rag.soc./logo)
    			secondColor = $.trim($('#personalizzazione_plus_tipo_personalizzazione').val() == 'ragione_sociale' ? $('#personalizzazione_plus_pantone_ragione_sociale').val() : $('#personalizzazione_plus_pantone_logo_1').val());
    			
    			// E' lo stesso Pantone (scritto allo stesso modo, abbastanza aleatorio come controllo in realtà...)
    			if (firstColor.toLowerCase().localeCompare(secondColor.toLowerCase()) == 0) {
    				
    				numColors = 1;
    				
    				// Ultima possibilità: l'utente ha specificato due colori Pantone a mano, ma ha scritto "oro", "argento" o "blu reflex"...
    				if ($.inArray(firstColor.replace(' ', '_').toLowerCase(), specialColors) != -1) {
    					selectedSpecialColor = firstColor.replace(' ', '_').toLowerCase();
    				} else {
	    				selectedColors.push(firstColor);			    					
    				}
    			
    			// Due Pantone diversi
    			} else {
    				numColors = 2;
    				selectedColors.push(firstColor);
    				selectedColors.push(secondColor);
    			}
    		}
    		
    	// Sono stati scelti *almeno* due colori diversi tra formula e rag.soc./logo
    	} else {
    		// Se è stata scelta la ragione sociale, al più possiamo avere due colori diversi
    		if ($('#personalizzazione_plus_tipo_personalizzazione').val() == 'ragione_sociale') {
    			numColors = 2;
    			selectedColors.push($.inArray($('#personalizzazione_plus_colore_formula').val(), specialColors) != -1 ? $('#personalizzazione_plus_colore_formula').val() : $('#personalizzazione_plus_pantone_formula').val());
    			selectedColors.push($.inArray($('#personalizzazione_plus_colore_ragione_sociale').val(), specialColors) != -1 ? $('#personalizzazione_plus_colore_ragione_sociale').val() : $('#personalizzazione_plus_pantone_ragione_sociale').val());
    		
    		// Se è stato scelto il logo, possiamo avere fino a 4 colori
    		// Verifico prima i colori del logo, dopo controllerò se uno dei colori è stato scelto anche per la formula. In tal caso non incrementerò il contatore
    		} else {
    			
    			// Per il logo è stato scelto un colore speciale (ma diverso dalla formula, al$.trimenti non saremmo qui...)
    			if ($.inArray($('#personalizzazione_plus_colore_logo').val(), specialColors) != -1) {
    				
    				numColors = 2;
    				selectedColors.push($.inArray($('#personalizzazione_plus_colore_formula').val(), specialColors) != -1 ? $('#personalizzazione_plus_colore_formula').val() : $('#personalizzazione_plus_pantone_formula').val());
    				selectedColors.push($('#personalizzazione_plus_colore_logo').val());
    				
    			// Per il logo è stato scelto uno o più Pantone
    			} else {
					// Numero di colori Pantone scelti
					numPantone = parseInt($('#personalizzazione_plus_colore_logo').val().replace('pantone_', ''));
					
					numColors = numPantone;
					
					// Se ha scelto 4 Pantone, in realtà il 4° è quello della formula
					if (numPantone == 4) {
						selectedColors.push($.inArray($('#personalizzazione_plus_colore_formula').val(), specialColors) != -1 ? $('#personalizzazione_plus_colore_formula').val() : $('#personalizzazione_plus_pantone_formula').val());
						numPantone--;
    					
						for (i=1; i<=numPantone; i++) {
							selectedColors.push($.trim($('#personalizzazione_plus_pantone_logo_' + i).val()));
    					}
					} else {
						for (i=1; i<=numPantone; i++) {
							selectedColors.push($.trim($('#personalizzazione_plus_pantone_logo_' + i).val()));
    					}
    					
    					// Verifico che il colore della formula non sia stato in qualche modo incluso tra quelli per il logo
    					formulaSelectedColor = $.inArray($('#personalizzazione_plus_colore_formula').val(), specialColors) != -1 ? $('#personalizzazione_plus_colore_formula').val() : $('#personalizzazione_plus_pantone_formula').val();
    					if ($.inArray(formulaSelectedColor, selectedColors) == -1) {
    						numColors++;
    						selectedColors.push(formulaSelectedColor);
    					}
					}
    			}
    		}
    	}
    	
    	// Una volta ottenuto il numero di colori, devo fare lookup della corrispondente option dell'attributo, IDEM se l'unico colore scelto è blu_reflex, oro e argento.
    	if (numColors > 0) {
	    	optionCode = '';
	    	optionColorValueId = '';
	    	
			if (selectedSpecialColor) {
				optionCode = selectedSpecialColor;
			} else {
				optionCode = 'pantone_' + numColors;
			}
			
			for (var config in customizationPriceConfig.attributeOptions) {
				if (customizationPriceConfig.attributeOptions.hasOwnProperty(config)) {
					if (customizationPriceConfig.attributeOptions[config]['label'] == optionCode) {
						optionColorValueId = customizationPriceConfig.attributeOptions[config]['value'];
						break;
					}
				}
			}
			
			// Ho tutto: formula_augurale e numero_colori.
			// Cerco il prodotto corrispondente e ne sommo il prezzo
			var productList = customizationPriceConfig.products[customizationType];
			
			for (var product in productList) {
				if (productList.hasOwnProperty(product)) {
					if (productList[product].numColors == optionColorValueId && productList[product].formulaAugurale == optionFormulaValueId) {
						totalPrice += (parseFloat(productList[product].price) * qty);
						totalPrice += parseFloat(productList[product].setupCost);
						break;
					}
				}
			}
    	}
		
		// Costo della busta
    	var bustaCustomizationType = $('#personalizzazione_busta_tipo_personalizzazione').val();
    	if (bustaCustomizationType != 'bianca') {
    		
    		// Cerco il prodotto corrispondente e ne sommo il prezzo
			var productList = customizationPriceConfig.products.busta,
				bustaOptionCode = (bustaCustomizationType == 'ragione_sociale' ? $('#personalizzazione_busta_colore_ragione_sociale').val() : $('#personalizzazione_busta_colore_logo').val()),
				bustaOptionColorValueId = 0;
			
			for (var config in customizationPriceConfig.attributeOptions) {
				if (customizationPriceConfig.attributeOptions.hasOwnProperty(config)) {
					if (customizationPriceConfig.attributeOptions[config]['label'] == bustaOptionCode) {
						bustaOptionColorValueId = customizationPriceConfig.attributeOptions[config]['value'];
						break;
					}
				}
			}
			
			for (var product in productList) {
				if (productList.hasOwnProperty(product)) {
					if (productList[product].numColors == bustaOptionColorValueId) {
						totalPrice += (parseFloat(productList[product].price) * qty);
						totalPrice += parseFloat(productList[product].setupCost);
						break;
					}
				}
			}
    	}
		
		// Costo della prova di stampa (se richiesta e se la formula augurale non è personalizzata)
		if ($('#personalizzazione_plus_prova_stampa:checked').length > 0 && $('#personalizzazione_plus_formula_is_custom').val() == 0) {
			totalPrice += parseFloat(customizationPriceConfig.costoProvaStampa);
    	}
		
    	// Aggiungo l'IVA
    	if (totalPrice > 0) {
			totalPrice += ((totalPrice / 100) * parseInt(customizationPriceConfig.taxRate[customizationType]));
		}
    	
    	// Aggiungo il prezzo del biglietto "liscio"
    	totalPrice += (parseFloat($('#productFinalPrice').val()) * qty);
    	
		totalPriceString = (totalPrice ? '&euro; ' + totalPrice.toFixed(2).replace('.', ',') : '--');
		$('.calculatedPrice strong').html(totalPriceString);
	};
})(jQuery);
