/* ------------------------------------------------------------------------
	Class: topWin
	Use: Modal Windows for jQuery
	Author: Simon May (http://www.prizebyte.com)
	Version: 1.0.3
	Date: 13 April 2009
------------------------------------------------------------------------- */

(function($) {
	$.fn.topWin = function(template, settings, callback) {
		var active = false;
		var twarr = [];
		var nextwinix = 0;
		var prevwinix = 0;
		
		$(window).scroll(function(){ _resizeWin(); });
		$(window).resize(function(){ _resizeWin(); _resizeOverlay(); });

		settings = jQuery.extend({
			animSpeed: 300,
			opacity: 0.4,
			shadow: 4,
			shadowOpacity: 0.3,
			width: 500
		}, settings);

		if(typeof callback == 'undefined') callback = function(){return true;};
		$(document).keydown(function(event){
			if(active){
				switch(event.keyCode){
					case 27: 
						closeWin();
						break;
					case 33:
						_closeWin();
						_openWin(prevwinix);
						break;
					case 34:
						_closeWin();
						_openWin(nextwinix);
						break;
				}
				return false;
			}
			return true;
		});

		$(this).each(function(){
			var r = $(this).attr("rel");
			var re = /\[(.*)\]/;
			var ix = re.exec(r);

			twarr.push(ix[1]);
			var i = twarr.length - 1;
			
			$(this).bind("click", function(){
				setWin(i);
				return false;
			});
		});

		function setWin(i){
			if(!active){
				$('body').append("<div class='tw_ovly'></div>");
				$('div.tw_ovly').height($(document).height()).bind('click',function(){closeWin();})
						.css('opacity',0).fadeTo(settings.animSpeed,settings.opacity);
				_openWin(i);
			}
		};
		
		function _openWin(i){
			var x = parseInt(($(window).height() - 100) / 2);
			if(x < 0) x = 0;
			var y = parseInt(($(window).width() - 100) / 2);
			if(y < 0) y = 0;

			$('body').append("<div class='tw_aldr' style='top:" + x + "px;left:" + y +"px'></div>");
			$('body').append("<div class='tw_wrap'><div class='tw_shdw'></div><div class='tw_hdr'><a class='tw_prev'><img src='topwin/btnprev.png' alt='Previous (or press PgUp)' title='Previous (or press PgUp)' /></a><a class='tw_next'><img src='topwin/btnnext.png' alt='Next (or press PgDn)' title='Next (or press PgDn)' /></a><a class='tw_rgt'><img src='topwin/btnclose.png' alt='Close this window (or press ESC)' title='Close this window (or press ESC)' /></a></div><div class='tw_cont'></div></div>");
			$('div.tw_wrap').css("opacity",0);
			$('div.tw_hdr a.tw_rgt').bind('click',function(){closeWin();});
			nextwinix = (i + 1 >= twarr.length) ? 0 : i + 1;
			prevwinix = (i <= 0) ? twarr.length - 1 : i - 1;
			$('div.tw_hdr a.tw_next').bind('click',function(){
				_closeWin();
				_openWin(nextwinix);
			});
			$('div.tw_hdr a.tw_prev').bind('click',function(){
				_closeWin();
				_openWin(prevwinix);
			});
			$('div.tw_cont').css('width', settings.width - parseInt($('div.tw_cont').css('padding-left')) - parseInt($('div.tw_cont').css('padding-right')));
			$('div.tw_hdr').css('width', settings.width);
			$('div.tw_cont').load(template, {'twIndex': twarr[i]}, function(){
				if(!active) callback(active = true);
				_resizeWin();
				$('div.tw_wrap').css({'opacity' : "", "display" : "none"});
				$('div.tw_aldr').hide();
				$('div.tw_wrap').fadeIn(settings.animSpeed);
			});
		};
		
		function _resizeWin(){
			if(active)
			{
					var spos = _scroll();
					var hh = $(window).height();
					var x = parseInt($(window).width()/2 + spos['sLeft'] - settings.width/2);
					var y = spos['sTop'];
					var hdrh = $('div.tw_hdr').outerHeight();
					var h = $('div.tw_cont').height('auto').outerHeight() + hdrh + settings.shadow;
					if(x < 0) x = 0;
					if(h >= hh){
						h = hh;
						var ch = h - hdrh - settings.shadow - parseInt($('div.tw_cont').css('border-bottom-width'));
						ch -= (parseInt($('div.tw_cont').css('padding-top')) + parseInt($('div.tw_cont').css('padding-bottom')));
						$('div.tw_cont').height(ch);
					}else{
						y += (hh - h + settings.shadow)/2;
						if(y < 0) y = 0;
					}
					$('div.tw_shdw').css({'height': h - settings.shadow, 'width': settings.width, 'opacity': settings.shadowOpacity});
					$('div.tw_wrap').css({'top': y,'left': x,'height': h,'width': $('div.tw_cont').outerWidth() + settings.shadow});
			}
			return active;
		};
		
		function _closeWin()
		{
			$('div.tw_aldr').remove();
			$('div.tw_wrap').remove();
		}
		
		function closeWin(){
			if(active){
				callback(active = false);
				_closeWin();
				$('div.tw_ovly').fadeOut(settings.animSpeed, function(){ 
					$('div.tw_ovly').remove();
				});
			}
		};

		function _scroll(){
			sTop = window.pageYOffset || document.documentElement.scrollTop || 0;
			sLeft = window.pageXOffset || document.documentElement.scrollLeft || 0;
			return {sTop:sTop,sLeft:sLeft};
		};

		function _resizeOverlay() {
			$('div.tw_ovly').css({
				'height':$(document).height(),
				'width':$(window).width()
			});
		};

	};
})(jQuery);
