ModMenuVistaArbre = Class.create(); 
ModMenuVistaArbre.prototype= {
	initialize:function(gestEvt,name){
		this.extend(new ModeleAbstract(),this);
		this.curHierOpen=-1;
		this.gestEvt=gestEvt;
		this.gestEvt.ajouteEvenement('ANALYSEMENUADDED');
		this.curHierarchie=new Array();
		this.curLevel=0;
	  this.currentAnalyse=null;
		this.tabHierarchie=new Array();
		this.tabIncompatible = new Array();
		this.MonTab = new Array();
		this.name = name;
		//this.synchronisationOnglet = synchronisationOnglet;
	},
	setCurentHierarchie:function (idElement,lvl){
		if(this.curHierarchie[lvl]!=idElement){
			for(i=lvl+1;i<this.curHierarchie[lvl];i++){
				this.curHierarchie[i]=-1;
			}
			this.curHierarchie[lvl]=idElement;
			this.curLevel=lvl;
			this.notifieObs('majHierarchie');
		}
	},
	openHierarchie:function (lvl){
		this.curHierOpen=lvl;
		this.notifieObs('openHierarchie');
	},
	getDatas:function (lvl){
  	 if( this.tabHierarchie[lvl]==undefined){
  	   return false;
  	 }
		var lvlSub=lvl-1;
		if(lvlSub==-1){
		    if( this.tabHierarchie[lvl]!=undefined){
           return this.tabHierarchie[lvl]; 
       }else{
        return false;
       }
    }
		lvlSub=    this.curHierarchie[lvlSub];
		var tabR=new Array();
		for(var i=0;i<this.tabHierarchie[lvl].length;i++){
			ob=this.tabHierarchie[lvl][i];
			if(ob.idPere==lvlSub){
				tabR[tabR.length]=ob;
			}
		}
		return tabR;
	},
	initLvl:function (datas,lvl)
  {
      for(var i=0;i<datas.length;i++)
      {
			    this.addDataInNode(datas[i],lvl);
			    
			    if (lvl==2)
          { // liste des analyses
      		    ob = datas[i];
      			  state = ob.STATE_INIT;
      			  if (ob.TYPEANALYSE==1){
      				    if (state=="1"){
      				        this._addTabIncompatible(ob.LAYERID);
      				    }
      			  }
      		}
  		}	
  },
	addDataInNode:function (data,lvl){
		if(this.tabHierarchie[lvl]==undefined){
			this.tabHierarchie[lvl]=[];
		}
		var len = this.tabHierarchie[lvl].length;
		this.tabHierarchie[lvl][len]=data
		//this.notifieObs('addDataInNode');
	},
	setAnalyse:function(analyse){
	  this.currentAnalyse = analyse;


	  synchronisationOnglet.currentAnalyseId[this.name] = analyse;
	  
	  synchronisationOnglet.setRefused();
		this.gestEvt.lanceEvenement('ASK_LAUNCH_ANALYSE',[analyse]);
	},	
	setCurentHierarchieByAnalyse:function(analyseObj){		
	  if(analyseObj!=null && analyseObj != undefined){
    		var idAnalyse = analyseObj.ANALYSEID;
    		
    		// Récupération du theme
    		var idTheme = analyseObj.GRP;
    		if (idTheme != "" && idTheme != undefined)
    		{
          var tabTheme = this.tabHierarchie[1];
    
          for(var i=0;i<tabTheme.length;i++){
          
            if(idTheme == tabTheme[i].ID)
            {
              idDomaine = tabTheme[i].GRP_PERE;
              if (idDomaine != "" && idDomaine != undefined && idDomaine != "all")
      		    {
      		      this.setCurentHierarchie(idDomaine,"0");
      		      //this.openHierarchie("0");
      		    }
            }
          }
          this.setCurentHierarchie(idTheme,"1");
          //this.openHierarchie("1");
        }
        this.setCurentHierarchie(idAnalyse,"2");
        this.MonTab[""+idAnalyse]="1";
	      if (analyseObj.TYPEANALYSE==1){
    	      this._addTabIncompatible(analyseObj.LAYERID);
    		}
    		
      }
    },
	  _addTabIncompatible:function (layerId){
	    	this.tabIncompatible[this.tabIncompatible.length] = layerId;
		    return this.tabIncompatible;
	  },
    _delTabIncompatible:function (layerId){
    		var newTab = new Array();
    		var $cpt = 0;
    		for(var i=0;i<this.tabIncompatible.length;i++)
    		{
    			if (this.tabIncompatible[i] == layerId)
    			{
    				$cpt++;
    				if ($cpt>1)
    				{
    					newTab[this.tabIncompatible.length] = this.tabIncompatible[i];
    				}
    			}
          else
    			{
    				newTab[this.tabIncompatible.length] = this.tabIncompatible[i];
    			}
    		}
    		this.tabIncompatible = newTab;
    		return this.tabIncompatible;
	  },
	  _isIncompatible:function (layerId)
	  {
  		var isIncompatible = false;
  		for(var i=0;i<this.tabIncompatible.length;i++)
  		{
  			if (this.tabIncompatible[i] == layerId)
  			{
  				isIncompatible = true;
  			}
  		}
  		return isIncompatible;
	  }
}
ModMenuVistaArbreWithType=Class.create();
ModMenuVistaArbreWithType.prototype.extend(ModMenuVistaArbre.prototype).extend({
	initialize:function(gestEvt,typeAnalyse){
		this.extend(new ModeleAbstract(),this);
		this.curHierOpen=-1;
		this.gestEvt=gestEvt; 
		this.gestEvt.ajouteEvenement('ANALYSEMENUADDED');
		this.curHierarchie=new Array();
		this.curLevel=0;
		this.tabHierarchie=new Array();
		this.typeAnalyse = typeAnalyse;
	},
	addDataInNode:function(data,lvl){
		if(this.tabHierarchie[lvl]==undefined){
			this.tabHierarchie[lvl]=[];
		}
		
		var tabTypeAnalyse = data.typeAnalyse.split(',');
		var tabTypeAnalyseGen = this.typeAnalyse.split(',');
		
		var typeOk = false;
		for(var i=0;i<tabTypeAnalyse.length;i++){
			for(var j=0;j<tabTypeAnalyseGen.length;j++){
				if(tabTypeAnalyse[i] == tabTypeAnalyseGen[j]){
					typeOk = true;
				}
			}
		}
		if(typeOk == true){
			var len = this.tabHierarchie[lvl].length;
			this.tabHierarchie[lvl][len]=data;
		}
	}
});

/**
 * Vue main correspond aux listes domaine / theme (voir VueTheme)
 */ 
VueMain=Class.create();
VueMain.prototype= {
	initialize:function(observateur,name,lvl,lib,divName,path_application){
		this.extend(Object.extend(new VueAbstract(observateur,name),this));
		//
		this.pA=path_application;
		this.divM=$(divName);
		this.lvl=lvl;
		this.mxH=0;
		this.lib=lib;
		this.divName=divName;
		this.ef=new fx.Height('ss_'+divName, {duration: 400});
		this.divSub=$('ss_'+divName);
		this.divLib=$('lib_'+divName);
		this._op=0;
		this.p_initialize(observateur,name);
	},
	bindToHtml:function(){
		Event.observe(this.divLib, 'click', this.GetControler().handleClickMenu.bindAsEventListener(this.GetControler()), false);

	},
	miseAJour:function(nameE){
		if(nameE=='openHierarchie' )
    {
			if(this._modele.curHierOpen==this.lvl){
				this._swap(0);
			}else{
				this._swap(1);
			}
		}
		if(nameE=='majHierarchie'){
			this._majH();
		}
	},
	_majH:function(){
		//alert(this._modele.curHierarchie[lvl-1]);
		if(this.lvl<=this._modele.curLevel+1){
			Element.show(this.divM);

			if(this._modele.curHierarchie[this.lvl]!=undefined&&this._modele.curHierarchie[this.lvl]!=-1){
				var obID=this._modele.curHierarchie[this.lvl];

				for(var i=0;i<this._modele.tabHierarchie[this.lvl].length;i++){
					//alert(this._modele.tabHierarchie[this.lvl][i].id);
					if(	this._modele.tabHierarchie[this.lvl][i].id==obID){
						var ob=this._modele.tabHierarchie[this.lvl][i];
						this.divLib.innerHTML='<strong>'+ob.libelle+'</strong>';
					}
				}

			}else{
				this.divLib.innerHTML='<span>'+this.lib+'</span>';
			}


		}else{

			Element.hide(this.divM);
			//	Element.hide(this.divM);

		}

	},
	_swap:function(f){

		if(this._modele.curHierOpen!=this.lvl||this._op||f){
			this._op=0;
			Element.hide(this.divSub);
			//	this.divSub.style.height=0;
		}else{
			this._op=1;
			ret=this._construct();

			//this.divSub.style.height=0;
			Element.show(this.divSub);
			//this.divSub.style.height=0;
			//	this.ef.custom(0, this.mxH);

		}
	},
	_construct:function(){
		var str='<ul class="sous_menu">';
		this.mxH=5;

		var ob='';
		var tabE=this._modele.getDatas(this.lvl);
		//s	'(tabE);
	
		for(var i=0;i<tabE.length;i++){
			ob=tabE[i];
      
			str+='<li class="ligne_sous_menu" >'+
			     '<a  class="a_sous_menu" href="javascript:'+this.nom+'.GetControler().selectItem('+ob.id+','+this.lvl+')"><span>'+ob.libelle+'</span></a></li>';
			this.mxH+=15;
			
		}
		str+='</ul>';

		this.divSub.innerHTML=str;
		return tabE.length;

	},
	setControler: function(observateur){
		this._controller=new ControlerMain(observateur,this.lvl,this.pA);
	}
}

/**
 * Vue Domaine extnd de Vue main
 * Class de vue pour les domaines
 * Gere essentiellement le cas de l'affichages du block domaine si 1 seul ou 0 domaine 
 */  
VueDomain =  Dynmap.Class(VueMain, {
    initialize:function(observateur,name,lvl,lib,divName,path_application,showDomain){
   
       VueMain.prototype.initialize.apply(this, [ observateur,name,lvl,lib,divName,path_application ]);
       this.showDomain=showDomain;
      
    },
    miseAJour:function(nameE){
		if(nameE=='openHierarchie' )
    {
			if(this._modele.curHierOpen==this.lvl){
				this._swap(0);
			}else{
				this._swap(1);
			}
      var nbItem=0;
      // Si je n'ai qu'un élément alors je cache le block
      if (this._modele.getDatas(this.lvl))
      {
          nbItem = this._modele.getDatas(this.lvl).length;
		      // console.debug("openHierarchie : Nombre d'item "+nbItem);
		  }        
		  if (nbItem==1)
      {
        if (this.showDomain==false || this._modele.getDatas(this.lvl)[0]=="all")
        {
            Element.hide(this.divM);
        }
        
      } 
			
		}
		if(nameE=='majHierarchie'){
			this._majH();
			var nbItem=0;
      // Si je n'ai qu'un élément alors je cache le block
      if (this._modele.getDatas(this.lvl))
      {
          nbItem = this._modele.getDatas(this.lvl).length;
		      // console.debug("openHierarchie : Nombre d'item "+nbItem);
		  }        
		  if (nbItem==1)
      {
        if (this.showDomain==false || this._modele.getDatas(this.lvl)[0]=="all")
        {
            Element.hide(this.divM);
        }
        
      } 
		}
	},
	setSimpleDomainVisibility:function(visibility)
	{
      this.showDomain = visibility;
  },
	setControler: function(observateur){
		this._controller=new ControlerMain(observateur,this.lvl,this.pA);
	
	}
});




ControlerMain=Class.create();
ControlerMain.prototype= {
	initialize:function(modele,lvl,pA){
		this.extend(new ControlerAbstract(modele),this);
		this.dl=0;
		this.pA=pA;
		this.lvl=lvl;
		this.tabH=[];
		this.paramSelect='cont=analysedomaine&event=getThematiques&mod=domaines&path_application=';
	},
	AjhandleClickMenu:"",
	handleClickMenu:function(evt){

		if(this.dl || (this._modele.tabHierarchie[0]!=undefined  && this._modele.tabHierarchie[0].length>0 )  ) {
			this._modele.openHierarchie(this.lvl);
		}else{
			if(this.AjhandleClickMenu!=""){  
        return;
			}
			var dynmap_url='/dynmap/extensions/indexcarte.php?';
			var params='cont=analysedomaine&event=getDomaines&mod=domaines&path_application='+this.pA;
			this.AjhandleClickMenu=new Ajax.Request(dynmap_url,
			{method: 'get', parameters: params, onComplete: this.a_dlMain,objetLie:this}
			);
		}
	},
	a_dlMain:function(res){

		eval('resp='+res.responseText);

		for(var i=0;i<resp.length;i++){

			this._modele.addDataInNode(resp[i],this.lvl);
		}

		this.dl=1;

		this._modele.openHierarchie(this.lvl);
	},
	AjselectItem:"",
	selectItem:function(id,lvl){
		this.idn=id;
	 this._modele.setCurentHierarchie(id,lvl);
		if((   
        this._modele.getDatas(this.lvl+1)!=false &&  
        this._modele.getDatas(this.lvl+1).length>0) ) {

			this._modele.openHierarchie(this.lvl+1);
		}else{
			if(this.AjselectItem!=""){
         this.AjselectItem.abort();
      }
      
    
  			var dynmap_url='/dynmap/extensions/indexcarte.php?';
  			var params=this.paramSelect+this.pA+'&args='+id;
  			this.AjselectItem=new Ajax.Request(dynmap_url,
  			{method: 'get', parameters: params, onComplete: this.a_s,objetLie:this}
  			);
  		
		}
	},
	a_s:function(res){


		eval('resp='+res.responseText);
		this.tabH[this.idn]=1;
		for(var i=0;i<resp.length;i++){
			this._modele.addDataInNode(resp[i],this.lvl+1);
		}


		this._modele.setCurentHierarchie(this.idn,this.lvl);
		this._modele.openHierarchie(this.lvl+1);
	}
}

ControlerMenuA=Class.create();
ControlerMenuA.prototype.extend(ControlerMain.prototype).extend({
	selectItem:function(id,lvl,a){
		if(id!=-1){
			for(var i=0;i<this._modele.tabHierarchie[this.lvl].length;i++){
				if(	this._modele.tabHierarchie[this.lvl][i].id==id){
					if(a==-1){
						var ob=this._modele.tabHierarchie[this.lvl][i];

					}else{
						var ob=this._modele.tabHierarchie[this.lvl][i]['subA'][a];
					}
					break;

				}
			}
			if(!ob.subA){
				this._modele.setAnalyse(ob);
			}
		}
		this._modele.setCurentHierarchie(id,2);
		this._modele.openHierarchie(4);
	}
});


ControlerDomaineInitializer=Class.create();
ControlerDomaineInitializer.prototype.extend(ControlerMain.prototype).extend({
	initialize:function(modele,domaine,nbDomaine,pA){
		this.extend(new ControlerAbstract(modele),this);
		this.domaine=domaine;
	  this.nbDomaine =  nbDomaine;
		this.dl=0;
		this.lvl=0;
		this.tabH=[];
		this.pA=pA
		this.paramSelect='cont=analysedomaine&event=getThematiques&mod=domaines&path_application=';	  
	},
	execute:function()
	{
    var cpt = 0;
    
    // gestion par defaut si aucun domaine
    var uniqueDomaine="null";
    
    for(var indiceDomaine in this.domaine)
		{
				if(indiceDomaine!='extend')
				{
    			//this._modele.addDataInNode(this.domaine[indiceDomaine],0);
    			cpt++;
    		}
		}
		
    // SI je n'ai qu'un domaine je l'ouvre par défaut
    // Si j'ai un dommaine filtré par defaut => idem c'est le cas un seul domaine

      if(cpt==1){
         uniqueDomaine = this.domaine[0].id;
         this.dl=1;
         this.selectItem(uniqueDomaine,0);
         
      } 	  
      if(cpt==0){
         this._modele.addDataInNode("all",0);
         this.dl=1;
         this.selectItem("all",0);
        
      } 	
	  
  }
  
  
});



	
VueAnalyse=Class.create();
VueAnalyse.prototype.extend(VueMain.prototype).extend({
	setControler: function(observateur){

		this._controller=new ControlerMenuA(observateur,this.lvl,this.pA);
		this.divRegion=$('reg_'+this.divName);
		this._controller.dl=1;
		//alert(this.divRegion);
	},
	initData:function(){


		this.tabRegion=new Array();
		GestEvtDyn.register('STATE_ANALYSE_UPDATED',this._reDraw,this);
		this._modele.gestEvt.register('ANALYSE_SELECTED',this._analyseSelected,this);
	},
	_analyseSelected:function(objAnalyse){
	  this._modele.currentAnalyse = objAnalyse;
    this._modele.setCurentHierarchieByAnalyse(objAnalyse);  
	},
	_construct:function(){
		this._drawListe();
	},
	_drawListe:function(){
		Element.hide('reg_'+this.divName);
		
		this._draw();
	},
	_draw:function(){
		
		//this.divRegion.innerHTML='';
		var str='<ul id="ulDrawListe_'+this.nom+'" class="sous_menu" >';
		this.mxH=5;
		var ob='';
		tabE=this._modele.getDatas(this.lvl);
		
		for(var i=0;i<tabE.length;i++){
			ob = tabE[i];
			if (ob.onlyOnList =="0"){ continue;}
			var cla = 'menu_analyseVue analyse_'+ob.typeAnalyse;         
			var claLi = "";
			var title = "";
			
			state = ob.STATE_INIT;
			if (this._modele.MonTab[ob.testid]){
				state = this._modele.MonTab[ob.testid];
			}
			
			// Analyse avec titre unique
			if(!ob.subA){
				// Si l'analyse est visible
				if (state == "1"){
					claLi += ' menu_analyseVue_active';
					title="Cette analyse est déjà visible dans la carte";
				} // analyse non chargé
				else{
					// Test analyse incompatible :
					// Si l'analyse est de type 1 et que la couche est utilisée pour une autre analyse
					if (ob.TYPEANALYSE==1 && this._modele._isIncompatible(ob.LAYERID)){
						title = "Une analyse par coloration est déjà active sur la couche '"+ob.lPName+"'";
						claLi += ' menu_analyseVue_incompatible';
					}
				}
				str+='<li  class="ligne_sous_menu '+cla + claLi +' ">'+
				     '<a title="'+title+'" class="a_sous_menu '+cla+'" '+
				     'href="javascript:'+this.nom+'.GetControler().selectItem('+ob.id+','+this.lvl+',-1)"><span> '+ ob.libelle+'</span></a></li>';
			}else{ // Multiples analyses avec un titre identique mais couches différentes
			    title = "Analyse multiple : cliquer pour déterminer votre territoire d'étude";
				str+='<li class="ligne_sous_menu '+cla + claLi +' gpeAnalyse "><a title="'+title+'"  class="a_sous_menu '+cla+'" href="javascript:';
				str+=this.nom+'.openRegion('+ob.id+');'+this.nom+'.GetControler().selectItem('+ob.id+','+this.lvl+',-1);' ;
				str+='"><span>'+ob.libelle+'</span></a></li>';
				var strSub='<ul class="ss_menu_region">';
				for(var j=0;j<ob.subA.length;j++){
					var obS=ob.subA[j];
					strSub+='<li class="ligne_layer_region '+cla+' ">';
					strSub+='<button type="button"  class="a_sous_menu '+cla+'" onclick="javascript:'+this.nom+'.GetControler().selectItem('+ob.id+','+this.lvl+','+j+')"> '+obS.lPName+'</a></button>';
					strSub+='</li>';
				}
				strSub+='</ul>';
				this.tabRegion[ob.id]=strSub;
			}
			this.mxH+=17;
		}
		str+='</ul>';
		this.divSub.innerHTML=str;
		
	},
	_reDraw:function(option){

		analyseId = option.id;
		state = option.state;
		layer = option.layer;
		
		if (state=="1"){
			this._modele._addTabIncompatible(layer);
		}
		else{
			this._modele._delTabIncompatible(layer);
		}
				
		this._modele.MonTab[""+analyseId] = ""+state;
		
		if ($('ulDrawListe_'+this.nom)){
		    this._draw();
		}
		
		return true;
	},
	openRegion:function(idReg){
		var strRegion=this.tabRegion[idReg];
		this.divRegion.innerHTML=strRegion;
		Element.show('reg_'+this.divName);
	}
});

/**
 * Vue main correspond au theme
 */

VueTheme =  Dynmap.Class(VueMain, { 
  showSingleDomain:false,
  initialize : function(observateur,name,lvl,lib,divName,path_application,showSingleDomain){
       VueMain.prototype.initialize.apply(this, [ observateur,name,lvl,lib,divName,path_application ]);
       this.showSingleDomain=showSingleDomain;
       var test = this.showSingleDomain;
  },
	setControler : function(observateur){
	  
		this._controller=new ControlerMain(observateur,this.lvl,this.pA);

		this._controller.paramSelect='cont=analysedomaine&event=getAnalyses&mod=domaines&path_application=';
	}
});
