/*
bam.overlay version 2.0
Requires jQuery for DOM operations.

Aleksandar Kolundzija
*/

({
	overlay: (function(){
													
		var _$overlay    = null;
		var _initialized = false;
		var _displayed   = false;
		var _scrollTop   = 0; // used by IE6
		
		var _isMacXFF2 = function() {
			var userAgent = navigator.userAgent.toLowerCase();
			if (/firefox[\/\s](\d+\.\d+)/.test(userAgent)) {
				var ffversion = new Number(RegExp.$1);
				if (ffversion < 3 && userAgent.indexOf("mac") != -1){ return true; }
			}
			return false;
		};
		
		/* private jQuery object for controlling custom events */
		var _$event = $({supportedEvents:["beforeInit","afterInit","beforeShow","afterShow","beforeHide","afterHide"]});
				
		var _self = {
			
			bind: function(eventName, dataOrFn, fnOrUndefined){ 
				_$event.bind(eventName, dataOrFn, fnOrUndefined);
			},
			
			unbind: function(eventName, fn){
				_$event.unbind(eventName, fn);
			},
						
			
			init: function(customProps){
				_$event.trigger("beforeInit");
				if (!_initialized){					
					var props = { // default props
						css     : "/shared/css/bam/bam.overlay.css",
						cssObj  : {opacity:0.7}
					};
					$.extend(props, customProps);
					bam.loadCSS(props.css);
					if (_isMacXFF2()){ props.cssObj.opacity = 1; } // FF2 doesn't like the transparent overlay
					_$overlay = $("<div id='overlay'></div>").appendTo("body").css(props.cssObj).fadeTo("fast",props.cssObj.opacity);
					_initialized = true;
					_$event.trigger("afterInit");
				}
			},
	
			show: function(customProps){
				_$event.trigger("beforeShow");				
				var props = {
					callback  : function(){},
					fadeSpeed : "normal"
				};
				// for backwards support
				switch (typeof(customProps)){
					case "object" : $.extend(props, customProps); break;
					case "number" : props.opacity = customProps; break;
					case "string" : props.opacity = customProps; break;
					default       : break;
				}
				
				var _callback = props.callback;
				props.callback = function(){
					_callback();
					_$event.trigger("afterShow");
				};
				
				if (_isMacXFF2()){ props.opacity = 1; } // FF2 doesn't like the transparent overlay
				if (props.opacity){
					_$overlay.fadeTo("fast",props.opacity, function(){
						_$overlay.fadeIn(props.fadeSpeed, props.callback);																													
					});
				}
				else {
					_$overlay.fadeIn(props.fadeSpeed, props.callback);
				}
				if ($.browser.msie && $.browser.version < 7){ // IE6 support
					$("select").css("visibility","hidden");
					_scrollTop = document.documentElement.scrollTop;
					window.scrollTo(0,0);
					$("body","html").css({height:"100%",width:"100%"});
					$("html").css({overflow:"hidden"});
				}
				_displayed = true;
				return this;
			},
			
			hide: function(customProps){
				_$event.trigger("beforeHide");				
				var props = {
					opacity   : 0,
					callback  : function(){},
					fadeSpeed : "normal"
				};
				$.extend(props, customProps);
				_$overlay.fadeOut(props.fadeSpeed, function(){
					if ($.browser.msie && $.browser.version < 7){ // IE6 support
						$("select").css("visibility","visible");				
						$("body","html").css({height:"auto",width:"auto"});
						$("html").css({overflow:""});
						window.scrollTo(0,_scrollTop);
					}
					_displayed = false;
					_$event.trigger("afterHide");
					props.callback();
				});
				return this;
			},
			
			isDisplayed: function(){
				return _displayed;
			},
					
			setClass: function(className){
				_$overlay.attr({"class":className});
				return this;
			},
			
			setCSS: function(props){
				_$overlay.css(props);
			}
		
		};
		
		return _self;	
	
	})()
	
})
