window.addEvent("domready", function () {
	 /**
     * l'array settings deve avere la seguente struttura:
     * 'form' => id del form in cui caricare gli input invisibili
     * 'container' => id del container in cui generare la lista
     * */
	var settings = {
            'sender':'article_id',
            'descContainer':'desc_container',
            'optionsContainer':'options_container',
            'selectionContainer':'selection_container',
            'articleSelect':'data[Article][id]',
            'width':'data[Article][width]',
            'height':'data[Article][height]',
            'format':'data[Article][format]',
            'copies':'data[Article][copies]',
            'loader':'loadbar',
            'estimateId':'estimate_id',
            'emailId':'email_id',
            'privacyId':'privacy_id',
            'privacyCheck':'privacy_check',
            'privacyInfo':'privacy_info',
            'privacyHide':'privacy_hide',
            'advice':'options_advice',
            'total':'estimate_total',
            'price':'estimate_article',
            'estimate': 'action',
            'contact': 'mailing',
            'estimateBtn':'estimate_btn',
            'cleanBtn':'clean_btn',
            'emailBtn':'email_btn',
            'emailField':'email_field',
            'nameField':'name_field',
            'contactCheck':'contact_check',
            'telField':'tel_field',
            'noteField':'note_field'
        };
    var messages = {
	    //inserire poi i messaggi necessari    
    }
     /**
     * ELEMENTI NECESSARI PER LA GESTIONE
     */
    //container per la select dell'articolo
    selectionContainer = $(settings.selectionContainer);
    //select dell'articolo
    articleSelect = selectionContainer.getElement('[name="'+settings.articleSelect+'"]');
    //select del format
    formatSelect = selectionContainer.getElement('[name="'+settings.format+'"]');
    //input della width
    inputWidth = selectionContainer.getElement('[name="'+settings.width+'"]');
    //input della height
    inputHeight = selectionContainer.getElement('[name="'+settings.height+'"]');
    //input delle copies
    inputCopies = selectionContainer.getElement('[name="'+settings.copies+'"]');
    
    //array dei formati disponibili
    formats = false;
    
    //dati del preventivo
    estimateData = false;
    
    //div contenente la descrizione e l'immagine
    descContainer = $(settings.descContainer);
    //div contenente le opzioni dell'articolo scelto
    optionsContainer = $(settings.optionsContainer);
    
    //link visualizza info privacy
    privacy = $(settings.privacyId);
    //checkbox privacy
    privacyCheck = $(settings.privacyCheck);
    //container privacy
    privacyInfo = $(settings.privacyInfo);
    //altezza massima container (verrà settata alla prima richiesta)
    privacyHeight = 0;
    
    
    //si occupa della creazione del widget che effettivamente 
    //gestisce immagine e testo per l'articolo selezionato
	descManager = new DescriptionManagerWidget(descContainer);
    
    //si occupa della creazione del widget che effettivamente 
    //gestisce le opzioni per l'articolo selezionato
	optionsManager = new OptionsManagerWidget(optionsContainer);
    
    //tiene traccia del numero minimo di copie per il formato scelto
    minCopies = 0;
    
    computeClass = "." + settings.estimate + " ." + settings.estimateBtn;
    cleanClass = "." + settings.estimate + " ." + settings.cleanBtn;
    emailClass = " ." + settings.emailBtn;
    
     /**
     * FUNZIONI DI UTILITA' PER LA GESTIONE
     */
    
    //funzione di pulizia della select format
    populateFormats = function(tmpFormats) {
       formatSelect.getChildren().destroy();
        if(!tmpFormats){
           var opt = new Element('option',{'label':' ','value':0});
           opt.inject(formatSelect);
        }else{
            tmpFormats.each(function(item,index){
                var opt = new Element('option',{'text':item.label,'value':index});
                opt.inject(formatSelect);
            }.bind(this));
        }
        formats = tmpFormats;
	};
    
    //funzione di pulizia della view principale
    cleanView = function() {
        $(settings.total).set('text','0.00 Euro');
        cleanErrors();
	};
    
    //funzione di gestione visibilità loader
    showLoader = function(state) {
        var className = "." + settings.loader;
        if (state) {
            $$(className).removeClass('invisible');
        }else{
            $$(className).addClass('invisible');
        }
	};
    //funzione di gestione visibilità loader
    showSend = function(e) {
        if(privacyCheck.getProperty('checked') === true){
            $$(emailClass).removeClass('hr');
        }else{
            $$(emailClass).addClass('hr');
        }
	};
    //funzione di pulizia degli errori
    cleanErrors = function() {
        var err;
        var className = "." + settings.estimate + " .error";
        err = $$(className).dispose();
        cleanEmailErrors();
	};
    //funzione di pulizia degli errori
    cleanEmailErrors = function() {
        var err;
        var className = "." + settings.contact + " .error";
        err = $$(className).dispose();
	};
    
    //disabilita input o select per formato e altezza/base
    disableParamElement = function(item){
        item.setProperty('disabled',true);
        item.getParent().addClass('disabled');
    };
    //abilita input o select per formato e altezza/base
    enableParamElement = function(item){
        item.setProperty('disabled',false);
        if (item.getParent().hasClass('disabled')) {
            item.getParent().removeClass('disabled');
        }
    };
    //abilita input o select per formato e altezza/base
    checkDimensions = function(w,h){
        if(inputHeight.getProperty('disabled') && inputWidth.getProperty('disabled')){
            return true;
        }
        var spotted = -1;
        formats.each(function(item,index){
            var wxh = (w <= (item.width*1) && h <= (item.height*1))? true : false;
            var hxw = (w <= (item.height*1) && h <= (item.width*1))? true : false;
            if((wxh || hxw) && spotted == -1){
                spotted = index;
            }
        }.bind(this));
        if(spotted != -1){
            alert('Le misure da voi inserite corrispondono ad un formato esistente. Le impostazioni saranno modificate di conseguenza.');
            formatSelect.selectedIndex = spotted;
            formatSelect.fireEvent('change');
        }
        return true;    
    };
    //mostra stringa di errore
    showError = function(error,whereClass){
        var err = new Element('span',{'class':'error'});
        var acthung = new Element('b');
        acthung.set('text','Attenzione! ');
        acthung.inject(err);
        err.appendText(error);
        var className = "." + whereClass;
        $$(className).each(function(el) {
            var toInject = err.clone();
            toInject.inject(el,'bottom');
        });
        err.dispose();
    };
    
    /**
     * FUNZIONI DI CALLBACK X EVENTI
     */
    //callback per invio email
    emailDone = function(e) {
        showLoader(false);
        var result = JSON.decode(e);  
        if(result == null){
            return;
        }
        if(result.error == undefined){
            alert(result.success);
        }else{
            showError(result.error,settings.contact);
        }
	};
    //callback per tasto clean
    emailCalled = function(e) {
        cleanEmailErrors();
        var addressClass = "."+settings.emailField;
        var address = $$(addressClass).get('value');
       
        if(address == ""){
            showError('Specificare un indirizzo email.',settings.contact);
            return;
        }
        
        var nameClass = "."+settings.nameField;
        var name = $$(nameClass).get('value');
        if(name == ""){
            showError('Specificare il proprio nome.',settings.contact);
            return;
        }
        
        if(!estimateData){
            showError('Nessun preventivo calcolato.',settings.contact);
            return;
        }
        var contactMeClass = "."+settings.contactCheck;
        var contactMe = $$(contactMeClass).getProperty('checked');
        var noteClass = "."+settings.noteField;
        var note = $$(noteClass).get('value');
        var telClass = "."+settings.telField;
        var tel = $$(telClass).get('value');
        showLoader(true);
        var req = new Request({
              method: 'post',
              url: $(settings.emailId).get('href'),
              data: { 'data[Article]' : estimateData,
                      'data[To]' : address[0],
                      'data[Mail][contactMe]' : contactMe[0],
                      'data[Mail][name]' : name[0],
                      'data[Mail][tel]' : tel[0],
                      'data[Mail][note]' : note[0]
                    },
              onSuccess : function(responseText,responseXML){emailDone(responseText)}
              }).send();
	};
    //callback per tasto privacy
    privacyCalled = function(e) {
        e.preventDefault();
        var check = privacyInfo.hasClass('hr');
        
        if (check) {
            var req = new Request.HTML({
                method: 'get',
                url: privacy.get('href'),
                
                onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript){
                    
                    var html = privacyInfo.get('html');
                    html = html + responseHTML;
                    privacyInfo.set('html',html);
                   
                    //link nascondi info privacy
                    privacyHide = $(settings.privacyHide);
                    privacyHide.addEvent('click', privacyHideCalled);
                    
                    privacyInfo.setStyles({
                        'position':'absolute',
                        'top':-10000,
                        'left':-10000
                    });
                       
                    privacyInfo.removeClass('hr');
                    
                    privacyHeight = privacyInfo.getSize().y;
                    
                    privacyInfo.setStyles({
                        'height':0,
                        'position':'relative',
                        'top':'auto',
                        'left':'auto'
                    });
                    
                    privacyInfo.set('morph', { 
                        duration: 'normal', 
                        transition: Fx.Transitions.Sine.easeOut
                    })
                    
                    privacyInfo.morph({
                        'height': [0,privacyHeight]
                    });

                }
            }).send();
        }else{
             privacyInfo.morph({
                        'height': [0,privacyHeight]
                    });
        }
	};
    //callback per tasto privacyHide
    privacyHideCalled = function(e) {
        e.preventDefault();
        var myEffect = new Fx.Morph(privacyInfo, {duration: 'long', transition: Fx.Transitions.Sine.easeOut});
        privacyInfo.morph({
            'height': [privacyHeight,0]
        });
        
	};
    //callback per tasto clean
    cleanCalled = function() {
        articleSelect.selectedIndex = 0;
        articleSelect.fireEvent('change');
        var inputs = selectionContainer.getElements('input');
        inputs.each(function(input){
            input.set('value','');
        });
        $$('input[name="' + settings.copies + '"]').set('value',1);
	};
    //callback per calcolo completato
    estimateDone = function(e) {
        showLoader(false);
        var result = JSON.decode(e);  
        if(result == null){
            return;
        }
        if(result.error == undefined){
            $(settings.total).set('text',result.article.total + " Euro");
            optionsManager.manageEstimate(result.options);
            estimateData = result;
        }else{
            estimateData = false;
            showError(result.error,settings.estimate);
        }
	};
    //callback per chiamata calcolo
    estimateCalled = function(e) {
        cleanErrors();
        var w = inputWidth.getProperty('value');
        var h = inputHeight.getProperty('value');
        var qt = inputCopies.getProperty('value');
        if(!w || !h ||!qt){
            showError('Compilare tutti i campi per eseguire il calcolo. Controllare base e altezza.',settings.estimate);
            return;
        }
        var bool = checkDimensions(w,h);
        var index = formatSelect.get('value');
        var formatData = formats[index];
        var nextFormatData;
        if(index == (formats.length - 1)){
            nextFormatData = formatData;
        }else{
            index++;
            nextFormatData = formats[index];
        }
        if(articleSelect.getProperty('value') != '*'){
            showLoader(true);
            var req = new Request({
              method: 'post',
              url: $(settings.estimateId).get('href'),
              data: { 'data[Article][id]' : articleSelect.getProperty('value'),
                      'data[Article][width]' : w,
                      'data[Article][height]' : h,
                      'data[Article][copies]' : qt,
                      'data[Article][formatId]' : formatData.id,
                      'data[Article][calculation]' : formatData.calculation,
                      'data[Article][nextFormat]' : nextFormatData.id,
                      'data[Article][nextCalc]' : nextFormatData.calculation,
                      'data[Options]' : optionsManager.getEstimateData()
                    },
              onSuccess : function(responseText,responseXML){estimateDone(responseText)}
              }).send();
        }else{
            showError('Selezionare un supporto',settings.estimate);
        }
	};
    
    //callback per caricamento completato
    dataReceived = function(e) {
        showLoader(false);
        var result = JSON.decode(e);  
        if(result == null){
            showError('Articolo non valido',settings.estimate);
            return;
        }
        descManager.manageResult(result.desc);
        if (result.formats) {
            enableParamElement(formatSelect); 
            populateFormats(result.formats);
            formatSelect.selectedIndex = 0;
            formatSelect.fireEvent('change');
        }else{
            disableParamElement(formatSelect);
            populateFormats(false);
            disableParamElement(inputWidth); 
            disableParamElement(inputHeight);
            showError("Non sono presenti formati per l'articolo selezionato",settings.estimate);
        }        
        
        if (result.options.length > 0) {
            optionsManager.manageResult(result.options);
            $(settings.advice).addClass('hr');
        }else{
            if ($(settings.advice).hasClass('hr')) {
                $(settings.advice).removeClass('hr');
            }
        }
	};
    
    //callback selezione di un articolo
    selectionDone = function() {
        optionsManager.clean();
        
        cleanView();
        if(this.getProperty('value') != '*'){
            showLoader(true);
            var req = new Request({
              method: 'post',
              url: $(settings.sender).get('href'),
              data: { 'data[Article][id]' : this.getProperty('value') },
              onSuccess : function(responseText,responseXML){dataReceived(responseText)}
              }).send();
        }else{
            if ($(settings.advice).hasClass('hr')) {
                $(settings.advice).removeClass('hr');
            }
            disableParamElement(formatSelect); 
            disableParamElement(inputWidth); 
            disableParamElement(inputHeight);
            populateFormats(false);
            descManager.clean();
        }
	};
    
    //callback selezione di un formato
    formatChoiche = function(){
        var index = formatSelect.get('value');
        var formatData = formats[index];
        if(formatData.calculation == 'al pezzo'){
            disableParamElement(inputWidth);
            inputWidth.set('value',formatData.width); 
            disableParamElement(inputHeight);
            inputHeight.set('value',formatData.height); 
            inputCopies.set('value',formatData.min);
            minCopies = formatData.min;
        }else{
            enableParamElement(inputWidth);
            inputWidth.set('value',''); 
            enableParamElement(inputHeight);
            inputHeight.set('value',''); 
            inputCopies.set('value',1);
            minCopies = 1;
        }
        var label = inputCopies.getPrevious('label');
        label.set('text','Copie (Min. '+ minCopies +'):');
    };
    
    //callback cambio numero copie
    checkCopies = function(){
        var copies = inputCopies.get('value');
        var check = copies.test('^[0-9]*$');
        if (copies < minCopies || !check){
            inputCopies.set('value', minCopies);
        }
    };
    
    /**
     * AGGIUNGO EVENT LISTENERS
    */
    
    articleSelect.addEvent('change',selectionDone);
    formatSelect.addEvent('change',formatChoiche);
    inputCopies.addEvent('change',checkCopies);
    $$(computeClass).addEvent('click', estimateCalled);
    $$(cleanClass).addEvent('click', cleanCalled);
    $$(emailClass).addEvent('click', emailCalled);
    privacy.addEvent('click', privacyCalled);
    privacyCheck.addEvent('click', showSend);
    
    /**
     * OPERAZIONI DA SVOLGERE AL CARICAMENTO DELLA PAGINA
     */
    cleanCalled();
});
