/*

Fichier qui va offrir le support de l'AJAX à SportingEvents.   Ce fichier JS est une librairie commune à plusieurs autres fichiers JS qui seront eux, minimalistes et
voué à une tâche précise.

*/

// -----------------------------------------------------------------------------------------------------------
//
// Création de la fonction Ajax qui sera utilisée pour rafraîchir la page
// Fonction appellée par le composant mais aussi le module calendrier
//
// -----------------------------------------------------------------------------------------------------------

function SportingEvents_Ajax() {

var xmlhttp=false;

   try {
      xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");
   } catch(e){
       try {
          xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
       }
       catch(E) { xmlhttp=false; }
   }

   if (!xmlhttp && typeof XMLHttpRequest!="undefined") { xmlhttp=new XMLHttpRequest(); }

   return xmlhttp;

} // function newAjax()

// -----------------------------------------------------------------------------------------------------------
//
// Cette fonction va afficher une image "Loading" le temps que la requête Ajax soit complétée.
// Il faut passer en paramètre le nom de la DIV où l'image doit apparaître.
// Fonction appellée par le composant mais aussi le module calendrier
//
// -----------------------------------------------------------------------------------------------------------

function SportingEvents_Ajax_Loading(sDivName, on, imgFolder) {

   divLoading = document.getElementById(sDivName);

   // imgFolder peut être un folder comme p.e. "img16/".   L'image ajax-loader.gif sera alors chargée depuis ce folder-là

   if (imgFolder==null) imgFolder='';

   if (divLoading!=null) {

      if (on==1) {
         loadHtml  = "<div id='loadingDiv' style='display:block; position:absolute; z-index:99;'><img src='"+se_form_event_baseurl+"components/com_sportingevents/assets/images/"+imgFolder+"ajax-loader.gif'/></div>";
      } else {
         loadHtml = "<div id='loadingDiv' style='display:none;'>&#160;</div>";
      }

      divLoading.innerHTML = loadHtml;

   } else if (getQuerystring('debug',0)!=0) {

     alert('SportingEvents_Ajax_Loading - div '+sDivName+' seems to be missing');

   }

   return true;

} // function SportingEvents_Ajax_Loading()


// ------------------------------------------------------------------------------------------------------------------
//
// Pages donnant les listes des évènements (com_sportingevents\views\sportingevents) dans le frontend
// Met à jour la liste des évènements en tenant compte des choix opérés dans la zone des filtres
//
// ------------------------------------------------------------------------------------------------------------------

function refresh_list_events(sDivName, frmName) {

   // Le formulaire adminForm n'existe pas ==> nous sommes dans le frontend

   if (frmName=='') {

     // Le nom du formulaire n'est pas défini : tente d'accéder au formulaire "adminForm" et s'il n'existe pas à "filterForm"

     var form = document.adminForm;
     if (form==undefined) form=document.filterForm;

   } else {

     // Le nom du formulaire a été défini comme paramètre

     var form = eval('document.'+frmName);

   } // if (frmName=='') {

   if (form==undefined) {

      if (getQuerystring('debug',0)>=1) alert('refresh_list_events - form '+frmName+' seems to be missing.   Please verify the source code of the page');

   } else { // if (form==undefined)

      // Affichage d'une image "Loading..."

      SportingEvents_Ajax_Loading('AjaxLoader', 1);

      // Récupère les différents filtres

      sParams='&ajax=1';        // Ce paramètre est important car il va indiquer au code PHP que la mise-à-jour de la page est causée par une fonction Ajax

      // Parcoure chaque liste déroulante présente et dès l'instant où une liste contient un élément sélectionné (SelectedIndex non égal à 0), ajoute le champs et la valeur
      // à la liste des paramètres

      for ( var i=0;i<form.elements.length;i++ ) {
         if (form.elements[i].type=='select-one') {
            if ((form.elements[i].name)!='') {
               cbx = form.elements[i];
               sParams = sParams + "&" + cbx.name+ "=" + cbx[cbx.selectedIndex].value;
            }
         }
      } // for ( var i=0;i<form.elements.length;i++ )

      if ((document.getElementById('se_search')!=null) && (document.getElementById('se_search').value!='')) sParams += '&se_search='+encodeURIComponent(document.getElementById('se_search').value);

      // Lance la requête Ajax et fais la mise-à-jour de le DIV concernée.

      SportingEvents_Ajax_Update(sDivName, sParams, 1);

   } // // if (form==undefined)
   
   return true;

} // function refresh_list_events


/*
// ------------------------------------------------------------------------------------------------------------------
//
// Lorsque l'utilisateur va s'inscrire à un évènement et que cette inscription est l'inscription standard de SportingEvents
// (soit la case à cocher "Je participerais (ou pas) à l'évènement); la fonction ci-dessous va se charger d'inscrire / désinscrire l'utilisateur
// puis mettre à jour la liste des participants au travers d'une requête Ajax
//
// ------------------------------------------------------------------------------------------------------------------

function refresh_who_will_comes(sDivName) {

var form = document.se_enrolForm;

   // Affichage d'une image "Loading..."

   SportingEvents_Ajax_Loading('AjaxLoader',1);

   // Si coché, l'utilisateur veut s'inscire.   Se désinscrire sinon

   if (form.chkWillParticipate.checked==true) {
     form.task.value = 'saveParticipation';
   } else {
     form.task.value = 'removeParticipation';
   }

   // Construction des paramètres en prenant en considération les champs cachés du formulaire.
   // Ces champs sont créés par SportingEventsClassShowEvent::ShowEnrolForm

   sParams='';

   for (var i=0;i<form.elements.length;i++) {
      el = form.elements[i];
      if ((el.name !='option') && ((el.type=="hidden") || (el.type=="text"))) {
         sParams += '&'+el.name+'='+ el.value;
      }
   }

   // Met à jour.

   SportingEvents_Ajax_Update(sDivName, sParams);

}
*/

// -----------------------------------------------------------------------------------------------------------
//
// Cette fonction va permettre de construire l'URL qui sera utilisée pour la mise-à-jour grâce à Ajax.  
// Fonction appellée par le composant mais aussi le module calendrier
//
//   sParams      = Paramètres à ajouter dans le querystring
//   bConcatenate = Concatène au querystring existant si égal à 1
//   bIndex2      = Remplate index.php par index2.php si égal à 1
//
// -----------------------------------------------------------------------------------------------------------

function getUrlForAjax(sParams, bConcatenate, bIndex2) {


   sURL_Params = '';

   sURL = location.href;

   // Il arrive que la liste des paramètres n'est plus accessible dans la barre d'adresse.  C'est le cas p.e. lorque le webmaster clique sur un titre de colonne pour faire un tri.
   // Dans ce cas, s'il n'y a plus de paramètres, il faut les spécifier

   if (bConcatenate!=0) {

      // Récupère la liste des paramètres

      sURL_Params = window.location.search.slice(1,window.location.search.length);

      sURL_Params = ((sURL_Params=='') ? '?option=com_sportingevents&task=show_view&view=courses&layout=default' : '?'+sURL_Params);

   } // if (bConcatenate!=0)

   // ------------------------------------------------------------------------------------------------------------------------------------
   //
   // Retire de l'URL tous les paramètres qui ont comme valeur -1 (http://javascript.developpez.com/faq/?page=navig#RecupParam)

   first = sParams.split("&");

   sParams_Purged = '&';

   // Si certains paramètres sur la ligne de commande sont à -1 (p.e. show_sport=-1); le paramètre n'a pas de raison d'exister et peut être supprimé.
   //
   // Ces paramètres sont ajoutés automatiquement par Joomla dans l'écran de gestion des menus.

   for(i=0;i<first.length;i++){

      second = first[i].split("=");

      // Second[1] étant la valeur du paramètre et Second[0] son nom

      if ((second[1]!='-1') && (second[1]!='') && (second[1]!=undefined)) {

         // Vérifie si ce paramètre (p.e. sport_id) n'est pas déjà mentionné dans les paramètres de la page et si c'est le cas, adapte la valeur ancienne avec la nouvelle.

         sParamToRetrieve= '&'+second[0]+'=';

         wPos = sURL_Params.indexOf(sParamToRetrieve);

         if (wPos>0) {

            // Le paramètre a été retrouvé.  Il faut donc en remplacer la valeur

            wEndPos = sURL_Params.indexOf('&', wPos+1);
            if (wEndPos==-1) wEndPos = sURL_Params.length;

            sURL_Params = sURL_Params.substr(0, wPos+sParamToRetrieve.length)+second[1]+sURL_Params.substr(wEndPos, (sURL_Params.length-wEndPos));

         } else {

           sParams_Purged += second[0]+'='+second[1]+'&';

         } // if (wPos>0)

      } // if ((second[1]!='-1') && (second[1]!='') && (second[1]!=undefined))

   } // for(i=0;i<first.length;i++)

   // Si les deux premiers caractères sont '&?', retire le &

   sParams_Purged = sParams_Purged.replace('&?', '?');

   // Retire le "&" final

   if (sParams_Purged.substr(sParams_Purged.length-1,1)=='&') sParams_Purged =sParams_Purged.substr(0,sParams_Purged.length -1);

   // Si c'est le frontend et que l'URL mentionne index.php, remplace par index2.php pour économiser des ressources.   En effet, sur Joomla, index2.php ne génère pas la mise en
   // page complète mais uniquement la partie contenu càd le contenu généré par le composant spécifié en ligne de commandes.

   if ((bIndex2==1) && (sURL.indexOf('/index.php') > 0)) sURL = sURL.replace('/index.php', '/index2.php');

   // Construit l'URL qui sera utilisé par la fonction ajax : concatène l'URL avec ses paramètres, les paramètres non égal à -1 et les nouveaux paramètres qui dépendent des listes déroulantes

   if (sURL.indexOf('?') > 0) {
      sURL = sURL.substr(0,sURL.indexOf('?')) + sURL_Params + sParams_Purged;
   } else {
      sURL = sURL + sURL_Params + sParams_Purged;
   }

   if (getQuerystring('debug',0)>7) alert('SportingEvents_Ajax_Update - Executing \r\n'+sURL);

   return sURL;

} // function getUrlForAjax(sParams, bConcatenate)

// -----------------------------------------------------------------------------------------------------------
//
// Cette fonction va mettre à jour le contenu de la div en exécutant une requête (sURL) sur le serveur et
// en retrouvant la portion de code à mettre à jour (sDivName)
//
// -----------------------------------------------------------------------------------------------------------

function SportingEvents_Ajax_Update(sDivName, sParams, bConcatenate) {

   var ajax=SportingEvents_Ajax();

   // Lancement de la requête Ajax qui va charger la liste des champs

   if (sDivName=='') sDivName = 'se_ShowTable';
   
   // Construit l'URL

   sURL = getUrlForAjax(sParams, bConcatenate, 1);

   // Exécute la requête

   ajax.open("POST", sURL, true);
   ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
   ajax.send();

   // Envoi du paramètre qui est, dans ce cas-ci, le numéro du formulaire CK Forms

   ajax.onreadystatechange=function() {

      if (ajax.readyState==4) {

         // Récupération du document envoyé par le webserver

         var response = ajax.responseText;

         // Dans ce document, localise la div à mettre à jour

         if ((document.getElementById(sDivName)==null) && (getQuerystring('debug',0)>=1)) {
            alert('SportingEvents_Ajax_Update - div '+sDivName+' seems to be missing.   Please verify the source code of the page');
         }

         var start = response.indexOf('<!--'+sDivName+' start-->');
         var finish = response.indexOf('<!--'+sDivName+' end-->');

         html_code_to_update = response.substring(start,finish);

         if (getQuerystring('debug',0)>=7) alert('SportingEvents_Ajax_Update : returned HTML \r\n'+html_code_to_update);

         // Remplace le contenu de la DIV avec la portion de code qui provient de la requête

         document.getElementById(sDivName).innerHTML = html_code_to_update;

         SportingEvents_Ajax_Loading('AjaxLoader', 0);

      } // if (ajax.readyState==4)

   } // ajax.onreadystatechange=function()

} // function SportingEvents_Ajax_Update()

// -----------------------------------------------------------------------------------------------------------
//
// Applique les filtres
//
// -----------------------------------------------------------------------------------------------------------

function submit_filters(cbx) {

   // Le filter qui a été activé doit être stylisé.

   if (cbx!='') {

      obj = document.getElementById(cbx);

      if (obj!=undefined) {

         if (cbx=='se_search') {

            if (obj.value=='') {
               obj.className="search activefilter";
            } else {
               obj.className="search";
            }

         } else {


            i = obj.selectedIndex;

            if (i!=0) {
               obj.className="filtersCBX activefilter";
            } else {
               obj.className="filtersCBX";
            }

         } // if (cbx=='se_search')

      } else {
         if (getQuerystring('debug',0)>=1) alert('submit_filters - cbx '+sDivName+' seems to be missing.   Please verify the source code of the page');
      }
   } // if (cbx!='')
   
   frmName = ((se_UserIsSeetingSite=='backend') ? 'adminForm' : 'filterForm');

   refresh_list_events('se_ShowTable', frmName);

   return;

} // function submit_filters(cbx)


