﻿
String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
};

String.prototype.ltrim = function() {
	return this.replace(/^\s+/,"");
};

String.prototype.rtrim = function() {
	return this.replace(/\s+$/,"");
};

Function.createDelegate = function(instance, method) {
    return function() {
        return method.apply(instance, arguments);
    };
};

$.defer = function(delay, callback) {

    var timer;

    // Return the callback proxy
    return function() {
        // Save the vars for the real callback
        var that = this, args = arguments;

        // Reset the delay
        window.clearTimeout(timer);

        // Delay the real callback
        timer = window.setTimeout(function() {
            callback.apply(that, args);
        }, delay);
    };

};

var parseQueryString = function(string) {

    var oResult = {};
    
    var aQueryString = string.split("&");
    for (var i = 0; i < aQueryString.length; i++) {
        var aTemp = aQueryString[i].split("=");
        if (aTemp[1].length > 0) {
            oResult[aTemp[0]] = unescape(aTemp[1]);
        }
    }
    
    return oResult;
    
};

var isArray = function(obj) {
   if (obj.constructor.toString().indexOf("Array") == -1)
      return false;
   else
      return true;
};
    
var reNodeChangeEvent = function (nodeId, nodeName, nodeMetadata) {
	$.historyLoad('indicateur=' + nodeId);
};

var reSetSelectedNode = function (nodeId) {

    var reSwf = document.getElementById("relationsExplorer");

	try {
		reSwf.setSelectedNode('id', nodeId, true);
	} catch (e) {
		
	}

};

socioscope.explorerModule = function() {

    var version = '3.0.0'; // Novembre 2009

    var strMode;

    var strAppUrl = socioscope.appUrl;

    //    var strMapservUrl = 'http://localhost';
    //    var strMapservExeName = 'mapserv.exe';

    var strMapservUrl = 'http://www.socioscope.qc.ca/';
    //var strMapservUrl = 'http://www.socioscope.qc.ca/wms/';
    var strMapservExeName = 'wms/';

    var strSldUrl = strMapservUrl + strMapservExeName + 'sld.ashx';

    var strAppName = socioscope.appName;

    var mapHistory;

    var remainingLayersToLoad = 0;

    var mapMaxExtent = new OpenLayers.Bounds(265561, 5027556, 308620, 5064251);
    var googleMaxExtent = new OpenLayers.Bounds(-8244344, 5679271, -8160264, 5740420);

    var useGoogle = true;

    var strMapProjection = 'epsg:2145'; // ou EPSG:32188
    var strGoogleMapProjection = 'epsg:900913';  // ou EPSG:3785  

    var strMapOutputFormat = 'png';
    var strLegendOutputFormat = 'png2';

    var mapMaxResolution = 200;
    var mapUnits = 'meters';

    var themeLayerOpacity = 0.7;

    var strBaseMapServiceName = 'fondcarte';
    var strBaseMapServiceDescription = 'Carte de base';
    var strBaseMapLayers = 'fleuve,rmr,arrondissements';

    var strThemeMapServiceDescription = 'Thématique';

    var strLimitsMapServiceName = 'limites';
    var strLimitsMapServiceDescription = 'Limites';
    var strLimitsMapLayers = 'limitesarrondissements';

    var strGoogleMapType = 'G_PHYSICAL_MAP';

    var zoomFullExtentOnVariableSwitch = false;

    var iIndicatorId = 0;
    var indicatorData;
    var iVariableId;
    var variableData;
    var iVariable2Id;
    var dependantVariableData;
//    var objVariable;
//    var idObjectif = 0;

    var autoLoadDefaultVariable = true;

    var applicationViewport;
    
//    var indicatorSelectionWindow;
//    var indicatorSelectionPanel;
//    
//    var variableSelectionWindow;
//    var variableSelectionPanel;

    var mapWidget;
    var tableWidget;
    var tablePager;
    
    var toolTip;
    
    var indicator_chooser_tabs;
    var data_panel_tabs;

    var historyTokenDelimiter = '|';
    
    var modalOptions = {
        persist: true,
        focus: true,
        close: true,
        zIndex: 2000,
        onOpen: function (dialog) {
            $('#relationsExplorer').css({visibility: 'hidden'});
            //$('#viewport').block({ fadeIn: 0, fadeOut: 0, css: { border: 'none', padding: '0px' }, overlayCSS: { backgroundColor: '#fff' }, message: '' });
            dialog.overlay.fadeIn('fast', function () {
                dialog.container.show('fast', function() {
                    dialog.data.show();
                });      
            });
        },
        onClose: function (dialog) {
            dialog.data.fadeOut('fast', function () {
                dialog.container.hide('fast', function () {
                    dialog.overlay.fadeOut('fast', function() {
           	            $('#relationsExplorer').css({visibility: 'visible'});
                        $.modal.close();
                        //$('#viewport').unblock();
                    });
                });
            });
        }
    };
    
    var waitMaskMsg = '<div class="loading" style="padding-left: 25px; text-align: left; background: transparent url(/js/resources/images/default/grid/loading.gif) no-repeat;">Un instant...</div>';
    var blockOptions = { overlayCSS: { backgroundColor: '#fff', cursor: 'default', opacity: 0.7 } };
    
//    var rteOptions =     { controls: {
//      strikeThrough : { visible : false },
//      underline     : { visible : true },
//      
//      separator00 : { visible : true },
//      
//      justifyLeft   : { visible : false },
//      justifyCenter : { visible : false },
//      justifyRight  : { visible : false },
//      justifyFull   : { visible : false },
//      
//      separator01 : { visible : false },
//      
//      indent  : { visible : false },
//      outdent : { visible : false },
//      
//      separator02 : { visible : false },
//      
//      subscript   : { visible : false },
//      superscript : { visible : false },
//      
//      separator03 : { visible : false },
//      
//      undo : { visible : true },
//      redo : { visible : true },
//      
//      separator04 : { visible : false },
//      
//      insertOrderedList    : { visible : false },
//      insertUnorderedList  : { visible : false },
//      insertHorizontalRule : { visible : false },

//      separator07 : { visible : true },
//      
//      cut   : { visible : true },
//      copy  : { visible : true },
//      paste : { visible : true }
//    }
//    };

    logMessage('App URL is : ' + strAppUrl + '...');
    
    var disableComponent = function(selector, options) {
        $(selector).block(blockOptions);
    };
    
    var enableComponent = function(selector) {
        $(selector).unblock();
    };
    
    var disablePanel = function(selector) {
        disableComponent(selector + ' > div.blue');
        $(selector + ' > h3').addClass('loading');
    };
    
    var enablePanel = function(selector) {
        enableComponent(selector + ' > div.blue');
        $(selector + ' > h3').removeClass('loading');
    };

//    storeLocations = new Ext.data.Store({
//        url: strAppUrl + 'services/api.ashx',
//        reader: new Ext.data.XmlReader({
//            record: 'lieu',
//            id: 'nom_lieu'
//        }, ['nom_lieu', 'type', (useGoogle ? 'bounds' : 'bounds')]
//        ),
//        baseParams: { method: 'socioscope.getLocations', like: '' }
//    });

    var updateDataView = function(data, element, templateStr, targetStr, directives, options) {
    
        var target = $(targetStr);
        var template = $(templateStr);
        
        target.empty();
        
        var context;
        var item;
        
        if (data[element] === undefined) {
            return;
        }
        
        var toto = target.html(template.html());
        
        if (!isArray(data[element])) {
            context = new Object();
            item = [];
            item.push(data[element]);
            context[element] = item;
        } else {    
            context = data.valueOf(element);
        }
       
        target.render(context, directives);

    };

    var updateComments = function(response) {
        
        updateDataView(response.commentaires, 'commentaire', '#comments_template', '#comments', {
                'div.comment': 'src <- commentaire',
                'div.comment div': 'src.texte',
                'span.comment_poster': 'src.nom_utilisateur',
//                'span.comment_poster': function(arg){  
//                    alert(arg.commentaire.nom_utilisateur);                 
//                    if (arg.nom_utilisateur === undefined) {
//                        return 'Socioscope';
//                    } else {
//                        return arg.nom_utilisateur;
//                    }
//                },
                'span.comment_date': 'src.jour',
                'span.comment_time': 'src.heure',
                'a.thumb_up[rel]': 'src.id_commentaire',
                'a.thumb_down[rel]': 'src.id_commentaire'
            }
        );
             
//        $('a.thumb_up, a.thumb_down').click(function() {
//        
//            $.modal('<h3>Désolé...</h3><p>Vous devez ouvrir une session de travail pour utiliser cette fonction...</p>', {
//                minHeight: 120,
//                maxWidth: 220,
//                containerId: 'warning-modal',
//                opacity: 100
//            });
//                    
//            logMessage('Rating...');
//            return false;
//        
//        });

        
        $('a.thumb_down').click(function() {
                
            if (socioscope.userModule.hasSession()) {
                rateComment($(this), 'down');
            }
            
            return false;
                
        });
        
        $('a.thumb_up').click(function() {
        
            if (socioscope.userModule.hasSession()) {
                 rateComment($(this), 'up');
            }
            
            return false;
                
        });
         
        enablePanel('#comments_panel');

    };
    
    var postComment = function() {
    
        if (socioscope.userModule.hasSession()) {
        
            var text = $('textarea', '#comment_form').val();
            
            $('#post_comment_btn').addClass('loading');
            disableComponent('textarea', '#comment_form');
        
            $.post(strAppUrl + 'services/api.ashx', {method: 'indicator.postComment', i: iIndicatorId, format: 'json', t: text},
                function(data, textStatus) {
                
                    logMessage('Done posting comment...');
                    $('textarea', '#comment_form').val('');
                    
                    $('#post_comment_btn').removeClass('loading');
                    enableComponent('textarea', '#comment_form');
                    
                    loadComments();
                   
                }
            );
             
        }
    
    };
    
    var loadComments = function() {
    
        logMessage('Loading comments...');
                
        disablePanel('#comments_panel');
        
        var time =  new Date().getTime();
            
        $.getJSON(strAppUrl + 'services/api.ashx', {method: 'indicator.getComments', i: iIndicatorId, format: 'json', ts: time, cache: false, direction: $('#comments_sortorder').val()},
            function(data, textStatus) {
               
                logMessage('Done loading comments...');

                updateComments(data.response); 
               
            }
        );
    
    };
    
    var rateComment = function(element, direction) { 
    
        $.getJSON(strAppUrl + 'services/api.ashx', {method: 'comment.changerating', c: element.attr('rel'), format: 'json', d: direction}, function(data, textStatus) {
                logMessage('Done rating comment...');
            }  
        );
    
    };
     
    var updateIndicatorDescription = function(data) {
        
        document.title  = strAppName + ' :: ' + data.indicateurs.indicateur.nom_indicateur;
        $('h2').html(data.indicateurs.indicateur.nom_indicateur).effect('highlight');
        
        $('#indicator_description').html(data.indicateurs.indicateur.description_indicateur);
        
        enablePanel('#indicator_panel');
   
    };
    
    var updateVariableDescription = function(variableData) {
        
        if (variableData === null) {
        
            $('#variable_name').html('');

        } else {
        
            if (variableData.table === 'mtl') { 
                data_panel_tabs.getTabs().eq(1).addClass('disabled');
            } else {
                data_panel_tabs.getTabs().eq(1).removeClass('disabled');
            }
            
            $('#variable_name').html(variableData.nom_variable);
            
            // Update sources...
            
            if (variableData.sources !== undefined) {
            
                updateDataView(variableData.sources, 'source', '#sources_template', '#variable_source', {
                        'li': 'src <- source',
                        'li+':     function(arg){                   
                            if (arg.item.nom_source !== undefined) {
                                return ', ' + arg.item.nom_source;
                            }
                        },   
                        'a': 'src.emetteur',
                        'a[href]': 'src.siteweb'
                    }
                );

            }
        
        }
        
    };
    
    var loadVariableDescription = function(id) {
    
        if (id === iVariableId) {
            return;
        }
    
        logMessage('Loading variable description...');
        
//        $('#data_panel > h3').addClass('loading');
        disablePanel('#data_panel');
        
        removeDependantVariable();

        if (id === null) {
        
            $('#data_panel > h3').removeClass('loading');
            //disableComponent('#data_panel > div.blue');

            iVariableId = id = null;
            variableData = null;
        
            updateVariableDescription(null);
            updateMap(null);
            
            return;
            
        }
    
        $.getJSON(strAppUrl + 'services/api.ashx', {method: 'variable.getDescription', v: id, format: 'json'},
            function(data, textStatus) {
            
                enablePanel('#data_panel');
            
                logMessage('...done loading variable description...');
            
                iVariableId = id;
                variableData = data.response.variables.variable;
                
                updateVariableDescription(variableData);
                updateMap(data.response); 
               
            }
        );
        
        //enablePanel('#data_panel');
        
    };
    
    var loadVariablesForIndicator = function(id) {
    
        logMessage('Loading variables for indicator id=' + id + '...');
    
        $.getJSON(strAppUrl + 'services/api.ashx', {method: 'indicator.getVariables', i: id, format: 'json'},
            function(data, textStatus) {
                
                logMessage('...done loading variables...');
                
                var variableCount;
                var variableId;
               
                if (data.response.variables.variable === undefined){
                
                    $('#variables_chooser_trigger').hide();
               
                    enablePanel('#data_panel');
                    disableComponent('#data_panel > div.panel');
                    variableCount = 0;
                    
                    variableId = null;
                    
                    $('#variables_list').html();
                    //loadVariableDescription(null);
                    
                    
                } else {
                
                    //enableComponent('#data_panel > div.panel');
                
                    if (data.response.variables.variable.length > 1) {
                    
                        $('#variables_chooser_trigger').show();
                    
                        variableCount = data.response.variables.variable.length;   
                        variableId = data.response.variables.variable[0].id_variable;               
                        //loadVariableDescription(data.response.variables.variable[0].id_variable);
                        
                    } else {
                    
                        $('#variables_chooser_trigger').hide();
                    
                        variableCount = 1;
                        variableId = data.response.variables.variable.id_variable;
                        //loadVariableDescription(data.response.variables.variable.id_variable);
                        
                    }              
                    
                    // Update variable selector
                    
                    updateDataView(data.response.variables, 'variable', '#variables_list_template', '#variables_list', {
                            'ul li': 'src <- variable',
                            'a': 'src.nom_variable',
                            'a[rel]': 'src.id_variable'
                        }
                    );
                                        
                    // "sélection" de la variable active...
                    
                    var selector = '#variables_list a[rel=' + variableId + ']';
                    $('#variables_list a[rel=' + variableId + ']').addClass('selected');
                    
                    // Assignation des handlers
                    
                    $('#variables_list a').click(function() {
                        $('#variables_list a.selected').removeClass('selected');
                        $(this).addClass('selected');
                        loadVariableDescription($(this).attr('rel'));
                        return false;
                    });
                    
                
                }
                                         
                loadVariableDescription(variableId);                
                $('#variable_count').html(variableCount);
                
            }
        );
        
    };
    
    var updateIndicatorsForObjectivesList = function(id) {
    
        $.getJSON(strAppUrl + 'services/api.ashx', {method: 'objective.getIndicators', o: id, format: 'json'}, function(data, textStatus) {
            
            logMessage('...done loading indicators associated with objective ' + id + '...');

            if (textStatus === 'success') {
            
                // Update indicator selector
                
                updateDataView(data.response.indicateurs, 'indicateur', '#indicators_for_objectives_list_template', '#indicators_for_objectives_list', {
                        'ul li': 'src <- indicateur',
                        'a': 'src.nom_indicateur',
                        'a[rel]': 'src.id_indicateur'
                    }
                );
                                 
                // Bind handlers
                
                $('#indicators_for_objectives_list a').click(function() {
                    $.historyLoad('indicateur=' + $(this).attr('rel'));
                    return false;
                });
                
            } 
            
        });
    
    };
    
    var updateObjectivesList = function() {
    
        if ($('#objectives_list').html() !== '') {
            return;
        }
    
        $.getJSON(strAppUrl + 'services/api.ashx', {method: 'socioscope.getObjectives', format: 'json'}, function(data, textStatus) {
            
            logMessage('...done loading objectives...');

            if (textStatus === 'success') {
            
                // Update indicator selector
                
                updateDataView(data.response.objectifs, 'objectif', '#objectives_list_template', '#objectives_list', {
                        'ul li': 'src <- objectif',
                        'a': 'src.nom_objectif',
                        'a[rel]': 'src.id_objectif'
                    }
                );
                                 
                // Bind handlers
                
                $('#objectives_list a').click(function() {
                    $('#objectives_list a.selected').removeClass('selected');
                    $(this).addClass('selected');
                    updateIndicatorsForObjectivesList($(this).attr('rel'));
                    return false;
                });

                return true;
                
            } else {
            
                return false;
            
            }
            
        });
    
    };
    
    var loadParcours = function(id) {
    
        $.getJSON(strAppUrl + 'services/api.ashx', {method: 'parcours.getdescription', p: id, format: 'json'}, function(data, textStatus) {
            
            if (textStatus === 'success') {
            
                $('#parcours_description > div').html(data.response.parcourss.parcours.html);
                             
                // Bind handlers
                
                $('#parcours_description a').click(function() {
                    
                    var id = parseInt($(this).attr('rel'), 10) + 1000;
                
                    $.historyLoad('indicateur=' + id + '');
                    return false;
                });

                return true;
                
            }
            
        });
    
    
    };
    
    var updateParcoursList = function() {
    
        if ($('#parcours_list').html() !== '') {
            return;
        }
    
        $.getJSON(strAppUrl + 'services/api.ashx', {method: 'socioscope.getParcours', format: 'json'}, function(data, textStatus) {
            
            logMessage('...done loading parcours...');

            if (textStatus === 'success') {
            
                // Update indicator selector
                
                updateDataView(data.response.parcourss, 'parcours', '#parcours_list_template', '#parcours_list', {
                        'ul li': 'src <- parcours',
                        'a': 'src.nom_parcours',
                        'a[rel]': 'src.id_parcours'
                    }
                );
                                 
                // Bind handlers
                
                $('#parcours_list a').click(function() {
                    $('#parcours_list a.selected').removeClass('selected');
                    $(this).addClass('selected');
                    loadParcours($(this).attr('rel'));
                    return false;
                });

                return true;
                
            } else {
            
                return false;
            
            }
            
        });
    
    };
    
    var openIndicatorsChooser = function() {
    
        var top;
        
        top = ($(window).height() - $('#indicators_chooser_container').outerHeight()) / 2;
        top = top > $('#viewport').offset().top ? $('#viewport').offset().top : top;
        
        if ($('#indicators_list').html() === '') {
        
            //disableComponent('#viewport'); 
        
            $.getJSON(strAppUrl + 'services/api.ashx', {method: 'socioscope.getIndicators', format: 'json'}, function(data, textStatus) {
                
                    logMessage('...done loading indicators...');

                    if (textStatus === 'success') {
                    
                        // Update indicator selector
                        
                        updateDataView(data.response.indicateurs, 'indicateur', '#indicators_list_template', '#indicators_list', {
                                'ul li': 'src <- indicateur',
                                'a': 'src.nom_indicateur',
                                'a[rel]': 'src.id_indicateur',
                                'a[class]': 'src.type',
                                'li span': 'src.nb_variables'
                            }
                        );
                                     
                        // Bind handlers
                        
                        $('#indicators_list a').click(function() {
                            //$('#variables_list a.selected').removeClass('selected');
                            //$(this).addClass('selected');
                            //socioscope.explorerModule.switchIndicator($(this).attr('rel'));
                            $.historyLoad('indicateur=' + $(this).attr('rel'));
                            return false;
                        });
                                
                        $('#indicators_chooser_container').modal( 
                            $.extend(modalOptions, {
                                position: [top, Math.round(($('#viewport').width() - $('#indicators_chooser_container').width())/2 + $('#viewport').position().left - 10)]
                            })
	                    );
	                    
                    }   
                }
            );
        
        } else {
        
            $('#indicators_chooser_container').modal(
                $.extend(modalOptions, {
                    position: [top, Math.round(($('#viewport').width() - $('#indicators_chooser_container').width())/2 + $('#viewport').position().left - 10)]
                })
            );
        
        }
    
    };
    
    var handleHistory = function(hash) {

        logMessage('Handling history: hash is : ' + hash);

        var parts, indicatorId;
        
        if (hash !== '') {
        
            parts = hash.split('=');
            
            indicatorId = parts[1];

            if (indicatorId === undefined || indicatorId === '') {
                openIndicatorsChooser();
                return;
            } 
            
            socioscope.explorerModule.switchIndicator(indicatorId); 
            
        } else {
        
            openIndicatorsChooser();
        
        }
         
    };
    
    var filterIndicatorsList = function(val) {
    
        if (val.length > 0 && val.length < 3) {
            return;
        }
    
        disableComponent('#indicators_list');
    
        $('#indicators_list a').each(function(i) {     
            $(this).parent().css({display: $(this).html().toLowerCase().indexOf(val) == -1 ? 'none': 'block'});
        });
        
        if (val !== '') {
            $('#indicators_list').highlight(val);
        } else {
            $('#indicators_list').removeHighlight();
        }
        
        enableComponent('#indicators_list');
    
    };
    
    var loadIndicatorDescription = function(id) {
    
        logMessage('Loading indicator description...');
        
        disablePanel('#indicator_panel');
        //disablePanel('#data_panel');
        disablePanel('#comments_panel');

        $.getJSON(strAppUrl + 'services/api.ashx', {method: 'indicator.getDescription', i: id, format: 'json'},
            function(data, textStatus) {
            
                reSetSelectedNode(id);
                
                logMessage('...done loading description...');
                //$('#indicator_description').unblock();

                if (textStatus === 'success' && data.response.indicateurs.indicateur) {
                
                    iIndicatorId = id;
                    indicatorData = data.response.indicateurs.indicateur;
                                        
                    loadComments();
                    
                    updateIndicatorDescription(data.response);
                    loadVariablesForIndicator(id);
                
                }   
               
            }
        );
        
    };
    
    //    storeDescriptionIndicateur = new Ext.data.Store({
//        url: strAppUrl + 'services/api.ashx',
//        reader: new Ext.data.XmlReader({
//            record: 'indicateur',
//            id: 'id_indicateur'
//        }, ['id_indicateur', 'nom_indicateur', 'description_indicateur', 'type']
//        ),
//        baseParams: { method: 'indicator.getDescription' }
//    });

    var mapTip;
    var mapTipTimeout;

    var updateMapTip = function(store, fields) {

//        if (mapTipTimeout) {
//            clearTimeout(mapTipTimeout);
//        }

//        var height = mapTip.getEl().getHeight();
//        var position = mapTip.getEl().getXY();

//        var str = '<h4>Résultat</h4>';

//        Ext.each(fields, function(obj, index, all) {
//            str += (Ext.DomQuery.selectValue(obj, store.reader.xmlData) === null ? '' : Ext.DomQuery.selectValue(obj, store.reader.xmlData)) + '<br/>';
//        }, this);

//        //        var node = Ext.DomQuery.selectNode('MTLNOM')

//        if (str !== '') {
//            mapTip.show();
//            mapTip.body.update(str);
//            mapTip.syncSize();
//        } else {
//            mapTip.body.update('Aucun résultat...');
//        }

//        var hide = function() {
//            mapTip.hide();
//        };

//        mapTipTimeout = hide.defer(5000);
    };

    var cancelMapClick = function() {

        $('#tooltip').removeClass('maptip').hide();

    };

    var handleMapClick = function(e) {
    
        var layer = mapWidget.getLayer('thematique');
        var lonlat = mapWidget.getLonLatFromViewPortPx(e.xy);
    
        var offset = $('#map_widget').offset();
    
        $('#tooltip').html('Un instant...').addClass('maptip').addClass('loading');
        
        var width = $('#tooltip').outerWidth();
        var height = $('#tooltip').outerHeight();
        
        var left = e.xy.x + width + 5 > $('#map_widget').width() ? offset.left + e.xy.x - 5 - width : offset.left + e.xy.x + 5;
        var top = e.xy.y - height - 5 < 0 ? offset.top + e.xy.y + 5 : offset.top + e.xy.y - height - 5;
        
        $('#tooltip').css({'position': 'absolute', 'top': top, 'left': left}).show();
   
        if (layer) {

            //            var strUrl = layer.getURL(mapWidget.getExtent()).replace(/getMap/i, 'getFeatureInfo');
            var strUrl = strAppUrl;

            var bounds = layer.getExtent();
            var ms = mapWidget.getCurrentSize();
            
            var querystring = parseQueryString(layer.getURL(mapWidget.getExtent()));

            //            strUrl += '/wms' + strMapservExeName + '?map=' + iVariableId + '&service=WMS&VERSION=1.1.0&LAYERS=' + iVariableId + '&REQUEST=GetFeatureInfo&FORMAT=png&WIDTH=' + ms.w + '&HEIGHT=' + ms.h + '&SRS=' + strMapProjection + '&BBOX=' + bounds.toBBOX();
            strUrl += 'services/getfeatureinfo.ashx?map=' + querystring.layers + '&service=WMS&VERSION=1.1.0&LAYERS=' + querystring.layers + '&REQUEST=GetFeatureInfo&FORMAT=png&WIDTH=' + ms.w + '&HEIGHT=' + ms.h + '&SRS=' + strMapProjection + '&BBOX=' + bounds.toBBOX();
            strUrl += '&x=' + e.xy.x + '&y=' + e.xy.y + '&QUERY_LAYERS=' + querystring.layers + '&INFO_FORMAT=gml';
            
            $.get(strUrl, function(data, textStatus) {
            
                $('#tooltip').html(data).removeClass('loading');
                
            }, 'text');

//            var xmlReader = new Ext.data.XmlReader({
//                record: iVariableId + '_feature',
//                id: Ext.DomQuery.selectValue('keydescfield', objVariable)
//            }, [Ext.DomQuery.selectValue('keyfield', objVariable), Ext.DomQuery.selectValue('keydescfield', objVariable)]
//                );

//            var dataStore = new Ext.data.Store({
//                url: strUrl,
//                reader: xmlReader
//            });

//            dataStore.on('load', function(store, records, options) {
//                if (store.getTotalCount() > 0) {
//                    updateMapTip(store, new Array(Ext.DomQuery.selectValue('keydescfield', objVariable), Ext.DomQuery.selectValue('valuefield', objVariable)));
//                } else {
//                    mapTip.body.update('Aucun résultat...');
//                }
//            });

//            dataStore.load();
        }



    };

    var registerMapLayer = function(evt) {

        logMessage('Adding layer ' + evt.layer.id + ' to map...');

        var layer = evt.layer;

        layer.events.register("loadstart", layer, function() {
            remainingLayersToLoad = remainingLayersToLoad + 1;
            displayMapLayersProgress();
        });

        layer.events.register("loadend", layer, function() {
            remainingLayersToLoad = remainingLayersToLoad - 1;
            displayMapLayersProgress();
        });

    };

    var toggleMapLayer = function(layerName, visible) {

        try {
            var layer = mapWidget.getLayer(layerName);
            layer.setVisibility(visible);
        } catch (e) {

        }

    };
    
    var updateScatterplot = function(var1Data, var2Data) {
    
        var target = $('#scatterplot');
    
        if (var1Data === null) {
            $('#scatterplot_container').hide();
            return;
        }   
        
        $('#scatterplot_container').show();   
        
        logMessage('Updating scatter plot...'); 
        
        var gridOptions = { clickable: false, hoverable: true, aboveData: false, backgroundColor: {colors: ['#9EB1C8', '#fff']}, borderWidth: 1, labelMargin: 8};
    
        target.unbind('plothover');
        target.unbind('mouseout');
        disableComponent('#scatterplot');
        
        logMessage('updateScatterplot: requesting data...');

    
//                $.getJSON('/services/api.ashx', {method: 'socioscope.getscatterplotdata', v: 'txpopsds_ad_01, txpopsfr_ad_01', format: 'json'},
        $.getJSON('/services/api.ashx', {method: 'socioscope.getscatterplotdata', v: var1Data.id_variable + ', ' + var2Data.id_variable, format: 'json'},

            function(data, textStatus) {
            
                logMessage('updateScatterplot: done loading data...');
        
                var dataArray = new Array();
                
                for ( i in data.response.rows.row ) {
                
                    //alert(data.response.rows.row[i][0].ISDR);
                    var dataItem = new Array(); 
                     
                    dataItem[0] = parseInt(data.response.rows.row[i][var1Data.valuefield], 10);
                    dataItem[1] = parseInt(data.response.rows.row[i][var2Data.valuefield], 10);
                    dataItem[2] = data.response.rows.row[i][var1Data.keyfield];
                    
                    dataArray.push(dataItem);
                
                }
                
                //alert('here');
        
                var scatterplot = $.plot(target, [dataArray], {
                    colors: ['#919733', '#d18b2c'],
                    grid: gridOptions,
                    points: { show: true, radius: 2, fillColor: '#919733'},
                    xaxis: {tickDecimals: 0},
                    zoom: {
                        interactive: false,
                        amount: 1.5         // 2 = 200% (zoom in), 0.5 = 50% (zoom out)
                    },
                    pan: {
                        interactive: false
                    },
                    crosshair: {
                        mode: 'xy',
                        color: '#aaa',
                        lineWidth: 1
                    }
                });
                
                target.bind('plothover', function (event, pos, item) {
            
                        if (item) {
                            //var dataItem = dataArray[item.dataIndex];
                            //var val = '<b>' + var1Data.keyfield + ' : ' + dataItem[2] + '</b><br />' + var1Data.nom_variable + ' : ' + dataItem[0] + ',<br />' + var2Data.nom_variable + ' : ' + dataItem[1];
                            //var val = '<b>' + var1Data.keyfield + ' : ' + dataItem[2] + '</b>';
                            $('#maptip').css({display: 'block', top: pos.pageY - 30, left: pos.pageX + 10}).html(var1Data.keyfield + ' : ' + dataItem[2]);
                        } else {
                            $('#maptip').css({display: 'none'});
                        }
                   
                });
                
                target.bind('mouseout', function () {
                    $('#maptip').css({display: 'none'});
                }); 
                
                enableComponent('#scatterplot');
                
            }
        );
        
    };
    
    var removeDependantVariable = function() {
    
        logMessage('Removing dependant variable...');  
        
        updateScatterplot(null); 
    
        $('#dependant_variable_name').html('');
        $('#theme2_legend_container').hide();
    
        if (mapWidget === undefined) {
            return;
        }
     
        var layer = mapWidget.getLayer('thematique2');

        if (layer) {
            mapWidget.removeLayer(layer);
        }
           
    };
    
    var loadDependantVariableDescription = function(variable_id) {
    
        logMessage('Loading dependant variable description for id = ' + variable_id);
        
        removeDependantVariable();
        
        $.getJSON(strAppUrl + 'services/api.ashx', {method: 'variable.getdescription', v: variable_id, format: 'json'},
            function(data, textStatus) {
                            
                logMessage('Done loading dependant variable description..');
                
                dependantVariableData = data.response.variables.variable;
                
                updateScatterplot(variableData, dependantVariableData);
                
//                $('#theme2_legend_container').show();
//                
                $('#dependant_variable_name').html(dependantVariableData.nom_variable).effect('highlight');
//                
//                var layer = new OpenLayers.Layer.MapServer('Statistique comparée', strMapservUrl + strMapservExeName, { map: variable_id, mode: 'map', layers: variable_id, map_imagetype: strMapOutputFormat }, { reproject: false, singleTile: true, isBaseLayer: false, ratio: 1.5, transitionEffect: 'none' });
//                layer.id = 'thematique2';
//                layer.setVisibility(false);
//                layer.setOpacity(useGoogle ? themeLayerOpacity : 0);
//                mapWidget.addLayer(layer);
//                
//                mapWidget.setLayerIndex(layer, mapWidget.getLayerIndex(mapWidget.getLayer('thematique')) + 1);
//                  
//                var strUrl = strMapservUrl + strMapservExeName + '?map=' + variable_id + '&mode=legend&layers=' + variable_id;
//                    
//                $('#theme2_legend p').html(dependantVariableData.nom_variable).effect('highlight');;
//                $('#theme2_legend img').attr('src', strUrl);
                
            }
            
        ); 

    };
    
    var openDependantVariablesChooser = function() {
    
        $.getJSON(strAppUrl + 'services/api.ashx', {method: 'socioscope.getvariables', table: variableData.table, format: 'json'},
            function(data, textStatus) {
                            
                logMessage('Opening dependant variables chooser...');
                
                // Update dependant variables selector
                
                updateDataView(data.response.variables, 'variable', '#dependant_variables_list_template', '#dependant_variables_list', {
                        'ul li': 'src <- variable',
                        'a': 'src.nom_variable',
                        'a[rel]': 'src.id_variable'
                    }
                );
                             
                // Bind handlers
                
                $('#dependant_variables_list a').click(function() {
                    loadDependantVariableDescription($(this).attr('rel'));
                    return false;
                });
        
                $('#dependant_variables_list_container').modal(
                    $.extend(modalOptions, {
                        position: [Math.round(($(window).height() - $('#dependant_variables_list_container').height())/2), 180]
                    })
                );   
            }
        );
       
    };
    


    var displayMapLayersProgress = function() {
    
        if (remainingLayersToLoad > 0) {
            $('#map_status').css('visibility', 'visible');
            //$('#map_status').html('Affichage de la carte...');
        } else {
            $('#map_status').css('visibility', 'hidden');
        }

    };

    var updateMapLegend = function(data) {

        logMessage('Updating map legend...');

        if (data === null) {
        
            $('#map_legend').css({visibility: 'hidden'});
            
            $('#theme_legend p').html('');
            $('#theme_legend img').attr('src', '/img/blank.gif');
            
            return;
            
        } else {
        
            $('#map_legend').css({visibility: 'visible'});
        
            var variable_id = data.variables.variable.id_variable;
            var variable_name = data.variables.variable.nom_variable;

            var strUrl = strMapservUrl + strMapservExeName + '?map=' + variable_id + '&mode=legend&layers=' + variable_id;
                        
            $('#theme_legend p').html(variable_name);
            $('#theme_legend img').attr('src', strUrl);
            //$('#theme_legend').html('<p style="font-size: 0.9em; font-weight: bold; line-height: 1.1em; margin: 7px 0px 6px 4px;">' + variable_name + '</p><img src="' + strUrl + '" style="left: -2px;"/>');

        } 

    };

    var setupRelationsExplorer = function(indicatorId) {
    
        if ($('#relationsExplorer').length > 0) {
            return;
        }
    
        logMessage('Setting up relations explorer...');
        
        var swfParams = {
            src: 'RelationsExplorer.swf',
            bgcolor: '#fff',
            height: $('#bubble_graph').height(),
            width: $('#bubble_graph').width(),
            allowscriptaccess: 'always',
            name: 'relationsExplorer',
            id: 'relationsExplorer'
        };
        
        var flashVars = {
            data: '/services/api.ashx?method=explorer.getIndicatorRelationsData',
            selectedId: indicatorId,
            selected: null
        };

        $('#bubble_graph').flashembed(swfParams, flashVars);

    };

    var setupChart = function() {

        logMessage('Setting up chart...');

    };
    
    var setupMap = function() {

        logMessage('Setting up map...');

//        firstRun = true;

        var navigationControl = new OpenLayers.Control.Navigation({ zoomWheelEnabled: false });

        OpenLayers.Control.Hover = OpenLayers.Class(OpenLayers.Control, {

            defaultHandlerOptions: {
                'delay': 2000,
                'pixelTolerance': 3,
                'stopMove': false
            },

            initialize: function(options) {

                this.handlerOptions = OpenLayers.Util.extend(
                    {}, this.defaultHandlerOptions
                );
                
                OpenLayers.Control.prototype.initialize.apply(
                    this, arguments
                );
                
                this.handler = new OpenLayers.Handler.Hover(
                    this,
                    { 'pause': this.onHoverPause, 'move': this.onHoverMove },
                    this.handlerOptions
                );

            },

            onHoverPause: function(e) {
                handleMapClick(e);
            },

            onHoverMove: function(e) {
                cancelMapClick();
            }

        });

        var hoverControl = new OpenLayers.Control.Hover({
            handlerOptions: {
                'delay': 500,
                'pixelTolerance': 2
            }
        });
        
        var mapHistoryControl = new OpenLayers.Control.NavigationHistory();

        mapHistory = mapHistoryControl;

        var options = {
            projection: new OpenLayers.Projection('EPSG:900913'),
            units: 'm',
            maxExtent: mapMaxExtent,
            restrictedExtent: mapMaxExtent,
            controls: [navigationControl, hoverControl, mapHistoryControl]
        };

        mapWidget = new OpenLayers.Map('map_widget', options);
        mapWidget.events.register('preaddlayer', mapWidget, Function.createDelegate(this, registerMapLayer));

        if (useGoogle) {
        
            layer = new OpenLayers.Layer.Google(strBaseMapServiceDescription, { sphericalMercator: true, type: G_PHYSICAL_MAP });
            layer.id = strBaseMapServiceName;
            mapWidget.addLayer(layer);

        }

        //mapWidget.events.register('click', null, Function.createDelegate(this, handleMapClick));
        mapWidget.events.register('dragstart', null, Function.createDelegate(this, cancelMapClick));
        mapWidget.events.register('move', null, Function.createDelegate(this, cancelMapClick));

        layer = new OpenLayers.Layer.WMS(strLimitsMapServiceDescription, strMapservUrl + strMapservExeName, { map: strLimitsMapServiceName, version: '1.1.0', layers: strLimitsMapLayers, format: strMapOutputFormat }, { singleTile: true, isBaseLayer: false, isplayOutsideMaxExtent: true, displayInLayerSwitcher: false, ratio: 2 });
        layer.id = 'limites';
        layer.setVisibility(false);
        layer.setOpacity(themeLayerOpacity);

        mapWidget.addLayer(layer);
        
    };
    
    var updateChart = function(variableData) {
    
        if (variableData === null) {
            $('#chart_container').css({visibility: 'hidden'});
            $('#chart_legend').css({display: 'none'});
            return;
        }

        logMessage('Updating chart...');
        
        var chartType = variableData.chart_type.toLowerCase();
        
        var target = $('#chart');
        var legend = $('#chart_legend');
    
        var colors = ["#dba255", "#919733", "#d18b2c"];
        var gridOptions = { clickable: false, hoverable: chartType === 'pie' ? false: true, aboveData: false, backgroundColor: {colors: ['#9EB1C8', '#fff']}, borderWidth: 1, labelMargin: 8};

        var chartOptions = {
            legend: {
                container: chartType === 'bars' || chartType === 'pie' ? $('#chart_legend') : null
            },
            grid: gridOptions       
        };
                  
        logMessage('updateChart: requesting data...');
        
        $.getJSON('/services/api.ashx', {method: 'variable.gettable', v: variableData.id_variable, format: 'json'},
            function(data, textStatus) {
                    
                logMessage('updateChart: done loading data...');
                
                var valueFields = variableData.valuefield.split(',');
                var valueLabels = variableData.chart_labels.split(',');
                
                var row = data.response.rows.row;
                                        
                var dataObj = {};
                var dataArray;                   
                var ticksArray = new Array();
                var seriesArray;
                
                // Reformattage des données selon le type de graphique
                
                var key, value, dataItem, tickItem;
                
                switch(chartType) {
                
                    case 'lines':
                    
                        dataArray = new Array(); 
                        
                        for ( i = 0; i < valueFields.length; i++ ) {
                                                                    
                            key = $.trim(valueFields[i]);                                       
                            value = row[key];   
       
                            dataItem = new Array(); 
                            dataItem[0] = parseInt(valueLabels[i], 10);
                            dataItem[1] = parseInt(value, 10);
                            dataArray.push(dataItem);
                                                                                 
                            tickItem = new Array();
                            tickItem.push(parseInt(valueLabels[i], 10));
                            tickItem.push(valueLabels[i]);
                            ticksArray.push(tickItem);

                        }
                        
                        dataObj['data'] = dataArray;
                    
                        break;
                        
                    case 'timebars':
                    
                        dataArray = new Array(); 
                    
                        for ( i = 0; i < valueFields.length; i++ ) {
                                                                    
                            key = $.trim(valueFields[i]);                                       
                            value = row[key];                           
         
                            dataItem = new Array(); 
                            dataItem[0] = parseInt(valueLabels[i], 10);
                            dataItem[1] = parseInt(value, 10);
                            dataArray.push(dataItem);
                                 
                            tickItem = new Array();
                            tickItem.push(i);
                            tickItem.push(valueLabels[i]);
                            ticksArray.push(tickItem);
                               
                        }
                
                        dataObj.data = dataArray;
                    
                        break;
                        
                    default:
                    
                        //ticksArray = new Array();
                        seriesArray = new Array();
                    
                        for ( i = 0; i < valueFields.length; i++ ) {
                                                                    
                            key = $.trim(valueFields[i]);                                       
                            value = row[key];     
                            
                            dataItem = new Array(); 
                            dataItem[0] = i;
                            dataItem[1] = parseInt(value, 10);
                            
                            dataArray = new Array();
                            //dataArray.push(dataItem);
                           
                            tickItem = new Array();
                            tickItem.push(i);
                            tickItem.push(valueLabels[i]);
                            ticksArray.push(tickItem);
                            
                            dataObj = {};
                            dataObj.label = valueLabels[i];
                            dataObj.data = [dataItem];
                            
                            seriesArray.push(dataObj);

                        }
                        
                        break;
                        
                        //alert(seriesArray[0][0][1]);
                
                }
                
                

                // Draw chart...
                
                $('#chart_container').css({visibility: 'visible', 'z-index': 1500});
                $('#chart_legend').css({display: 'block'});
       
                logMessage('updateChart : drawing..');
                
                var chart;
                    
                switch(chartType) {
                
                    case 'lines':
                    
                        chart = $.plot(target, [dataObj], $.extend(chartOptions, {
                                lines: {show: true},
                                points: {show: true},
                                xaxis: {
                                    tickDecimals: 0,
                                    ticks: ticksArray
                                },
                                crosshair: {
                                    mode: 'xy',
                                    color: '#fff'
                                }
                            })
                        );
                                                
                        break;
                        
                    case 'timebars': 

                        chart = $.plot(target, [dataObj], $.extend(chartOptions, {
                                bars: {
                                    show: true,
                                    barWidth: 0.5,
                                    align: 'center',
                                    fill: 0.7
                                },
                                xaxis: {
                                    tickDecimals: 0,
                                    autoscaleMargin: 0.05
                                }                                               
                            })
                        );
                        
                        break;
                      
                    case 'pie':
                    
                        chart = $.plot(target, seriesArray, $.extend(chartOptions, {
                                series: {
                                    pie: {                                                         
                                        show: true,
                                        tilt: 0.65,
                                        innerRadius: 0.03,
                                        radius: 0.8,
                                        label: {
                                            show: true,
                                            color: '#FFF'
                                        }
                                    }
                                }
                            })
                        );
                        
                        break;
                      
                    default: // bars...

                        chart = $.plot(target, seriesArray, $.extend(chartOptions, {
                                bars: {
                                    show: true,
                                    barWidth: 0.5,
                                    align: 'center',
                                    fill: 0.7
                                },
                                xaxis: {
                                    tickDecimals: 0,
                                    autoscaleMargin: 0.05,
                                    ticks: ticksArray
                                }                                             
                            })
                        );
                        break;
                        
                        
                }
                
                legend.css({visibility: chartType === 'bars' || chartType === 'pie' ? 'visible' : 'hidden'});
                
                target.unbind('plothover');
                
                if (chartType !== 'pie') {
                
                    target.bind('plothover', function (event, pos, item) {
                    
                        var data = chart.getData();
                        var val, label;
                        
                        if (item) {
                        
                            switch(variableData.chart_type) {
                            
                                case 'pie':
                                    //val = item.datapoint[0].toFixed();
                                    val = data[item.seriesIndex]['data'][0][1] + ' (' + item.datapoint[0].toFixed() + '%)';
                                    break;
                                    
                                default:
                                    label = item.datapoint[0];
                                    val = item.datapoint[1];
                                    break;
                            
                            }

                            $(this).css({cursor: 'pointer'});
                            //var val = item.datapoint[1];
                            $('#tooltip').css({visibility: 'visible', top: pos.pageY - 30, left: pos.pageX + 10}).html(label + ': ' + val);
                        } else {
                            $(this).css({cursor: 'default'});
                            $('#tooltip').css('visibility', 'hidden');
                        }
                    
                    });
                
                }

            }
        
        );
    
    };

    var updateMap = function(data) {
    
        if (mapWidget === undefined) {
            setupMap();
        }
    
        logMessage('Updating map...');
        
        $('#radioShowThemeLayer').trigger('click');
        
        // Revenir au tab de la carte...
        
        data_panel_tabs.click(0);

        var themelayer = mapWidget.getLayer('thematique');
        
        if (data === null) {
        
            if (themelayer) {
                themelayer.setVisibility(false);
            }
        
            updateMapLegend(null);
            return;
            
        }
        
        if (themelayer) {
            mapWidget.removeLayer(themelayer);
        }

//        layer = mapWidget.getLayer('selection');

//        if (layer) {
//            layer.setVisibility(false);
//            mapWidget.removeLayer(layer);
//        }
        
        $('#map_container').css('visibility', 'visible');

        var variable_id = data.variables.variable.id_variable;

        // Si la variable est une variable "composée", on désactive la carte        
        if (data.variables.variable.valuefield.split(',').length > 1) {
   
            updateMapLegend(null);
            disableComponent('#map_container');
            
            mapWidget.getLayer(strBaseMapServiceName).setVisibility(false);
            
            updateChart(data.variables.variable);
            
            return;
            
        } else {
        
            //$('#chart_container').css({visibility: 'hidden'});
            updateChart(null);
            
            enableComponent('#map_container');
            mapWidget.getLayer(strBaseMapServiceName).setVisibility(true);
        
        }


//            try {
//                mapWidget.removePopup(infoPopup);
//                cbLegendeGoogle.setValue(true);
//            } catch (err) {

//            }



        layer = new OpenLayers.Layer.MapServer(strThemeMapServiceDescription, strMapservUrl + strMapservExeName, { map: variable_id, mode: 'map', layers: variable_id, map_imagetype: strMapOutputFormat }, { reproject: false, singleTile: true, isBaseLayer: false, ratio: 1.5, transitionEffect: 'none' });
        layer.id = 'thematique';
        layer.setOpacity(useGoogle ? themeLayerOpacity : 0);
        mapWidget.addLayer(layer);

        layer = mapWidget.getLayer('limites');

        if (layer) {
            mapWidget.raiseLayer(layer, 1);
        }

        updateMapLegend(data);
        
        mapWidget.zoomTo(mapWidget.getZoom() === 0 ? 10 : mapWidget.getZoom());

    };


    var hiliteFeaturesOnMap = function(layerName, item, id) {

        var layer;

        layer = mapWidget.getLayer('selection');
        layer.mergeNewParams({ sld: strSldUrl + '?layername=' + layerName + '&propertyname=' + item + '&literal=' + id });
        layer.setVisibility(true);

    };

    var clearMapHilite = function() {
        mapWidget.getLayer('selection').setVisibility(false);
    };

    var bindTooltips = function(selector) {
    
//        logMessage('Binding tooltips...');
//    
//        $(selector).tooltip({
//            api: true,
//	        tip: '#tooltip',
//	        cancelDefault: true,
//	        lazy: false,
//	        effect: 'fade',
//	        fadeInSpeed: 0,
//	        fadeOutSpeed: 150,
//	        opacity: 1,
//	        position: 'bottom center',
//	        offset: [10, 10],
//	        relative: false,
//	        onBeforeShow: function(e, pos) {
//                $('#tooltip').removeClass('maptip').removeClass('loading');  
//            }
//        });
    
    };
    
    var openVariablesChooser = function() {
    
        var top;
        
        top = ($(window).height() - $('#variables_list_container').outerHeight()) / 2;
        top = top > $('#viewport').offset().top ? $('#viewport').offset().top : top;
    
        logMessage('Opening variables chooser...');
            
        $('#variables_list_container').modal(
            $.extend(modalOptions, { 
                position: [top, Math.round(($('#viewport').width() - $('#variables_list_container').width())/2 + $('#viewport').position().left - 10)]
            })
        );
    
    };
    
    return {

        print: function() {
        
            logMessage('Printing from explorer module...');

            var options = '';

            if (iIndicatorId) {

                options = options + "indicator=" + iIndicatorId;

                if (iVariableId) {

                    options = options + "&variable=" + iVariableId;
                    options = options + "&size=" + mapWidget.getSize().w + ',' + mapWidget.getSize().h;
                    options = options + "&mapextent=" + mapWidget.getExtent().toBBOX(0);

                    var mapCenter = mapWidget.getCenter().clone();

                    mapCenter.transform(
                        new OpenLayers.Projection('EPSG:900913'), new OpenLayers.Projection('EPSG:4326')
                    );

                    options = options + "&mapllcenter=" + mapCenter.lat + "," + mapCenter.lon;
                    options = options + "&zoom=" + mapWidget.getZoom();
                }

                var site = strAppUrl + 'services/impression.aspx?' + options;
                window.open(site, 'Impression', 'scrollbars=yes,menubar=yes,height=600,width=800,resizable=no,toolbar=no,location=no,status=yes');


            }

            return false;

        },
        
        switchIndicator: function(id) {
        
            $.modal.close();
            
            if (id !== iIndicatorId && id > 1) {
            
                logMessage('Switching to indicator ' + id);
                setupRelationsExplorer(id); 
                loadIndicatorDescription(id);
                
            } else {
            
                logMessage('Opening selector...');
            
            }

        },

        init: function() {
        
            OpenLayers.Util.onImageLoadErrorColor = "transparent";
            OpenLayers.IMAGE_RELOAD_ATTEMPTS = 5;
            
            $.blockUI.defaults.message = null;
            $.blockUI.defaults.fadeIn = 0;
            $.blockUI.defaults.fadeOut = 0;
            $.blockUI.defaults.css = {}; 
            $.blockUI.defaults.overlayCSS = {};
                        
            if ($.browser.msie && jQuery.browser.version < 7) {
                strMapOutputFormat = 'gif';
            }

            if (useGoogle) {
                mapMaxExtent = googleMaxExtent;
                strMapProjection = strGoogleMapProjection;
            }

            // Assignation des handlers...
                        
            $('#indicators_chooser_trigger').appendTo('#section_title');
            
            $('#indicators_chooser_trigger').click(function() {
                openIndicatorsChooser();
	            return false;
            });
            
            $('#variables_chooser_trigger').click(function() {
                openVariablesChooser();
	            return false;
            });
            
            $('#dependant_variables_chooser_trigger').click(function() {
                openDependantVariablesChooser();
                return false;
            });
            
            $('.dialog_cancel').click(function() {
                if (iIndicatorId !== 0) {
                    $.modal.close();
                }
                return false;
            });
            
            $('#post_comment_btn').click(function() {
                postComment();
                return false;
            });
                                    
            // Outils cartographiques

            $('#toolZoomIn').click(function() {
                mapWidget.zoomIn();
                return false;
            });
            
            $('#toolZoomOut').click(function() {
                mapWidget.zoomOut();
                return false;
            });
            
            $('#toolZoomAll').click(function() {
                mapWidget.zoomTo(10);
                return false;
            });
            
            $('#toolZoomPrev').click(function() {
                mapHistory.previousTrigger();
                return false;
            });
            
            $('#toolZoomNext').click(function() {
                mapHistory.nextTrigger();
                return false;
            });

            $('#chkShowMapLimits').click(function() {
                toggleMapLayer(strLimitsMapServiceName, $(this).attr('checked'));
            });

            $('#chkShowMapBase').click(function() {
                toggleMapLayer(strBaseMapServiceName, $(this).attr('checked'));
            });
            
            $('input[name="theme_layer"]').click(function() {
                val = $('input[name="theme_layer"]:checked').val();
                toggleMapLayer('thematique', val === 'thematique' ? true : false);
                toggleMapLayer('thematique2', val === 'thematique' ? false : true);
            });
            

//            Ext.getCmp('locationsCombo').on('select', function(combo, record, index) {
//                mapWidget.zoomToExtent(OpenLayers.Bounds.fromString(record.get('bounds')));
//            }, this);

//            $('textarea', '#comment_form').show().wysiwyg(rteOptions);
//            $('div.wysiwyg', '#comment_form').hide();

            // Tab panels
            
            $('#relations_tabs').tabs('#relations_panes > div', {api: true, effect: 'fade'}); 

            indicator_chooser_tabs = $('#indicator_chooser_tabs').tabs('#indicator_chooser_panes > div', {api: true, effect: 'fade'}); 
            
            indicator_chooser_tabs.onBeforeClick(function(e, index) {

                switch(index) {
                    case 1:
                        updateObjectivesList();
                        $('#indicator_chooser_toolbar').css({visibility: 'hidden'});
                        break;
                    case 2:
                        updateParcoursList();
                        $('#indicator_chooser_toolbar').css({visibility: 'hidden'});
                        break;
                    default:
                        $('#indicator_chooser_toolbar').css({visibility: 'visible'});
                        break;
                }

            });
            
            data_panel_tabs = $('#data_panel_tabs').tabs('#data_panel_panes > div', {api: true});
             
            data_panel_tabs.onBeforeClick(function(e, index) {
            
                if (data_panel_tabs.getTabs().eq(index).hasClass('disabled')) {
                    return false;
                }
            
            });
            
            data_panel_tabs.getPanes().eq(1).height(data_panel_tabs.getPanes().eq(0).height());
            
            $('#indicator_chooser_toolbar input').keyup($.defer(500, function() {
                filterIndicatorsList($(this).val());
            }));

            $('#comments_sortorder').change(function() {
                loadComments();
            });
            
            bindTooltips('.hastooltip[title]');
            
            if ($.browser.msie) {
                $('#loading_window').remove();
                $('#conteneur_donnees').css('visibility', 'visible');
                setupMap();
            } else {
                $('#loading_window').animate({opacity: 0}, function() {
                    $(this).remove();
                    $('#conteneur_donnees').css('visibility', 'visible').animate({opacity: 1} , 1000, function() {         
                        //setupMap();            
                    });
                });
            }
            
//            document.getElementsByTagName("body")[0].onmouseover = function(event) {
//                console.log('Renew session...');
//            }

            $.historyInit(handleHistory);
            
            if (top.location.href.indexOf("#") === -1 ||  window.location.hash === '') {
                openIndicatorsChooser();
            } 
            
            logMessage('Socioscope Explorer started...');

        }

    };

} ();


// Start module...

$(document).ready(function () {

    $('#print_btn').unbind();

    $('#print_btn').click(function() {
        socioscope.explorerModule.print();
        return false;
    });  

    logMessage('Loading Google Maps API...');
    $('#loadingWindow p').text('En attente de Google...');
    google.load('maps', '2', { language: 'fr', nocss: true, callback: socioscope.explorerModule.init });

});










