var FormOrdine = Class.create({
	container: null,
	classRiga: "rigaOrdine",
	righe: null,
	totaleProdotti: 0,
	totaleProdottiContainer: null,
	totalePrezzo: 0.0,
	speseSpedizioni: 0.0,
	totale: 0.0,
	totaleContainer: null,
	totalePrezzoContainer: null,
	speseSpedizioniContainer: null,
	buttonInvia: null,
	formAction: null,
								  
	initialize: function(container, totaleProdottiContainer, totalePrezzoContainer, classRiga, speseSpedizioniContainer, totaleContainer, buttonInvia) {
		this.container = $(container);
		this.totaleProdottiContainer = $(totaleProdottiContainer);
		this.totalePrezzoContainer = $(totalePrezzoContainer);
		this.totaleContainer = $(totaleContainer);
		this.classRiga = classRiga;
		this.speseSpedizioniContainer = $(speseSpedizioniContainer);
		this.gestoreSpeseSpedizioni = new FormSpedizioni(this);
		this.buttonInvia = $(buttonInvia);
		this.formAction = this.container.readAttribute("action");
				
		this._loadRighe();	
		this.calcolaTotale();
		this.setTotale();
		this.verificaOrdine();
	},
	
	_loadRighe: function() {
		this.righe = new Array();
		var lista = this.container.getElementsBySelector("input." + this.classRiga);
				
		$A(lista).each(
			function (item) {
				var riga = new FormRiga(item);	
				Element.observe(item, "change", this._rigaChanged.bind(this));
				
				this.righe.push(riga);
			}.bind(this)
		);
	},
	
	_rigaChanged: function(e) {
		this.calcolaTotale();
		this.setTotale();
		this.verificaOrdine();
	},
	
	calcolaTotale: function() {
		var totaleProdotti = 0;
		var totalePrezzo = 0.0;
		
		this.righe.each(
			function (riga) {
				totaleProdotti += riga.getUnita();
				totalePrezzo += riga.getPrezzoTotale();
			}
		);	
				
		this.totaleProdotti = totaleProdotti;
		this.totalePrezzo = totalePrezzo;		
		this.speseSpedizioni = this.gestoreSpeseSpedizioni.calcola();
		this.totale = this.totalePrezzo + this.speseSpedizioni;
	},
	
	setTotale: function() {
		this.totaleProdottiContainer.update(this.totaleProdotti);
		this.totalePrezzoContainer.update(number_format(this.totalePrezzo, 2));
		this.speseSpedizioniContainer.update(number_format(this.speseSpedizioni, 2));
		this.totaleContainer.update(number_format(this.totale, 2));
		
	},
	
	verificaOrdine: function() {
		// L'ordine puņ essere effettuato solo se il numero 
		// di bottiglie ordinate č un multiplo di 6:
		if (this.totaleProdotti % 6 != 0) {
			this.container.writeAttribute("action", "#null");
			this.buttonInvia.writeAttribute("disabled", true);
			this.totaleProdottiContainer.up("td").setStyle({backgroundColor: "red"});
		} else {
			this.container.writeAttribute("action", this.formAction);
			this.buttonInvia.writeAttribute("disabled", false);
			this.totaleProdottiContainer.up("td").setStyle({backgroundColor: "green"});
		}
	}
});

var FormRiga = Class.create({
	element: null,
	prezzo: 0,
	
	initialize: function(element) {
		this.element = $(element);
		this.prezzo = parseFloat(this.element.readAttribute("prezzo"));		
	},
	
	getPrezzoTotale: function() {
		return this.getPrezzoUnitario() * this.getUnita();
	},
	
	getPrezzoUnitario: function() {
		return this.prezzo;
	},
	
	getUnita: function() {
		var unita = parseInt(this.element.getValue());
		if (isNaN(unita)) {
			unita = 0;
		}
		
		return unita;	 
	}
});

var FormSpedizioni = Class.create({								  
	formOrdine: null,
	
	initialize: function(formOrdine) {
		this.formOrdine = formOrdine;
	},
	
	calcola: function() {
		var numCartoni = parseInt(this.getNumeroCartoni());
		var totale = 0.0;
		
		switch (numCartoni) {
			case 0:
				totale = 0;
				break;
			case 1:
				totale = 10;
				break;
			default:
				if (numCartoni > 7) {
					totale = 0;
				} else {
					totale = 10 + (numCartoni - 1) * 2.5;
				}
				break;
		}
		
		return totale;
	},
	
	getNumeroCartoni: function() {
		var tot = this.formOrdine.totaleProdotti;
		return Math.ceil(tot / 6);
	}
});


function number_format(number, decimals, dec_point, thousands_sep) {
    // http://kevin.vanzonneveld.net
    // +   original by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +     bugfix by: Michael White (http://getsprink.com)
    // +     bugfix by: Benjamin Lupton
    // +     bugfix by: Allan Jensen (http://www.winternet.no)
    // +    revised by: Jonas Raoni Soares Silva (http://www.jsfromhell.com)
    // +     bugfix by: Howard Yeend
    // +    revised by: Luke Smith (http://lucassmith.name)
    // +     bugfix by: Diogo Resende
    // +     bugfix by: Rival
    // +      input by: Kheang Hok Chin (http://www.distantia.ca/)
    // +   improved by: davook
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Jay Klehr
    // +   improved by: Brett Zamir (http://brett-zamir.me)
    // +      input by: Amir Habibi (http://www.residence-mixte.com/)
    // +     bugfix by: Brett Zamir (http://brett-zamir.me)
    // +   improved by: Theriault
    var n = !isFinite(+number) ? 0 : +number, 
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        s = '',
        toFixedFix = function (n, prec) {
            var k = Math.pow(10, prec);
            return '' + Math.round(n * k) / k;
        };
    // Fix for IE parseFloat(0.55).toFixed(0) = 0;
    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
    }
    return s.join(dec);
}

document.observe("dom:loaded", function() {
	new FormOrdine("formOrdine", "totaleBottiglie", "totalePrezzo", "rigaOrdine", "speseSpedizioni", "totale", "buttonInvia");	
});



