// CONSTANTES
ALL              = 'all';
CONTAINER        = 'contenu_integre';
EXTENSION        = '.html';
GOOGLE_IFRAME    = 'iframe/ga';
PAGE_INTEGRATION = 'frontend_ext.php';
SIP              = 'http://mip.service-information-publique.fr/';
DEFAULT_GUIDE    = 'guide-particuliers';

//--------------------------------------------------------------------
// Objet ExternalPage
//--------------------------------------------------------------------
/**
 * Objet ExternaPage
 * 
 * @author Joachim Martin
 * @date 2009-09-30
 * @param content : Contenu HTML à parser
 *
 **/
function ExternalPage(content)
{
  // Récupère le contenu HTML brut
  this.rawContent = content;

  // Partie Title
  this.titlePart = '';

  // Partie CSS
  this.cssPart = '';

  // Partie HTML
  this.bodyPart = '';
}

// Méthodes de l'objet ExternalPage
//===================================================================
/**
 * Permet d'extraire le css du html brut
 * 
 * @author Joachim Martin
 * @date 2009-09-30
 *
 **/
ExternalPage.prototype.extractCss = function() 
{
  temp = this.rawContent.substring(0,this.rawContent.indexOf("<div"));

  arrTemp = temp.split("<");

  arrCss = new Array();
  var arrLength = arrTemp.length;
  
  for(i = 0; i < arrLength; ++i)
  {
    // Exclusion des lignes vides
    if (arrTemp[i])
    {
      pos = arrTemp[i].indexOf('lte ');
      if (pos != -1) 
      {
        // Extraction de la version de IE
        browser = arrTemp[i].substring(pos + 7,pos + 8);

        // On passe à la ligne suivante car on ne veux pas stocker le <!-- if lte ...
        ++i;
      }
      else
      {
        browser = ALL;
      }
      var cssLink  = new CSSLink(arrTemp[i],browser);
      
      // Attention : on n'a pas traité forcément que des <link>
      if(cssLink.href)
      {
	      // Ajoute l'objet dans un tableau
	      arrCss.push(cssLink);
      }

      if(browser != ALL)
      {
        // On passe à la ligne suivante car on ne veux pas stocker le <!-- endif... 
        ++i;
      }
    }
  }

  this.cssPart = arrCss;
}

/**
 * Permet de récupérer le body du html
 * 
 * @author Joachim Martin
 * @date 2009-09-30
 *
 **/
ExternalPage.prototype.extractHtml = function() 
{
  this.bodyPart = this.rawContent.substring(this.rawContent.indexOf("<div"));
}

/**
 * Extrait le titre du contenu html brut
 * 
 * @author Joachim Martin
 * @date 2009-10-25
 *
 **/
ExternalPage.prototype.extractTitle = function()
{
  var regexS = "<title>(.*)<\/title>";
  var regex = new RegExp( regexS );
  var results = regex.exec(this.rawContent);
  if( results === null )
  {
    this.titlePart = '';
  }
  else
  {
    this.titlePart = results[1];
  }
}

//--------------------------------------------------------------------
// Objet CSS
//--------------------------------------------------------------------
function CSSLink(link,browser)
{
  this.link = link;
  this.rel = this.extractParameter('rel');
  this.type = this.extractParameter('type');
  this.media = this.extractParameter('media');
  this.href = this.extractParameter('href');
  this.browser = browser;
}

// Méthodes de l'objet CSS
//===================================================================
/**
 * Extrait les paramètres de la balise de style récupérée
 * 
 * @author Joachim Martin
 * @date 2009-09-30
 * @param name : Nom du paramètre à extraire
 *
 **/
CSSLink.prototype.extractParameter = function(name)
{
  var regexS = name+"=\"([^&# ]*)\"";
  var regex = new RegExp( regexS );
  var results = regex.exec(this.link);
  if( results === null )
  {
    return "";
  }
  else
  {
    return results[1];
  }
}

//--------------------------------------------------------------------
// Objet Intégration
//--------------------------------------------------------------------
/**
 * Objet Integration
 * 
 * @author Joachim Martin
 * @date 2009-09-30
 *
 **/
function Integration()
{
  this.sipguide = '';
  this.refUrl = window.location.href;
  this.sipadm = '';
  this.sipccm = '';
  this.sippub = '';
  this.sipcnt = '';
  this.sipcp  = '';
  this.siprpt  = '';
  this.content= '';
  this.isIe   = this.checkIE();

  // Vérification des paramètres nécessaires à l'intégration de SIP
  if (this.checkCompulsory())
  {
    // Tous les paramètres nécessaires sont présents, on ajoute la balise
    this.addScriptSrc(); 
  }
  else
  {

    if (this.isIe)
    {
      var strError = '';

      if (!this.sipadm)
      {
        strError += ' - sipadm => Identifiant de l\'administration\n';
      }

      if (strError)
      {
        strError = 'Echec de l\'intégration\nParamètres requis dans l\'url ou en dur dans la page : \n' + strError;
        alert(strError);
      }
    }
    else  
    {
      console.log('Echec de l\'intégration');
      console.log('Paramètres requis dans l\'url ou en dur dans la page: ');
      if (!this.sipadm)
      {
        console.log(' - sipadm => Identifiant de l\'administration');
      }
    }
  }
}

// Méthodes de l'objet Integration
//===================================================================
/**
 * Permet l'extraction d'un paramètre de l'url
 * 
 * @author Joachim Martin
 * @date 2009-09-29
 * @param string name : Nom du paramètrre à extraire
 *
 **/
Integration.prototype.extractQueryParameter = function(name) 
{
  name = name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
  var regexS = "[\\?&]"+name+"=([^&#]*)";
  var regex = new RegExp( regexS );
  var results = regex.exec( window.location.href );
  if( results === null )
  {
    return "";
  }
  else
  {
    return results[1];
  }
}

/**
 * Vérifie que tous les paramètres nécessaires à l'intégration de SIP sont présents
 * 
 * @author Joachim Martin
 * @date 2009-09-29
 *
 **/
Integration.prototype.checkCompulsory = function()
{
  result = false;

  // Est ce qu'on a les paramètres dans l'url ?
  if(this.extractQueryParameter('slug') || this.extractQueryParameter('sipadm')) 
  {
    
    // Stocke les paramètres dans l'objet
    this.sipadm = this.extractQueryParameter('slug');
    if (!this.sipadm)
    {
      this.sipadm = this.extractQueryParameter('sipadm');
    }
    this.sipccm = this.extractQueryParameter('sipccm');
    this.sipcp  = this.extractQueryParameter('sipcp');
    
    result = true; 
  }
  // Non, est ce qu'ils sont définis dans la page elle même
  else
  {
    if(typeof(sipadm) != 'undefined')
    {
      // Stocke les paramètres dans l'objet
      this.sipadm = sipadm;

      result = true;
    }
  }
  // Teste  si on a une variable pour l'id du container
  // => dans l'url
  if (this.extractQueryParameter('sipcnt'))
  {
    this.sipcnt = this.extractQueryParameter('sipcnt');
  }
  else 
  {
    // Dans la page appelante
    if(typeof(sipcnt) != 'undefined')
    {
      this.sipcnt = sipcnt;
    }
    // Aucun des deux cas précédents, on prend la valeur par défaut
    else
    {
      this.sipcnt = CONTAINER;
    }
  }
  // Teste  si on a une variable pour le nom du guide
  // => dans l'url
  if (this.extractQueryParameter('sipguide'))
  {
    this.sipguide = this.extractQueryParameter('sipguide');
  }
  else 
  {
    // Dans la page appelante
    if(typeof(sipguide) != 'undefined')
    {
      this.sipguide = sipguide;
    }
    else
    {
      this.sipguide = DEFAULT_GUIDE; 
    }
  }

  // Teste si on a une variable content (pages statiques)
  if (this.extractQueryParameter('content'))
  {
    this.content = this.extractQueryParameter('content');
  }
  return result;
}

/**
 * Ajout d'une balise script src de manière dynamique
 * 
 * @author Joachim Martin
 * @date 2009-09-29
 *
 **/
Integration.prototype.addScriptSrc = function()
{
  this.sippub = this.extractQueryParameter('sippub');
  
  // Code du parent éventuellement renseigné (arbo locale)
  this.siprpt = this.extractQueryParameter('siprpt');
  
  // Création de la balise script
  var script  = document.createElement('script');
  // Définit le type de script
  script.type = 'text/javascript';
  // Ajoute l'url de base
  script.src  = SIP + PAGE_INTEGRATION;
  // Force l'encodage du script
  script.charset = "utf-8";

  // Détermine l'action
  if(this.sippub)
  {
    script.src += '/' + this.sipadm;
    script.src += '/' + this.sipguide +'/' + this.sippub + EXTENSION;
    
    // on regarde si on doit rajouter le code du parent
    // TODO : attention au ? que je rajoute là
    if(this.siprpt)
  	  script.src += '?rpt=' + this.siprpt;
  }
  else 
  {
    if (this.content)
    {
      script.src += '/' + this.sipadm;
      script.src += '/' + this.content + EXTENSION;
    }
    // est ce qu'on a un code postal?
    else if (this.sipcp)
    {
      script.src += '/' + this.sipadm;
      script.src += '/cp/' + this.sipcp
      script.src += '/' + this.sipguide + EXTENSION;
    }
    else 
    {
      script.src += '/' + this.sipadm;
      // Est ce qu'on a un code commune
      if (this.sipccm)
      {
        script.src += '/' + this.sipccm;
      }
      script.src += '/' + this.sipguide + EXTENSION;
    }
  }

  // Ajoute la balise au head de la page
  headTag = document.getElementsByTagName("HEAD")[0];
  headTag.appendChild(script);
}

/**
 * Vérifie si on est sur IE, si oui ,en extrait la version
 * 
 * @author Joachim Martin
 * @date 2009-09-30
 *
 **/
Integration.prototype.checkIE = function()
{
  pos = navigator.appVersion.indexOf('MSIE');

  // On est sur IE, obtention de la version
  if (pos != -1)
  {
    return parseInt(navigator.appVersion.substring(pos + 5, pos + 8));
  }
  else
  {
    return 0;
  }
}
//--------------------------------------------------------------------
// Méthode de callback appelé une fois la récupération du contenu effectuée
//--------------------------------------------------------------------

/**
 * Fonction de callback appelée une fois la page externe chargée
 * 
 * @author Joachim Martin
 * @date 2009-09-29
 *
 **/
loadPage = function() {

	setTimeout(function(){
	
	  // Traitement du HTML généré
	  externalPage.extractTitle();
	  externalPage.extractCss();
	  externalPage.extractHtml();
	  
	  // Récupération du title
	  document.title = document.title + " | " + externalPage.titlePart;
	
	  // Récupération du head de la page
	  headTag = document.getElementsByTagName("HEAD")[0];

	  // Boucle sur les css pour les ajouter dans le head
	  var cssLength = externalPage.cssPart.length;
	
	  for (var i = 0; i < cssLength; ++i)
	  {
	    // N'ajoute la feuille de style que si nécessaire
	    if (externalPage.cssPart[i].browser == ALL || (externalPage.cssPart[i].browser >= integration.isIe && integration.isIe!=0))
	    {
	      // Création d'un nouvel élément de type link
	      var css = document.createElement('link');
	      css.type  = externalPage.cssPart[i].type;
	      css.rel   = externalPage.cssPart[i].rel;
	      css.media = externalPage.cssPart[i].media;
	      css.href  = externalPage.cssPart[i].href;
	
	      // Ajout de l'élément au head
	      headTag.appendChild(css);
	    }
	  }
	
	  // récupération du div servant à afficher le contenu
	  integrated = document.getElementById(integration.sipcnt);
	  
	  // Affichage du contenu
	  integrated.innerHTML = externalPage.bodyPart;
	  
    // Ajoute une iframe pour les marqueurs GA
    insertIframeGA();
	},50);
}

/**
 * Fonction permettant l'ajout de l'iframe nécessaire au fonctionnement de Google Analytics
 * 
 * @author Joachim Martin
 * @date 2009-11-24
 *
 **/
insertIframeGA = function() {
  if(typeof(sipadm) != 'undefined' && typeof(tracker) != 'undefined')
  {
    // Récupération du DIV servant à afficher le contenu du SIP
    integrated = document.getElementById(integration.sipcnt);

    // Création de l'iframe
    iframe = document.createElement("IFRAME");

    //Mise à jour de l'élément src
    iframe.src = SIP + GOOGLE_IFRAME + '/tracker/' + tracker;
    iframe.src += '/departement/' + departement;
    iframe.src += '/collectivite/' + collectivite ;
    iframe.src += '/guide/' + this.sipguide;
    iframe.src += '/ariane/' + ariane;
    iframe.src += '/type_page/' + type_page;
    iframe.src += EXTENSION;

    iframe.style.width = "0px";
    iframe.style.height = "0px";
    iframe.style.visibility = "hidden";

    // Ajout de l'iframe au DIV
    integrated.appendChild(iframe);
  }
}

// Lance l'intégration du contenu sur le site
//===========================================
//Intancie un nouvel objet intégration
integration = new Integration();
