/**
 * Charge les libraires Dojo n�cessaires
 */
function loadDojoLibs() {
	dojo.require("dojo.parser");
	dojo.require("dojo.io.script");
	
	dojo.require("dijit.form.Button");
	dojo.require("dijit.TitlePane");
	dojo.require("dijit.Dialog");
	dojo.require("dijit.Menu");
	dojo.require("dijit.Toolbar");
	
	dojo.require("dojox.validate");
	dojo.require("dojox.widget.Toaster");
	dojo.require("dojox.layout.ContentPane");
	
	dojo.require("dijit.layout.LayoutContainer");
	dojo.require("dijit.layout.SplitContainer");
	dojo.require("dijit.layout.TabContainer");
	dojo.require("dijit.layout.ContentPane");
	dojo.require("dijit.layout.LinkPane");
	dojo.require("dijit.form.FilteringSelect");
	
	dojo.require("dijit.form.CheckBox");
	dojo.require("dijit.form.Slider");
	
	dojo.require("dijit.Tooltip");
	dojo.require("dojo.data.ItemFileReadStore");
	dojo.require("dijit.Tree");
	
	dojo.require("dojo.cookie");
		
	dojo.require("infoterre.widget.CheckedTree");
	dojo.require("infoterre.widget.SliderMove");
	dojo.require("infoterre.widget.ToasterLoader");
	dojo.require("infoterre.widget.ResizableDialog");
	dojo.require("infoterre.widget.WritableComboBox");
	dojo.require("infoterre.widget.WritableFilteringSelect");
	
	if (isIE) {
		loadDojoSWELibs(true);
		loadDojoSLDLibs(true);
	}
}

function loadDojoSWELibs(force) {
	if (!isIE || force) {
		//SWE Dojo Requirements
		dojo.require("dojox.charting.Chart2D");
		dojo.require("dijit.form.DateTextBox");
		dojo.require("dojox.xml.DomParser");
	}
}

function loadDojoSLDLibs(force) {
	if (!isIE || force) {
		//SLD requirements
		dojo.require("dijit.InlineEditBox");
	    dojo.require("dijit.ColorPalette");
	    dojo.require("dijit.form.NumberTextBox");
	    dojo.require("dijit.form.NumberSpinner");
	    dojo.require("dojox.grid.Grid");
	    dojo.require("dojox.grid._data.model");
	}
}

/**
 * Add function to start when mapbuilder is initialized
 */
function addFirstInfoterreListeners() {
	config.objects.mainMap.addListener("loadModel", mapbuilderInitialized, config.objects.mainMap);
	config.objects.mainMap.addListener("loadModel", updateCheckedBoxLayers, null);
	config.objects.mainMap.addListener("bbox", updateLocator, null);
	config.objects.mainMap.addListener("bbox", updateSRSDisplay, config.objects.cursorTrack);
	config.objects.mainMap.addListener("bbox", updateDisplay, config.objects.mainMap);
}

/**
 * Add required listeners to mapbuilder.
 */
function addInfoterreListeners() {
	config.objects.mainMap.addListener("addLayer", updateCheckedBoxLayers, null);
	config.objects.mainMap.addListener("deleteLayer", updateCheckedBoxLayers, null);
	config.objects.mainMap.addListener("bbox", notifyBBoxModification, config.objects.mainMap);
	config.objects.mainMap.addListener("srs", notifySRSModification, config.objects.mainMap);
	config.objects.mainMap.addListener("addLayer", moveToTopSectionLayer, null);
	config.objects.mainMap.addListener("deleteLayer", moveToTopSectionLayer, null);
}

/**
 * Function triggered when the javascript libraries are loaded
 */
function jsLoaded() {
	dojo.parser.parse();
	setTimeout("waitParsing()",1000);
}

/**
 * Function for waiting the Dojo parsing is complete
 */
function waitParsing() {
	var list = dojo.query('[dojoType]');
	var isFinish = true;
	dojo.forEach(list, function(dijitNode){
		var type = dijitNode.getAttribute("dojoType");
		//only container are in the nodeList
		if (type != "dijit.layout.SplitContainer"
			&& type != "dijit.layout.LayoutContainer"
			&& type != "dijit.layout.ContentPane"
			&& type != "dijit.Tooltip"
			&& type != "dojo.data.ItemFileReadStore") {
			isFinish = false;
		}
	});
	var treeCatalog = dijit.byId("treeCatalogInfoterre");
	if (treeCatalog) {
		var dataCatalog = treeCatalog.store;
		if (dataCatalog) {
			isFinish = dataCatalog._loadFinished;
		} else {
			isFinish = false;
		}
	} else {
		isFinish = false;
	}
	if (isFinish) {
		dojoInitialized();
	} else {
		setTimeout("waitParsing()",500);
	}
}

/**
 * Function triggered when Dojo has been initialized (the page has been parsed)
 */
function dojoInitialized() {
	// Initialize MapBuilder
	mbDoLoad(addFirstInfoterreListeners);
}

/**
 * Function triggered when MapBuilder has been initialized (with the current context)
 */
function mapbuilderInitialized() {
	addInfoterreListeners();

	createDivOnMap();
    dojo.connect(dijit.byId("locatorTab").controlButton, 'onClick',  function(){updateLocator();});
	dojo.connect(dijit.byId('mainMapPane'), 'resize', function(){onMapResizeHandler();});
	dojo.connect(dijit.byId('firstSplitH'), 'beginSizing', function(){changeIndexDivOnMap(1);});
	dojo.connect(dijit.byId('mapTab'), 'resize', function(){changeIndexDivOnMap(2);resizeTabContainer();});

	// Fix the context
	firstLoadMapAndLocator();

	// Show the viewer
	showMainPage();
}
