
/* {{{ FONCTIONS A LA PHP */

// fonctions pour (de)serializer un tableau javascript
function serialize(a)    { return a.toString(); }
function unserialize(s)  { return s.split(","); }
function trim(s)         { return s.replace(/^\s+/, '').replace(/\s+$/, ''); }
function ltrim(s)        { return s.replace(/^\s+/, ''); }
function rtrim(s)        { return s.replace(/\s+$/, ''); }
function is_array(obj) { return (obj.constructor.toString().indexOf("Array") != -1) }

function strpad(val, longueur, remplissage) {
  if (!isNaN(val)) {
    while ((val.toString().length < longueur)) 
      val = remplissage+val;
    return val;
  }
  else return false;
}

function print_r (theObj, stripfunctions) {
  if (theObj.constructor == Array || theObj.constructor == Object) {
    document.write('<ul>');
    for (var p in theObj) {
      if (theObj[p].constructor == Array || theObj[p].constructor == Object) {
        document.write('<li>['+p+'] => '+typeof(theObj)+'<\/li>');
        document.write('<ul>');
        print_r(theObj[p], stripfunctions);
        document.write('<\/ul>');
      } 
      else {
        if ((stripfunctions && theObj[p].substr(0, 8) != 'function') || !stripfunctions)
          document.write('<li>['+p+'] => '+theObj[p]+'<\/li>');
      }
    }
    document.write('<\/ul>');
  }
  else {
    document.write(theObj);
  }
}

function print_pre(theObj, color, name, stripfunctions) {
    if (stripfunctions !== false) stripfunctions = true;
    document.write('<pre');
    if (color) document.write(' style="color: '+color+'"');
    document.write('>');
    if (name) document.write(name+' : ');
    print_r(theObj, stripfunctions);
    document.write('<\/pre>');
}

function strip_tags (tags) {
    stripped = tags.replace(/<[^<>]*>/gi, "");
    return stripped;
}

Array.prototype.in_array = function(search_term) {
   for (var i = 0; i < this.length; ++i) {
      if (this[i] === search_term) {
         return true;
      }
   }
   return false;
}

function now () { // incomplet mais tout de mÃªme utile 
    var today = new Date(); 
    today_str = today.getFullYear()+'-'+strpad(today.getMonth()+1,2,'0')+'-'+strpad(today.getDate(),2,'0'); 
    return today_str; 
}

/* }}} */


/* {{{ FONCTIONS PRATIQUES POUR FORMULAIRES */

/* renvoie l'objet du DOM coche (dans le cas d'un bouton radio), dans un formulaire donne eventuellement */
function getCheckedElementByTagName(tagname, form) {
    if (form) {
        var obj     = document.forms[form].elements[tagname];
    }
    else {
        var obj     = document.getElementsByName(tagname);
    }

    var lg      = obj.length;
    var valeur  = false;
    var found   = false;
    var i       = 0;

    for (; i < obj.length; ++i) {
        if (obj[i].checked) {
            found  = true;
            valeur = obj[i].value;
            break;
        }
    }
    if (found) return obj[i];
    else return false;
}

/* vide un input type=text quand on "clique" dessus ssi il est initialise a sa valeur par defaut */
function vide_onevent(event,id,name,val) {
  var cur_val;
  cur_val = document.getElementById(id).value;
  
  switch (event) {
    case 'focus': 
      if (cur_val == name) {
        document.getElementById(id).value = val;
      }
      break;
    case 'blur': 
      if (!cur_val.length || cur_val == name) {
        document.getElementById(id).value = name;
      }
      break;
  }
}

/* demande une confirmation avant de rediriger vers une url */
function if_confirm (url, message, blank) {
  if (confirm(message)) { document.location = url; }
}

/* compare 2 champs et met a jour un div selon qu'ils sont identiques ou non. pratique en onkeyup, onblur et onclick pour pass et pass_confirm */
function compare_fields (field1, field2, id_span_ok, inner_no, inner_yes, min_length) {
    val1 = document.getElementById(field1).value;
    val2 = document.getElementById(field2).value;
    if (val1 == val2 && (!min_length || (val1.length >= min_length))) {
        document.getElementById(id_span_ok).innerHTML = inner_yes;
        return 1;
    }
    else {
        document.getElementById(id_span_ok).innerHTML = inner_no;
        return 0;
    }
}

/* valide le format d'une adresse email */
function valide_email (email) {
    reg = /^\s*[a-z0-9\._-]+@([a-z0-9-]+\.)+[a-z0-9]+\s*$/i;
    return email.match(reg);
}

/* valide le format d'une adresse email avec 2e champ pour confirmation et met a jour un div selon qu'ils sont identiques ou non. pratique en onkeyup, onblur et onclick pour les email et email_confirm */
function valide_email_confirm (field1, field2, id_span_ok, inner_no, inner_yes, min_length, icase) {
    val1 = document.getElementById(field1).value;
    val2 = document.getElementById(field2).value;

    if (icase) {
        val1 = val1.toLowerCase();
        val2 = val2.toLowerCase();
    }

    if (val1 == val2 && (!min_length || (val1.length >= min_length)) && valide_email(val1) && valide_email(val2)) {
        document.getElementById(id_span_ok).innerHTML = inner_yes;
        return 1;
    }
    else {
        document.getElementById(id_span_ok).innerHTML = inner_no;
        return 0;
    }
}

/* valide les caractÃ¨res d'un nombre, avec taille min */
function valide_num (field, id_span_ok, inner_no, inner_yes, min_length, max_length) {
    reg = /^[0-9]+$/i;
    return valide_champ(field, '', id_span_ok, inner_no, inner_yes, min_length, max_length, reg);
}

/* valide les caractÃ¨res d'un login, avec taille min */
function valide_login (field, id_span_ok, inner_no, inner_yes, min_length, max_length) {
    reg = /^[a-z0-9@\._-]+$/i;
    return valide_champ(field, '', id_span_ok, inner_no, inner_yes, min_length, max_length, reg);
}

/* valide les caractÃ¨res d'une chaine alphanumerique, avec taille min */
function valide_alnum (field, id_span_ok, inner_no, inner_yes, min_length, max_length) {
    reg = /^[a-z0-9]+$/i;
    return valide_champ(field, '', id_span_ok, inner_no, inner_yes, min_length, max_length, reg);
}

/* valide les caractÃ¨res d'un numero de telephone, avec taille min */
function valide_tel (field, id_span_ok, inner_no, inner_yes, min_length, max_length) {
    reg = /^[0-9()+ \.-]+$/i;
    return valide_champ(field, '', id_span_ok, inner_no, inner_yes, min_length, max_length, reg);
}

/* valide un code_postal */
function valide_cp (field, id_span_ok, inner_no, inner_yes) {
    reg = /^[a-z0-9]+$/i;
    return valide_champ(field, '', id_span_ok, inner_no, inner_yes, 5, 5, reg);
}

/* verifie que la valeur du champ field correspond a l'une des valeurs du tableau liste */
function value_is_in (field, liste, id_span_ok, inner_no, inner_yes, min_length, max_length) {
    var obj = document.getElementsByName(field);
    var lg = obj.length;
    var valeur;
    for (i = 0; i < obj.length; ++i) {
        if (obj[i].checked) {
            valeur = obj[i].value;
            break;
        }
    }

    if (liste.in_array(valeur)) {
        document.getElementById(id_span_ok).innerHTML = inner_yes;
        return 1;
    }
    else {
        document.getElementById(id_span_ok).innerHTML = inner_no;
        return 0;
    }
}

/* valide si un champ est rempli, avec taille min, taille max, et expreg de validation des caracteres autorises */
function valide_champ (field, form, id_span_ok, inner_no, inner_yes, min_length, max_length, reg) {
    // valeurs par defaut
    if (!id_span_ok) id_span_ok = field+'_ok';
    if (!inner_no)   inner_no  = '*';
    if (!inner_yes)  inner_yes = ' ';
    if (!min_length) min_length = 1;

    if (is_array(field)) { // valide_champ renvoie vrai si et seulement si au moins un element du tableau est ok
        valide = 0;
        cnt = field.length;
        for (i=0; i < cnt; ++i) {
            valide += parseInt(valide_champ(field[i], form, id_span_ok, inner_no, inner_yes, min_length, max_length, reg));
        }

        if (valide) {
            document.getElementById(id_span_ok).innerHTML = inner_yes;
            return 1;
        }
        else {
            document.getElementById(id_span_ok).innerHTML = inner_no;
            return 0;
        }
    }

    retour = 1;
    is_radio = 0;
    
    champ = '';

    // on essaye d'abord de recuperer la valeur par le name dans un formulaire donne, eventuellement
    obj = getCheckedElementByTagName(field, form);
    if (obj) {
        champ = obj.value;
        is_radio = 1;
    }
    else { // sinon on recupere par l'id
        obj = document.getElementById(field);
        if (obj) champ = obj.value;
    }

    champ = trim(champ);

    min_length = parseInt (min_length);
    max_length = parseInt (max_length);

    // teste la taille
    if ((max_length && (champ.length > max_length))
     || (min_length && (champ.length < min_length))) {
        retour = 0;
    }

    // evite que la fonction retourne vrai quand on n'a pas selectionne d'element pour des boutons radio. Ne fonctionne pas sous IE...
    if (is_radio && champ == false) retour = 0;

    // teste la conformite a l'expreg
    if (retour && (reg && champ.match(reg) || !reg)) {
        document.getElementById(id_span_ok).innerHTML = inner_yes;
        return 1;
    }
    else {
        document.getElementById(id_span_ok).innerHTML = inner_no;
        return 0;
    }
}

/* incremente la valeur numerique d'un champ input avec l'increment passe en parametre, eventuellement negatif. */
function increment (obj, increment, min_val) {
    var val = parseInt(obj.value); 
    if (isNaN(val)) val = 0; 
    if ((val > min_val && increment < 0) || (increment > 0)) val = val + increment; 
    return val; 
}

/* appelee en onkeyup sur un textarea source, met a jour de le div destination avec le contenu du textarea. */
function maj_div (id_source, id_destination) {

    var reg_Open  = 0; 
    var reg_Close = 0; 

    /*
    var reg_Open  = new RegExp(/\[(big|small)\]/); 
    var reg_Close = new RegExp(/\[\/(big|small)\]/); 
    */

    var src = document.getElementById(id_source); 
    var dst = document.getElementById(id_destination); 
    var contenu = src.value; 

    // on utilise la regexp pour pouvoir utiliser le flag "g" !
    var reg_Script  = new RegExp("</*script.*", "g"); 
    var reg_Spaces  = new RegExp(" ", "g"); 
    var reg_Html1   = new RegExp("<", "g"); 
    var reg_Html2   = new RegExp(">", "g"); 
    var reg_Br      = new RegExp("\n", "g"); 

    // filtre le contenu html
    contenu = contenu.replace(reg_Script, ""); 
    contenu = contenu.replace(reg_Spaces, "&nbsp;"); 
    contenu = contenu.replace(reg_Html1, "&lt;"); 
    contenu = contenu.replace(reg_Html2, "&gt;"); 

    // remplacements sur le contenu rÃ©cupÃ©rÃ©
    if (reg_Open && reg_Close) {
        // ENCODE LES BALISES OUVRANTES
        var i = 100;    // on utilise une boucle car on ne peut pas utiliser le flag "g" sur l'expression rÃ©guliÃ¨re
        while (contenu != contenu.replace(reg_Open, '<$1>') && i) {
            contenu = contenu.replace(reg_Open, '<$1>'); 
            --i; 
        }
        // ENCODE LES BALISES FERMANTES
        var i = 100;    // on utilise une boucle car on ne peut pas utiliser le flag "g" sur l'expression rÃ©guliÃ¨re
        while (contenu != contenu.replace(reg_Close, '</$1>') && i) {
            contenu = contenu.replace(reg_Close, '</$1>'); 
            --i; 
        }
    }

    // ENCODE LES RETOURS A LA LIGNE
    contenu = contenu.replace(reg_Br, "<br />"); 

    /* foireux... sous IE autant que sous FF, perturbe la saisie. 
    // LIMITATIONS DE LA SOURCE 
    var reg_Src = new RegExp(/(.{42}).*$/); 
    src.value = src.value.replace (reg_Src, '$1'); 
    */

    dst.innerHTML = contenu; 

}

/* encadre le texte selectionnÃ© dans un textarea avec des balises prÃ©dÃ©finies (sorte de bbcode). */
function modif_selection (txtarea, effet) {
    
    txtarea = document.getElementById(txtarea); 

    switch (effet) {
        /*
        case  'big' :
            tagOpen = new Array('\[big\]', '<big>'); 
            tagClose = new Array('\[/big\]', '</big>'); 
            break; 
        case  'small' :
            tagOpen = new Array('\[small\]', '<small>'); 
            tagClose = new Array('\[/small\]', '</small>'); 
            break; 
        */
        default :   // clean
            tagOpen = new Array('\\\[[^\\\] ]*\\\]', ''); 
            tagClose = new Array('\\\[/[^\\\] ]*\\\]', ''); 
            break; 
    }

    var reg_Open  = new RegExp(tagOpen[0],  "g");     // on utilise la regexp pour pouvoir utiliser le flag "g" !
    var reg_Close = new RegExp(tagClose[0], "g");     // on utilise la regexp pour pouvoir utiliser le flag "g" !

    if (document.selection  && document.selection.createRange) { // IE/Opera
        txtarea.focus();
        var range = document.selection.createRange();
        selText = range.text;
        if (effet == 'clean') {
            selText = selText.replace (reg_Open, tagOpen[1]); 
            selText = selText.replace (reg_Close, tagClose[1]); 
            range.text = selText; 
        }
        else {
            range.text = tagOpen[0] + selText + tagClose[0]; 
        }
    }
    else { // Mozilla
        var startPos = txtarea.selectionStart;
        var endPos = txtarea.selectionEnd;
        beforeText = txtarea.value.substring(0, startPos); 
        selText = txtarea.value.substring(startPos, endPos);
        afterText = txtarea.value.substring(endPos, txtarea.value.length);
        if (effet == 'clean') {
            selText = selText.replace (reg_Open, tagOpen[1]); 
            selText = selText.replace (reg_Close, tagClose[1]); 
            txtarea.value = beforeText + selText + afterText; 
        }
        else {
            txtarea.value = beforeText + tagOpen[0] + selText + tagClose[0] + afterText; 
        }
    }

    maj_div ('src_promo', 'dst_promo'); 
    txtarea.focus(); 

}

/* }}} */


/* {{{ FONCTIONS FLASH */

/* ecrire le code HTML pour integrer un flash, et contourne la restriction IE, en conservant la validite XHTML */
function integrer_flash (largeur, hauteur, chemin, title) {
    document.write("<object classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=7,0,19,0' width='"+largeur+"' height='"+hauteur+"' title='"+title+"'>\n");
    document.write("<param name='movie' value='"+chemin+"' />\n");
    document.write("<param name='quality' value='high' />\n");
    document.write("<embed src='"+chemin+"' quality='high' pluginspage='http://www.macromedia.com/go/getflashplayer' type='application/x-shockwave-flash' width='"+largeur+"' height='"+hauteur+"'></embed> \n");
    document.write("</object>\n");
}

/* }}} */


/* {{{ FONCTIONS SHOW/HIDE */

/* show/hide un element du DOM, et change la source d'une image en fonction de l'Ã©tat cachÃ©/affichÃ© */
function showhide (eltid, eltimg, img_reduire, img_restaurer, path, forceshow, visible) {
    if (!img_reduire) img_reduire = 'img/reduire.png';
    if (!img_restaurer) img_restaurer = 'img/restaurer.png';

    if (!visible) {
        oldval = document.getElementById(eltid).style.display;
        newval = (oldval == 'none') ? 'block' : 'none';
        if ('block' == forceshow) newval = 'block';
        if ('none'  == forceshow) newval = 'none';
        newimg = (newval == 'block') ? path+img_reduire : path+img_restaurer;
        if (eltimg) eltimg.src= newimg;
         zindex = (newval == 'block') ? '7' : '1';
        document.getElementById(eltid).style.display = 'none';
        document.getElementById(eltid).style.zIndex = zindex;
        document.getElementById(eltid).style.display = newval;
        // if ('block' == forceshow) fade_element('tableau_error_handler');
    }
    else {
        oldval = document.getElementById(eltid).style.visibility;
        newval = (oldval == 'hidden') ? 'visible' : 'hidden';
        if ('visible' == forceshow) newval = 'visible';
        if ('hidden'  == forceshow) newval = 'hidden';
        newimg = (newval == 'visible') ? path+img_reduire : path+img_restaurer;
        if (eltimg) eltimg.src= newimg;
        zindex = (newval == 'visible') ? '7' : '1';
        document.getElementById(eltid).style.visibility = 'hidden';
        document.getElementById(eltid).style.zIndex = zindex;
        document.getElementById(eltid).style.visibility = newval;
        // if ('block' == forceshow) fade_element('tableau_error_handler');
    }
}

/* open (display:'block') un element du DOM */
function opendiv (eltid) { if (document.getElementById(eltid)) document.getElementById(eltid).style.display = 'block'; }

/* close (display:'none') un element du DOM */
function closediv (eltid) { document.getElementById(eltid).style.display = 'none'; }

/* vide (innerHTML = '') un element du DOM */
function empty_div (eltid) { document.getElementById(eltid).innerHTML = ''; }

/* }}} */


function montre(id) {
    var d = document.getElementById(id);
    for (var i = 1; i <= 10; ++i) {
	if (document.getElementById('sub'+i)) { $('#sub'+i).fadeOut(100); }
    }
    if (d) { $('#'+id).fadeIn(100); }
}


/**
 * jQuery lightBox plugin
 * This jQuery plugin was inspired and based on Lightbox 2 by Lokesh Dhakar (http://www.huddletogether.com/projects/lightbox2/)
 * and adapted to me for use like a plugin from jQuery.
 * @name jquery-lightbox-0.5.js
 * @author Leandro Vieira Pinho - http://leandrovieira.com
 * @version 0.5
 * @date April 11, 2008
 * @category jQuery plugin
 * @copyright (c) 2008 Leandro Vieira Pinho (leandrovieira.com)
 * @license CC Attribution-No Derivative Works 2.5 Brazil - http://creativecommons.org/licenses/by-nd/2.5/br/deed.en_US
 * @example Visit http://leandrovieira.com/projects/jquery/lightbox/ for more informations about this jQuery plugin
 */

// Offering a Custom Alias suport - More info: http://docs.jquery.com/Plugins/Authoring#Custom_Alias
(function($) {
	/**
	 * $ is an alias to jQuery object
	 *
	 */
	$.fn.lightBox = function(settings) {
		// Settings to configure the jQuery lightBox plugin how you like
		settings = jQuery.extend({
			// Configuration related to overlay
			overlayBgColor: 		'#000',		// (string) Background color to overlay; inform a hexadecimal value like: #RRGGBB. Where RR, GG, and BB are the hexadecimal values for the red, green, and blue values of the color.
			overlayOpacity:			0.8,		// (integer) Opacity value to overlay; inform: 0.X. Where X are number from 0 to 9
			// Configuration related to navigation
			fixedNavigation:		false,		// (boolean) Boolean that informs if the navigation (next and prev button) will be fixed or not in the interface.
			// Configuration related to images
			imageLoading:			'img/loading.gif',		// (string) Path and the name of the loading icon
			imageBtnPrev:			'img/prev.gif',			// (string) Path and the name of the prev button image
			imageBtnNext:			'img/next.gif',			// (string) Path and the name of the next button image
			imageBtnClose:			'img/close.gif',		// (string) Path and the name of the close btn
			imageBlank:				'img/spacer.gif',			// (string) Path and the name of a blank image (one pixel)
			// Configuration related to container image box
			containerBorderSize:	10,			// (integer) If you adjust the padding in the CSS for the container, #lightbox-container-image-box, you will need to update this value
			containerResizeSpeed:	200,		// (integer) Specify the resize duration of container image. These number are miliseconds. 400 is default.
			// Configuration related to texts in caption. For example: Image 2 of 8. You can alter either "Image" and "of" texts.
			txtImage:				'Image',	// (string) Specify text "Image"
			txtOf:					'sur',		// (string) Specify text "of"
			// Configuration related to keyboard navigation
			keyToClose:				'c',		// (string) (c = close) Letter to close the jQuery lightBox interface. Beyond this letter, the letter X and the SCAPE key is used to.
			keyToPrev:				'p',		// (string) (p = previous) Letter to show the previous image
			keyToNext:				'n',		// (string) (n = next) Letter to show the next image.
			// Don´t alter these variables in any way
			imageArray:				[],
			activeImage:			0
		},settings);
		// Caching the jQuery object with all elements matched
		var jQueryMatchedObj = this; // This, in this context, refer to jQuery object
		/**
		 * Initializing the plugin calling the start function
		 *
		 * @return boolean false
		 */
		function _initialize() {
			_start(this,jQueryMatchedObj); // This, in this context, refer to object (link) which the user have clicked
			return false; // Avoid the browser following the link
		}
		/**
		 * Start the jQuery lightBox plugin
		 *
		 * @param object objClicked The object (link) whick the user have clicked
		 * @param object jQueryMatchedObj The jQuery object with all elements matched
		 */
		function _start(objClicked,jQueryMatchedObj) {
			// Hime some elements to avoid conflict with overlay in IE. These elements appear above the overlay.
			$('embed, object, select').css({ 'visibility' : 'hidden' });
			// Call the function to create the markup structure; style some elements; assign events in some elements.
			_set_interface();
			// Unset total images in imageArray
			settings.imageArray.length = 0;
			// Unset image active information
			settings.activeImage = 0;
			// We have an image set? Or just an image? Let´s see it.
			if ( jQueryMatchedObj.length == 1 ) {
				settings.imageArray.push(new Array(objClicked.getAttribute('href'),objClicked.getAttribute('title')));
			} else {
				// Add an Array (as many as we have), with href and title atributes, inside the Array that storage the images references		
				for ( var i = 0; i < jQueryMatchedObj.length; i++ ) {
					settings.imageArray.push(new Array(jQueryMatchedObj[i].getAttribute('href'),jQueryMatchedObj[i].getAttribute('title')));
				}
			}
			while ( settings.imageArray[settings.activeImage][0] != objClicked.getAttribute('href') ) {
				settings.activeImage++;
			}
			// Call the function that prepares image exibition
			_set_image_to_view();
		}
		/**
		 * Create the jQuery lightBox plugin interface
		 *
		 * The HTML markup will be like that:
			<div id="jquery-overlay"></div>
			<div id="jquery-lightbox">
				<div id="lightbox-container-image-box">
					<div id="lightbox-container-image">
						<img src="../fotos/XX.jpg" id="lightbox-image">
						<div id="lightbox-nav">
							<a href="#" id="lightbox-nav-btnPrev"></a>
							<a href="#" id="lightbox-nav-btnNext"></a>
						</div>
						<div id="lightbox-loading">
							<a href="#" id="lightbox-loading-link">
								<img src="../images/lightbox-ico-loading.gif">
							</a>
						</div>
					</div>
				</div>
				<div id="lightbox-container-image-data-box">
					<div id="lightbox-container-image-data">
						<div id="lightbox-image-details">
							<span id="lightbox-image-details-caption"></span>
							<span id="lightbox-image-details-currentNumber"></span>
						</div>
						<div id="lightbox-secNav">
							<a href="#" id="lightbox-secNav-btnClose">
								<img src="../images/lightbox-btn-close.gif">
							</a>
						</div>
					</div>
				</div>
			</div>
		 *
		 */
		function _set_interface() {
			// Apply the HTML markup into body tag
			$('body').append('<div id="jquery-overlay"></div><div id="jquery-lightbox"><div id="lightbox-container-image-box"><div id="lightbox-container-image"><img id="lightbox-image"><div style="" id="lightbox-nav"><a href="#" id="lightbox-nav-btnPrev"></a><a href="#" id="lightbox-nav-btnNext"></a></div><div id="lightbox-loading"><a href="#" id="lightbox-loading-link"><img src="' + settings.imageLoading + '"></a></div></div></div><div id="lightbox-container-image-data-box"><div id="lightbox-container-image-data"><div id="lightbox-image-details"><span id="lightbox-image-details-caption"></span><span id="lightbox-image-details-currentNumber"></span></div><div id="lightbox-secNav"><a href="#" id="lightbox-secNav-btnClose"><img src="' + settings.imageBtnClose + '"></a></div></div></div></div>');	
			// Get page sizes
			var arrPageSizes = ___getPageSize();
			// Style overlay and show it
			$('#jquery-overlay').css({
				backgroundColor:	settings.overlayBgColor,
				opacity:			settings.overlayOpacity,
				width:				arrPageSizes[0],
				height:				arrPageSizes[1]
			}).fadeIn();
			// Get page scroll
			var arrPageScroll = ___getPageScroll();
			// Calculate top and left offset for the jquery-lightbox div object and show it
			$('#jquery-lightbox').css({
				top:	arrPageScroll[1] + (arrPageSizes[3] / 10),
				left:	arrPageScroll[0]
			}).show();
			// Assigning click events in elements to close overlay
			$('#jquery-overlay,#jquery-lightbox').click(function() {
				_finish();									
			});
			// Assign the _finish function to lightbox-loading-link and lightbox-secNav-btnClose objects
			$('#lightbox-loading-link,#lightbox-secNav-btnClose').click(function() {
				_finish();
				return false;
			});
			// If window was resized, calculate the new overlay dimensions
			$(window).resize(function() {
				// Get page sizes
				var arrPageSizes = ___getPageSize();
				// Style overlay and show it
				$('#jquery-overlay').css({
					width:		arrPageSizes[0],
					height:		arrPageSizes[1]
				});
				// Get page scroll
				var arrPageScroll = ___getPageScroll();
				// Calculate top and left offset for the jquery-lightbox div object and show it
				$('#jquery-lightbox').css({
					top:	arrPageScroll[1] + (arrPageSizes[3] / 10),
					left:	arrPageScroll[0]
				});
			});
		}
		/**
		 * Prepares image exibition; doing a image´s preloader to calculate it´s size
		 *
		 */
		function _set_image_to_view() { // show the loading
			// Show the loading
			$('#lightbox-loading').show();
			if ( settings.fixedNavigation ) {
				$('#lightbox-image,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide();
			} else {
				// Hide some elements
				$('#lightbox-image,#lightbox-nav,#lightbox-nav-btnPrev,#lightbox-nav-btnNext,#lightbox-container-image-data-box,#lightbox-image-details-currentNumber').hide();
			}
			// Image preload process
			var objImagePreloader = new Image();
			objImagePreloader.onload = function() {
				$('#lightbox-image').attr('src',settings.imageArray[settings.activeImage][0]);
				// Perfomance an effect in the image container resizing it
				_resize_container_image_box(objImagePreloader.width,objImagePreloader.height);
				//	clear onLoad, IE behaves irratically with animated gifs otherwise
				objImagePreloader.onload=function(){};
			};
			objImagePreloader.src = settings.imageArray[settings.activeImage][0];
		};
		/**
		 * Perfomance an effect in the image container resizing it
		 *
		 * @param integer intImageWidth The image´s width that will be showed
		 * @param integer intImageHeight The image´s height that will be showed
		 */
		function _resize_container_image_box(intImageWidth,intImageHeight) {
			// Get current width and height
			var intCurrentWidth = $('#lightbox-container-image-box').width();
			var intCurrentHeight = $('#lightbox-container-image-box').height();
			// Get the width and height of the selected image plus the padding
			var intWidth = (intImageWidth + (settings.containerBorderSize * 2)); // Plus the image´s width and the left and right padding value
			var intHeight = (intImageHeight + (settings.containerBorderSize * 2)); // Plus the image´s height and the left and right padding value
			// Diferences
			var intDiffW = intCurrentWidth - intWidth;
			var intDiffH = intCurrentHeight - intHeight;
			// Perfomance the effect
			$('#lightbox-container-image-box').animate({ width: intWidth, height: intHeight },settings.containerResizeSpeed,function() { _show_image(); });
			if ( ( intDiffW == 0 ) && ( intDiffH == 0 ) ) {
				if ( $.browser.msie ) {
					___pause(250);
				} else {
					___pause(100);	
				}
			} 
			$('#lightbox-container-image-data-box').css({ width: intImageWidth });
			$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({ height: intImageHeight + (settings.containerBorderSize * 2) });
		};
		/**
		 * Show the prepared image
		 *
		 */
		function _show_image() {
			$('#lightbox-loading').hide();
			$('#lightbox-image').fadeIn(function() {
				_show_image_data();
				_set_navigation();
			});
			_preload_neighbor_images();
		};
		/**
		 * Show the image information
		 *
		 */
		function _show_image_data() {
			$('#lightbox-container-image-data-box').slideDown('fast');
			$('#lightbox-image-details-caption').hide();
			if ( settings.imageArray[settings.activeImage][1] ) {
				$('#lightbox-image-details-caption').html(settings.imageArray[settings.activeImage][1]).show();
			}
			// If we have a image set, display 'Image X of X'
			if ( settings.imageArray.length > 1 ) {
				$('#lightbox-image-details-currentNumber').html(settings.txtImage + ' ' + ( settings.activeImage + 1 ) + ' ' + settings.txtOf + ' ' + settings.imageArray.length).show();
			}		
		}
		/**
		 * Display the button navigations
		 *
		 */
		function _set_navigation() {
			$('#lightbox-nav').show();

			// Instead to define this configuration in CSS file, we define here. And it´s need to IE. Just.
			$('#lightbox-nav-btnPrev,#lightbox-nav-btnNext').css({ 'background' : 'transparent url(' + settings.imageBlank + ') no-repeat' });
			
			// Show the prev button, if not the first image in set
			if ( settings.activeImage != 0 ) {
				if ( settings.fixedNavigation ) {
					$('#lightbox-nav-btnPrev').css({ 'background' : 'url(' + settings.imageBtnPrev + ') left 15% no-repeat' })
						.unbind()
						.bind('click',function() {
							settings.activeImage = settings.activeImage - 1;
							_set_image_to_view();
							return false;
						});
				} else {
					// Show the images button for Next buttons
					$('#lightbox-nav-btnPrev').unbind().hover(function() {
						$(this).css({ 'background' : 'url(' + settings.imageBtnPrev + ') left 15% no-repeat' });
					},function() {
						$(this).css({ 'background' : 'transparent url(' + settings.imageBlank + ') no-repeat' });
					}).show().bind('click',function() {
						settings.activeImage = settings.activeImage - 1;
						_set_image_to_view();
						return false;
					});
				}
			}
			
			// Show the next button, if not the last image in set
			if ( settings.activeImage != ( settings.imageArray.length -1 ) ) {
				if ( settings.fixedNavigation ) {
					$('#lightbox-nav-btnNext').css({ 'background' : 'url(' + settings.imageBtnNext + ') right 15% no-repeat' })
						.unbind()
						.bind('click',function() {
							settings.activeImage = settings.activeImage + 1;
							_set_image_to_view();
							return false;
						});
				} else {
					// Show the images button for Next buttons
					$('#lightbox-nav-btnNext').unbind().hover(function() {
						$(this).css({ 'background' : 'url(' + settings.imageBtnNext + ') right 15% no-repeat' });
					},function() {
						$(this).css({ 'background' : 'transparent url(' + settings.imageBlank + ') no-repeat' });
					}).show().bind('click',function() {
						settings.activeImage = settings.activeImage + 1;
						_set_image_to_view();
						return false;
					});
				}
			}
			// Enable keyboard navigation
			_enable_keyboard_navigation();
		}
		/**
		 * Enable a support to keyboard navigation
		 *
		 */
		function _enable_keyboard_navigation() {
			$(document).keydown(function(objEvent) {
				_keyboard_action(objEvent);
			});
		}
		/**
		 * Disable the support to keyboard navigation
		 *
		 */
		function _disable_keyboard_navigation() {
			$(document).unbind();
		}
		/**
		 * Perform the keyboard actions
		 *
		 */
		function _keyboard_action(objEvent) {
			// To ie
			if ( objEvent == null ) {
				keycode = event.keyCode;
				escapeKey = 27;
			// To Mozilla
			} else {
				keycode = objEvent.keyCode;
				escapeKey = objEvent.DOM_VK_ESCAPE;
			}
			// Get the key in lower case form
			key = String.fromCharCode(keycode).toLowerCase();
			// Verify the keys to close the ligthBox
			if ( ( key == settings.keyToClose ) || ( key == 'x' ) || ( keycode == escapeKey ) ) {
				_finish();
			}
			// Verify the key to show the previous image
			if ( ( key == settings.keyToPrev ) || ( keycode == 37 ) ) {
				// If we´re not showing the first image, call the previous
				if ( settings.activeImage != 0 ) {
					settings.activeImage = settings.activeImage - 1;
					_set_image_to_view();
					_disable_keyboard_navigation();
				}
			}
			// Verify the key to show the next image
			if ( ( key == settings.keyToNext ) || ( keycode == 39 ) ) {
				// If we´re not showing the last image, call the next
				if ( settings.activeImage != ( settings.imageArray.length - 1 ) ) {
					settings.activeImage = settings.activeImage + 1;
					_set_image_to_view();
					_disable_keyboard_navigation();
				}
			}
		}
		/**
		 * Preload prev and next images being showed
		 *
		 */
		function _preload_neighbor_images() {
			if ( (settings.imageArray.length -1) > settings.activeImage ) {
				objNext = new Image();
				objNext.src = settings.imageArray[settings.activeImage + 1][0];
			}
			if ( settings.activeImage > 0 ) {
				objPrev = new Image();
				objPrev.src = settings.imageArray[settings.activeImage -1][0];
			}
		}
		/**
		 * Remove jQuery lightBox plugin HTML markup
		 *
		 */
		function _finish() {
			$('#jquery-lightbox').remove();
			$('#jquery-overlay').fadeOut(function() { $('#jquery-overlay').remove(); });
			// Show some elements to avoid conflict with overlay in IE. These elements appear above the overlay.
			$('embed, object, select').css({ 'visibility' : 'visible' });
		}
		/**
		 / THIRD FUNCTION
		 * getPageSize() by quirksmode.com
		 *
		 * @return Array Return an array with page width, height and window width, height
		 */
		function ___getPageSize() {
			var xScroll, yScroll;
			if (window.innerHeight && window.scrollMaxY) {	
				xScroll = window.innerWidth + window.scrollMaxX;
				yScroll = window.innerHeight + window.scrollMaxY;
			} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
				xScroll = document.body.scrollWidth;
				yScroll = document.body.scrollHeight;
			} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
				xScroll = document.body.offsetWidth;
				yScroll = document.body.offsetHeight;
			}
			var windowWidth, windowHeight;
			if (self.innerHeight) {	// all except Explorer
				if(document.documentElement.clientWidth){
					windowWidth = document.documentElement.clientWidth; 
				} else {
					windowWidth = self.innerWidth;
				}
				windowHeight = self.innerHeight;
			} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
				windowWidth = document.documentElement.clientWidth;
				windowHeight = document.documentElement.clientHeight;
			} else if (document.body) { // other Explorers
				windowWidth = document.body.clientWidth;
				windowHeight = document.body.clientHeight;
			}	
			// for small pages with total height less then height of the viewport
			if(yScroll < windowHeight){
				pageHeight = windowHeight;
			} else { 
				pageHeight = yScroll;
			}
			// for small pages with total width less then width of the viewport
			if(xScroll < windowWidth){	
				pageWidth = xScroll;		
			} else {
				pageWidth = windowWidth;
			}
			arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight);
			return arrayPageSize;
		};
		/**
		 / THIRD FUNCTION
		 * getPageScroll() by quirksmode.com
		 *
		 * @return Array Return an array with x,y page scroll values.
		 */
		function ___getPageScroll() {
			var xScroll, yScroll;
			if (self.pageYOffset) {
				yScroll = self.pageYOffset;
				xScroll = self.pageXOffset;
			} else if (document.documentElement && document.documentElement.scrollTop) {	 // Explorer 6 Strict
				yScroll = document.documentElement.scrollTop;
				xScroll = document.documentElement.scrollLeft;
			} else if (document.body) {// all other Explorers
				yScroll = document.body.scrollTop;
				xScroll = document.body.scrollLeft;	
			}
			arrayPageScroll = new Array(xScroll,yScroll);
			return arrayPageScroll;
		};
		 /**
		  * Stop the code execution from a escified time in milisecond
		  *
		  */
		 function ___pause(ms) {
			var date = new Date(); 
			curDate = null;
			do { var curDate = new Date(); }
			while ( curDate - date < ms);
		 };
		// Return the jQuery object for chaining. The unbind method is used to avoid click conflict when the plugin is called more than once
		return this.unbind('click').click(_initialize);
	};
})(jQuery); // Call and execute the function immediately passing the jQuery object

