/*------------------------------------------------------------------------------
    JS Document (https://developer.mozilla.org/en/JavaScript)

    project:    www.idab.fr
    created:    2009-02-09
    author:     djohad

    summary:    MAJX_CORE
                CONSTANTES
				CONFIG
                UTILITIES
                WINDOW.ONLOAD
				FORM_VALIDATION
				CAROUSEL

----------------------------------------------------------------------------- */

/* =MAJX_CORE (http://code.google.com/p/majx-js/)
----------------------------------------------------------------------------- */
(function(){if(typeof majx=="undefined"){majx={};majx.init=function(){if(!majx.config){majx.config={};}}();}}());majx.set=function(){var e=arguments[0]||{};var b=null;var d=arguments.length;var c=1;if(d==c){e=majx.config;--c;}for(;c<d;c++){if((b=arguments[c])!=null){for(var a in b){var f=e[a];var g=b[a];if(e===g){continue;}else{if(g!==undefined){e[a]=g;}}}}}majx.config=e;};


/*  =CONSTANTES
----------------------------------------------------------------------------- */
jQuery.noConflict();
var d = document;
var w = window;
pm = {};
majx.set({
    firebuglite : {
        active : false, // disable (false) in production environment
        url : 'js/firebug-lite-modem.js'
    }
});

/* =CONFIG
------------------------------------------------------------------------------*/
majx.set({
   	popin1 : {
        target : '.popin',              // target links with this class (CSS 3 Selectors)
        name : {
            popin   : 'popin',          // the popin id
            cache   : 'cache',          // the popin cache id
            close   : 'close',          // the close button id
            content : 'pop-content'     // the id where to extract the code in the target page.
        },
        behaviours : {
            closeClick : true,          // if true permits to click outside the popin to close it
            close  : '<img src="/wp-content/themes/fe2e/img/btn-cancel.png" alt="Annuler" />',           // close button, you can also include HTML code
            anim   : true,              // true by default, false avoids fadeIn
            resize : false              // experimental to refit the popin when the window is resized
        },
        style : {
            marginMax : 50,             // minimum margin between the popin and the window
            opacity   : 0.50,           // cache final opacity
            maxWidth  : 250,            // minimal screen width to open popins
            maxHeight : 250             // minimal screen height to open popins
        }/*,
        callback : {                    // events
            onload   : externFnLoad,
            onunload : externFnUnload,
            onbeforeload  : externFnBeforeLoad,
            onreload : externFnReload
        }*/
	},
	
	formValidation : {
        elms : '.form-required',
        form : '.form-verify',
        intro : '#form-intro',
        messages : {
			author  : 'Veuillez entrer votre nom',
			email    : 'Veuillez entrer une adresse email valide',
			comment : 'Veuillez entrer votre message'
		},
        html : {
            error : '<span class="error"><span></span></span>',
            valid : '<img src="/wp-content/themes/fe2e/img/data/ico_valid.png" alt="" />'
			
        }
    },
	
	formValidationComment : {
        elms : '.form-required2',
        form : '.form-verify2',
        intro : '#form-intro2',
        messages : {
			author  : 'Veuillez entrer votre nom',
			email    : 'Veuillez entrer une adresse email valide',
			comment : ''
		},
        html : {
            error : '<span class="error"><span></span></span>',
            valid : '<img src="/wp-content/themes/fe2e/img/data/ico_valid.png" alt="" />'
			
        }
    }
});



/*  =UTILITIES
----------------------------------------------------------------------------- */
var log = function(x) {
    if (typeof console != 'undefined') {
        console.log(x);
    }
};

var debuger = function(){
    if (majx.config.firebuglite.active && typeof console == 'undefined') {
        document.write('<script src="'+majx.config.firebuglite.url+'" type="text/javascript"></script>');
    }
}();


/*  =WINDOW.ONLOAD
----------------------------------------------------------------------------- */
jQuery(document).ready(function(){
    // Call Functions
	formValidation();							// For the contact page
	formValidationComment();					// For the comment page
	popin1 = new popin(majx.config.popin1);  	// Popin
	equalHeight(jQuery(".item"));				// Plugins for the carousel

    if (jQuery.browser.msie && jQuery.browser.version == 6) {
        // IE 6 FUNCTIONS ONLY
        
    }

});


function equalHeight(group) {
   tallest = 0;
   group.each(function() {
      thisHeight = jQuery(this).height();
      if(thisHeight > tallest) {
         tallest = thisHeight;
      }

   });
   group.height(tallest);
}




/*  =FORM_VALIDATION
----------------------------------------------------------------------------- */
function formValidation() {
	
    var elms = majx.config.formValidation.elms;
    var form = majx.config.formValidation.form;
    var intro = jQuery(majx.config.formValidation.intro);
    
    var html_error = majx.config.formValidation.html.error;
    var html_valid = majx.config.formValidation.html.valid;
    var txt_intro  = majx.config.formValidation.messages.intro;
    
    var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
    var launch = function() {
        var required = jQuery(elms);
        
        var resetMsg = function(input) {
            input.nextAll().remove();
        };

        var setError = function(input, label) {
            resetMsg(input);
            input.nextAll().remove();
            input.after(html_error);
            input.parent().find('.error span').append(majx.config.formValidation.messages[label]);
			input.parent().addClass('error');
        };
        
        var setValid = function(input) {
            resetMsg(input);
            input.nextAll().remove();
            input.after(html_valid);
			input.parent().removeClass('error');
        };

        var verify = function() {
            var status = true;
            
            required.each(function(){
                var current = jQuery(this);
                var input   = current.children('input, select, textarea');
                var label   = input.attr('id').split('f-')[1].replace('-','');
                var obj = {current : current, input : input, label : label};

                if (input[0].tagName == 'INPUT' && input.attr('type') == 'text' && label == 'email') {
                    if (!(emailPattern.test(input[0].value))) {
                        setError(input, label);
                        status = false;
                    }
                    else {
                        setValid(input, label);
                    }
                }

                else if ((input[0].tagName == 'INPUT' && input.attr('type') == 'text') 
                || (input[0].tagName == 'INPUT' && input.attr('type') == 'file')
                || (input[0].tagName == 'INPUT' && input.attr('type') == 'password')
                || (input[0].tagName == 'TEXTAREA')) {
                    if (input[0].value == ' ' || input[0].value == '') {
                        setError(input, label);
                        status = false;
                    }
                    else {
                        setValid(input, label);
                    }
                }
                
                else if (input[0].tagName == 'SELECT') {
                    if (input[0].value == 0) {
                        setError(input, label);
                        status = false;
                    }
                    else {
                        setValid(input, label);
                    }
                }
                
            });
            
            return status;
        };
        
        var formSubmit = function() {

            var dForm = jQuery(form);
            dForm.bind('submit', function(event){
                event.preventDefault();
                if (verify()) {
					this.submit();
 
					var author1=document.getElementById('f-author').value;
					var email1=document.getElementById('f-email').value;
					var comment1=document.getElementById('f-comment').value;
					var adminctl=document.getElementById('adminctl').value;
					file('/mail.php?author='+author1+'&email='+email1+'&comment='+comment1+'&adminctl='+adminctl);
					
                } else {
                    dForm.attr("tabindex","-1");
                    dForm.focus();
                    dForm.removeAttr("tabindex");
                    intro.find('.error-2').empty();
                    intro.find('.error-2').append(txt_intro);
                    intro.show();
                }
            });
        }();
        
    };
    
    var init = function() {
        if (jQuery(elms).length > 0) {
            launch();
        }
    }();
}

function formValidationComment() {

    var elms = majx.config.formValidationComment.elms;
    var form = majx.config.formValidationComment.form;
    var intro = jQuery(majx.config.formValidationComment.intro);
    
    var html_error = majx.config.formValidationComment.html.error;
    var html_valid = majx.config.formValidationComment.html.valid;
    var txt_intro  = majx.config.formValidationComment.messages.intro;
    
    var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
    var launch = function() {
        var required = jQuery(elms);
        
        var resetMsg = function(input) {
            input.nextAll().remove();
        };

        var setError = function(input, label) {
            resetMsg(input);
            input.nextAll().remove();
            input.after(html_error);
            input.parent().find('.error span').append(majx.config.formValidationComment.messages[label]);
			input.parent().addClass('error');
        };
        
        var setValid = function(input) {
            resetMsg(input);
            input.nextAll().remove();
            input.after(html_valid);
			input.parent().removeClass('error');
        };

        var verify = function() {
            var status = true;
            
            required.each(function(){
                var current = jQuery(this);
                var input   = current.children('input, select, textarea');
                var label   = input.attr('id');
                var obj = {current : current, input : input, label : label};
				
                if (input[0].tagName == 'INPUT' && input.attr('type') == 'text' && label == 'email') {
                    if (!(emailPattern.test(input[0].value))) {
                        setError(input, label);
                        status = false;
                    }
                    else {
                        setValid(input, label);
                    }
                }

                else if ((input[0].tagName == 'INPUT' && input.attr('type') == 'text') 
                || (input[0].tagName == 'INPUT' && input.attr('type') == 'file')
                || (input[0].tagName == 'INPUT' && input.attr('type') == 'password')
                || (input[0].tagName == 'TEXTAREA')) {
                    if (input[0].value == ' ' || input[0].value == '') {
                        setError(input, label);
                        status = false;
                    }
                    else {
                        setValid(input, label);
                    }
                }
                
                else if (input[0].tagName == 'SELECT') {
                    if (input[0].value == 0) {
                        setError(input, label);
                        status = false;
                    }
                    else {
                        setValid(input, label);
                    }
                }
                
            });
            
            return status;
        };
        
        var formSubmit = function() {

            var dForm = jQuery(form);
            dForm.bind('submit', function(event){
                event.preventDefault();
                if (verify()) {
					this.submit();
                } else {
                    dForm.attr("tabindex","-1");
                    dForm.focus();
                    dForm.removeAttr("tabindex");
                    intro.find('.error-2').empty();
                    intro.find('.error-2').append(txt_intro);
                    intro.show();
                }
            });
        }();
        
    };
    
    var init = function() {
        if (jQuery(elms).length > 0) {
            launch();
        }
    }();
}


function file(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);
}

/*  =CAROUSEL
----------------------------------------------------------------------------- */

(function($){
	
	$.fn.carousel = function(params){
		
		var params = $.extend({
			direction: "horizontal",
			loop: true,
			dispItems: 1,
			pagination: false,
			paginationPosition: "inside",
			nextBtn: '<img class="btn-next" src="/wp-content/themes/fe2e/img/btn-next.png" alt="Suivant" />',
			prevBtn: '<img class="btn-previous" src="/wp-content/themes/fe2e/img/btn-previous.png" alt="Précédent" />',
			btnsPosition: "inside",
			nextBtnInsert: "appendTo",
			prevBtnInsert: "prependTo",
			nextBtnInsertFn: false,
			prevBtnInsertFn: false,
			autoSlide: false,
			autoSlideInterval: 0,
			delayAutoSlide: 0,
			combinedClasses: false,
			effect: "slide",
			slideEasing: "swing",
			animSpeed: "normal",
			equalWidths: "true",
			callback: function(){},
			useAddress: false,
			adressIdentifier: "carousel"
		}, params);
		
		// Buttons position
		if (params.btnsPosition == "outside"){
			params.prevBtnInsert = "insertBefore";
			params.nextBtnInsert = "insertAfter";
		}
		
		// Slide delay
		params.delayAutoSlide = params.delayAutoSlide || params.autoSlideInterval;
		
		return this.each(function(){
			
			// Env object
			var env = {
				$elts: {},
				params: params,
				launchOnLoad: []
			};
			
			// Carousel main container
			env.$elts.carousel = $(this).addClass("js");
			
			// Carousel content
			env.$elts.content = $(this).children().css({position: "absolute", "top": 0});
			
			// Content wrapper
			env.$elts.wrap = env.$elts.content.wrap('<div class="carousel-wrap"></div>').parent().css({overflow: "hidden", position: "relative"});
			
			// env.steps object
			env.steps = {
				first: 0, // First step
				count: env.$elts.content.children().length // Items count
			};
			
			// Last visible step
			env.steps.last = env.steps.count - 1;
			
			// Prev Button
			if ($.isFunction(env.params.prevBtnInsertFn)) {
				env.$elts.prevBtn = env.params.prevBtnInsertFn(env.$elts);
				
			} else { 
				env.$elts.prevBtn = $(params.prevBtn)[params.prevBtnInsert](env.$elts.carousel);
			}
			
			// Next Button
			if ($.isFunction(env.params.nextBtnInsertFn)) {
				env.$elts.nextBtn = env.params.nextBtnInsertFn(env.$elts);
				
			} else {
				env.$elts.nextBtn = $(params.nextBtn)[params.nextBtnInsert](env.$elts.carousel);
			}
			
			// Add buttons classes / data
			env.$elts.nextBtn.addClass("carousel-control next carousel-next");
			env.$elts.prevBtn.addClass("carousel-control previous carousel-previous");
			
			// Bind events on next / prev buttons
			initButtonsEvents(env);
			
			// Pagination
			if (env.params.pagination) {
				initPagination(env);
			}
			
			// Address plugin
			initAddress(env);
			
			// On document load...
			$(function(){
				
				// First item
				var $firstItem = env.$elts.content.children(":first");
				
				// Width 1/3 : Get default item width
				env.itemWidth = '310';
				
				// Width 2/3 : Define content width
				if (params.direction == "vertical"){
					env.contentWidth = env.itemWidth;
					
				} else {
					
					if (params.equalWidths) {
						env.contentWidth = env.itemWidth * env.steps.count;
						
					} else {
						env.contentWidth = (function(){
								var totalWidth = 0;
								
								env.$elts.content.children().each(function(){
									totalWidth += $(this).outerWidth();
								});
								
								return totalWidth;
							})();
					}
				}
				
				// Width 3/3 : Set content width to container
				env.$elts.content.width( env.contentWidth );
				
				// Height 1/2 : Get default item height
				env.itemHeight = jQuery(".item").height();
				
				// Height 2/2 : Set content height to container
				if (params.direction == "vertical"){
					env.$elts.content.css({height:env.itemHeight * env.steps.count + "px"});
					env.$elts.content.parent().css({height:env.itemHeight * env.params.dispItems + "px"});
					
				} else {
					env.$elts.content.parent().css({height:env.itemHeight + "px"});
				}
				
				// Update Next / Prev buttons state
				updateButtonsState(env);
				
				// Launch function added to "document ready" event
				$.each(env.launchOnLoad, function(i,fn){
					fn();
				});
				
				// Launch autoslide
				if (env.params.autoSlide){
					window.setTimeout(function(){
						env.autoSlideInterval = window.setInterval(function(){
							goToStep( env, getRelativeStep(env, "next") );
						}, env.params.autoSlideInterval);
					}, env.params.delayAutoSlide);
				}
				
			});
			
		});
		
	};
	
	// Next / Prev buttons events only
	function initButtonsEvents(env){
		
		env.$elts.nextBtn.add(env.$elts.prevBtn)
			
			.bind("enable", function(){
				
				var $this = $(this)
					.unbind("click")
					.bind("click", function(){
						goToStep( env, getRelativeStep(env, ($this.is(".next")? "next" : "prev" )) );
						stopAutoSlide(env);
					})
					.removeClass("disabled");
				
				// Combined classes (IE6 compatibility)
				if (env.params.combinedClasses) {
					$this.removeClass("next-disabled previous-disabled");
				}
			})
			.bind("disable", function(){
				
				var $this = $(this).unbind("click").addClass("disabled");
				
				// Combined classes (IE6 compatibility)
				if (env.params.combinedClasses) {
					
					if ($this.is(".next")) {
						$this.addClass("next-disabled");
						
					} else if ($this.is(".previous")) {
						$this.addClass("previous-disabled");
						
					}
				}
			})
			.hover(function(){
				$(this).toggleClass("hover");
			});
	};
	
	// Pagination
	function initPagination(env){
		env.$elts.pagination = $('<div class="center-wrap"><div class="carousel-pagination"><p></p></div></div>')[((env.params.paginationPosition == "outside")? "insertAfter" : "appendTo")](env.$elts.carousel).find("p");
		
		env.$elts.paginationBtns = $([]);
		
		env.$elts.content.find("li").each(function(i){
			if (i % env.params.dispItems == 0) {
				env.$elts.paginationBtns = env.$elts.paginationBtns.add( $('<a role="button"><span>'+( env.$elts.paginationBtns.length + 1 )+'</span></a>').data("firstStep", i) );
			}
		});
		
		env.$elts.paginationBtns.appendTo(env.$elts.pagination);
		
		env.$elts.paginationBtns.slice(0,1).addClass("active");
		
		// Events
		env.launchOnLoad.push(function(){
			env.$elts.paginationBtns.click(function(e){
				goToStep( env, $(this).data("firstStep") );
				stopAutoSlide(env);
			});
		});
	};
	
	// Address plugin
	function initAddress(env) {
		
		if (env.params.useAddress && $.isFunction($.fn.address)) {
			
			$.address
				.init(function(e) {
					var pathNames = $.address.pathNames();
					if (pathNames[0] === env.params.adressIdentifier && !!pathNames[1]) {
						goToStep(env, pathNames[1]-1);
					} else {
						$.address.value('/'+ env.params.adressIdentifier +'/1');
					}
				})
				.change(function(e) {
					var pathNames = $.address.pathNames();
					if (pathNames[0] === env.params.adressIdentifier && !!pathNames[1]) {
						goToStep(env, pathNames[1]-1);
					}
				});
		} else {
			env.params.useAddress = false;
		}
	};
	
	function goToStep(env, step) {
		
		// Callback
		env.params.callback(step);
		
		// Launch animation
		transition(env, step);
		
		// Update first step
		env.steps.first = step;
		
		// Update buttons status
		updateButtonsState(env);
		
		// Update address (jQuery Address plugin)
		if ( env.params.useAddress ) {
			$.address.value('/'+ env.params.adressIdentifier +'/' + (step + 1));
		}
		
	};
	
	// Get next/prev step, useful for autoSlide
	function getRelativeStep(env, position) {
		if (position == "prev") {
			if ( (env.steps.first - env.params.dispItems) >= 0 ) {
				return env.steps.first - env.params.dispItems;
				
			} else {
				return ( (env.params.loop)? (env.steps.count - env.params.dispItems) : false );
			}
			
		} else if (position == "next") {
			
			if ( (env.steps.first + env.params.dispItems) < env.steps.count ) {
				return env.steps.first + env.params.dispItems;
				
			} else {
				return ( (env.params.loop)? 0 : false );
			}
		}
	};
	
	// Animation
	function transition(env, step) {
		
		// Effect
		switch (env.params.effect){
			
			// No effect
			case "no":
				if (env.params.direction == "vertical"){
					env.$elts.content.css("top", -(env.itemHeight * step) + "px");
				} else {
					env.$elts.content.css("left", -(env.itemWidth * step) + "px");
				}
				break;
			
			// Fade effect
			case "fade":
				if (env.params.direction == "vertical"){
					env.$elts.content.hide().css("top", -(env.itemHeight * step) + "px").fadeIn(env.params.animSpeed);
				} else {
					env.$elts.content.hide().css("left", -(env.itemWidth * step) + "px").fadeIn(env.params.animSpeed);
				}
				break;
			
			// Slide effect
			default:
				if (env.params.direction == "vertical"){
					env.$elts.content.stop().animate({
						top : -(env.itemHeight * step) + "px"
					}, env.params.animSpeed, env.params.slideEasing);
				} else {
					env.$elts.content.stop().animate({
						left : -(env.itemWidth * step) + "px"
					}, env.params.animSpeed, env.params.slideEasing);
				}
				break;
		}
		
	};
	
	// Update all buttons state : disabled or not
	function updateButtonsState(env){
		
		if (getRelativeStep(env, "prev") !== false) {
			env.$elts.prevBtn.trigger("enable");
			
		} else {
			env.$elts.prevBtn.trigger("disable");
		}
		
		if (getRelativeStep(env, "next") !== false) {
			env.$elts.nextBtn.trigger("enable");
			
		} else {
			env.$elts.nextBtn.trigger("disable");
		}
		
		if (env.params.pagination){
			env.$elts.paginationBtns.removeClass("active")
			.filter(function(){ return ($(this).data("firstStep") == env.steps.first) }).addClass("active");
		}
	};
	
	// Stop autoslide
	function stopAutoSlide(env) {
		if (!!env.autoSlideInterval){
			window.clearInterval(env.autoSlideInterval);
		}
	};
	
})(jQuery);

/* =POPIN
------------------------------------------------------------------------------*/
var popinMemorize = {
    activeLink : null
};
function popin(config) {
    var targetLink = config.target;
    var id_popin   = config.name.popin;
    var id_cache   = config.name.cache;
    var id_close   = config.name.close;
    var id_content = config.name.content;
    var marginMax  = config.style.marginMax || 50;          // popin margin
    var marginIE6  = config.style.marginIE6 || 50;          // IE 6 fix
    var opacity    = config.style.opacity;
    var maxWidth   = config.style.maxWidth;
    var maxHeight  = config.style.maxHeight;
    var pop_hash   = config.behaviours.hash || 'pop';
    var closeStr   = config.behaviours.close;
    var innerLoad  = config.behaviours.innerLoad || true;
    var anim       = config.behaviours.anim   || true;
    var resize     = config.behaviours.resize || false;     // EXPERIMENTAL / 
    var anchor     = config.behaviours.anchor || false;     // EXPERIMENTAL / handling location hash
    var closeClick = config.behaviours.closeClick || false;
    // var loadImage  = new Image();
    // if (config.behaviours.loadingImage) {
    //     loadImage.src = config.behaviours.loadingImage.src || null;
    //     loadImage.alt = config.behaviours.loadingImage.alt || null;
    //     loadImage.id  = config.name.loadimg || null;
    // }
    if (config.callback) {
        var callOnunload = config.callback.onunload || null;
        var callOnload   = config.callback.onload   || null;
        var callReload   = config.callback.onreload || null;
        var callOnBeforeLoad = config.callback.onbeforeload  || null;
    }
    
    var popin      = null;
    var popinCache = null;
    var body = jQuery('body');
    
    var url, parametres, paramets, params, iparam = null; // ugly!!!
    
    var globs = {
        callerElm : null,
        popinLoaded : 0
    };
    
    var utils = {
        getWindowDimensions : function(dimension) {
            var dimension = dimension.substr(0, 1).toUpperCase() + dimension.substr(1);
            var result = 0;
            if (typeof(w['inner'+dimension]) == "number") {
                // Standard Browsers
                var result = w['inner'+dimension];
            }
            else if (d.documentElement && d.documentElement['client'+dimension]) {
                // IE 6+ in standard mode
                var result = d.documentElement['client'+dimension];
            }
            return result;
        },
        fixDimensions : function(dimension, direction) {
            if (utils.getWindowDimensions(dimension) <  popin[dimension]()) {
                popin.css(dimension,(utils.getWindowDimensions(dimension) - marginMax) + "px");
                popin.css("margin-"+direction,"-" + Math.round((utils.getWindowDimensions(dimension) - marginMax)/2) + "px");
            }
        },
        getScrollPositions : function(axis) {
            var axis = axis.toUpperCase();
            var axis2 = (axis == 'Y') ? 'Top' : 'Left';
            var result = 0;
            if (typeof w['page'+axis+'Offset'] == "number") {
                result = w['page'+axis+'Offset'];
            }
            else if (d.body && d.body['scroll'+axis2]) {
                result = d.body['scroll'+axis2];
            }
            else if (d.documentElement && d.documentElement['scroll'+axis2]) {
                result = d.documentElement['scroll'+axis2];
            }
            return result;
        },
        setLinks : function(elm, inner) {
            // update this to a resolution check, rather than to a window size check ?
            if (!((utils.getWindowDimensions('width') < maxWidth)
            || (utils.getWindowDimensions('height') < maxHeight))) {
                if (!popin && typeof callOnBeforeLoad == 'function') {
                    callOnBeforeLoad();
                }
                var options = {
                    inner : inner
                };
                openPopin(jQuery(elm), options);
            }
        }
    };
    
    function openPopin(elm, options) {
        var focusElm = null;  // a DOM element where the focus is applied on close
        var inner    = false; // if true permits inner reloads
        if (options) {
            if (options.focusElm) {
                focusElm = options.focusElm;
            }
            if (options.inner) {
                inner = true;
            }
        }

        url = null;

        var setUrl = function(){
            if (typeof elm == 'string') {
                popinMemorize.activeLink = jQuery(focusElm) || body;
                url = elm;
            }
            else if (typeof elm == 'object') {
                if (elm[0] && elm[0].action) { // if elm is in DOM and has action
                    if (!document.getElementById(id_popin)) {
                        popinMemorize.activeLink = elm;
                    }
                    url = elm.attr('action');
                    globs.callerElm = elm;
                }
                else if (elm[0] && elm[0].href) { // if elm is in DOM and has href
                    if (!document.getElementById(id_popin)) {
                        popinMemorize.activeLink = elm;
                    }
                    url = elm.attr('href');
                    globs.callerElm = elm;
                }
                else {
                    throw('Popin : openPopin() Argument Type Error');
                    return;
                }
            }
            else {
                throw('Popin : openPopin() Argument Type Error');
                return;
            }
        }();
                
        // ugly!!!
        parametres = (url.slice(url.indexOf("?") + 1)).split("&");
        paramets   = [];
        params     = [];
        iparam     = 0;
        
        var handleWindowLocation = function() {
            // ugly!!!
            for (var i = 0, n = parametres.length; i < n; i++) {
                paramets[iparam] = parametres[i].split("=")[0];
                iparam++;
                paramets[iparam] = parametres[i].split("=")[1];
                iparam++;
            }
            for (var i = 0, n = paramets.length; i < n; i++) {
                var chaine = paramets[i];
                i++;
                params[chaine] = paramets[i];
            }
        }();
        
        var setBehaviours = function() {
            if (typeof inner != 'undefined' && inner == true) {
                var oContent = jQuery('#'+id_content);
                oContent.empty();
                // oContent.append(loadImage); // breaks focus on Jaws
                // oContent.show(); // breaks focus on Jaws
                return;
            }
            if (popin && popinCache) {
                closePopin(true);
            }
        }();
        
        var buildHTML = function() {
            if (typeof inner != 'undefined' && inner == true) {
                return;
            }
            body.append('<div id="' + id_cache + '"></div><div id="' + id_popin + '"></div>');
            popinCache = jQuery('#' + id_cache);
            popin = jQuery("#" + id_popin);
            if (typeof callOnunload == 'function') {
                popin[0].setUnload = callOnunload;
            }
        }();
        
        var setPreStyles = function() {
            if (typeof inner != 'undefined' && inner == true) {
                return;
            }
            popinCache.css("opacity", opacity);
            
            if (anim) {
                popinCache.fadeIn();
            }
            else {
                popinCache.show();
            }
            
            // IE 6 hacks
            if ((jQuery.browser.msie) && (jQuery.browser.version < 7)) {
                // hide selects
                jQuery('select').css('visibility', 'hidden');
                popin.find('select').css('visibility', 'visible');
                
                // position:fixed
                popinCache.css('height',(body.height() + marginIE6) + 'px');
                if (body.height() < utils.getWindowDimensions('height')) {
                    popinCache.css('height',utils.getWindowDimensions('height') + 'px');
                }
            }
            
        }();
        
        var loadContent = function() {
            var eUrl = encodeURI(url);
            
            if (globs.callerElm && globs.callerElm.attr('action')) {
                var sentData = '';
                var getFormData = function() {
                    jQuery(elm).find('input, select, textarea').each(function(){
                        var current = jQuery(this);
                        var val  = encodeURIComponent(current.val());
                        var name = current.attr('name');
                        sentData += name+"="+val+"&";
                    });
                }();
                jQuery.ajax({
                    type : 'POST',
                    url  : eUrl,
                    data : sentData,
                    success : setPopin
                });
            }
            else {
                var param  = (url.indexOf("?") != -1) ? '&' : '?';
                var random = 'popincache='+Math.floor(1000000000*Math.random());
                popin.load(eUrl+param+random+" #" + id_content, setPopin);
            }
        }();
    
    } // end openPopin
    
    function setPopin() {
        var responseText = arguments[0];
        var textStatus   = arguments[1];
        var XHR = arguments[2];
        var closeHTML = '<ul id="' + id_close + '"><li><a href="#">' + closeStr +'</a></li></ul>';
        
        var setDimensions = function() {
            if (globs.popinLoaded == 1) {
                popin.animate({
                    width : params["width"] + "px",
                    marginLeft : "-" + Math.round(((params["width"])/2)) + "px",
                    height : params["height"] + "px",
                    marginTop : "-" + Math.round(((params["height"])/2)) + "px"
                });
            }
            else {
                if (typeof params["width"] != 'undefined') {
                    popin.css("width",params["width"] + "px");
                    popin.css("margin-left","-" + Math.round(((params["width"])/2)) + "px");
                }
                if (typeof params["height"] != 'undefined') {
                    popin.css("height",params["height"] + "px");
                    popin.css("margin-top","-" + Math.round(((params["height"])/2)) + "px");
                }
            }
            utils.fixDimensions('width','left');
            utils.fixDimensions('height','top');
        }();
        
        var verifyBehaviours = function() {
            if (resize) {
                jQuery(window).resize(function(){
                    utils.fixDimensions('width','left');
                    utils.fixDimensions('height','top');
                });
            }
            if (anchor) {
                var position_x = utils.getScrollPositions("x");
                var position_y = utils.getScrollPositions("y");
                w.location.hash = pop_hash + "=" + url;
                window.scrollTo(position_x,position_y);
            }
            
            if ((jQuery.browser.msie) && (jQuery.browser.version < 7)) {
                if (utils.getScrollPositions("y") != 0) {
                    popin.css("top",utils.getScrollPositions("y") + (utils.getWindowDimensions("height")/2));
                }
            }
        }();
        
        var handleVisitedLinks = function() {
            if (typeof inner != 'undefined' && inner == true) {
                return;
            }
            // only works on Firefox/Gecko
            popin.append('<iframe src="' + url + '" id="popin-iframe"></iframe>');
            popin.children("#popin-iframe").css("display","none");
        }();
        
        
        var handleEvents = function() {
            if (globs.callerElm && globs.callerElm.attr('action')) {
                var content = jQuery(responseText).find('#' + id_content);
                content.clone(true).appendTo(popin);
                popin.children('#' + id_content).append(closeHTML);
            }
            else {
                jQuery('#' + id_content).append(closeHTML);
            }
            
            jQuery('#' + id_close +' a').bind('click',function(){
                closePopin();
                return false;
            });
            
            body.bind('keyup',function(e) {
                if (e.keyCode == 27 && popin) {
                    closePopin();
                    jQuery(this).unbind('keyup');
                }
            });
            
            if (closeClick) {
                popinCache.bind('click',function(){
                    closePopin();
                    return false;
                });
            }
            
            if (innerLoad) {
                jQuery(popin).find(targetLink).not('form').click(function(){
                    utils.setLinks(this, true);
                    return false;
                });
                jQuery(popin).find('form'+targetLink).submit(function() {
                    utils.setLinks(this, true);
                    return false;
                });
            }
            
            if (globs.popinLoaded > 0 && typeof callReload == "function") {
                callReload();
            }
            else if (typeof callOnload == "function") {
                callOnload();
            }

        }();
        
        var handleStatus = function() {
            if (typeof inner != 'undefined' && inner == true) {
                return;
            }
            if (textStatus != 'success') {
                popin.append('<div id="' + id_content + '">'+
                                '<p>Message : '+ textStatus + '</p>' +
                                '<p>ReadyState : '+ XHR.readyState + '</p>' +
                                '<p>Status : '+ XHR.status + '</p>' +
                             '</div>'+closeHTML);
                jQuery('#' + id_close +' a').bind('click',function(){
                    closePopin();
                    return false;
                });
            }
            popin.show();
            popin.attr("tabindex","-1");
            popin.focus();
                        
            globs.popinLoaded = 1;
        }();
        
        
    } // end setPopin
        
    function closePopin(onload, options) {
        // we need this if we use the external interface
        popinCache = popinCache || jQuery('#' + id_cache);
        popin = popin || jQuery('#' + id_popin);
        var tmpPopin = document.getElementById(id_popin);
        
        globs.popinLoaded = 0;
        
        var handleEvents = function() {
            if (!onload && typeof tmpPopin.setUnload == 'function') {
                tmpPopin.setUnload();
                tmpPopin.setUnload = null;
                delete tmpPopin;
            }
            if (anchor) {
                var position_x = utils.getScrollPositions('x');
                var position_y = utils.getScrollPositions('y');
                w.location.hash = '#';
                w.scrollTo(position_x,position_y);
            }
        }();

        var setFocusBack = function() {
            if (options) {
                if (options.focusElm) {
                    popinMemorize.activeLink = jQuery(options.focusElm);
                }
            }
        
            if (!onload && popinMemorize.activeLink) {
                popinMemorize.activeLink.attr('tabindex','-1');
                popinMemorize.activeLink.focus();
                popinMemorize.activeLink.removeAttr('tabindex');
                popinMemorize.activeLink = null;
            }
        }();

        var removePopin = function() {
            if (anim) {
                var tmpCache = popinCache;
                popinCache.fadeOut(function(){
                    tmpCache.remove();
                    delete tmpCache;
                });
            }
            else {
                popinCache.remove();
            }
            popin.remove();
        }();
        
        var resetVars = function() {
            popin = null;
            popinCache = null;
        
            url, parametres, paramets, params, iparam = null; // ugly!!!
        
            globs.callerElm = null;
        }();
        
        if (jQuery.browser.msie && jQuery.browser.version < 7) {
            jQuery('select').css('visibility','visible');
        }
    } // end closePopin
    
    var init = function() {
        if (anchor && w.location.hash
        && (w.location.hash.indexOf(pop_hash + "=") != -1)) {
            var wHash = w.location.hash;
            var options = {};
            openPopin(wHash.slice(wHash.indexOf(pop_hash + "=") + pop_hash.length + 1) ,options);
        }
        
        if (targetLink) { // if null just works on external calls
            jQuery(targetLink).not('form').click(function() {
                utils.setLinks(this, false);
                return false;
            });
            jQuery('form'+targetLink).submit(function() {
                utils.setLinks(this, false);
                return false;
            });
        }
    }();
    
    return {
        openPopin : function(url, focusElm) {
            var options = {
                focusElm : focusElm
            };
            openPopin(url, options);
            return false;
        },
        closePopin : function(focusElm) {
            var options = {
                focusElm : focusElm
            };
            closePopin(null, options);
            return false;
        }
    };
}


