// (c) 2010 Mickael Riga
// Screenology.js version 0.0.1

var screenology_wrapper = '';

;(function($) {
	
	$.fn.center_on_screen = function() {
		return this.each(function() {
			var $$ = $(this);
			var val_left = !$.browser.msie && window.pageYOffset ? Math.round(($(window).width() - $$.width()) / 2 + window.pageXOffset) : Math.round(($(window).width() - $$.width()) / 2);
			var val_top = !$.browser.msie && window.pageYOffset ? Math.round(($(window).height() - $$.height()) / 2 + window.pageYOffset) : Math.round(($(window).height() - $$.height()) / 2);
			$$.css({
				'left' : val_left + 'px',  // page offsets are for iPad
				'top' : val_top + 'px'
			});
		});
	}
	
	$.fn.adapt_to_screen = function() {
		if ($.browser.msie) {
			$('body').css('overflow', 'hidden');
		} else {
			if (!$('body').data().framed) $.screenorama.frame_body();
		}
		
		return this.each(function() {
			var $$ = $(this);
			var w = $$.width();
			var h = $$.height();
			var ratio_w = ($(window).width()/w*100);
			var ratio_h = ($(window).height()/h*100);
			var ratio_to_use = Math.max(ratio_h,ratio_w);
			//
			$$.css({
				'width' : (w/100*ratio_to_use + "px"),
				'height' : (h/100*ratio_to_use + "px")
			}).center_on_screen();
		});
	}
	
	$.preload_them = function(list) {
		for(var i=0; i<list.length; i++) {
			var img_obj = new Image();
    	img_obj.src=list[i];
    }
	}
	
	$.screenorama = function(list) {
		if (!list) return false;
		$.preload_them(list);
		$('body').prepend("<div id='screenology_wrapper'></div>");
		screenology_wrapper = $('#screenology_wrapper').css('zIndex', '0');
		screenology_wrapper.data().pics = list;
		screenology_wrapper.data().direction = 0;
		
		$(window).resize(function() {
			screenology_wrapper.find('img').adapt_to_screen();
		});
	}
	
	$.screenorama.frame_body = function() {
		var $body = $('body, html');
		var $window = $(window);
		$body
		.css('overflow', 'hidden')
		//.width($window.width())
		//.height($window.height())
		.data().framed = true;
	}
	
	$.screen_transition = {
		regular: function(img,callback) {
			img.adapt_to_screen().show();
			callback();
		},
		fade: function(img,callback) {
			img.adapt_to_screen().stop(true,true).fadeIn('slow', callback);
		},
		slide_h: function(img,callback) {
			$('body').width($(window).width()*4); //dirty hack for iPad
			var $$ = screenology_wrapper;
			var window_w = $(window).width();
			img.adapt_to_screen().show();
			var target_x = img.position().left;
			if ($$.data().current==undefined || $$.data().direction==1 || ($$.data().direction==0 && $$.data().current <= $$.data().next)) {
				img.css({left: window_w + 'px'});
				$('#screenology_wrapper img').stop(true,true).animate({left: '-=' + (img.position().left - target_x) + 'px'}, 1000, callback);
			} else {
				img.css({left: - img.width() + 'px'});
				$('#screenology_wrapper img').stop(true,true).animate({left: '+=' + (target_x - img.position().left) + 'px'}, 1000, callback);
			}
		},
		slide_over_h: function(img,callback) {
			$('body').width($(window).width()*4); //dirty hack for iPad
			var $$ = screenology_wrapper;
			var window_w = $(window).width();
			img.adapt_to_screen().show();
			var target_x = img.position().left;
			if ($$.data().current==undefined || $$.data().direction==1 || ($$.data().direction==0 && $$.data().current <= $$.data().next)) {
				img.css({left: window_w + 'px'});
				img.stop(true,true).animate({left: target_x + 'px'}, 1000, callback);
			} else {
				img.css({left: - img.width() + 'px'});
				img.stop(true,true).animate({left: target_x + 'px'}, 1000, callback);
			}
		}
	}
	
	
	$.screenorama.goto = function(index, transition_tag, onloaded, callback) {
		
		var $$ = screenology_wrapper;
		$$.data().next = index;
		
		function go_when_loaded() {
			var img = $("#screenology_wrapper img:last");
			if (img.get(0).complete) {
				if (onloaded) onloaded();
				if (transition_tag==undefined) {
					var transition = $.screen_transition.fade;
				} else if (typeof transition_tag=='string') {
					var transition = eval('$.screen_transition.'+transition_tag);
				} else {
					var transition = transition_tag;
				}
				
				transition(img, function() {
					$$.data().current = index;
					$$.data().direction = 0;
					img.prev().remove();
					if (callback) callback();
				});
				
			} else {
				setTimeout(function() {
					go_when_loaded();
				}, 250);
			}
		}
		
		var img = $("<img />").hide().attr('src', $$.data().pics[index]).css({position:'absolute', zIndex: '0'});
		$$.append(img);
		go_when_loaded();
	}
	
	$.screenorama.one_step = function(direction, transition_tag, onloaded, callback) {
		var $$ = screenology_wrapper;
		$$.data().direction = direction;
		var max = $$.data().pics.length;
		if ($$.data().current!=undefined) {
			var next = ($$.data().current + direction + max) % max;
			$.screenorama.goto(next, transition_tag, onloaded, callback);
		} else if (direction==-1) {
			$.screenorama.goto(max-1, transition_tag, onloaded, callback);
		} else {
			$.screenorama.goto(0, transition_tag, onloaded, callback);
		}
	}
	
	$.screenorama.next = function(transition_tag, onloaded, callback) {
		$.screenorama.one_step(1, transition_tag, onloaded, callback);
	}
	
	$.screenorama.previous = function(transition_tag, onloaded, callback) {
		$.screenorama.one_step(-1, transition_tag, onloaded, callback);
	}
	
})(jQuery);
