/**
 * Description rapide du rôle de la classe sur une ligne
 *
 * Commentaires sur plusieurs lignes
 * donnant le détail du fonctionnement
 * <code>
 * var testObj = new ObjGestionErreur(benchmark.ObjGestionErreur.REPORT_MODE,false);
 * testObj.setUrlReport("http://www.lan35.linternaute.com/video/cgi/erreur/gestion_erreur.php");
 *</code>
 *
 * @author pot <pot@benchmark.fr>
 * @package bibliotheque
 * @subpackage javascript
 * @version 1.00
 * @since 1.00 - 06/09/2007 18:11 Olivier Pot <pot@benchmark.fr> Création du fichier
 */
if(typeof benchmark == "undefined") var benchmark = new Object();


/**
 * constructeur de l'objet
 * 
 * permet de spécifier le mode de fonctionnement du gestionnaire d'erreur
 *
 * @param int mode mode STANDARD_MODE | REPORT_MODE
 * @param boolean visible l'erreur doit elle etre visible
 * @return boolean toujours true
 */
benchmark.ObjGestionErreur = function(mode, montreErreur) {
		
	// set les parametres de l'objet
	this.montreErreur  = montreErreur;
	
	// sauvegarde de l'ancien onError
	this.ancienOnError = window.onerror;
	
	if(mode == benchmark.ObjGestionErreur.STANDARD_MODE){
		
		// si on ne veut pas afficher les erreurs
		if(this.montreErreur == false){	
			window.onerror = function(){return true;}
		}
		
	}else if(mode == benchmark.ObjGestionErreur.REPORT_MODE){
		
		var refClass = this;
		window.onerror = function(msg,url,line){
			return refClass.gereErreur(msg,url,line);
		};
	}
}



/** mode de gestion standard des erreurs */
benchmark.ObjGestionErreur.STANDARD_MODE = 1;

/** mode de gestion par rapport des erreurs */
benchmark.ObjGestionErreur.REPORT_MODE = 2;

/**#@+
 * Url par défaut appelée dans le mode report
 */
benchmark.ObjGestionErreur.DEFAULT_URL_REPORT_LINTERNAUTE = "http://www.linternaute.com/e/cgi/erreur/gestion_erreur.php";
benchmark.ObjGestionErreur.DEFAULT_URL_REPORT_JOURNALDUNET = "http://www.journaldunet.com/e/cgi/erreur/gestion_erreur.php";
benchmark.ObjGestionErreur.DEFAULT_URL_REPORT_BENCHMARK = "http://www.benchmark.fr/e/cgi/erreur/gestion_erreur.php";
/**#@-*/



benchmark.ObjGestionErreur.prototype = {
	/**
	 * methode appelée en cas d'erreur
	 * 
	 * elle prend en charge les erreurs et agit differement selon la confiuguration de l'objet
	 * 
	 *
	 * @param string msg erreur en texte
	 * @param string url url en erreur
	 * @param int line ligne de l'erreur
	 * @return boolean vrai si l'erreur ne doit pas être "vue"
	 */
	gereErreur: function(msg,url,line) {
		
		// récupération de l'url courante
		var adresseCourante = new String(window.location);
		
		// si pas d'adresse de préciser, on test si on peut utiliser une adresse générique
		if(this.urlReport == null && adresseCourante!=null && adresseCourante != ""){
			if(adresseCourante.indexOf("www.linternaute.com") != -1){
				this.urlReport = benchmark.ObjGestionErreur.DEFAULT_URL_REPORT_LINTERNAUTE;
			}else if(adresseCourante.indexOf("www.journaldunet.com") != -1){
				this.urlReport = benchmark.ObjGestionErreur.DEFAULT_URL_REPORT_JOURNALDUNET;
			}else if(adresseCourante.indexOf("www.benchmark.fr") != -1){
				this.urlReport = benchmark.ObjGestionErreur.DEFAULT_URL_REPORT_BENCHMARK;
			}	
		}	
		
		// si l'adresse de report est ok, alors on envoi le report
		if(this.urlReport != null){
		
			// récuprération des js
			var codeJs = "";
			var tagJavascript = document.getElementsByTagName("script");
			for (var i = 0; i < tagJavascript.length; i++) { 
				var tagCourant = tagJavascript[i]; //.getAttribute("status"); 
				
				if(tagCourant.innerHTML != null && tagCourant.innerHTML!=""){
					codeJs += "\r\nCode dans la page : " + tagCourant.innerHTML;
				}else if(tagCourant.src != null && tagCourant.src !=""){
					codeJs += "\r\nSource externe : " + tagCourant.src;
				}
			}
			
		
		
			// envoi de l'erreur
			var xhr;
			if (window.XMLHttpRequest){ 
				xhr = new XMLHttpRequest();
			} else if (window.ActiveXObject){
				xhr = new ActiveXObject("Microsoft.XMLHTTP");
			}
			
			xhr.open( "POST", this.urlReport,  true); 
			xhr.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
			
			xhr.send("f_message=" + escape(msg) + "&f_url=" + escape(url) + "&f_ligne=" + line + "&f_url_courante=" + escape(window.location) + "&f_referer" + escape(document.referrer) + "&f_code=" + escape(codeJs)); 
			
			
			if(this.montreErreur == false){
				return true;
			}
			
		}
		
	},
	
	/**
	 * permet de modifier l'url appelé en cas d'erreur
	 * 
	 * permet de modifier l'url ajax appelée
	 *
	 * @param string urlReport url a appelé
	 * @return void
	 */
	setUrlReport: function(urlReport){
		this.urlReport = urlReport;
	}
}

// pour simplifier les appels
var ObjGestionErreur = benchmark.ObjGestionErreur;