/******************************************************************************\
 * fichier iwn_loader.js
 *
 * @author Camille Descombes
 * @version 1.2
 * @since 1.0
 *  
 * Script de chargement des modules IWN
 *  
\******************************************************************************/

IWN =
{
  includes:
  {
    classes: {
      'inscription': [
        'table',
        'cookie',
        'informations',
        'emprunts',
        'pathologies',
        'sports',
        'professions',
        'coordonnees',
        'formules'
      ],
      'consultation': [
        'table',
        'cookie',
        'coordonnees',
        'formules'
      ]
    },

    scripts: {
      'inscription': [
        'i_general',
        'i_corbeille',
        'i_verifiercircuit',
        'i_resume',
        'i_identification'
      ],
      'consultation': [
        'c_general',
        'c_login',
        'c_mdpoublie',
        'c_nodossierperdu'
      ]
    },

    communs: [
      'librairie',
      'docsnecessaires',
      'infossupp',
      'tarifchoix',
      'popup'
    ],

    lib: {
      'inscription': ['mylib'],
      'consultation': ['mylib','md5']
    }
  },

  require: function(libraryName)
  {
    document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
  },
  
  load: function(parameters)
  {
    // Actualisation du message de chargement
    IWN.loader.setMessage('Vérification des données...');

    if((typeof Prototype=='undefined') ||
       (typeof Element == 'undefined') ||
       (typeof Element.Methods=='undefined'))
       throw('La librairie Prototype n\'est pas incluse');

    if (typeof(parameters.serveur) == 'undefined')
      return alert('Paramètre "serveur" non renseigné');
    if (typeof(parameters.partenaire) == 'undefined')
      return alert('Paramètre "partenaire" non renseigné');
    if (typeof(parameters.apporteur) == 'undefined')
      return alert('Paramètre "apporteur" non renseigné');
    if (typeof(parameters.scriptRequeteAjax) == 'undefined')
      return alert('Paramètre "scriptRequeteAjax" non renseigné');
    if (typeof(parameters.module) == 'undefined')
      return alert('Paramètre "module" non renseigné');

    if (parameters.module != 'inscription'
     && parameters.module != 'consultation')
      return alert('Module IWN incorect : "'+parameters.module+'" (inscription ou consultation)');

    // Actualisation du message de chargement
    IWN.loader.setMessage('Chargement des fichiers JavaScript...');
    
    // Répertoire des scripts
    var path = parameters.serveur + 'js/';

    IWN.includes.lib[parameters.module].each(function(include){
      IWN.require(path + '_lib/' + include + '.js'); });

    IWN.includes.classes[parameters.module].each(function(include){
      IWN.require(path + 'iwn/classes/' + include + '.class.js'); });

    IWN.includes.communs.each(function(include){
      IWN.require(path + 'iwn/communs/' + include + '.js'); });
      
    IWN.includes.scripts[parameters.module].each(function(include){
      IWN.require(path + 'iwn/' + parameters.module + '/' + include + '.js'); });
      

    // Boucle tant que le DOM et les scripts ne sont pas chargés
    IWN.loader.onJsReady(function()
    {
      // Les parametres deviennent des propriétés de l'objet IWN
      Object.extend(IWN,parameters);

      // Paramètres par défaut
      IWN.langue               = IWN.langue               || 'fr';
      IWN.messageErreur        = IWN.messageErreur        || 'Erreur de chargement';
      IWN.conteneur            = IWN.conteneur            || 'iwn_conteneur';
      IWN.produitAccident      = IWN.produitAccident      || false;
      IWN.produitFraisGeneraux = IWN.produitFraisGeneraux || false;

      // Actualisation du message de chargement
      IWN.loader.setMessage('Chargement des chaines traduites...');

      // On inclut les chaines traduites
      var phpTrad = 'ajax/dossier/';
      switch (IWN.module)
      {
        case 'inscription'  : phpTrad += 'DossierInscriptionTrad.php'; break;
        case 'consultation' : phpTrad += 'DossierConsultationTrad.php'; break;
      }

      IWN.loader.onDomReady(function()
      {
      	IWN.loader.requeteAjax({
    			parameters:  IWN.loader.parametres(phpTrad),
    			onComplete:  IWN.loader.inclureJsTrad,
    			onFailure:   IWN.loader.erreurChargement,
    			onException: IWN.loader.erreurChargement
     		})
      });
    });
  },

  // Charge le module IWN
  loader:
  {
    // Message de chargement
    message: '',
    
    // Temps entre 2 tentatives de chargement
    intervalTime: 200,
    
    setMessage: function(msg)
    {
      IWN.loader.message = msg;
      if (document.getElementById('iwn_loader_message'))
        $('iwn_loader_message').innerHTML = msg;
    },
    
    // Inclut les chaines javascript traduites
    inclureJsTrad: function(req)
    {
      // On exécute le code javascript
      eval(IWN.getJSONResult(req));

      var phpDiv = 'ajax/dossier/';
      switch (IWN.module)
      {
        case 'inscription'  : phpDiv += 'DossierInscriptionDiv.php'; break;
        case 'consultation' : phpDiv += 'DossierConsultationDiv.php'; break;
      }

      // Actualisation du message de chargement
      IWN.loader.setMessage('Chargement du contenu du module...');
      
      IWN.loader.requeteAjax({
  			parameters:  IWN.loader.parametres(phpDiv),
  			onComplete:  IWN.loader.remplirConteneur,
  			onFailure:   IWN.loader.erreurChargement,
  			onException: IWN.loader.erreurChargement
  		});
    },

    // Remplit le conteneur avec du code HTML
    remplirConteneur: function(req)
    {
      // On remplit le conteneur
      $(IWN.conteneur).innerHTML = IWN.getJSONResult(req);

      // On initialise le module
      IWN.initialisation();
    },

    // Exécuter lors d'une erreur AJAX
    erreurChargement: function(transport,error)
    {
      $(IWN.conteneur).innerHTML = IWN.messageErreur;
  	  throw error;
    },

    // Exécute la fonction passée en Paramètre lorsque le DOM est chargé
    onJsReady: function(fct)
    {
      // Boucle tant que la fonction d'initialisation du module n'est pas chargée
      IWN.loader.interval = setInterval(function()
      {
        // On quitte si la fonction n'existe pas
        if (typeof(IWN.initialisation) == 'undefined') return;

        // on stoppe la boucle
        clearInterval(IWN.loader.interval);

        // On exécute la fonction
        fct();

      },IWN.loader.intervalTime);
    },
    
    // Exécute la fonction passée en Paramètre lorsque le DOM est chargé
    onDomReady: function(fct)
    {
      // Boucle tant que la fonction d'initialisation du module n'est pas chargée
      IWN.loader.interval = setInterval(function()
      {
        // On quitte si le conteneur n'existe pas sur la page
        if (!document.getElementById(IWN.conteneur)) return;

        // on stoppe la boucle
        clearInterval(IWN.loader.interval);

        // On exécute la fonction
        fct();

      },IWN.loader.intervalTime);
    },
    
    // Exécute une requete AJAX
    requeteAjax: function(param)
    {
      var defaultParam = {method:'post'};
      Object.extend(defaultParam,param);
      IWN.ajaxCall = new Ajax.Request(IWN.scriptRequeteAjax,defaultParam);
      return IWN.ajaxCall;
    },

    // Ecrit les paramètres de la requête AJAX
    parametres_get: function()
    {
    	return 'lang='  + IWN.langue
    		+ '&IDP='   + IWN.partenaire
    		+ '&IDA='   + IWN.apporteur
    		+ '&MOD='   + IWN.module
    		+ (IWN.produitAccident      ? '&prod=accident' : '')
    		+ (IWN.produitFraisGeneraux ? '&prod=fraisgeneraux' : '');
    },
    
    parametres: function(page)
    {
    	return 'url=' +
        escape ( IWN.serveur + page + '?' + IWN.loader.parametres_get() );
    }
  }
};

