define(['jquery', 'underscore', 'backbone',
        'text!modules/converter/converterViewTemplate.html',
        'modules/base/baseView'],
    function($, _, Backbone, converterViewTemplate, BaseView){

        var ConverterView = BaseView.extend({

            collection: null,
            //initialize template
            template:_.template(converterViewTemplate),

            initialize: function (options) {
                var self = this;
                ConverterView.__super__.initialize.call(this);
                //this.header.title = "pippo";
            },

            events: {
                "click #calculate": "performCalcBtn",
                "change #typeLvStart": "typeLvStartChanged"
            },

            performCalcBtn: function (e) {
                e.preventDefault();
                //this.calculateConvert();
                this.$el.find("#inputForm").submit();
            },

            typeLvStartChanged: function(e){
                e.preventDefault();
				
                if(this.$el.find("#typeLvStart").val() == "ldbf" ||
                    this.$el.find("#typeLvStart").val() == "ldbs"){
                }
                else{
                    
                }
            },

            calculateConvert: function(){
                var ret ="";
                if(this.$el.find("#typeLvStart").val() == "ldbf" ||
                   this.$el.find("#typeLvStart").val() == "ldbs"){
                    this.$el.find("#qtaLvlAlt").val(this.impostaPmConsigliata());
                    ret += this.convertiLDB();
                }
                else{
					this.$el.find("#qtaLvlAlt").val(this.impostaPmConsigliata());
                    ret += this.convertiPM();
                }

                this.$el.find('#result')[0].innerHTML = ret.replace(/<br>/g, "<br><br>");

                this.$el.find('#popupConvertResult').popup("open");
            },

            convertiPM: function(){

                // dichiaro e inizializzo la variabile che conterrà il risultato dell'elaborazione
                var risultato = "";

                // imposto come fissa al 50% l'idratazione della PM solida
                var VidratazionePmSolida = 50;

                // ottengo i valori scelti dall'utente
                var vTipoPmPartenza = this.$el.find("#typeLvStart").val();
                var vTipoPmFinale = "";
                var vIdratazionePmFinale = 0;
                var vIdratazionePmPartenza = 50; //parseInt(this.$el.find("#qtaLiquidi").val());
                if(this.$el.find("#typeLvStart").val() == "lic100" )
                    vIdratazionePmPartenza = 100;
                else if(this.$el.find("#typeLvStart").val() == "lic130" )
                    vIdratazionePmPartenza = 130;

                var vQuantitaPmPartenza = parseInt(this.$el.find("#qtaLvStart").val());
                var vQuantitaFarinaPartenza = parseInt(this.$el.find("#qtaFarina").val());
                var vQuantitaAcquaPartenza = parseInt(this.$el.find("#qtaLiquidi").val());
                var vQuantitaPmFinale = parseInt(this.$el.find("#qtaLvlAlt").val());

                // Imposto di il tipo di PM finale in funzione di quello scelto come partenza
                // e visualizzo o nascondo di conseguenza la select per l'idratazione
                switch (this.$el.find("#typeLvDest").val()){
                    case "pm":
                        vTipoPmFinale = "SOLIDA";
                        vIdratazionePmFinale = 50;
                        break;
                    case "lic100":
                        vTipoPmFinale = "LIQUIDA";
                        vIdratazionePmFinale = 100;
                        break;
                    case "lic130":
                        vTipoPmFinale = "LIQUIDA";
                        vIdratazionePmFinale = 130;
                        break;
                    default:
                        vTipoPmFinale = "";
                }

                // elaborazione per PM finale SOLIDA
                if (vTipoPmFinale == "SOLIDA") {

                    // quanta acqua c'è nella PM liquida di partenza?
                    var qAcquaPmPartenza = (vQuantitaPmPartenza / (100 + vIdratazionePmPartenza)) * vIdratazionePmPartenza;
                    qAcquaPmPartenza = qAcquaPmPartenza.toFixed(0);

                    // quanta farina c'è nella PM liquida di partenza?
                    var qFarinaPmPartenza = vQuantitaPmPartenza - qAcquaPmPartenza;

                    // quanta acqua c'è nella PM finale?
                    var qAcquaPmFinale = (vQuantitaPmFinale / (100 + VidratazionePmSolida)) * VidratazionePmSolida
                    qAcquaPmFinale = qAcquaPmFinale.toFixed(0);

                    // quanta farina c'è nella PM finale?
                    var qFarinaPmFinale = vQuantitaPmFinale - qAcquaPmFinale;

                    // come devo modificare l'acqua prevista dalla ricetta originale?
                    // devo aggiungere/togliere la differenza tra l'acqua della PM di partenza e quella finale
                    // quindi calcolo tale differenza...
                    var deltaAcquaPM = qAcquaPmPartenza - qAcquaPmFinale;

                    // ...e la aggiungo/tolgo all'acqua dell'impasto della ricetta originale
                    var qAcquaImpastoFinale = vQuantitaAcquaPartenza;

                    // se il delta acqua è negativo lo tolgo
                    // altrimenti lo aggiungo
                    if (deltaAcquaPM < 0) {
                        qAcquaImpastoFinale -= deltaAcquaPM;
                    }
                    else {
                        qAcquaImpastoFinale += deltaAcquaPM;
                    }

                    // come devo modificare la farina prevista dalla ricetta originale?
                    // devo aggiungere/togliere la differenza tra la farina della PM di partenza e quella finale
                    // quindi calcolo tale differenza...
                    var deltaFarinaPM = qFarinaPmPartenza - qFarinaPmFinale;

                    // ...e la aggiungo/tolgo alla farina dell'impasto della ricetta originale
                    var qFarinaImpastoFinale = vQuantitaFarinaPartenza;

                    // se il delta farina è negativo lo aggiungo
                    // altrimenti lo tolgo
                    if (deltaFarinaPM < 0) {
                        qFarinaImpastoFinale += deltaFarinaPM;
                    }
                    else {
                        qFarinaImpastoFinale -= deltaFarinaPM;
                    }

                    risultato += "PM solida gr " + vQuantitaPmFinale.toString();
                    risultato += "<br>";
                    risultato += "Farina gr " + qFarinaImpastoFinale.toString();
                    risultato += "<br>";
                    risultato += "Acqua gr " + qAcquaImpastoFinale.toString();


                }

                // elaborazione per PM finale LIQUIDA
                if (vTipoPmFinale == "LIQUIDA"){

                    // CASO PM LIQUIDA FINALE AL 100%

                    // quanta acqua c'è nella PM solida iniziale?
                    var qAcquaPmPartenza = (vQuantitaPmPartenza / (100 + VidratazionePmSolida)) * VidratazionePmSolida
                    qAcquaPmPartenza = qAcquaPmPartenza.toFixed(0);

                    // quanta farina c'è nella PM solida iniziale?
                    var qFarinaPmPartenza = vQuantitaPmPartenza - qAcquaPmPartenza;

                    // quanta acqua c'è nella PM finale?
                    var qAcquaPmFinale = (vQuantitaPmFinale / (100 + 100)) * 100;
                    qAcquaPmFinale = qAcquaPmFinale.toFixed(0);

                    // quanta farina c'è nella PM finale?
                    var qFarinaPmFinale = vQuantitaPmFinale - qAcquaPmFinale;

                    // come devo modificare l'acqua prevista dalla ricetta originale?
                    // devo aggiungere/togliere la differenza tra l'acqua della PM di partenza e quella finale
                    // quindi calcolo tale differenza...
                    var deltaAcquaPM = qAcquaPmPartenza - qAcquaPmFinale;

                    // ...e la aggiungo/tolgo all'acqua dell'impasto della ricetta originale
                    var qAcquaImpastoFinale = vQuantitaAcquaPartenza;

                    // se il delta acqua è negativo lo aggiungo
                    // altrimenti lo tolgo
                    if (deltaAcquaPM < 0){
                        qAcquaImpastoFinale += deltaAcquaPM;
                    }
                    else{
                        qAcquaImpastoFinale -= deltaAcquaPM;
                    }

                    // come devo modificare la farina prevista dalla ricetta originale?
                    // devo aggiungere/togliere la differenza tra la farina della PM di partenza e quella finale
                    // quindi calcolo tale differenza...
                    var deltaFarinaPM = qFarinaPmPartenza - qFarinaPmFinale;

                    // ...e la aggiungo/tolgo alla farina dell'impasto della ricetta originale
                    var qFarinaImpastoFinale = vQuantitaFarinaPartenza;

                    // se il delta farina è negativo lo aggiungo
                    // altrimenti lo tolgo
                    if (deltaFarinaPM < 0){
                        qFarinaImpastoFinale -= deltaFarinaPM;
                    }
                    else{
                        qFarinaImpastoFinale += deltaFarinaPM;
                    }

                    if(vIdratazionePmFinale == 100) {
                        risultato += "PM liquida 100% gr " + vQuantitaPmFinale.toString();
                        risultato += "<br>";
                        risultato += "Farina gr " + qFarinaImpastoFinale.toString();
                        risultato += "<br>";
                        risultato += "Acqua gr " + qAcquaImpastoFinale.toString();
                    }
                    else {

                        // CASO PM LIQUIDA FINALE AL 130%

                        // quanta acqua c'è nella PM solida iniziale?
                        var qAcquaPmPartenza = (vQuantitaPmPartenza / (100 + VidratazionePmSolida)) * VidratazionePmSolida
                        qAcquaPmPartenza = qAcquaPmPartenza.toFixed(0);

                        // quanta farina c'è nella PM solida iniziale?
                        var qFarinaPmPartenza = vQuantitaPmPartenza - qAcquaPmPartenza;

                        // quanta acqua c'è nella PM finale?
                        var qAcquaPmFinale = (vQuantitaPmFinale / (100 + 130)) * 130;
                        qAcquaPmFinale = qAcquaPmFinale.toFixed(0);

                        // quanta farina c'è nella PM finale?
                        var qFarinaPmFinale = vQuantitaPmFinale - qAcquaPmFinale;

                        // come devo modificare l'acqua prevista dalla ricetta originale?
                        // devo aggiungere/togliere la differenza tra l'acqua della PM di partenza e quella finale
                        // quindi calcolo tale differenza...
                        var deltaAcquaPM = qAcquaPmPartenza - qAcquaPmFinale;

                        // ...e la aggiungo/tolgo all'acqua dell'impasto della ricetta originale
                        var qAcquaImpastoFinale = vQuantitaAcquaPartenza;

                        // se il delta acqua è negativo lo aggiungo
                        // altrimenti lo tolgo
                        if (deltaAcquaPM < 0) {
                            qAcquaImpastoFinale += deltaAcquaPM;
                        }
                        else {
                            qAcquaImpastoFinale -= deltaAcquaPM;
                        }

                        // come devo modificare la farina prevista dalla ricetta originale?
                        // devo aggiungere/togliere la differenza tra la farina della PM di partenza e quella finale
                        // quindi calcolo tale differenza...
                        var deltaFarinaPM = qFarinaPmPartenza - qFarinaPmFinale;

                        // ...e la aggiungo/tolgo alla farina dell'impasto della ricetta originale
                        var qFarinaImpastoFinale = vQuantitaFarinaPartenza;

                        // se il delta farina è negativo lo aggiungo
                        // altrimenti lo tolgo
                        if (deltaFarinaPM < 0) {
                            qFarinaImpastoFinale -= deltaFarinaPM;
                        }
                        else {
                            qFarinaImpastoFinale += deltaFarinaPM;
                        }

                        risultato += "PM liquida 130% gr " + vQuantitaPmFinale.toString();
                        risultato += "<br>";
                        risultato += "Farina gr " + qFarinaImpastoFinale.toString();
                        risultato += "<br>";
                        risultato += "Acqua gr " + qAcquaImpastoFinale.toString();
                    }
                }

                return risultato;
            },

            convertiLDB: function(){
                // dichiaro e inizializzo la variabile che conterrà il risultato dell'elaborazione
                var risultato = "";

                // dichiaro e inizializzo la variabile che conterrà la quantità di farina da usare
                var vQuantitaFarinaDaUsare = 0;

                // dichiaro e inizializzo la variabile che conterrà la quantità di acqua da usare
                var vQuantitaAcquaDaUsare = 0;

                // dichiaro e inizializzo la variabile per la quantità di farina presente nella PM da usare
                var qFarinaPmDaUsare = 0;

                // dichiaro e inizializzo la variabile per la quantità di acqua presente nella PM da usare
                var qAcquaPmDaUsare = 0;

                // ricavo la quantità di LDB della ricetta originale
                var vQuantitaLdbPartenza = parseInt(this.$el.find("#qtaLvStart").val());

                // ricavo l'idratazione della PM da usare
                var vIdratazionePmFinale = 50;
                if(this.$el.find("#typeLvDest").val() == "lic100" )
                    vIdratazionePmFinale = 100;
                else if(this.$el.find("#typeLvDest").val() == "lic130" )
                    vIdratazionePmFinale = 130;

                // ricavo la quantità di farina della ricetta originale
                var vQuantitaFarinaPartenza = parseInt(this.$el.find("#qtaFarina").val());

                // ricavo la quantità di acqua della ricetta originale
                var vQuantitaAcquaPartenza = parseInt(this.$el.find("#qtaLiquidi").val());

                // ricavo la quantità di PM da usare
                var vQuantitaPmDaUsare = parseInt(this.$el.find("#qtaLvlAlt").val());

                // quanta acqua c'è nella PM da usare?
                var qAcquaPmDaUsare = (vQuantitaPmDaUsare / (100 + vIdratazionePmFinale)) * vIdratazionePmFinale;
                qAcquaPmDaUsare = qAcquaPmDaUsare.toFixed(0);

                // ricavo la quantità di farina presente nella PM da usare
                qFarinaPmDaUsare = vQuantitaPmDaUsare - qAcquaPmDaUsare;

                // diminuisco la farina della ricetta originale di una quantità pari a quella presente nella PM da usare
                vQuantitaFarinaDaUsare = vQuantitaFarinaPartenza - qFarinaPmDaUsare;

                // diminuisco l'acqua della ricetta originale di una quantità pari a quella presente nella PM da usare
                vQuantitaAcquaDaUsare = vQuantitaAcquaPartenza - qAcquaPmDaUsare;

                // costruisco la stringa del risultato
                risultato += "PM gr " + vQuantitaPmDaUsare.toString();
                risultato += "<br>";
                risultato += "Farina gr " + vQuantitaFarinaDaUsare.toString();
                risultato += "<br>";
                risultato += "Acqua gr " + vQuantitaAcquaDaUsare.toString();


                return risultato;
            },

            impostaPmConsigliata: function(){

                var dummy = "";


                // dichiaro e inizializzo la variabile per la quantità consigliata di pasta madre
                var vQuantitaPmConsigliata = 0;

                if(this.$el.find("#typeLvStart").val() == "pm")
                {
                    vQuantitaPmConsigliata = ((parseInt(this.$el.find("#qtaLvStart").val()) / 3) * 2);
                }
                else if(this.$el.find("#typeLvStart").val() == "lic100" ||
                    this.$el.find("#typeLvStart").val() == "lic130")
                {
                    vQuantitaPmConsigliata = ((parseInt(this.$el.find("#qtaLvStart").val()) / 2) * 3);
                }
                else {
                    // dichiaro e inizializzo la variabile per la quantità di lievito di birra
                    var vQuantitaLdbPartenza = 0;

                    // dichiaro e inizializzo la variabile per il tipo di lievito di birra
                    var vTipoLdbPartenza = "";

                    // dichiaro e inizializzo la variabile per la quantità consigliata di pasta madre massima ammessa
                    var vQuantitaPmConsigliataMax = 0;

                    // imposto il rapporto percentuale di default PM solida/Farina... ma è solo orientativo
                    var rapportoPmSolidaFarina = 25;

                    // imposto il rapporto percentuale di default PM liquida 100%/Farina... ma è solo orientativo
                    var rapportoPm100Farina = 16.5;

                    // imposto il rapporto percentuale di default PM liquida 100%/Farina... ma è solo orientativo
                    var rapportoPm130Farina = 16.5;

                    // ricavo la quantità di farina della ricetta originale
                    var vQuantitaFarinaPartenza = parseInt(this.$el.find('#qtaFarina').val());

                    // ricavo l'idratazione della PM da usare
                    var vIdratazionePmFinale = 0;

                    switch (this.$el.find("#typeLvDest").val()) {
                        case "pm":
                            vTipoPmFinale = "SOLIDA";
                            vIdratazionePmFinale = 50;
                            break;
                        case "lic100":
                            vTipoPmFinale = "LIQUIDA";
                            vIdratazionePmFinale = 100;
                            break;
                        case "lic130":
                            vTipoPmFinale = "LIQUIDA";
                            vIdratazionePmFinale = 130;
                            break;
                        default:
                            vTipoPmFinale = "";
                    }
                    // altrimenti faccio il rapporto partendo dalla quantità del lievito di birra

                    // ricavo la quantità di lievito di birra
                    vQuantitaLdbPartenza = parseInt(this.$el.find('#qtaLvStart').val());

                    // ricavo il tipo di lievito di birra
                    vTipoLdbPartenza = this.$el.find("#typeLvStart").val();

                    if (!isNaN(vQuantitaLdbPartenza)) {
                        if (vQuantitaLdbPartenza > 0) {
                            if (vTipoLdbPartenza == "ldbs") {
                                // 6 ldb = 240 PM
                                vQuantitaPmConsigliata = (240 / 6) * vQuantitaLdbPartenza;
                            }
                            else {
                                // 15 ldb = 240 PM
                                vQuantitaPmConsigliata = (240 / 15) * vQuantitaLdbPartenza;
                            }

                            // SE IL RISULTATO OTTENUTO E' IRRAGIONEVOLE LO CORREGGO
                            switch (this.$el.find('#typeLvDest').val()) {
                                case "pm":
                                    vQuantitaPmConsigliataMax = (vQuantitaFarinaPartenza / 100) * rapportoPmSolidaFarina;
                                    break;
                                case "lic100":
                                    vQuantitaPmConsigliataMax = (vQuantitaFarinaPartenza / 100) * rapportoPm100Farina;
                                    break;
                                case "lic130":
                                    vQuantitaPmConsigliataMax = (vQuantitaFarinaPartenza / 100) * rapportoPm130Farina;
                                    break;
                                default:
                                    vQuantitaPmConsigliataMax = 0;
                            }
                            if (vQuantitaPmConsigliata > vQuantitaPmConsigliataMax) {
                                vQuantitaPmConsigliata = vQuantitaPmConsigliataMax;
                            }


                        }
                        else {
                            vQuantitaPmConsigliata = 0;
                            alert("Impossibile calcolare\nAccertati di aver scritto bene la quantita'\ndi lievito di birra nella ricetta originale.");
                        }
                    }
                    else {
                        vQuantitaPmConsigliata = 0;
                        alert("Impossibile calcolare\nAccertati di aver scritto bene la quantita'\ndi lievito di birra nella ricetta originale.");
                    }
                }
                return vQuantitaPmConsigliata;

            },

            //render the content into div of view
            render: function(){
                //this.header.title = "pippo";
                ConverterView.__super__.render.call(this);
                //this.el is the root element of Backbone.View. By default, it is a div.
                //$el is cached jQuery object for the view's element.
                //append the compiled template into view div container
                var self = this;
                this.$el.append(this.header.$el);
                this.$el.append(this.template({ deviceWidth: myManifest.Settings.Device.Width }));
                this.$el.append(this.footer.$el);

                //this.$el.find("#popupConvertResult").css("max-width", myManifest.Settings.Device.Width + "px" );

                jQuery.validator.addMethod("cRequired", $.validator.methods.required,
                    "Il campo è richiesto, si prega di completarlo");

                jQuery.validator.addMethod("requireIf", function(value, element, params) {
                    if(self.$el.find('#typeLvStart').val() != "ldbf" &&
                       self.$el.find('#typeLvStart').val() != "ldbs")
                    {
                        return value!="";
                    }
                    return true;
                }, jQuery.validator.format("Il campo è richiesto, si prega di completarlo"));

                jQuery.validator.addClassRules("cRequireIf", {
                    requireIf: true
                });

                jQuery.validator.addClassRules("cRequired", {
                    cRequired: true
                });

                this.$el.find("#inputForm").validate({
                    submitHandler: function() {
                        self.calculateConvert();
                    }
                });
                this.$el.find("#moreBtn").addClass("ui-btn-active");
                //$("#homeBtn").addClass("ui-btn-active");
                //return to enable chained calls
                return this;
            }
        });
        return ConverterView;
    });