/**
 * @lightweightbox - simple lightbox style 'window'; currently adapted to use an iframe.
 */
jQuery.fn.lightweightbox = function(o){ //attach a call to lwb.trigger to all elements in collection
	lwb.init();
	// this function should be extended to parse out any get string params, save in $(this).data, and then insert in event sent to lwb.trigger 
	return this.each(function(){
	    var options = {
	            video:      false,
	            vote:       false,
	            gallery:    false,
	            image:      false,
				setScroll:	false
	        };
	        
	    o == null ? jQuery.extend(options, {video:true}) : jQuery.extend(options, o);
	        
		jQuery(this).bind('click', {uri : this.href, options : options}, lwb.trigger);
		
	});
};

// lightweightbox utilities
var lwb = {
	$lwb_overlay : jQuery('<div id="lwb-overlay"></div>'),
	$lwb : jQuery('<div id="lwb"></div>'),
	$lwb_content : jQuery('<div id="lwb-content"></div>'),
	$lwb_loader : jQuery('<div id="lwb-loader"><img src="/_resources/img/content/loader.gif" />'),
	$lwb_iframe : jQuery('<iframe id="lwb-iframe" frameBorder="0" scrolling="no" allowtransparency="true"></iframe>'),
	
	init : function(){
		if( !lwb.$lwb.find('.lwb-close').length ) {

			var closeControl = jQuery('<div class="lwb-close"><span class="lwb-close-control">close</span></div>'); 

			closeControl.find('.lwb-close-control').bind('click', lwb.close);
			
			lwb.$lwb.append(closeControl).append(lwb.$lwb_content);
		}
	},
	// core function to tie event to.  curently just calls loadIframe function.
	trigger : function(event){ 
		lwb.$lwb_iframe.bind('load', {type : 'iframe'}, lwb.open);
		lwb.$lwb_content.append(lwb.$lwb_iframe);
		
		if(!jQuery('#lwb').length) { jQuery('body').append(lwb.$lwb_overlay).append(lwb.$lwb_loader).append(lwb.$lwb); }
		
		// using jQuery.show() causes filter to be set inline in IE, overriding any setting in CSS (results in opaque overlay)
		lwb.$lwb_overlay.css({'display' : 'block', 'height' : jQuery(document).height() + 'px'});
		lwb_utility.setPosition(lwb.$lwb_loader, true);
		lwb.$lwb_loader.fadeIn(100);
		
		lwb.setScroll = event.data.options.setScroll;
	
		lwb.loadIframe(event);
		return false;
	},
	loadIframe : function(event){
	    var source = event.data.uri,
	        domain = source.match(/http:\/\/[^\/]+/)[0],
		    path = source.substr(domain.length).replace('.aspx', ''),
			query = '&' + source.substr(source.indexOf('?')+1),
		    application = '';
	    if (event.data.options.video) { 
	        var addClass = (event.data.options.addClass) ? 'class='+event.data.options.addClass+'&' : '';
		    application = '/Layouts/Data/LightboxVideoContent.aspx?'+addClass+'vote='+event.data.options.vote+'&id=/sitecore/content/home';
		}
		if (event.data.options.gallery) {
		    application = '/Layouts/Data/BlackGalleryLightboxContent.ashx?path=/sitecore/content/home';
		}
	    source = domain + application + path + query;
		lwb.$lwb_iframe.attr('src', source);
	},
	removeIframe : function() {
		lwb.$lwb_content.empty();
	},
	open : function(event) {
		lwb.$lwb_loader.fadeOut(100, function(){
		    lwb_utility.setPosition(lwb.$lwb);
		    lwb.$lwb.fadeIn(250, function(){ lwb.$lwb_overlay.bind('click', lwb.close)});
		});
	},
	close : function(event){ 
		lwb.$lwb.fadeOut(250, function(){ lwb.$lwb_overlay.hide().unbind('click', lwb.close); });
		lwb.removeIframe();
	}
};

var lwb_utility = {
	loadError : function() { }, // future improvement: work out error handling
	parsOptions : function() { }, // build a function to parse out a get string for recognized options. Accepts a url and returns false or an object with options and a cleaned up url.
	setPosition : function($el, scroll){
		scroll = scroll || lwb.setScroll;
		var $w = jQuery(window);
		var top = (($w.height() - $el.outerHeight())/2),
			left = (($w.width() - $el.outerWidth())/2 + $w.scrollLeft());
		
		top = (top < 20) ? '20px' : (scroll) ? top + $w.scrollTop() + 'px' : top + 'px';
		left = (left < 0) ? '0' : left + 'px';
		$el.css({'top' : top, 'left' : left});
	}
};

