// SPL-Life-Events -- Web application to manage administrative duties during major life events.
// By: Valéry Febvre <spl-devel@listes.servicepubliclocal.net>
//     Cyril Lacoux <spl-devel@listes.servicepubliclocal.net>
//     Emmanuel Raviart <spl-devel@listes.servicepubliclocal.net>
//     Thierry Dulieu <spl-devel@listes.servicepubliclocal.net>
//
// Copyright (C) 2007, 2008, 2009 CDC Numérique
// http://dev.servicepubliclocal.net
//
// This file is part of SPL-Life-Events.

if (!Array.indexOf) {
    Array.prototype.indexOf = function(obj) {
        for(var i=0; i<this.length; i++) {
            if (this[i] == obj) {
                return i;
            }
        }
        return -1;
    }
}

(function($) {
    
    /*
     * Ajoute la barre de boutons outils
     */
    $.fn.boutonsOutils = function() {
        // Retrieve URL of images from the URL of this JavaScript, because when used behind the
        // aggregator, the URL of images is changed.
        if (parent) {
            var title = parent.document.title;
        }
        else {
            var title = document.title;
        }

        var boutonImprimer = $('#imprimer');
        boutonImprimer.click(function(e) {
            window.print();
            e.preventDefault();
            e.stopPropagation();
            return false;
        });
        
        var boutonEnvoyer = $('#envoyer');
        boutonEnvoyer.click(function(e) {
            var url = location.href;
            window.location = 'mailto:?subject=' + escape(title)
                + '&body=' + escape(title + ' : ' + url);
            e.preventDefault();
            e.stopPropagation();
            return false;
        });
        
        var boutonFavoris = $('#favoris');
        boutonFavoris.click(function(e) {
            var url = location.href;
            if (window.sidebar) { // Mozilla Firefox Bookmark
                window.sidebar.addPanel(title, url, "");
            } else if( window.external ) { // IE Favorite
                window.external.AddFavorite(url, title);
            }
            e.preventDefault();
            e.stopPropagation();
            return false;
        });
        
        return this;
    }
             
    /*
     * Adapte le style de la bannière en fonction de sa largeur
     */
    $.fn.adapterBanniere = function() {
        if ($(this).width() > 700) {
            $(this).addClass("large");
        } else {
            $(this).removeClass("large");
        }
        return this;
    };
    
    /*
     * Ajoute les liens tout deplier/tout replier
     */
    $.fn.liensDeplierReplier = function() {
        var lienDeplier = $('#unfold-all');
        lienDeplier.click(function(e) {
            $(".rubrique").each(function() {
                $(this).addClass('deployee');
                $(this).parents("tr:eq(0)").siblings().show();
            });
            $(".demarche").each(function() {
                $(this).addClass('deployee');
                $(this).siblings("a,p").show();
            });
            e.preventDefault();
            e.stopPropagation();
            return false;
        });
        
        var lienReplier = $('#fold-all');
        lienReplier.click(function(e) {
            $(".rubrique").each(function() {
                $(this).removeClass('deployee');
                $(this).parents("tr:eq(0)").siblings().hide();
            });
            $(".demarche").each(function() {
                $(this).removeClass('deployee');
                $(this).siblings("a,p").hide();
            });
            e.preventDefault();
            e.stopPropagation();
            return false;
        });
        
    return this;
    };
    
    /*
     * Génère les lignes du formulaire Mon foyer
     */
    function genererFoyer() {
        var n = $("#mon-foyer").find("tbody>tr").size();
        var aNbPersonnes = $("#taille_foyer").val();

        if (n > aNbPersonnes) {
            for (var i=n; i>aNbPersonnes; i--) {
                $("#mon-foyer").find("tbody>tr:last-child").remove();
            }
        } else if (n < aNbPersonnes) {
            for (var i=n+1; i<=aNbPersonnes; i++) {
                $("#mon-foyer tbody").append($(personRendering.replace(/666/g, '' + i)));
                $(".situation:last").situation();
                $(".calendrier:last").calendar({
                    minDate: new Date(1900, 0, 1),
                    maxDate: new Date()
                });
            }
        }
    }
    
    /*
     * Initialisation des rubriques
     */
    $.fn.initRubrique = function() {
        this.each(function() {
            $(this).removeClass("deployee");
            $(this).parents("tr:eq(0)").siblings().hide();
        
            $(this).click(function(e) {
                var siblings = $(this).parents("tr:eq(0)").siblings();
            
                if ($(this).is(".deployee")) {
                    $(this).removeClass("deployee");
                    siblings.hide();
                } else {
                    $(this).addClass("deployee");
                    siblings.show();
                }
                e.preventDefault();
                e.stopPropagation();
                return false;
            });
        });
        return this;
    };
    
    /*
     * Initialisation des demarches
     */
    $.fn.initDemarche = function() {
        this.each(function() {
            $(this).removeClass("deployee");
            $(this).siblings("a,p").hide();
            
            $(this).click(function(e) {
                if ($(this).is(".deployee")) {
                    $(this).removeClass("deployee");
                    $(this).siblings("a,p").hide();
                } else {
                    $(this).addClass("deployee");
                    $(this).siblings("a,p").show();
                }
                e.preventDefault();
                e.stopPropagation();        
                return false;
            });
        });
        return this;
    };
    
    function sortProcedures(element) {
        $('#bouton-actualiser').addClass('attente');
        window.setTimeout(
            function () {
                var clickedHead = $(element).parent();
                var table = $('fieldset#mes-demarches > fieldset.formulaire > table');
                var heads = $('thead > tr > th', table);
                var rowsGroups = [];
                var imagesPath = $('script[type="text/javascript"][src$="js/edv.js"]').attr('src');
                var agent = $('input[name=agent]').val();
                var procedure = $('input[name=procedure]').val();
                var lang = $('html').attr('lang'); // Hack to handle translations
                imagesPath = imagesPath.substring(0, imagesPath.length - '/static/js/edv.js'.length);
                if (clickedHead.hasClass('categorie')) {
                    $('input[name="tri"]').val('categorie');
                    //heads.eq(2).html('<a href="#" title="Trier par organisme">Organismes</a>').removeClass().addClass("logo organisme");
                    //heads.eq(3).html('<a href="#" title="Trier chronologiquement">Quand&nbsp;?</a>').removeClass().addClass("delai quand");
                    if (lang == 'fr') {
                        heads.eq(1).html('<a href="#" title="Trier par organisme">Organismes</a>').removeClass().addClass("logo organisme");
                        heads.eq(2).html('<a href="#" title="Trier chronologiquement">Quand&nbsp;?</a>').removeClass().addClass("delai quand");
                    } else if (lang == 'en') {
                        heads.eq(1).html('<a href="#" title="Sort by organization">Organizations</a>').removeClass().addClass("logo organisme");
                        heads.eq(2).html('<a href="#" title="Sort by date">When?</a>').removeClass().addClass("delai quand");
                    }
                    for (var i = 0; i < categoryPriorities.length; i ++) {
                        var categoryId = categoryPriorities[i][2];
                        var categoryDescription = categoryDescriptions[categoryId];
                        if (categoryDescription.size == 0)
                            continue;
                        var rowsGroup = $('<tbody></tbody>');
                        var row = $('<tr></tr>');
                        var cell = $('<td class="premiere" colspan="' + nbCols + '"></td>');
                        var link = $('<a class="rubrique deployee" href="javascript:;"><span>+</span></a>');
                        link.append(categoryDescription.title + ' (' + categoryDescription.size + ')');
                        cell.append(link);
                        row.append(cell);
                        rowsGroup.append(row);
                        for (var j = 0; j < procedurePriorities.length; j ++) {
                            var procedureId = procedurePriorities[j][2];
                            var procedureDescription = procedureDescriptions[procedureId];
                            if (procedureDescription.categories_symbol.indexOf(categoryId) < 0)
                                continue;
/*                            var procedureFieldName = procedureId.substring(1).replace('/', '-');*/
                            var logoId = procedureDescription.logo_id;
                            var logoDescription = logoDescriptions[logoId];
                            var chronologyDescription = chronologyDescriptions[procedureDescription.chronology_symbol];
                            row = $('<tr></tr>');
                            if (procedure && procedure == procedureId) {
                                row.addClass('active');
                            }
/*                            var checkbox = $('<input type="checkbox" class="case-a-faire" />').attr(*/
/*                                'name', procedureFieldName);*/
/*                            if ($(".case-a-faire[name='" + procedureFieldName + "']").attr('checked'))*/
/*                                checkbox.attr('checked', 'checked');*/
/*                            row.append($('<td class="a-faire"></td>').append(checkbox));*/
                            var td = $('<td class="description">');
                            var a = $('<a class="demarche deployee" href="javascript:;" name="demarche-' + procedureId + '"></a>');
                            a.text(procedureDescription.title);
                            a.prepend($('<span>+</span>'));
                            td.append(a);
                            if (procedureDescription.description)
                                td.append(procedureDescription.description);
                            row.append(td);
                            if (logoId)
                                row.append($('<td class="logo"></td>').append(
                                    $('<img class="logo-organisme" alt="Logo de l\'organisme" />').attr(
                                        'src', imagesPath + logoDescription.url)));
                            else
                                row.append($('<td class="logo">Organisme inconnu</td>'));
                            row.append($('<td class="delai"></td>').text(chronologyDescription.title));
                            if (agent) {
                                var html = '<td class="actions">';
                                html += '<a class="button" href="' + procedureDescription.back_office_url + '">';
                                html += 'Voir <img alt="" src="/static/img/icone-outils.gif" />';
                                html += '</a>';
                                if (procedureDescription.status) {
                                    html += '<br />' + procedureDescription.status;
                                }
                                html += '</td>';
                                html += '<td class="actions">' + (-procedurePriorities[j][0]) + '</td>';
                                row.append($(html));
                            }
                            rowsGroup.append(row);
                            rowsGroups.push(rowsGroup);
                        }
                    }

                } else if (clickedHead.hasClass('quand')) {
                    $('input[name="tri"]').val('quand');
                    //heads.eq(2).html('<a href="#" title="Trier par organisme">Organismes</a>').removeClass().addClass("logo organisme");
                    //heads.eq(3).html('<a href="#" title="Trier par cat&eacute;gorie">Cat&eacute;gories</a>').removeClass().addClass("delai categorie");
                    if (lang == 'fr') {
                        heads.eq(1).html('<a href="#" title="Trier par organisme">Organismes</a>').removeClass().addClass("logo organisme");
                        heads.eq(2).html('<a href="#" title="Trier par cat&eacute;gorie">Cat&eacute;gories</a>').removeClass().addClass("delai categorie");
                    } else if (lang == 'en') {
                        heads.eq(1).html('<a href="#" title="Order by organization">Organizations</a>').removeClass().addClass("logo organisme");
                        heads.eq(2).html('<a href="#" title="Order by category">Categories</a>').removeClass().addClass("delai categorie");
                    }
                    for (var i = 0; i < chronologyPriorities.length; i ++) {
                        var chronologyId = chronologyPriorities[i][2];
                        var chronologyDescription = chronologyDescriptions[chronologyId];
                        if (chronologyDescription.size == 0)
                            continue;
                        var rowsGroup = $('<tbody></tbody>');
                        var row = $('<tr></tr>');
                        var cell = $('<td class="premiere" colspan="' + nbCols + '"></td>');
                        var link = $('<a class="rubrique deployee" href="javascript:;"><span>+</span></a>');
                        link.append(chronologyDescription.title + ' (' + chronologyDescription.size + ')');
                        cell.append(link);
                        row.append(cell);
                        rowsGroup.append(row);
                        for (var j = 0; j < procedurePriorities.length; j ++) {
                            var procedureId = procedurePriorities[j][2];
                            var procedureDescription = procedureDescriptions[procedureId];
                            if (procedureDescription.chronology_symbol != chronologyId)
                                continue;
/*                            var procedureFieldName = procedureId.substring(1).replace('/', '-');*/
                            var logoId = procedureDescription.logo_id;
                            var logoDescription = logoDescriptions[logoId];
                            var categoriesTitle = '';
                            for (var k = 0; k < procedureDescription.categories_symbol.length; k ++) {
                                var categoryId = procedureDescription.categories_symbol[k];
                                var categoryTitle = categoryDescriptions[categoryId].title;
                                if (categoryTitle) {
                                    if (categoriesTitle)
                                        categoriesTitle += ', ';
                                    categoriesTitle += categoryTitle;
                                }
                            }
                            row = $('<tr></tr>');
                            if (procedure && procedure == procedureId) {
                                row.addClass('active');
                            }
/*                            var checkbox = $('<input type="checkbox" class="case-a-faire" />').attr(*/
/*                                'name', procedureFieldName);*/
/*                            if ($(".case-a-faire[name='" + procedureFieldName + "']").attr('checked'))*/
/*                                checkbox.attr('checked', 'checked');*/
/*                            row.append($('<td class="a-faire"></td>').append(checkbox));*/
                            var td = $('<td class="description">');
                            var a = $('<a class="demarche deployee" href="javascript:;" name="demarche-' + procedureId + '"></a>');
                            a.text(procedureDescription.title);
                            a.prepend($('<span>+</span>'));
                            td.append(a);
                            if (procedureDescription.description)
                                td.append(procedureDescription.description);
                            row.append(td);
                            if (logoId)
                                row.append($('<td class="logo"></td>').append(
                                    $('<img class="logo-organisme" alt="Logo de l\'organisme" />').attr(
                                        'src', imagesPath + logoDescription.url)));
                            else
                                row.append($('<td class="logo">Organisme inconnu</td>'));
                            row.append($('<td class="delai"></td>').text(categoriesTitle));
                            if (agent) {
                                var html = '<td class="actions">';
                                html += '<a class="button" href="' + procedureDescription.back_office_url + '">';
                                html += 'Voir <img alt="" src="/static/img/icone-outils.gif" />';
                                html += '</a>';
                                if (procedureDescription.status) {
                                    html += '<br />' + procedureDescription.status;
                                }
                                html += '</td>';
                                html += '<td class="actions">' + (-procedurePriorities[j][0]) + '</td>';
                                row.append($(html));
                            }
                            rowsGroup.append(row);
                            rowsGroups.push(rowsGroup);
                        }
                    }
                } else { // Sort by organism.
                    $('input[name="tri"]').val('organisme');
                    //heads.eq(1).html('<a href="#" title="Trier par cat&eacute;gorie">Cat&eacute;gories</a>').removeClass().addClass("logo categorie");
                    //heads.eq(2).html('<a href="#" title="Trier chronologiquement">Quand&nbsp;?</a>').removeClass().addClass("delai quand");
                    if (lang == 'fr') {
                        heads.eq(1).html('<a href="#" title="Trier par cat&eacute;gorie">Cat&eacute;gories</a>').removeClass().addClass("logo categorie");
                        heads.eq(2).html('<a href="#" title="Trier chronologiquement">Quand&nbsp;?</a>').removeClass().addClass("delai quand");
                    } else if (lang == 'en') {
                        heads.eq(1).html('<a href="#" title="Order by category">Categories</a>').removeClass().addClass("logo categorie");
                        heads.eq(2).html('<a href="#" title="Order by date">When?</a>').removeClass().addClass("delai quand");
                    }
                    for (var i = 0; i < logoPriorities.length; i ++) {
                        var logoId = logoPriorities[i][2];
                        var logoDescription = logoDescriptions[logoId];
                        if (logoDescription.size == 0)
                            continue;
                        var rowsGroup = $('<tbody></tbody>');
                        var row = $('<tr></tr>');
                        var cell = $('<td class="premiere" colspan="' + nbCols + '"></td>');
                        var link = $('<a class="rubrique deployee" href="javascript:;"><span>+</span></a>');
                        link.append($('<img class="logo-organisme" alt="Logo de l\'organisme" />').attr(
                            'src', imagesPath + logoDescription.url));
                        link.append(' (' + logoDescription.size + ' ')
                        if (lang == 'fr') {
                            if (logoDescription.size > 1) {
                                link.append('d&eacute;marches');
                            } else {
                                link.append('d&eacute;marche');
                            }
                        } else if (lang == 'en') {
                            if (logoDescription.size > 1) {
                                link.append('formalities');
                            } else {
                                link.append('formality');
                            }
                        }
                        link.append(')');
                        cell.append(link);
                        row.append(cell);
                        rowsGroup.append(row);
                        for (var j = 0; j < procedurePriorities.length; j ++) {
                            var procedureId = procedurePriorities[j][2];
                            var procedureDescription = procedureDescriptions[procedureId];
                            if (procedureDescription.logo_id != logoId)
                                continue;
/*                            var procedureFieldName = procedureId.substring(1).replace('/', '-');*/
                            var categoriesTitle = '';
                            for (var k = 0; k < procedureDescription.categories_symbol.length; k ++) {
                                var categoryId = procedureDescription.categories_symbol[k];
                                var categoryTitle = categoryDescriptions[categoryId].title;
                                if (categoryTitle) {
                                    if (categoriesTitle)
                                        categoriesTitle += ', ';
                                    categoriesTitle += categoryTitle;
                                }
                            }
                            var chronologyDescription = chronologyDescriptions[procedureDescription.chronology_symbol];
                            row = $('<tr></tr>');
                            if (procedure && procedure == procedureId) {
                                row.addClass('active');
                            }
/*                            var checkbox = $('<input type="checkbox" class="case-a-faire" />').attr(*/
/*                                'name', procedureFieldName);*/
/*                            if ($(".case-a-faire[name='" + procedureFieldName + "']").attr('checked'))*/
/*                                checkbox.attr('checked', 'checked');*/
/*                            row.append($('<td class="a-faire"></td>').append(checkbox));*/
                            var td = $('<td class="description">');
                            var a = $('<a class="demarche deployee" href="javascript:;" name="demarche-' + procedureId + '"></a>');
                            a.text(procedureDescription.title);
                            a.prepend($('<span>+</span>'));
                            td.append(a);
                            if (procedureDescription.description)
                                td.append(procedureDescription.description);
                            row.append(td);
                            row.append($('<td class="logo"></td>').text(categoriesTitle));
                            row.append($('<td class="delai"></td>').text(chronologyDescription.title));
                            if (agent) {
                                var html = '<td class="actions">';
                                html += '<a class="button" href="' + procedureDescription.back_office_url + '">';
                                html += 'Voir <img alt="" src="/static/img/icone-outils.gif" />';
                                html += '</a>';
                                if (procedureDescription.status) {
                                    html += '<br />' + procedureDescription.status;
                                }
                                html += '</td>';
                                html += '<td class="actions">' + (-procedurePriorities[j][0]) + '</td>';
                                row.append($(html));
                            }
                            rowsGroup.append(row);
                            rowsGroups.push(rowsGroup);
                        }
                    }
                }
                $('tbody', table).remove();
                for (i = 0; i < rowsGroups.length; i ++)
                    table.append(rowsGroups[i]);
                initProceduresTable();
                $('#bouton-actualiser').removeClass('attente');
            }, 1
        );
        return false;
    }

    function initProceduresTable() {
        if (presentationInitiale == 'ferme') {
            $(".rubrique").initRubrique();
            $(".demarche").initDemarche();
        }
        $('th.logo > a, th.delai > a').attr('href', '#').click(function () {
            return sortProcedures(this);
        });
        $(".case-a-faire").change(function() {
            // FIXME: With IE 6 (at least), the checkboxes are not visualy updated till the page is
            // refreshed.
            $(this).addClass('changing');
            if ($(this).attr('checked'))
                $(".case-a-faire[name='" + $(this).attr('name') + "']:not(:checked):not(.changing)").attr('checked', 'checked');
            else
                $(".case-a-faire[name='" + $(this).attr('name') + "']:checked:not(.changing)").removeAttr('checked');
            $(this).removeClass('changing');
        });
        $("a[rel='external'][href]").attr('target', '_blank');
    }

    $(document).ready(function() {
        var banniere = $("#banniere");
        if (banniere.length == 1) {
            $(window).resize(function() {
                $("#banniere").adapterBanniere();
            });
            $("#banniere").adapterBanniere();
        }
        
        $("#taille_foyer").spinButton({minimum: 1, maximum: 20, callback: function(){ genererFoyer(); }});
        genererFoyer();
        
        $('th.description').liensDeplierReplier();
        initProceduresTable();

        $(".calendrier").calendar({
            minDate: new Date(1900, 0, 1),
            maxDate: new Date()
        });
        $(".situation").situation();

//        $('#affichage, #commune, #code-postal-ou-ville, #facultatives').change(function() {
//            $('#bouton-actualiser').addClass('attente');
//            $('form').submit();
//        });

        // FIXME: Dirty hack by Manou to allow button to work in IE6. 
        $('#bouton-actualiser').click(function() {
            $(this).addClass('attente');
            $('form').submit();
        });

        
        jQuery('#code-postal-ou-ville').autocompleter({
            source: communesWebServiceUrl,
            minchars: 2
        });
        jQuery('#code-postal-ou-ville').blur(function () {
            if (this.value == '')
                this.value = 'Indiquez le code postal et/ou la ville';
        });
        jQuery('#code-postal-ou-ville').focus(function () {
            if (this.value == 'Indiquez le code postal et/ou la ville')
                this.value = '';
        });

        if ($('.credits').length) {
            $('form').boutonsOutils();
        }
//        if (typeof(credit) != 'undefined') {
//            $('form').boutonsOutils();
//        };
    });
})(jQuery);
