if(VVF === undefined) {
	var VVF = {};
}

(function(namespace) {
	namespace = namespace || window;
	var $ = jQuery;
	
	// Get dimensions utility
	var getDimensions = function() {
		var de = document.documentElement;
		return {
			'viewportW': window.innerWidth || (de && de.clientWidth) || document.body.clientWidth,
			'viewportH': window.innerHeight || (de && de.clientHeight) || document.body.clientHeight,
			'scrollW': window.pageXOffset || (de && de.scrollLeft) || document.body.scrollLeft,
			'scrollH': window.pageYOffset || (de && de.scrollTop) || document.body.scrollTop,
			'totalW': de.scrollWidth || window.body.scrollWidth,
			'totalH': de.scrollHeight || window.body.scrollHeight
		};
	};
	
	// Cache loader
	var cacheLoader = null;
	
	// Loader utility
	var loader = function() {
		if(!cacheLoader) {
			cacheLoader = $('<div id="loadPopin" class="hide"></div>').appendTo('#wrapper');
		}
		var dim = getDimensions();
		var left = (dim.viewportW - cacheLoader[0].offsetWidth) / 2,
			top = (dim.viewportH - cacheLoader[0].offsetHeight) / 2 + dim.scrollH;
		return cacheLoader.css({'top': top, 'left': left}).removeClass('hide');
	};
	
	// Cache already created popins
	namespace.cachePopin = {};
	var lastPopin = null;
	
	// Popin constructor
	var Popin = function(url, masking, onload) {
		Popin.superclass.constructor.call(this);
		
		this.addEvents(['open', 'close'], onload);
		this.initialize(url, masking);
	};
	namespace.extend(Popin, namespace.Observable, {
		initialize: function(url, masking) {
			var that = this;
			
			this.url =      url;
			this.masking =  masking;
			this.popin =    null;
			this.openings = 0;
			
			var h = $(document).height(), w = $(window).width();
			if(VVF.ie6PNG) {
				this.iframe = $('<iframe id="maskIframe" style="border:0; width:' + w + 'px; height:' + h + 'px;" frameborder="0"></iframe>');
			}
			
			$.get(url, function(datas) {
				var insert = datas;
				if(that.masking) {
					insert = '<div id="mask" style="left:-10000px; width:' + w + 'px; height:' + h + 'px"><div id="maskInner">' + datas + '</div></div>';
				}
				that.popin = $(insert);
				namespace.cachePopin[url] = that;
				that.fireEvent('load');
				that.open();
			});
		},
		
		open: function() {
			var that = this;
			if(lastPopin) {
				lastPopin.close();
			}
			var url = this.url,
				o = namespace.cachePopin[url],
				dim = getDimensions(),
				popin = o.popin.find('div.popin'),
				showWithImg = false;
			if (url.indexOf('idClubDevis') > -1) {
				o.popin.find('div.club').remove()
				};
			if(o.masking) {
				$(document.body).addClass('modePopin');
			}
			var imgs = o.popin.find('img'),
				imgsNb = imgs.length,
				counter = 0;
			if(imgs.length) {
			    cacheLoader = loader();
			    showWithImg = true;
			}
			imgs.each(function() {
			    
				var img = new Image();
				$(img).load(function() {
					++counter;
					if(counter == imgsNb) {show();}
				}).attr('src', this.src);
			});
			if(VVF.ie6PNG) {
				this.iframe.appendTo('#wrapper');
			}
			o.popin.appendTo('#wrapper');
			popin = popin[0] ? popin : o.popin;
			if(VVF.ie6PNG && o.popin.find('#popinClubMap').size()){
			  var left = (dim.viewportW - o.popin.find('img').attr('width')) / 2;
			} else {
				var left = (dim.viewportW - popin[0].offsetWidth) / 2;
			}
				var	top = (dim.viewportH - popin[0].offsetHeight) / 2 + dim.scrollH;
					if(popin.hasClass('tarifs')) top = (top<0)? 10:top; 
				popin.css({'top': top, 'left': left});
			
			o.popin.click(function(e) {
				if(($(e.target).hasClass('close') && e.target.parentNode.className.indexOf('calendar') == -1) || $(e.target).hasClass('closePopin')) {
					that.close();
					e.preventDefault();
				}
			});
			function show() {
				if(o.popin[0].id == 'mask') {
					o.popin.css('left', 0);
				} else {
				    popin.removeClass('hide');
				}
				if(cacheLoader) {
					cacheLoader.addClass('hide');
				}
				if(popin.hasClass('tarifs')){
					var dim = getDimensions();
					var left = (dim.viewportW - popin[0].offsetWidth) / 2;
					var	top = (dim.viewportH - popin[0].offsetHeight) / 2 + dim.scrollH;
						top = (top<0)? 10:top; 
					popin.css({'top': top, 'left': left});
				}
			}
			if(!showWithImg) {show();}
			lastPopin = this;
			this.openings++;
			this.fireEvent('open');
		},
		
		close: function() {
		    if (this.popin)
		    {
			    this.popin.remove();
			    if(VVF.ie6PNG) {
				    this.iframe.remove();
			    }
			    if(this.masking) {
				    $(document.body).removeClass('modePopin');
			    }
			    lastPopin = null;
			}
            this.fireEvent('close');
		}
	});
	
	// Manager utility (check if popins are already created)
	function manager(url, masking, onload) {
		var cp = namespace.cachePopin[url];
		if(cp && url.indexOf('cachePopin=0') == -1) {
			cp.open();
		} else {
			cp = new Popin(url, masking, onload);
		}
		
		return cp;
	}
	
	if(!namespace.Popin) {
		namespace.Popin = {
			manager: manager
		};
	}
})(VVF);
