// méthode HTTPRequest pour intérrogation serveur via PHP -----------------------------------------
function httprequest(fichier) {
	if(window.XMLHttpRequest) // FIREFOX
		xhr_object = new XMLHttpRequest(); 
	else if(window.ActiveXObject) // IE
		xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); 
	else 
		return(false); 
	
	xhr_object.open("GET", fichier, false); 
	xhr_object.send(null); 
	if(xhr_object.readyState == 4) return(xhr_object.responseText);
	else return(false);
}

function httprequest_post(fichier, envoi) {
	if(window.XMLHttpRequest) // FIREFOX
		xhr_object = new XMLHttpRequest(); 
	else if(window.ActiveXObject) // IE
		xhr_object = new ActiveXObject("Msxml2.XMLHTTP");
		//xhr_object = new ActiveXObject("Microsoft.XMLHTTP"); 
	else 
		return(false); 
	xhr_object.open("POST", fichier, false); 
	xhr_object.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=iso-8859-1");
	xhr_object.send(envoi);
	if(xhr_object.readyState == 4) return(xhr_object.responseText);
	else return(false);
}
// /méthode HTTPRequest pour intérrogation serveur via PHP ----------------------------------------

function ObjGetPos(obj_){
	var PosX = 0;
	var PosY = 0;
	var Obj  =  obj_;
	//-- Si l'objet existe
	if( Obj){
	  //-- Si propriété existe
	  if( Obj.offsetParent){
	    //-- Récup. Position Objet
	    PosX = Obj.offsetLeft;
	    PosY = Obj.offsetTop;
	    //-- Tant qu'un parent existe
	    while( Obj = Obj.offsetParent){
	      //-- Ajout position Parent
	      PosX += Obj.offsetLeft;
	      PosY += Obj.offsetTop;
	    }
	  }
	}
  //-- Retour des positions
  return([PosX, PosY]);
}

// Calcul de la largeur interne de la fenêtre (hors menu, barre d'état etc ...)
function getInnerWidth(){
	var width=0;
	if (self.innerWidth){// all except Explorer
		width = self.innerWidth;
	} else {
		if (document.documentElement && document.documentElement.clientWidth){// Explorer 6 Strict Mode
			width = document.documentElement.clientWidth;
		} else {
			if (document.body) {// other Explorers
				width = document.body.clientWidth;
			}
		}
	}
	return width;
}

// Calcul de l'offset horizontal = de combien on a déplacé le curseur de l'ascenseur horizontal
function getOffsetX(){
	var offsetX =0;
	if (self.pageXOffset) {// all except Explorer
		offsetX = self.pageXOffset;
	} else {
		if (document.documentElement && document.documentElement.scrollLeft){// Explorer 6 Strict
			offsetX = document.documentElement.scrollLeft;
		} else {
			if (document.body){// all other Explorers
				offsetX = document.body.scrollLeft;
			}
		}
	}
	return offsetX;
}

// Calcul de la hauteur interne de la fenêtre (hors menu, barre d'état etc ...)
function getInnerHeight(){
	var height=0;
	if (self.innerHeight){// all except Explorer
		height = self.innerHeight;
	} else {
		if (document.documentElement && document.documentElement.clientHeight){		// Explorer 6 Strict Mode
			height = document.documentElement.clientHeight;
		} else {
			if (document.body){// other Explorers
				height = document.body.clientHeight;
			}
		}
	}
	return height;
}

// Calcul de l'offset vertical = de combien on a déplacé le curseur de l'ascenseur vertical
function getOffsetY(){
	var offsetY =0;
	if (self.pageYOffset){// all except Explorer
		offsetY = self.pageYOffset;
	} else {
		if (document.documentElement && document.documentElement.scrollTop)	{		// Explorer 6 Strict
			offsetY = document.documentElement.scrollTop;
		} else {
			if (document.body){// all other Explorers
				offsetY = document.body.scrollTop;
			}
		}
	}
	return offsetY;
}

function taille_obj(element){
	// Taille de la fenetre d'explorateur
	var doc = (typeof(element) == "object") ? element : document.getElementById(element) ;

	if (document.all){// ok I.E 
		width = parseInt(doc.currentStyle.width);
		height= parseInt(doc.currentStyle.height);
	} else {// ok firefox.0.9.2 , pas mozilla.1.0 ni netscape.7.02 
		width = parseInt(document.defaultView.getComputedStyle(doc, null).width);
		height = parseInt(document.defaultView.getComputedStyle(doc, null).height);
	}
	return([width, height]);
}

function center_element(element){
	var tab_dim			=	taille_obj(element);
	var margin_width	=	(((getInnerWidth()-tab_dim[0])/2) + getOffsetX());
	var margin_height	=	(((getInnerHeight()-tab_dim[1])/2) + getOffsetY());
	
	return ([margin_width,margin_height]);
}

function change_source_select(id_select, data_text, selectedKey, texte_si_null){
	data_text = data_text.toString();
	var reg=new RegExp("[|]+", "g");
	data_split = data_text.split(reg);
	var monSelect = (typeof(id_select) == "object") ? id_select : document.getElementById(id_select);
	monSelect.innerHTML	=	"";
	monSelect.options.length 	= 0;
	var selected;
	var text_optgrp = 'optgrp=';
	if (data_split != ''){
		for (var j=0; j<data_split.length; j++) {
			// si optiongroup
			if (data_split[j].lastIndexOf(text_optgrp) != -1){
				var opg = window.parent.document.createElement('OPTGROUP');
				opg.label = data_split[j].substring(text_optgrp.length);
				monSelect.appendChild(opg);
			} else {
				// permet de choisir le champs à definir par defaut
				if (selectedKey == data_split[j]) {
					selected = monSelect.length;
				}
				monSelect.options[monSelect.length] = new Option(data_split[(j+1)],trim(data_split[j]));
				j++;
			}
		}
	}
	
	//permet de positionner la combo au bon champs
	monSelect.selectedIndex = selected;
	if (monSelect.options.length == 0) monSelect.options[0] = new Option(texte_si_null, '');
}

var ie = document.all;
var nn6 = document.getElementById &&! document.all;

var isdrag = false;
var x, y;
var dobj;

function movemouse( e ) {
  if( isdrag ) {
    dobj.style.left = nn6 ? tx + e.clientX - x : tx + event.clientX - x;
    dobj.style.top  = nn6 ? ty + e.clientY - y : ty + event.clientY - y;
    return false;
  }
}

function selectmouse( e ) {
	var fobj       = nn6 ? e.target : event.srcElement;
  	var topelement = nn6 ? "HTML" : "BODY";
	while (fobj.tagName != topelement && fobj.className != "dragme") {
		fobj = nn6 ? fobj.parentNode : fobj.parentElement;
	}

  	if (fobj.className=="dragme") {
    	isdrag = true;
	    //dobj = document.getElementById(fobj.id+'_div');
		dobj = fobj.parentNode.parentNode.parentNode.parentNode;
	    tx = parseInt(dobj.style.left+0);
	    ty = parseInt(dobj.style.top+0);
	    x = nn6 ? e.clientX : event.clientX;
	    y = nn6 ? e.clientY : event.clientY;
	    document.onmousemove=movemouse;
	    return false;
  	}
}

function styledPopupClose(popup, rafraichir) {
	if (!rafraichir) rafraichir = 1;
	document.getElementById(popup).style.display = "none";
  	// Si rafraichir
  	if (rafraichir == 1){
		if (window.parent.document.getElementById('frm').onsubmit()) window.parent.document.getElementById('frm').submit();
	}
}

// Fonctions de vérification de chaines
function verif_obligatoire(element, texte){
	if (element.value == '') {
		alert('Le champ "'+texte+'" est obligatoire');
		if(element.type != 'hidden' && element.type != 'select-one' ){
			element.focus();
			element.select();
		}
		return false;
	} else {
		// Test si le champ n'est composé que d'espace
		var nb_charact = element.value.length;
		var retour = false;
		for (var i=0;i<nb_charact;i++){
			if (element.value.charAt(i) != " ") retour = true;
		}
		if (retour === false){
			alert('Merci de ne pas saisir que des espaces pour le champ "'+texte+'" qui est obligatoire');
			element.focus();
			element.select();
			return false;
		}
	}
	return true;
}

function verif_date(element, texte){
	if (element.value != '') {
		regex = new RegExp("^[0-9]{2}\/[01]?[0-9]\/[0-9]{4}$","g");
		var jour 		= element.value.split("/");
		jour 			= new Date(jour[2], jour[1]-1, jour[0]);
		if(!regex.exec(element.value)){
			alert('Le champ "'+texte+'" n\'est pas une date valide (jj/mm/aaaa).');
			if(element.type != 'hidden' && element.type != 'select-one' ){
				element.select();
				element.focus();
			}
			return false;
		} else {
			// Remet la bonne date : 32/01/2009 => 01/02/2009
			formatDateCorrecte(element);
		}
	}
	return true;
}

function verifMenusAssocies(){
	var elements = document.forms[0].elements;
	var nb_checkbox = elements.length;
	var retour = false;
	for (var i=0;i<nb_checkbox;i++){
		if (elements[i].checked === true) retour = true;
	}
	if (retour == false) alert("Merci d'associer l'enregistrement à au moins un menu.");
	return retour;
}

function formatDateAa(element){
	var jour 		= element.value.split("/");
	if (jour.length == 3){
		// Remet l'année sur 4 chiffres
		if (jour[2].length == 2){
			// < 30 alors 20
			if (parseFloat(jour[2]) < parseFloat(30)){
				jour[2] = "20"+jour[2];
			// Sinon 19
			} else {
				jour[2] = "19"+jour[2];
			}
			element.value = jour[0]+"/"+jour[1]+"/"+jour[2];
		}
		// Remet la bonne date : 32/01/2009 => 01/02/2009
		formatDateCorrecte(element);
	}
}

function formatDateCorrecte(element){
	var jour 		= element.value.split("/");
	jour 			= new Date(jour[2], jour[1]-1, jour[0]);
	element.value 	= ((jour.getDate() < 10) ? '0' : '')+jour.getDate()+'/'+(((jour.getMonth()+1) < 10) ? '0' : '' )+(jour.getMonth()+1)+'/'+jour.getFullYear();
}

function verif_unique(element, texte, table, id_name, id_value, champ_name, utilisateur){
	action = (utilisateur == true) ? "unic_index" : "unic";
	if (httprequest('httprequest.php?action='+action+'&table_name='+escape(table)+'&id_name='+escape(id_name)+'&id_value='+escape(id_value)+'&champ_name='+escape(champ_name)+'&champ_value='+escape(element.value)) > 0){
		alert(texte+' : cette valeur existe déjà.\nElle doit être unique.');
		if(element.type != 'hidden' && element.type != 'select-one' ){
			element.focus();
			element.select();
		}
		return false;
	}
	return true;
}

function verif_unique_groupe(liste_elements, table, id_name, id_value){
	var champs  = "";
	var valeurs = "";
	var texte   = "";
	
	liste_elements = liste_elements.toString();
	var reg=new RegExp("[,]+", "g");
	element = liste_elements.split(reg);
	
	// Verifie si tous les champs sont affichés
	for(var i=0; i<element.length; i++){
		if (!document.getElementById(element[i])){
			alert("Le champ '"+element[i]+"' n'est pas affiché et doit être contrôlé pour l'unicité.\nImpossible d'enregistrer.");
			return false;
		} else {
			champs  += element[i]+",";
			valeurs += document.getElementById(element[i]).value+",";
			if (document.getElementById(element[i]).title != "") texte	+= document.getElementById(element[i]).title+", ";
		}
	}
	champs  = champs.substring(0, champs.length-1);
	valeurs = valeurs.substring(0, valeurs.length-1);
	texte   = texte.substring(0, texte.length-2);
	
	//Verifie si l'association de tous les champ est unique dans la base de données
	if (httprequest('httprequest.php?action=unic_groupe&table_name='+escape(table)+'&id_name='+escape(id_name)+'&id_value='+escape(id_value)+'&champ_name='+escape(champs)+'&champ_value='+escape(valeurs)) > 0){
		alert('Donnée(s) déja existante(s) pour \''+texte+'\'.\nImpossible d\'enregistrer.');
		return false;
	}
	return true;
}

function verif_email (element, texte, affiche_message) {
    if (typeof(affiche_message) == "undefined") affiche_message = true;
	if (element.value != '') {
		ctl = /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+([\.][a-z0-9-]+)+$/;
		if (element.value.search(ctl) != -1){
			return true;
		} else {
			if (affiche_message == true){
                alert('Le champ "'+texte+'" n\'est pas une adresse mail valide.');
    			if(element.type != 'hidden' && element.type != 'select-one' ){
	    			element.focus();
		    		element.select();
			    }
            }
			return false;
		}
	}
	return true;
}

function number_decimal(value){
	var reg 		= 	"";
	var autorise 	= 	false
	reg 			= 	/^\d+[.]?\d*$/;
	// si l'element comporte des lettres
	if (reg.exec(value) != null)	autorise = true
	if (value == "")				autorise = true
	return autorise;
}

function verif_number_decimal(element){
	var autorise 	= 	false
	element.value	= 	element.value.replace(',','.');
	element.value	=	element.value.replace(/\s+/g,'').replace(/\s+$/g,'');// Enleve les espaces
	if (element.value.substring(0,1) == '-'){
		negatif = '-';
		element.value = element.value.substring(1);
	} else {
		negatif = '';
	}

	// Vérifie si le nombre est décimal
	autorise = number_decimal(element.value);
	// remet le négatif
	element.value = negatif+element.value;
	if (autorise == false){
		alert ('Nombre décimal requis.');
		if(element.type != 'hidden' && element.type != 'select-one' ){
			element.focus();
			element.select();
		}
	}
	return autorise;
}

function number_entier(value){
	var reg 		= 	"";
	var autorise 	= 	false
	reg 			= /^\d+$/;
	// si l'element comporte des lettres
	if (reg.exec(value) != null)	autorise = true
	if (value == "")				autorise = true
	return autorise;
}

function verif_number_entier(element){
	var reg 		= "";
	var autorise 	= false
	reg 			= /^\d+$/;
	element.value	= element.value.replace(',','.');
	// Vérifie si le nombre est décimal
	autorise = number_entier(element.value);
	if (autorise == false){
		alert ('Nombre entier requis (décimales non autorisées).');
		if(element.type != 'hidden' && element.type != 'select-one' ){
			element.focus();
			element.select();
		}
	}
	return autorise;
}

function move_obj(element){
	if(document.addEventListener){
		document.addEventListener('mousedown', selectmouse, false);
		document.addEventListener('mouseup', new Function("isdrag=false"), false);
	} else {
		if (typeof(element) == "object"){
			element.onmousedown = selectmouse;
			element.onmouseup = new Function("isdrag=false");
		} else {
			document.getElementById(element).onmousedown = selectmouse;
			document.getElementById(element).onmouseup = new Function("isdrag=false");
		}
	}
}

function gestion_url(frm, page){
	var url 	 = "";
	var url_text = "";
	for (i=0 ; i<= frm.length-1 ; i++){
		if (frm[i].name != "" && frm[i].value != ""){
			if (frm[i].type != "text"){
				if (frm[i].value == frm[i].options[frm[i].selectedIndex].text){
					var reg = new RegExp(" ", "g");
					var reg2= new RegExp("/", "g");
					value = escape(frm[i].value.replace(reg,"+")).replace(reg2, "|");
				} else {
					 value = frm[i].value+"-"+epure_special_chars(frm[i].options[frm[i].selectedIndex].text);
				}
				url += frm[i].name+"/"+value+"/";
			} else {
				var reg = new RegExp("( |%)", "g");
				var reg2= new RegExp("/", "g");
				url_text = frm[i].name+"/"+escape(frm[i].value.replace(reg,"+")).replace(reg2, "|");
			}
		}
	}
	if (url != "" || url_text != "" ){
		if (url_text == "") url = url.substring(0, url.length-1);
		url = "/"+page+"/recherche/"+url+url_text+".html";
	} else {
		url = "/"+page+"/recherche/liste/complete.html";
	}
	//Redirection de la page
	window.location.href = url;
	return false;
}

function epure_special_chars(chaine){
	chaine 	= chaine.replace("\\", "");
	chaine 	= chaine.replace(RegExp(" ", "g"), "-");
	chaine	= strtr(chaine, "ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ","AAAAAAACEEEEIIIIDNOOOOOOUUUUYaaaaaaaceeeeiiiionoooooouuuuyy");
	chaine	= trim(strtolower(chaine));
	var reg2= new RegExp("[^a-z0-9\-]", "g");
	chaine = chaine.replace(reg2, "");
	return chaine;
}

function evenement(nom_evenement, fonction){
	if(document.addEventListener){
		window.addEventListener(nom_evenement, function(){eval(fonction)}, false);
	} else {
		window.attachEvent('on'+nom_evenement, function(){eval(fonction)});
	}
}

function evenement_variable(nom_evenement, variable){
	if(document.addEventListener){
		window.addEventListener(nom_evenement, eval(variable), false);
	} else {
		window.attachEvent('on'+nom_evenement, eval(variable));
	}
}

function gestion_raz_compteur(){
	if (confirm('Etes-vous sur de vouloir remettre les compteurs à 0 ?')){
		return true;
	} else {
		return false;
	}
}

function index_all_controle(form){
	var elements 		= new Array();
	var indices 		= new Array();
	var frm_length 		= form.length-1;
	for (j=0;j<=frm_length;j++){
		if (form[j].name){
			var nom_controle = form[j].name;
			var profondeur	 = substr_count(nom_controle, "[");
			if (profondeur > 0){
				var nom_tab = nom_controle.substring(0, nom_controle.indexOf("["))+'_'+profondeur;
				// Si le controle n'existe pas, alors à partir de la profondeur on met les index à 0
				if (!isset(elements[nom_tab])){
					elements[nom_tab] = 0;
					// initialisation de l'indice de la profondeur si il n'existe pas encore
					indices[profondeur] = 0;
				// Sinon, indice[profondeur] ++ et les indices enfants 0
				} else {
					// ++ nb elements
					elements[nom_tab] ++;
					// Indice de la profondeur ++
					indices[profondeur] = elements[nom_tab];
					// les indices enfant = 0
					for (var k=profondeur+1;k<=indices.length-1;k++){
						indices[k] = 0;
					}
					// le nb elements des indices enfants = 0
					for (var tableau_nom in elements){
						if (tableau_nom.substring(tableau_nom.lastIndexOf("_")+1) >= profondeur+1){
							elements[tableau_nom] = -1;
						}
					}
				}
				// Creation du nom du controle
				var new_nom = nom_controle.substring(0, nom_controle.indexOf("["));
				for (var k=1;k<=profondeur;k++){
					new_nom += "["+indices[k]+"]";
				}
				if (new_nom != nom_controle){
					form[j].name = new_nom;
					form[j].id 	= new_nom;
				}
			}
		}
	}
}

function getElementByNameInParentNode(zone, type_html, nom_controle){
	var elements = zone.getElementsByTagName(type_html);
	for (var i=0;i<elements.length;i++){
		if (elements[i].name == nom_controle) return elements[i];
	}
}

function inialise_autocompleter(nom_data, option, requete_sql, function_suppl){
	var auto = 	"new Autocompleter.Request.HTML('"+nom_data+"', 'httprequest.php?action=autocompletion', {";
	auto += option;
	auto += "'postData': {'sql': '"+requete_sql+"'},"; // send additional POST data, check the PHP code
	auto += "'filterSubset':true,";
	var reg=new RegExp("this", "g");
	var funct_suppl = (function_suppl) ? function_suppl.replace(reg, "document.getElementById('"+nom_data+"')") : "" ;
	auto += "'onSelection': function (arg1, arg2, arg3, arg4){if (document.getElementById('autocompleter_"+nom_data+"')){document.getElementById('"+nom_data+"').value = document.getElementById('"+nom_data+"').value.replace(/\&amp;/g, '&');document.getElementById('autocompleter_"+nom_data+"').value = arg2.getProperty('valeurs_complementaires');"+funct_suppl+"}}";
	auto += "});";
	eval(auto);
}

// Permet de stopper l'execution du js après un action (par exemple, lorsque l'on a plusieurs onclick imbriqués)
// Passer en arguments le mot clé "event" (variable d'environnement qui sous firefox n'est pas accessible dans une fonction)
function stopJs(event){
	if (event.stopPropagation) {
		event.stopPropagation();
	}
	event.cancelBubble = true;
}

// permet de recupere une valeur en GET comme php GET["quelque chose"]
function tab_get(){
	var get	= new Array();

    // On enlève le ?
    param = window.location.search.slice(1, window.location.search.length);

    // On sépare le paramètres....
    // first[0] est de la forme param=valeur

    first = param.split("&");

    for(i=0;i<first.length;i++){
        second = first[i].split("=");
        get[second[0]] = second[1];
    }
	
	return get;
}

//Convertit une date en 20100101 pour comparaison par exemple
function convertionDateToInt(date_fr){
	if (!empty(date_fr)){
		date_fr = date_fr.split("/");
		return date_fr[2]+date_fr[1]+date_fr[0];
	}
	return "";
}
/********************************  PHPJS  *****************************************/
function strtr(chaine_a_traiter, expr1, expr2){
	for(var i=0;i<expr1.length;i++){
		chaine_a_traiter = chaine_a_traiter.replace(RegExp(expr1.substring(i,i+1), "g"), expr2.substring(i,i+1));
	}
	return chaine_a_traiter;
}

function strtolower( str ) {
    return str.toLowerCase();
}

function trim( str, charlist ) {
    var whitespace, l = 0;
    if (!charlist) {
        whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';
    } else {
        whitespace = charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
    }
    l = str.length;
    for (var i = 0; i < l; i++) {
        if (whitespace.indexOf(str.charAt(i)) === -1) {
            str = str.substring(i);
            break;
        }
    }
    l = str.length;
    for (i = l - 1; i >= 0; i--) {
        if (whitespace.indexOf(str.charAt(i)) === -1) {
            str = str.substring(0, i + 1);
            break;
        }
    }   
    return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
}

function printr(obj){
	var msg = "";
	for (prop in obj){
		msg += "property : " + prop + "\t\t value : " + obj[prop] + "\n";
    }
    alert(msg);
}


function substr_count( haystack, needle, offset, length ) {
    var pos = 0, cnt = 0;
    if(isNaN(offset)) offset = 0;
    if(isNaN(length)) length = 0;
    offset--;
    while( (offset = haystack.indexOf(needle, offset+1)) != -1 ){
        if(length > 0 && (offset+needle.length) > length){
            return false;
        } else{
            cnt++;
        }
    }
    return cnt;
}

function print_r( array, return_val ) {
    var output = "", pad_char = " ", pad_val = 4;
    var formatArray = function (obj, cur_depth, pad_val, pad_char) {
        if (cur_depth > 0) {
            cur_depth++;
        }
        var base_pad = repeat_char(pad_val*cur_depth, pad_char);
        var thick_pad = repeat_char(pad_val*(cur_depth+1), pad_char);
        var str = "";
        if (obj instanceof Array || obj instanceof Object) {
            str += "Array\n" + base_pad + "(\n";
            for (var key in obj) {
                if (obj[key] instanceof Array) {
                    str += thick_pad + "["+key+"] => "+formatArray(obj[key], cur_depth+1, pad_val, pad_char);
                } else {
                    str += thick_pad + "["+key+"] => " + obj[key] + "\n";
                }
            }
            str += base_pad + ")\n";
        } else if(obj == null || obj == undefined) {
            str = '';
        } else {
            str = obj.toString();
        }

        return str;
    };
    var repeat_char = function (len, pad_char) {
        var str = "";
        for(var i=0; i < len; i++) { 
            str += pad_char; 
        };
        return str;
    };
    output = formatArray(array, 0, pad_val, pad_char);
    if (return_val !== true) {
        document.write("<pre>" + output + "</pre>");
        return true;
    } else {
        return output;
    }
}

function isset(  ) {
    var a=arguments; var l=a.length; var i=0;
    if (l==0) { 
        throw new Error('Empty isset'); 
    }   
    while (i!=l) {
        if (typeof(a[i])=='undefined' || a[i]===null) { 
            return false; 
        } else { 
            i++; 
        }
    }
    return true;
}

// {{{ empty
function empty( mixed_var ) {
    // Determine whether a variable is empty
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_empty/
    // +       version: 811.1314
    // +   original by: Philippe Baumann
    // +      input by: Onno Marsman
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: LH
    // +   improved by: Onno Marsman
    // +   improved by: Francesco
    // *     example 1: empty(null);
    // *     returns 1: true
    // *     example 2: empty(undefined);
    // *     returns 2: true
    // *     example 3: empty([]);
    // *     returns 3: true
    // *     example 4: empty({});
    // *     returns 4: true
    
    var key;
    
    if (mixed_var === ""
        || mixed_var === 0
        || mixed_var === "0"
        || mixed_var === null
        || mixed_var === false
        || mixed_var === undefined
    ){
        return true;
    }
    if (typeof mixed_var == 'object') {
        for (key in mixed_var) {
            if (typeof mixed_var[key] !== 'function' ) {
	            return false;
            }
        }
        return true;
    }
    return false;
}// }}}

// {{{ parse_url
function parse_url (str, component) {
    // Parse a URL and return its components
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_parse_url/
    // +       version: 901.2514
    // +      original by: Steven Levithan (http://blog.stevenlevithan.com)
    // + reimplemented by: Brett Zamir
    // %          note: Based on http://stevenlevithan.com/demo/parseuri/js/assets/parseuri.js
    // %          note: blog post at http://blog.stevenlevithan.com/archives/parseuri
    // %          note: demo at http://stevenlevithan.com/demo/parseuri/js/assets/parseuri.js
    // %          note: Does not replace invaild characters with '_' as in PHP, nor does it return false with
    // %          note: a seriously malformed URL.
    // %          note: Besides function name, is the same as parseUri besides the commented out portion
    // %          note: and the additional section following, as well as our allowing an extra slash after
    // %          note: the scheme/protocol (to allow file:/// as in PHP)
    // *     example 1: parse_url('http://username:password@hostname/path?arg=value#anchor');
    // *     returns 1: {scheme: 'http', host: 'hostname', user: 'username', pass: 'password', path: '/path', query: 'arg=value', fragment: 'anchor'}

    var  o   = {
        strictMode: false,
        key: ["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],
        q:   {
            name:   "queryKey",
            parser: /(?:^|&)([^&=]*)=?([^&]*)/g
        },
        parser: {
            strict: /^(?:([^:\/?#]+):)?(?:\/\/((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?))?((((?:[^?#\/]*\/)*)([^?#]*))(?:\?([^#]*))?(?:#(.*))?)/,
            loose:  /^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/\/?)?((?:(([^:@]*):?([^:@]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/ // Added one optional slash to post-protocol to catch file:/// (should restrict this)
        }
    };
    
    var m   = o.parser[o.strictMode ? "strict" : "loose"].exec(str),
    uri = {},
    i   = 14;
    while (i--) uri[o.key[i]] = m[i] || "";
    // Uncomment the following to use the original more detailed (non-PHP) script
    /*
        uri[o.q.name] = {};
        uri[o.key[12]].replace(o.q.parser, function ($0, $1, $2) {
        if ($1) uri[o.q.name][$1] = $2;
        });
        return uri;
    */

    switch (component) {
        case 'PHP_URL_SCHEME':
            return uri.protocol;
        case 'PHP_URL_HOST':
            return uri.host;
        case 'PHP_URL_PORT':
            return uri.port;
        case 'PHP_URL_USER':
            return uri.user;
        case 'PHP_URL_PASS':
            return uri.password;
        case 'PHP_URL_PATH':
            return uri.path;
        case 'PHP_URL_QUERY':
            return uri.query;
        case 'PHP_URL_FRAGMENT':
            return uri.anchor;
        default:
            var retArr = {};
            if (uri.protocol !== '') retArr.scheme=uri.protocol;
            if (uri.host !== '') retArr.host=uri.host;
            if (uri.port !== '') retArr.port=uri.port;
            if (uri.user !== '') retArr.user=uri.user;
            if (uri.password !== '') retArr.pass=uri.password;
            if (uri.path !== '') retArr.path=uri.path;
            if (uri.query !== '') retArr.query=uri.query;
            if (uri.anchor !== '') retArr.fragment=uri.anchor;
            return retArr;
    }
}// }}}

// {{{ in_array
function in_array(needle, haystack, strict) {
    // Checks if a value exists in an array
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_in_array/
    // +       version: 809.522
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: in_array('van', ['Kevin', 'van', 'Zonneveld']);
    // *     returns 1: true

    var found = false, key, strict = !!strict;

    for (key in haystack) {
        if ((strict && haystack[key] === needle) || (!strict && haystack[key] == needle)) {
            found = true;
            break;
        }
    }

    return found;
}// }}}

// {{{ strip_tags
function strip_tags(str, allowed_tags) {
    // Strip HTML and PHP tags from a string
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_strip_tags/
    // +       version: 811.1812
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Luke Godfrey
    // +      input by: Pul
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   bugfixed by: Onno Marsman
    // +      input by: Alex
    // +   bugfixed by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +      input by: Marc Palau
    // +   improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // *     example 1: strip_tags('<p>Kevin</p> <br /><b>van</b> <i>Zonneveld</i>', '<i><b>');
    // *     returns 1: 'Kevin <b>van</b> <i>Zonneveld</i>'
    // *     example 2: strip_tags('<p>Kevin <img src="someimage.png" onmouseover="someFunction()">van <i>Zonneveld</i></p>', '<p>');
    // *     returns 2: '<p>Kevin van Zonneveld</p>'
    // *     example 3: strip_tags("<a href='http://kevin.vanzonneveld.net'>Kevin van Zonneveld</a>", "<a>");
    // *     returns 3: '<a href='http://kevin.vanzonneveld.net'>Kevin van Zonneveld</a>'

    var key = '', tag = '', allowed = false;
    var matches = allowed_array = [];

    var replacer = function(search, replace, str) {
        return str.split(search).join(replace);
    };

    // Build allowes tags associative array
    if (allowed_tags) {
        allowed_array = allowed_tags.match(/([a-zA-Z]+)/gi);
    }
	
    str += '';

    // Match tags
    matches = str.match(/(<\/?[^>]+>)/gi);

    // Go through all HTML tags
    for (key in matches) {
        if (isNaN(key)) {
            // IE7 Hack
            continue;
        }

        // Save HTML tag
        html = matches[key].toString();

        // Is tag not in allowed list? Remove from str!
        allowed = false;

        // Go through all allowed tags
        for (k in allowed_array) {
            // Init
            allowed_tag = allowed_array[k];
            i = -1;

            if (i != 0) { i = html.toLowerCase().indexOf('<'+allowed_tag+'>');}
            if (i != 0) { i = html.toLowerCase().indexOf('<'+allowed_tag+' ');}
            if (i != 0) { i = html.toLowerCase().indexOf('</'+allowed_tag)   ;}

            // Determine
            if (i == 0) {
                allowed = true;
                break;
            }
        }

        if (!allowed) {
            str = replacer(html, "", str); // Custom replace. No regexing
        }
    }

    return str;
}// }}}


// {{{ nl2br
function nl2br (str, is_xhtml) {
    // Inserts HTML line breaks before all newlines in a string
    // 
    // +    discuss at: http://kevin.vanzonneveld.net/techblog/article/javascript_equivalent_for_phps_nl2br/
    // +       version: 810.1417
    // +   original by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
    // +   improved by: Philip Peterson
    // +   improved by: Onno Marsman
    // +   improved by: Atli Þór
    // +   bugfixed by: Onno Marsman
    // *     example 1: nl2br('Kevin\nvan\nZonneveld');
    // *     returns 1: 'Kevin<br />\nvan<br />\nZonneveld'
    // *     example 2: nl2br("\nOne\nTwo\n\nThree\n", false);
    // *     returns 2: '<br>\nOne<br>\nTwo<br>\n<br>\nThree<br>\n'
    // *     example 3: nl2br("\nOne\nTwo\n\nThree\n", true);
    // *     returns 3: '<br />\nOne<br />\nTwo<br />\n<br />\nThree<br />\n'

    breakTag = '<br />';
    if (typeof is_xhtml != 'undefined' && !is_xhtml) {
        breakTag = '<br>';
    }

    return (str + '').replace(/([^>]?)\n/g, '$1'+ breakTag +'\n');
}// }}}