/**
 * OutilRecherche.js
 *
 * Script repris (avec autorisation) du site de la sécurité civile du gouvernement du Québec  
 *  portail@cogesaf.qc.ca
 */

var oRechercheForm;
var p_maxEnreg = 80;
var resultat = [];

var puce = "<img alt='' src='images/puce.gif'>"

var lien_pdf = "<a href=\'#here\'";
    lien_pdf += "onclick=\'window.open("
    lien_pdf += "\"AideSOAP-ServiceGOLocQuebec.pdf\"";
    lien_pdf += ");\'>";
    lien_pdf += "Cliquer ici pour avoir plus de détails...</a>";
	lien_pdf += "<br> <p class='center_gras'>Service de recherche <a href='http://geomsp.msp.gouv.qc.ca/portail_geo/goloc.htm' target='_blank'>G.O.LOC</a> du Ministère de la Sécutié publique du Québec</p>";

var aide_adresse = "<span class='gras'>Ex</span>: <br>";
    aide_adresse += puce + "Sherbrooke ou J1N1H4 ou Boulevard Bourque<br>"; 
    aide_adresse += puce + "5182 Boulevard Bourque<br>";

var maxEnreg;
var html="";
var jscript="";
var NbResulInitial = 80;
var SOAPbreak = false;
var Nbappel = 1;
var NbPrecSuiv = 0;
 
var pnFormRecherche = new Ext.FormPanel( {
		id: 'rechercheform',
        labelWidth: 1,
		height: 300,
        hideLabel: true,
        frame:true,
        border: false,
        bodyStyle:'padding:0px 0px 0px',
		autoScroll: true,
        items: [
			{xtype: 'textfield',
				fieldLabel: 'Texte',
				value:rechercheText,
				hideLabel: true,
				border: false,
				width: 260,
				id: 'RechercheTitle',
				allowBlank: true,
				blankText: 'Vous devez saisir au moins 1 caractère...',
				enableKeyEvents: true,
				listeners:{
                    keyup: function(field, e) {
						var key = e.getKey();
						if (key == 13){
							NbPrecSuiv = 0;
							initialisation();
							Requete();                        
						}
                    }
                }     
			},
			{xtype: 'radiogroup',
				fieldLabel: 'Type:',
				id: 'typeRecherche',
				hideLabel: true,
				width: 260,
				// remarque : le listners unique pour tous les radio ne fonctionne pas correctement car le texte s'affiche puis disparait tout seul. Il faut donc en mettre un par radio
				items: [{boxLabel: 'Adr.',	name: 'rb-auto',	checked: rechercheCheckbox["adresse"]/*voir init.js*/, 	listeners: {'check': function (checkbox, checked) {if( checked ){RadioClicked("1")}}}},
						{boxLabel: 'Lieu', 	name: 'rb-auto', 	checked: rechercheCheckbox["lieu"],						listeners: {'check': function (checkbox, checked) {if( checked ){RadioClicked("2")}}}},
						{boxLabel: 'GPS', 	name: 'rb-auto', 	checked: rechercheCheckbox["gps"],						listeners: {'check': function (checkbox, checked) {if( checked ){RadioClicked("3")}}}},
						{boxLabel: 'Borne', name: 'rb-auto', 	checked: rechercheCheckbox["borne"],					listeners: {'check': function (checkbox, checked) {if( checked ){RadioClicked("4")}}}}
				]
			},
			{html: aide_adresse + lien_pdf,    
                id: 'resul'
            },
			{xtype: 'hidden',
				id: 'indexDebut',
				value: 0
			},
			{xtype: 'hidden',
				id: 'maxEnreg',
				value: p_maxEnreg
			},
			{html:"<br><br>"},
			{xtype: 'button',
				text: 'Rechercher',
				tooltip: 'Lancer la recherche',
				style:{marginLeft:'40%'},
				handler: function(){NbPrecSuiv = 0;initialisation();Requete();}
			}
		]
	});
	
function RadioClicked(options) {
	var aide = "<span class='gras'>Ex</span>: <br>";
	//	alert(options);	

	switch(options){
	  case "1":
		aide = aide_adresse;
		break;
	  case "2":
		aide += puce + "lac Massawippi<br>";
		aide += puce + "COGESAF<br>";
		aide += puce + "Police Sherbrooke<br>";
		break;
	  case "3":
		aide += puce + "UTM-fuseau X,Y (utm-18 mmm mmm, m mmm mmm)<br>";
		aide += puce + "MTM-fuseau X,Y (mtm-8 mmm mmm, m mmm mmm)<br>";
		aide += puce + "Degré décimal (dd.ddd, dd.ddd)<br>";
		aide += puce + "Degré minute décimale (dd mm.mmm, dd mm.mmm)<br>";
		aide += puce + "Degré minute seconde: (dd mm ss.sss, dd mm ss.sss)<br>"
		aide += puce + "BELL-E911-SSF (Lat: dd.ddd Long: dd.ddd UNC: CONF:)<br>";
		break; 
	  case "4":
		aide += puce + "140 10 = repère du 140ième kilomètre de la route #10<br>";
		break;
	}
	
	aide += lien_pdf        
	document.getElementById("resul").innerHTML = aide;
}

function initialisation () {
	NbResulInitial = 80;
	document.getElementById("indexDebut").value = 0;
	SOAPbreak = false;
	Nbappel = 1;
	html="";
	jscript="";
	resultat = [];
}
var Requete = function() {
              
				AppelServiceSOAP();
}

function AppelServiceSOAP(){

  var aoElements;
  aoElements = pnFormRecherche.items.items;
  
  //Récupérer les éléments de la form ext-js (texte+type recherche)
  for (var i=0, len=aoElements.length; i<len; i++){
    oElement = aoElements[i];
    if(oElement.getId() == "RechercheTitle"){
      texte = oElement.getValue();
    }
    
    if(oElement.getId() == "typeRecherche"){
      
      for (var y=0; y<oElement.items.length; y++){
        if (oElement.items.items[y].checked == true)
          szOutputFormat = y;
      }
      
      switch(szOutputFormat){
        case 1:
          texte = "LIEU " + texte;
          typeRecherche="lieu";
          break;
        case 2:
          texte = "GPS " + texte;
          typeRecherche="gps";
          break;
        case 3:
          texte = "BORNE " + texte;
          typeRecherche="borne";
          break;
        default:
          typeRecherche = "adresse";                                                                                                           
      }
    }
  }
  
  //remplacer par une variable globale ou constante
  page = "glo/FormaterReponseSOAP.php";

  var url = page;
  url += "?type=" + typeRecherche;
  url += "&texte=" + escape(texte);
  url += "&epsg=" + systemeCoord;
  url += "&indDebut=" + parseInt(document.getElementById("indexDebut").value);
  url += "&indFin=0";
  url += "&maxg=" + coordRecherche[0];
  url += "&maxb=" + coordRecherche[1];
  url += "&maxd=" + coordRecherche[2];
  url += "&maxh=" + coordRecherche[3];
  
  //Afficher le message d'attente
  Ext.MessageBox.show({
           msg: 'Recherche en cours, patientez un moment...',
           progressText: 'Chargement...',
           width:300,
           wait:true,
           waitConfig: {interval:200}
        });

  //Lancer l'appel au service SOAP en AJAX
  OpenLayers.loadURL(url, '', this, compteReponseSOAP);
  }
  
function compteReponseSOAP(response) {
  var jscript = unescape(response.responseText);
  jscript = jscript.replace(/\+/g,'\n');
  
  //Compte le nombre de résultats avant de parser
	posDebut = jscript.indexOf("(");
	posFin = jscript.indexOf(")");
	NbResulInitial = jscript.substring(posDebut+1,posFin);
	
	// range les résultats dans une matrice
	posDebut = 0;
	while(jscript.indexOf("href", posDebut) > 0) {
		posDebut = jscript.indexOf("javascript", posDebut);
		posFin = jscript.indexOf(">", posDebut);
		var href = jscript.substring(posDebut, posFin-1);
		posDebut = jscript.indexOf(">", posDebut);
		posFin = jscript.indexOf("</a>", posDebut);
		var mot = jscript.substring(posDebut+1,posFin);
		resultat[resultat.length] = {lien:href, lieu:mot, lien2:""}
		var index = resultat.length-1;
		if (jscript.indexOf("cadrerEtendue",posDebut) > 0) {
			posDebut = jscript.indexOf("javascript", posDebut);
			posFin = jscript.indexOf(">", posDebut);
			resultat[index].lien2 = jscript.substring(posDebut, posFin-1);
			posDebut = posFin;
		}
	}


	var NbAppelMax = 2;
	maxEnreg = parseInt(document.getElementById("maxEnreg").value);
	if (NbResulInitial > 79 && Nbappel < NbAppelMax) {
		document.getElementById("indexDebut").value = parseInt(document.getElementById("indexDebut").value) + maxEnreg;
		Nbappel = Nbappel + 1;
		Requete();
	} else {
		//si les résultats sont trop nombreux (nombre d'appels > 2)
		if (Nbappel == NbAppelMax && NbResulInitial > 79) {
			SOAPbreak = true;
			//alert ("La recherche a été stoppée car elle génère trop de résultats. Vous pouvez continuer la recherche en cliquant sur \"Suivant\". Pour une meilleure réponse, rafiner votre recherche.");
		}		
		parseReponseSOAP();
	}
}

function parseReponseSOAP(){

	//Masquer le message d'attente
	Ext.MessageBox.hide();
	
	// On enlève les résultats identiques
	for (var i=0; i<resultat.length; i++) {
		var test = resultat[i].lieu;
		for (var j=i+1; j<resultat.length; j++) {
			if (resultat[j].lieu == test) {
				resultat = removeInArray(resultat, j);
			}
		}
	}
	
	//Sépare les catégories (ne semble pas être possible de faire en xslt)
      switch(szOutputFormat){
        case 1: //Lieu
		//Enlève les valeurs qui n'ont pas tous les mots recherchés
			var textRecherche = document.getElementById("RechercheTitle").value;
			var motsRecherche = [];
			// Sépare les différents mots et les mets dans motsRecherche
			motsRecherche = separeArray(textRecherche);
			
			//Enleve les item de resultat qui n'ont pas les mots recherchés
			var mot;
			var motResultat = [];
			var nbEvident = 0;
			var index = 0;
			var caracDeb = ["à","À","â","Â","é","É","è","È","ê","Ê","ë","Ë","ï","Ï","ô","Ô","ç","Ç"];
			var caracFin = ["a","A","a","A","e","E","e","E","e","E","e","E","i","I","o","O","c","C"];
			for (var i=0; i<resultat.length; i++) {
				mot = resultat[i].lieu;
				for(var j=0; j <= caracDeb.length-1; j++) {
					while(mot.indexOf(caracDeb[j]) > 0){
						mot = mot.replace(caracDeb[j], caracFin[j]);
					}
				}
				var motEvident = mot.substring(0,mot.indexOf("("));
				var test = true;
				var test2 = true;
				for(var j=0; j <= motsRecherche.length-1; j++) { // Tous les mots recherchés sont-ils dans le résultat ?
					if (motEvident.indexOf(motsRecherche[j]) < 0){
						test2 = false;
						if (mot.indexOf(motsRecherche[j]) < 0){
							test = false
							break;
						}
					}
				}
				if (test == false || test2 == true){ //On enlève le résultat correspondant (si pas tous les mots)	
					if (test2 == true) { // On place les résultats évidents au début
						nbEvident += 1;
						resultat = insertInArray(resultat, 0, resultat[i]);
						resultat = removeInArray(resultat, i+1);
					} else {
						resultat = removeInArray(resultat, i);
					}
				}
			}
			
			// On place le résultat le plus évident en premier
			for (var i=0; i<nbEvident; i++) {
				mot = resultat[i].lieu.substring(0,mot.indexOf("("));
				motResultat = separeArray(mot);
				var prec = separeArray(resultat[index].lieu);
				test = motResultat.length-motsRecherche.length;
				test2 = prec.length-motsRecherche.length;
				if (test < test2) {
					index = i;
				}
			}
			resultat = insertInArray(resultat, 0, resultat[index]);
			resultat = removeInArray(resultat, index+1);
			
			// On bâtit le html
			html = nbEvident + " résultats :<br>"
			for (var i=0; i<resultat.length; i++) {
				if (i == nbEvident) {
					var nbresul = resultat.length - nbEvident
					html += "<br>" + nbresul + "&nbsp;autres résultats : <br>";
				}
				html += "<img alt='' src='images/puce.gif'/> <a href='" + resultat[i].lien + "'>" + resultat[i].lieu + "</a><br>"
			}
			
			
          break;
        case 2: //GPS
			html = decode(jscript);
          break;
        case 3: //Borne
			html = decode(jscript);
          break;
        default: //Adresse
			// On bâtit le html
			html = resultat.length + " résultats :<br><br> Administrations : <br>"
			var test = false;
			for (var i=0; i<resultat.length; i++) {
				if (resultat[i].lien.indexOf("cadrerPoint") > 0 && test == false) {
					test = true;
					html += "<br/>Rues, Chemins,... : <br/>"
				}
				html += "<img alt='' src='images/puce.gif'/> <a href='" + resultat[i].lien + "'>" + resultat[i].lieu + "</a>"
				if (resultat[i].lien.indexOf("cadrerCentreEtendue") > 0) {
					html += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;" + "<img alt='' src='images/puce.gif'/> <a style='color:#000000;' href='" + resultat[i].lien2 + "'>" + "Cadrer sur l'étendue</a><br>"
				}
			}
      }
	  
  //générer la zone Précédent Suivant SI REQUIS (trop d'éléments)
  var ajoutFleche = "";
  maxEnreg = parseInt(document.getElementById("maxEnreg").value);
  var indexDebut;
  
  indexDebut = parseInt(document.getElementById("indexDebut").value);
  
  if (SOAPbreak == true || NbPrecSuiv > 0){
	ajoutFleche += "<div align='center'><table>";
	ajoutFleche += "<tr>";
	
	if (NbPrecSuiv == 0) {
	  ajoutFleche += "<td>Précédent</td>";
	  ajoutFleche += "<td>&nbsp;&nbsp;&nbsp;</td>";
	  ajoutFleche += "<td><a href='javascript: AppelSuivantSOAP();'>Suivant</a></td>";
	}
	if (NbPrecSuiv > 0 ){
	    ajoutFleche += "<td><a href='javascript: AppelPrecedentSOAP();'>Précédent</a></td>";
	    ajoutFleche += "<td>&nbsp;&nbsp;&nbsp;</td>";
		if (NbResulInitial > 79) {
			ajoutFleche += "<td><a href='javascript: AppelSuivantSOAP();'>Suivant</a></td>";
		}else{
			ajoutFleche += "<td>Suivant</td>";
		}
	}
    ajoutFleche += "</tr>";
    ajoutFleche += "</table></div>";
}
  
  if (jscript.indexOf("Uncaught SoapFault exception") > -1)
    html = "<font color=red>Accès au service refusé!</font>";

  if (jscript.indexOf("SOAP Exceptions") > -1)
    html = "<font color=red>Accès au service refusé!</font>";    
  
  //Si le point n'est pas dans la zone rapprochée du Bassin versant
  if (NbResulInitial!=0 && resultat.length == 0 ) {
	html += "<br>Votre recherche ne se trouve pas aux alentours du bassin versant de la rivière Saint-François"
  }
  
  //alert(document.getElementById("resul").innerHTML);
  document.getElementById("resul").innerHTML = ajoutFleche + html;
  
  //ZOOM 2 FIRST
/*  posDebut = jscript.indexOf("javascript:");
  posFin = jscript.indexOf(")", posDebut+11);
  
  if (posDebut > 0 && posFin > 0)              
    eval(jscript.substring(posDebut+11,posFin+1));       */       
}


function AppelSuivantSOAP(){
  var maxEnreg;
  maxEnreg = parseInt(document.getElementById("maxEnreg").value);
  document.getElementById("indexDebut").value = parseInt(document.getElementById("indexDebut").value) + maxEnreg;
  NbPrecSuiv = NbPrecSuiv + 1;
  initialisation();
  Requete();
}

function AppelPrecedentSOAP(){
  var maxEnreg;
  maxEnreg = parseInt(document.getElementById("maxEnreg").value);
  document.getElementById("indexDebut").value = parseInt(document.getElementById("indexDebut").value) - maxEnreg;
  NbPrecSuiv = NbPrecSuiv -1;
  initialisation();
  Requete();
}
        

