// 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';
ID_CODE_POSTAL   = 'code_postal';
ID_CODE_INSEE    = 'sip_code_insee';

//--------------------------------------------------------------------
//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())
{
  // Récupération et traitement de l'url
  this.processUrl();
  
  // Insertion de jQuery
  // TODO : ne le mettre que si besoin (bcp de communes)
  // Un jQuery.noConflict est mis dans le layout ext 
  this.addJQuery();

  // 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.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;
  }
}

/* On regarde si le sipccm est forcé dans le code js d'integration, sinon en GET */
if(this.extractQueryParameter('sipccm')) {
	  this.sipccm = this.extractQueryParameter('sipccm');
}
else if(typeof(sipccm) != 'undefined') {
	  this.sipccm = sipccm;
}

// 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";

// Ajoute le domaine pour identification
script.src += '/' + this.refUrl;

// On ajoute le sipadm
script.src += '/' + this.sipadm;

// On commence par regarder si on affiche du contenu static
if (this.content)
{
  script.src += '/' + this.content + EXTENSION;
}
// On valide un code postal (cas du champ texte standard)
else if (this.sipcp)
{
	script.src += '/cp/' + this.sipcp;
	script.src += '/' + this.sipguide + EXTENSION;
	
	// Attention : pour pouvoir rester sur la pub demandée avant le choix de commune, on reprend le texte du sippub
	// car on transite le sippub tout au long des formulaire, pour retomber dessus après
	var sepChar = '?'; // indispensable pour gérer les 2 cas
	if (this.sippub) {
		script.src += '?sippub=' + this.sippub;
		sepChar = '&';
	}
		  
	// on regarde si on doit rajouter le code du parent (cf ci-dessous)
	if(this.siprpt)
	  script.src += sepChar + 'rpt=' + this.siprpt;
}
// Sinon, est-ce qu'on a un sippub
else if (this.sippub)
{
	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;
}
// Est ce qu'on a un code commune (doit rester en dernière position)
else if (this.sipccm)
{
	script.src += '/' + this.sipccm;
	script.src += '/' + this.sipguide + EXTENSION;
}
else
{
	// Cas par défaut : pour l'accueil
	script.src += '/' + this.sipguide + EXTENSION;
}

// Détermine l'action : OLD mais le garder
/*
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);
}

/**
 * On commence à insérer jQuery dans la page
 * 
 * @author Guillaume Bourreau
 * @date 2010-06-25
 *
 **/
Integration.prototype.addJQuery = function() {
	headTag = document.getElementsByTagName("HEAD")[0];
	
	var script = document.createElement('script');
	script.src = SIP + 'js/jquery-1.4.2.min.js';
	script.type = "text/javascript";
	headTag.appendChild(script);
	
	// Le timeout est pour IE, pour que jQuery puisse être correctement chargé avant
	setTimeout(function(){
		var script = document.createElement('script');
		script.src = SIP + 'js/jquery.autocompleter.js';
		script.type = "text/javascript";
		headTag.appendChild(script);
	},50);
	
}

/**
* 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;
}
}

/**
* Extrait l'url de la page (domaine)
* 
* @author Joachim Martin
* @date 2010-06-09
*
**/
Integration.prototype.processUrl = function()
{
this.refUrl = this.refUrl.substring(7);

// Est ce qu'on a un ? => donc des params
if (this.refUrl.indexOf('?') != -1) 
{
  // On stocke le domaine
  this.refUrl = this.refUrl.substring(0,this.refUrl.indexOf('?'));
}

// Un slash est trouvé, on extrait le domaine
if (this.refUrl.indexOf('/') != -1)
{
  this.refUrl = this.refUrl.substring(0,this.refUrl.indexOf('/'))
}

// Remplace tous les . par des _ pour éviter les pb de route dans symfony
this.refUrl = this.refUrl.replace(/\./g,'_');
}

//--------------------------------------------------------------------
//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();

	  // Gère l'autocomplete des communes
	  processAutocomplete();  
	},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/' + sous_rubrique;
  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);
}
}

/**
 * Fonction permettant de faire l'autocomplete des communes
 * Copie du sipWidgetJQueryCommunesAutocompleter
 * 
 * @author Guillaume Bourreau
 * @date 2010-06-25
 *
 **/
processAutocomplete = function() {
	jQuery(document).ready(function() {
	    jQuery('#' + ID_CODE_POSTAL)
	    .autocomplete(SIP + '/guide/rechercheCommuneAjax.html?jsoncallback=?', jQuery.extend({}, {
	      dataType: 'json',
	      parse:    function(data) {
	        var parsed = [];
	        for (key in data) {
	          parsed[parsed.length] = { data: [ data[key], key ], value: data[key], result: data[key] };
	        }
	        return parsed;
	      }
	    }, { extraParams: { value: function() { return jQuery('#' + ID_CODE_POSTAL).val(); } },
              resultsClass: 'ac_results conteneur-sip-ac_results' ,
              scrollHeight: 500 ,
              width: 220 ,
              minChars: 3,
              max: 15,
              autoFill: false }))
	    .result(function(event, data) {
	    	// On met à jour le champ code_postal de base, avec en réalité le nom de la commune
		    jQuery('#' + ID_CODE_POSTAL).val(data[2]);	    
		    
		    // Et on remplit le champ d'id de code commune : en 0 l'id, en 1 le cp et en 2 une clé
		    string = data[1].split('_');
		   	jQuery('#' + ID_CODE_INSEE).val(string[0]);	
	    });
	  });
}

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