(function($) {
		   
	function Overlay() {                 	
				
		var ref = this;
		
		var _overlay;
		var _overlayDataReset = {
			type: false,
			src: false,
			w: false,
			h: false,
			title: false,
			descriptionElements: null,
			overlayH: false,
			overlayW: false
		};
		var _overlayData = _overlayDataReset;

		var SWF = {
			container: 'swfContainer',
			embed: {
				src: null,
				width: "",
				height: "",
				version: "9"
			},
			params: {
				wmode: "opaque"
			}
		}
		
		var config = {
			SELECTORS: {
				OVERLAYPROMPT: 'a.prompt-overlay',
				OVERLAYCLOSECLASS: '.close',
				OVERLAYCLOSEID: '#close',
				OVERLAYCONTENT: '#overlay-content'
			},
			IDS: {
				OVERLAYID: 'overlay',
				OVERLAYCONTENT: 'overlay-content'
			}
		}

		var ie6 = (navigator.appName == "Microsoft Internet Explorer" && parseInt(navigator.appVersion) == 4 && navigator.appVersion.indexOf("MSIE 6.0") != -1);
		
		function init() {
			createOverlay();
			setUp();
			attachListeners();
		}
		
		function setUp() {
			if (jQuery.browser.msie && ie6) {
				fixPng($(config.SELECTORS.OVERLAYCLOSECLASS));
			}
			if($.browser.msie) {
				$(_overlay).each(function() { PIE.attach(this); });
			}
		}
		
		function attachListeners() {
			$(config.SELECTORS.OVERLAYPROMPT).click(handleOverlay);
		}
		
		function handleOverlay(e) {
			e.preventDefault();
			getOverlayDataFromElement( $(this) );
			populateOverlay( $(this) );
			$(_overlay).overlay().load();
		}
		
		function createOverlay() {
			
			_overlay = $( document.createElement('div') ).attr('id',config.IDS.OVERLAYID);
			var closeBtn = $( document.createElement('a') ).attr('href',config.SELECTORS.OVERLAYCLOSEID).html('Close overlay').addClass('close');
			_overlay.append(closeBtn);
			var overlayBody = $( document.createElement('div') ).attr('id',config.IDS.OVERLAYCONTENT);
			_overlay.append(overlayBody);
			$('body').append(_overlay);
			
			$(_overlay).overlay({
				close: '.close',							 
				fixed: false,
				mask: {
					color: '#000000',
					loadSpeed: 200,
					opacity: 0.5,
					closeOnClick: false
				},
				onBeforeLoad: function() {
					this.getOverlay().find(config.SELECTORS.OVERLAYCLOSECLASS).click(function(e) { e.preventDefault(); });
				},
				onLoad: function() {	
					this.getOverlay().find(config.SELECTORS.OVERLAYCLOSECLASS).focus();
					$(document).trigger('OVERLAY_LOADED');	
				},
				onClose: function() {
					this.getOverlay().removeAttr('tabIndex');
					this.getTrigger().focus();
					$(document).trigger('OVERLAY_CLOSED');
					emptyOverlay();
				}
			});
		}
		
		function populateOverlay(el) {
			
			
			switch (_overlayData.type) {
			case 'swf':
				_overlayData.src = el.attr("href");
				_overlay.css({'width':_overlayData.w+'px'});
				$(config.SELECTORS.OVERLAYCONTENT,_overlay).css({'width':_overlayData.w+'px','height':_overlayData.h+'px'});
				var swfContainer = $( document.createElement('div') ).attr('id',SWF.container);
				$(config.SELECTORS.OVERLAYCONTENT,_overlay).append(swfContainer);
				embedFlash();
				break;
			case 'html':
				_overlay.css({'width':_overlayData.w+'px'});
				$(config.SELECTORS.OVERLAYCONTENT,_overlay)
					.css({'width':_overlayData.w+'px','height':'auto'})
					.html( $('#' + el.attr("href").replace(/.*#([a-z0-9\-\_]+).*/i, '$1')).html() );
				break;
			case 'youtube-with-title':
				$(config.SELECTORS.OVERLAYCONTENT,_overlay).append('<h2>' + _overlayData.title + '</h2>').append(_overlayData.descriptionElements);
				_overlayData.overlayH = false;
			default: // case 'youtube':
				var youtubeQs = el.attr("href").split('?');
				if(youtubeQs.length > 1) {
					var youtubeQsObj = queryStringToArray(youtubeQs[1]);
					_overlayData.src = youtubeQsObj['v'];
				} else {
					_overlayData.src = el.attr("href").replace('http://youtu.be/','');
				}
				_overlay.css({'width':_overlayData.w+'px'});
				$(config.SELECTORS.OVERLAYCONTENT,_overlay).css({'width': _overlayData.overlayW ? _overlayData.overlayW + 'px' : 'auto','height': _overlayData.overlayH ? _overlayData.overlayH + 'px' : 'auto'});
				var overlayContent = '<iframe width="'+ _overlayData.w +'" height="'+ _overlayData.h +'" src="http://www.youtube.com/embed/'+ _overlayData.src +'" frameborder="0" allowfullscreen></iframe>';
				$(config.SELECTORS.OVERLAYCONTENT,_overlay).append(overlayContent);
				break;
			}
		}
		
		function emptyOverlay() {
			switch (_overlayData.type) {
			case 'swf':
				$('#'+SWF.container).flash().remove();
				break;
			}
			
			$(config.SELECTORS.OVERLAYCONTENT,_overlay).empty();
			_overlayType = null;
			_overlayData = _overlayDataReset;
		}
		
		function embedFlash() {
			
			var flashMovie = $.flash.create(
				{
					swf: _overlayData.src,
					width: _overlayData.w,
					height: _overlayData.h,
					hasVersion: SWF.embed.version,
					wmode: SWF.params.wmode
				}
			);
			
			$('#'+SWF.container).html(flashMovie);
	
		}
		
		function fixPng(el,sizing) {
			if(!sizing) { var sizing = 'crop'; }
			var bgImg = $(el).css('background-image');
			var imgUrl = bgImg.split('url("')[1].split('")')[0];
			$(el).css('background-image', 'none');
			$(el).get(0).runtimeStyle.filter = "progid:DXImageTransform.Microsoft.AlphaImageLoader(src='" + imgUrl + "',sizingMethod='"+sizing+"')";
		}
		function getOverlayDataFromElement(el) {
			_overlayData = queryStringToArray( el.attr('rel') );
			if (_overlayData.hasOwnProperty('h')) {
				_overlayData.overlayH = _overlayData.h;
			}
			if (_overlayData.hasOwnProperty('w')) {
				_overlayData.overlayW = _overlayData.w;
			}
			switch (_overlayData.type) {
			case 'youtube-with-title':
				_overlayData.title = el.parent().find('.overlay-title').text();
				_overlayData.descriptionElements = el.parent().find('.overlay-description').clone(true);
				break;
			}
		}
		
		function queryStringToArray(str) {
			var querystring = str.replace( '?', '' ).split( '&' );
			var queryObj = {};
			for ( var i=0; i<querystring.length; i++ ) {
				  var name = querystring[i].split('=')[0];
				  var value = querystring[i].split('=')[1];
				  queryObj[name] = value;
			}
			return queryObj;
		}
		
		
		init();
		
    	
    }
	
	
    $(document).ready(function(){ UHG.ui.Overlay = new Overlay(); });
    
    		
})(jQuery);
