
var g_app = {
    
    _wizardController: null,
    _tipOptions: {
        className: 'glossary',
        maxTitleChars: 30,
        errTitle: 'Glossaire',
        errText: "La définition n'a pas été trouvée. Nous vous prions de nous excuser pour ce problème ...",
        loadingText: "Chargement ..."
    },
    _cddMenuOptions: {
        showOnClick: true,
        showOnMouseEnter: false,
        className: 'cdd-menu',
        maxTitleChars: 30,
        fixed: true,
        offsets: {'x': 0, 'y': 19},
        onShow: function(tip) {
            tip.setStyle('visibility', 'visible');
            tip.removeEvents('click');
            tip.addEvent('click', function(event) {
                var target = event.target;
                if (target.tagName == 'LI') {
                    var action = target.id.split('_');
                    if (action && action.length == 2) {
                        eval(action[0]+'('+action[1]+")");
                    }
                }
            }.bindWithEvent(tip));
        },
        onHide: function(tip) {
            tip.setStyle('visibility', 'hidden');
            tip.removeEvents('click');
        }
    },
    _cddMenu: null,

    init: function() {
        var tips = $$('.mootip');
        if (tips != null && tips.length > 0) {
            new MooTips(tips, g_app._tipOptions);
        }
        var menus = $$('.cdd-menu');
        if (menus != null && menus.length > 0) {
            g_app._cddMenu = new MooTips(menus, g_app._cddMenuOptions);
        }
        
        var screen_container = $('screen-container');
        if (screen_container) {
            g_app._wizardController = new WizardController();
            g_app._wizardController.processCode(screen_container, true);
        }
        
        var scroller = new SmoothScroll({
            wait: false,
            duration: 500,
            links: $ES('.top-link'),
            transition: Fx.Transitions.Circ.easeOut
        });
        
        buildSlideEffects('more-toggler', 'more-info');
    }
};

var WizardController = new Class({
    
    _processing: false,
    _wizard_scroll: new Fx.Scroll(window, {
        transition: Fx.Transitions.Circ.easeInOut,
        duration: 300
    }),
    _imask: null,
    _loadingBox: null,
    
    processCode: function(screen_container, firstPage) {

        var wizardActionElements = $$('div.wizard-action');
        for(var i = 0; i < wizardActionElements.length; i++) {
            var classes = wizardActionElements[i].className.split(' ');
            for(var j = 0; j < classes.length; j++) {
                if (classes[j].indexOf('wizard_button_') == 0 && classes[j].indexOf('_disabled') == -1) {
                    var action = classes[j].substr(14);
                    wizardActionElements[i].addEvent('click', this.handleAction.bind(this, action));
                    break;
                }
           }
        }
        var wizardActionLink = $$('a.wizard-action');
        for(var i = 0; i < wizardActionLink.length; i++) {
            var id = wizardActionLink[i].id;
            if (id.indexOf('link_') == 0) {
                var action = id.substr(5);
                wizardActionLink[i].addEvent('click', this.handleActionLink.bindWithEvent(this, action));
            }
        }
        
        this.helpSideBar = new SideBar(screen_container, '.sidebar', {
            position : 'left',
            showDuration: 500,
            showTransition: Fx.Transitions.Circ.easeOut,
            hideDuration: 500,
            hideTransition: Fx.Transitions.Circ.easeIn,
            padding: [0, 20, 0, 0],
            onContentLoaded: function(loadedContent) {
                $ES('a', loadedContent).each(function(a) {
                    var i = a.href.indexOf('/layout/set/ajax');
                    if (i > -1) {
                        a.href = a.href.substring(0, i) + a.href.substring(i + 16);
                    }
                })
            },
            onShowStart: function(sidebar) {
                var closeButton = $('wizard-close-button');
                closeButton.setStyle('display', 'none');
            },
            onHideComplete: function(sidebar) {
                var closeButton = $('wizard-close-button');
                closeButton.setStyle('display', 'block');
            }
        });
        
        $ES('input, textarea', screen_container).each(function(element) {
           if (element.getTag() == 'input' && element.getProperty('type') == 'text' && element.getProperty('readonly') != 'true') {
               element.addEvent('focus', function(event, element) {
                   element.select();
               }.bindWithEvent(this, element));
           } else {
               element.addEvent('focus', function(event, element) {
                   element.select();
               }.bindWithEvent(this, element));
           }
        });
        
        if (firstPage) {
            this.baseFormUrl = $('wizard-form').action;
            this._imask = new iMask();
            this._loadingBox = new Moobox('waitbox-inner', {
                BoxStyles: {
                    'width': 100
                },
                OverlayStyles: {
                    'background-color': '#ffffff',
                    'opacity': 0.3
                },                
                showDuration: 200,
                showEffect: Fx.Transitions.linear,
                closeDuration: 100,
                closeEffect: Fx.Transitions.linear,
                moveDuration: 0,
                scrollBox: false
            });
        } else {
            var tips = $ES('.mootip', screen_container);
            if (tips != null && tips.length > 0) {
                new MooTips(tips, g_app._tipOptions);
            }
            this._imask.initFields();
            buildSlideEffects('more-toggler', 'more-info');
        }
    },
    
    handleActionLink: function(event, action) {
        event.preventDefault();
        this.handleAction(action);
    },
    
    handleAction: function(action) {
        if (this._canProcessAction()) {
            $closeAllDatePickers();
            var wizardForm = $('wizard-form');
            wizardForm.action = this.baseFormUrl + "/" + action;
            this.createIdField(wizardForm);
            this._startProcessing();
            var ajax = wizardForm.send({
                method: 'post',
                evalScripts: false,
                onFailure: function() {
                    // FIXME
                    this._stopProcessing();
                }.bind(this),
                onSuccess: function(responseText, responseXml) {
                    this._handleResponse(ajax, wizardForm, responseText);
                }.bind(this)
            });
        }
    },
    
    createIdField: function( form ) {
    	var wizardIdField = new Element('input', {
			    'name': 'wizardId',
			    'type': 'hidden',
			    'value': window.wizardId
			});
    	form.adopt(wizardIdField);
    },
    
    invoke: function(methodName, args) {
        if (this._canProcessAction()) {
            var actionUrl = this.baseFormUrl + "/invoke";
            var queryString = this._buildQueryString(methodName, args);
            var wizardForm = $('wizard-form');
            this._startProcessing();
            var ajax = new Ajax(actionUrl, {
                method: 'get',
                data: queryString,
                evalScripts: false,
                onFailure: function() {
                    // FIXME
                    this._stopProcessing();
                }.bind(this),
                onSuccess: function(responseText, responseXml) {
                    this._handleResponse(ajax, wizardForm, responseText);
                }.bind(this)
            }); 
            ajax.request();
        }
    },
    
    _buildQueryString: function(methodName, args) {
        var queryString = [];
        queryString.push('method=' + methodName);
        queryString.push('wizardId=' + window.wizardId);
        args.each(function(arg) {
            var element = $(arg);
            if (element) {
                var name = element.name;
                var value = element.getValue();
                if (value === false || !name || element.disabled) {
                    return;
                } else {
                    queryString.push(name + '=' + encodeURIComponent(value));
                }
            }
        });
        return queryString.join('&');
    },
    
    _handleResponse: function(ajax, wizardForm, response) {
        response = response.trim();
        if (response.indexOf('{') == 0) {
            var response = Json.evaluate(response);
            if (response.status == 'error') {
                var fields = response.params.fields;
                if (fields) {
                    var divFields = $$('div.form_field', wizardForm);
                    for(var i = 0; i < divFields.length; i++) {
                        var id = divFields[i].getProperty('fieldId');
                        if (fields[id] != null) {
                            if (fields[id] == true) {
                                divFields[i].removeClass('form_field_error');
                                divFields[i].getElement('span.field-error').setText('');
                            } else {
                                divFields[i].addClass('form_field_error');
                                divFields[i].getElement('span.field-error').setText(fields[id]);
                            }
                        }
                    }
                }
                this._stopProcessing();
            } else if (response.status == 'exit') {
            	removeConfirmQuit();
                window.location = response.url;
            } else if (response.status == 'fatal') {
                // FIXME
                // this._stopProcessing();
            } else if (response.status == 'update') {
                var values = response.values;
                if (values) {
                    var divFields = $$('div.form_field', wizardForm);
                    for(var i = 0; i < divFields.length; i++) {
                        divFields[i].removeClass('form_field_error');
                        divFields[i].getElement('span.field-error').setText('');
                    }
                    for(name in values) {
                        var element = $(name);
                        if (element) {
                            if (element.getTag() == 'input') {
                                element.value = values[name];
                                element.fireEvent('change');
                            } else if (element.getTag() == 'div' || element.getTag() == 'span') {
                                element.setText(values[name]);
                            }
                        }
                    }
                }
                this._stopProcessing();
            } else {
                this._stopProcessing();
            }
        } else {
            if (response.indexOf('<!DOCTYPE html') == -1 && response.indexOf('<b>Fatal error</b>') == -1) {
                this._wizard_scroll.scrollTo(0, 170); //toElement('contentCell');
                var screen_container = $('screen-container');
                screen_container.empty();
                screen_container.setHTML(response);
                ajax.evalScripts();
                this.processCode(screen_container, false);
            } else {
                // FIXME
            }
            this._stopProcessing();
        }
    },
    
    _startProcessing: function() {
        this._processing = true;
        this._loadingBox.show();
    },
    
    _stopProcessing: function() {
        this._processing = false;
        this._loadingBox.hide();
    },
    
    _canProcessAction: function() {
        return ! this._processing;
    }
});

function notImplemented(message) {
    if (message) {
        alert(message);
    } else {
        alert("Cette fonctionnalité n'est pas encore implémentée !");
    }
    return false;
}

function beforeQuit(e) {
    if (typeof e == 'undefined') {
        e = window.event;
    }
    if (e) {
        e.returnValue = confirmQuitMessage;
    }
    return confirmQuitMessage;
}

var confirmQuitMessage = '';
function addConfirmQuit(msg) {
    confirmQuitMessage = msg;
    window.addEvent("beforeunload", beforeQuit);
}

function removeConfirmQuit() {
    window.removeEvent("beforeunload", beforeQuit);
}

function buildSlideEffects(togglerClass, slideeClass) {
    function disableFields(slideeElement){
		$ES('button', slideeElement).each(function(elem) { elem.disabled = true; });
		$ES('input', slideeElement).each(function(elem) { elem.setProperty('readonly', 'readonly');	});
	}
    
    function enableFields(slideeElement){
		$ES('button', slideeElement).each(function(elem) { elem.disabled = false; });
		$ES('input', slideeElement).each(function(elem) { elem.removeProperty('readonly'); });
	}
	
	$ES('.'+togglerClass).each(function(toggler) {
        var slideeElement = toggler.getNext();
        if(slideeElement && slideeElement.hasClass(slideeClass)) {
            var togglerButton = $E('div', toggler);
            var slideFx = new Fx.Slide(slideeElement, {
                transition: Fx.Transitions.Circ.easeInOut,
                duration: 500,
                onComplete: function() {
                    if (slideFx.open) {
                        togglerButton.removeClass('more-toggler-close').addClass('more-toggler-open');
                        disableFields(slideeElement);
                    } else {
                        togglerButton.removeClass('more-toggler-open').addClass('more-toggler-close');
                        enableFields(slideeElement);
                    }
                }
            });
            
            if (togglerButton.hasClass('more-toggler-close')) {
                slideFx.show();
                enableFields(slideeElement);
            } else {
                slideFx.hide();
                disableFields(slideeElement);
            }
            
            
            
            toggler.addEvent('click', function() {
                 slideFx.toggle(); 
            });
        } 
    });
}

function invokeOnChange(methodName, args) {
      g_app._wizardController.invoke(methodName, args);
}
    
function changeDatePicker(id) {
    var date = $(id).getValue().split('/');
    if (date[2].length < 4) {
        date[2] = "20" + date[2];
    }
    $getDatePicker(id).setSelectedDate(date[2],date[1],date[0]);
}

function getForm(element) {
    var form = $(element).getParent();
    while(form.getTag() != "form") {
        form = form.getParent();
    }
    return form;
}

function submitCasRecours(selectElement) {
    selectElement = $(selectElement);
    var value = selectElement.options[selectElement.selectedIndex].value;
    var form = getForm(selectElement);
    if (value != '--') {
        var action = form.getProperty('action') + '/CasRecours/' + value;
        form.setProperty('action', action);
    }
    form.submit();
    return false;
}

function updateValidateButton(buttonClass, clickHandler) {
    var wizardActionElements = $$('div.wizard-action');
    for(var i = 0; i < wizardActionElements.length; i++) {
        var classes = wizardActionElements[i].className.split(' ');
        for(var j = 0; j < classes.length; j++) {
            if (classes[j] == buttonClass) {
                wizardActionElements[i].removeClass('wizard-action');
                wizardActionElements[i].addEvent('click', clickHandler);
                return;
            }
        }
    }
}

function submitWizardForm(url) {
    var form = $('wizard-form');
    form.setProperty('action', url);
    g_app._wizardController._startProcessing();
    form.submit();
}

function focusOn(element) {
    var element = $(element);
    if (element) {
        if (element.focus) {
            element.focus();
        }
        if (element.select) {
            element.select();
        }
    }
}
