/*
freak_slider - Fullscreen Slideshow jQuery Plugin
By Sam Dunn (www.buildinternet.com // www.onemightyroar.com)
Version: freak_slider.2.0.js // Relase Date: 5/7/09
Website: www.buildinternet.com/project/freak_slider
Thanks to Aen for preloading, fade effect, & vertical centering
*/

(function($){

	jQuery.fn.freak_slider = function(options) {
		var _freak_slider_this_id = jQuery(this).attr("id");
		var _freak_slider_current_item = 0;
		var _freak_slider_old_item = -1;
		var _freak_slider_items = new Array();
		var _freak_slider_nb_items = 0;
		var _freak_slider_scroll_type = "";
		var _freak_slider_loop = false;
		var _freak_slider_slideshow = false;
		var _freak_slider_slideshow_delay = 5000;
		var _freak_slider_slideshow_random = false;
		var _freak_slider_slideshow_stop_onclick = false;
		var _freak_slider_slideshow_stop_onmouseover = false;
		var _freak_slider_counter_id = null;
		var _freak_slider_squares_id = null;
		var _freak_slider_slideshow_continue = true;
		

		var options = jQuery.extend(jQuery.fn.freak_slider.defaults, options);
		_freak_slider_scroll_type = options.scroll_type;
		_freak_slider_loop = options.loop;
		_freak_slider_slideshow = options.slideshow;
		_freak_slider_slideshow_delay = options.slideshow_delay;
		_freak_slider_slideshow_random = options.slideshow_random;
		_freak_slider_slideshow_stop_onclick = options.slideshow_stop_onclick;
		_freak_slider_slideshow_stop_onmouseover = options.slideshow_stop_onmouseover;

		jQuery(this).css("position", "relative");
		jQuery(this).css("overflow", "hidden");

		jQuery(this).append("<a class='next'></a><a class='previous'></a><div class='counter'></div><div class='squares'></div>");

		//*Add squares* /
		jQuery(this).find("div.squares").each(function() {
			jQuery(this).attr("id", _freak_slider_this_id+"_squares");
			_freak_slider_squares_id=jQuery(this).attr("id");
		});

		i=0;
		jQuery(this).find("."+options.items_class).each(function () {
			jQuery(this).attr("id", _freak_slider_this_id+"_"+options.items_class+"_"+i);
			jQuery(this).css("display", "none");

			jQuery("#"+_freak_slider_squares_id).append("<div class='square' id='"+_freak_slider_this_id+"_square_"+i+"' item_number='"+i+"'>"+(i+1)+"</div>");

			_freak_slider_items[i] = new Array();
			_freak_slider_items[i]["id"]=jQuery(this).attr("id");
			i++;
		});
		
		_freak_slider_nb_items=i;
		

		//*Bind clicks* /
		jQuery(this).bind('click', function() {
			if (_freak_slider_slideshow_stop_onclick){
				_freak_slider_slideshow_continue = false;
			}
		});
		jQuery(this).bind('mouseover', function() {
			if (_freak_slider_slideshow_stop_onmouseover){
				_freak_slider_slideshow_continue = false;
			}
		});
		jQuery(this).find("a.next").bind('click', function() {
			_freak_slider_next();
		});
		jQuery(this).find("a.next").bind('mouseover', function() {
			jQuery(this).css("cursor", "pointer");
		});
		jQuery(this).find("a.previous").bind('click', function() {
			_freak_slider_previous();
		});
		jQuery(this).find("a.previous").bind('mouseover', function() {
			jQuery(this).css("cursor", "pointer");
		});

		jQuery(this).find("div.square").bind('click', function() {
			if (_freak_slider_slideshow_stop_onclick){
				_freak_slider_slideshow_continue = false;
			}
			vars=new Array();
			vars["item_number"]=jQuery(this).attr("item_number");
			_freak_slider_set_to(vars);
		});
		jQuery(this).find("div.square").bind('mouseover', function() {
			jQuery(this).css("cursor", "pointer");
		});

		//*Add counter* /
		jQuery(this).find("div.counter").each(function() {
			jQuery(this).attr("id", _freak_slider_this_id+"_counter");
			_freak_slider_counter_id=jQuery(this).attr("id");
		});
		
		
		if (_freak_slider_slideshow_random){
			_freak_slider_current_item = Math.floor(Math.random() * _freak_slider_nb_items);
		}

		vars=new Array();
		vars["item_number"] = _freak_slider_current_item;
		vars["direction"] = null;
		if (_freak_slider_scroll_type=="slideLeftRight") vars["direction"]="left";
		_freak_slider_show_item (vars);
		_freak_slider_refresh_counter();
		_freak_slider_refresh_squares();

		if (_freak_slider_slideshow){
			_freak_slider_auto_next();
		}

		function _freak_slider_auto_next () {
			if (_freak_slider_slideshow_continue == true){
				if (_freak_slider_slideshow_random){
					setTimeout(function() {
						_freak_slider_random_next();
						_freak_slider_auto_next();
					}, _freak_slider_slideshow_delay);
				}
				else{
					setTimeout(function() {
						_freak_slider_next();
						_freak_slider_auto_next();
					}, _freak_slider_slideshow_delay);
				}
			}
		}

		function _freak_slider_random_next () {
			if (_freak_slider_slideshow_continue == false) return;

			vars = new Array();
			vars["item_number"] = _freak_slider_current_item;
			vars["direction"]= null;
			if (_freak_slider_scroll_type=="slideLeftRight") vars["direction"] = "left";
			_freak_slider_hide_item (vars);			

			_freak_slider_old_item = _freak_slider_current_item;
			_freak_slider_current_item = Math.floor(Math.random() * _freak_slider_nb_items);
			if (_freak_slider_current_item == _freak_slider_current_item) _freak_slider_current_item ++;
			if (_freak_slider_current_item >= _freak_slider_nb_items) _freak_slider_current_item = 0;

			vars["item_number"] = _freak_slider_current_item;
			vars["direction"]= null;
			if (_freak_slider_scroll_type=="slideLeftRight") vars["direction"]="left";
			_freak_slider_show_item (vars);	
			_freak_slider_refresh_counter();
			_freak_slider_refresh_squares();

			return;
		}

		function _freak_slider_next () {
			if (_freak_slider_slideshow_continue == false) return;
			
			if (_freak_slider_loop || _freak_slider_current_item < (_freak_slider_nb_items - 1)){
				vars=new Array();
				vars["item_number"]=_freak_slider_current_item;
				vars["direction"]= null;
				if (_freak_slider_scroll_type=="slideLeftRight") vars["direction"]="left";
				_freak_slider_hide_item (vars);			
				
				_freak_slider_current_item++;
				if (_freak_slider_current_item >= _freak_slider_nb_items) _freak_slider_current_item = 0;
				
				vars["item_number"]=_freak_slider_current_item;
				vars["direction"]= null;
				if (_freak_slider_scroll_type=="slideLeftRight") vars["direction"]="left";
				_freak_slider_show_item (vars);	
				_freak_slider_refresh_counter();
				_freak_slider_refresh_squares();
			}
			return;
		}

		function _freak_slider_previous () {
			if (_freak_slider_slideshow_continue == false) return;
			
			if (_freak_slider_loop || _freak_slider_current_item>0){
				vars=new Array();
				vars["item_number"] = _freak_slider_current_item;
				vars["direction"]= null;
				if (_freak_slider_scroll_type=="slideLeftRight") vars["direction"]="right";
				_freak_slider_hide_item (vars);			
				
				_freak_slider_current_item--;
				if (_freak_slider_current_item < 0) _freak_slider_current_item = _freak_slider_nb_items - 1;
				
				vars["item_number"]=_freak_slider_current_item;
				vars["direction"]= null;
				if (_freak_slider_scroll_type=="slideLeftRight") vars["direction"]="right";
				_freak_slider_show_item (vars);	
				_freak_slider_refresh_counter();
				_freak_slider_refresh_squares();
			}
			return;
		}

		function _freak_slider_set_to (vars) {
			var item_number=null;
			item_number=vars['item_number'];
			//alert(item_number);
			if (_freak_slider_current_item>item_number){
				vars['direction']="right";
				vars['item_number']=_freak_slider_current_item;
				_freak_slider_hide_item (vars);
				vars['item_number']=item_number;
				_freak_slider_show_item (vars);
				_freak_slider_current_item = item_number;
			}
			else if(_freak_slider_current_item < item_number){
				vars['direction']="left";
				vars['item_number'] = _freak_slider_current_item;
				_freak_slider_hide_item (vars);
				vars['item_number']=item_number;
				_freak_slider_show_item (vars);
				_freak_slider_current_item = item_number;
			}
			_freak_slider_refresh_counter();
			_freak_slider_refresh_squares();
			return;
		}

		function _freak_slider_show_item (vars) {
			item_number=vars['item_number'];
			direction=vars['direction'];
			//alert("_freak_slider_show_item :: " + _freak_slider_slideshow_random + "  " + item_number + " : " + _freak_slider_items.length);
			item_id=_freak_slider_items[item_number]["id"];

			jQuery("#"+item_id).each(function () {
				if (_freak_slider_scroll_type=="slideLeftRight"){
					if (direction=="left"){
						marginLeft=jQuery("#"+_freak_slider_this_id).outerWidth();
						jQuery(this).css("marginLeft", marginLeft);
					}
					else{
						marginLeft=0-jQuery("#"+_freak_slider_this_id).outerWidth();
						jQuery(this).css("marginLeft", marginLeft);
					}
					jQuery(this).show();
					jQuery(this).animate({
						marginLeft: 0
				    });
				}
				else if (_freak_slider_scroll_type=="fade"){
					jQuery(this).fadeIn("slow");
				}
				else{
					jQuery(this).show("slow");
				}
			});
			return;
		}

		function _freak_slider_hide_item (vars) {
			item_number = vars['item_number'];
			direction = vars['direction'];
			//alert("_freak_slider_hide_item :: " + _freak_slider_slideshow_random + "  " + vars['item_number'] + " : " + _freak_slider_items.length);
			item_id = _freak_slider_items[item_number]["id"];
			//alert(item_id);
			//alert(direction);
			jQuery("#"+item_id).each(function () {
				if (_freak_slider_scroll_type=="slideLeftRight"){
					if (direction=="left"){
						marginLeft=0-jQuery("#"+_freak_slider_this_id).outerWidth();
					}
					else{
						marginLeft=jQuery("#"+_freak_slider_this_id).outerWidth();
					}
					jQuery(this).animate({
						marginLeft: marginLeft
					},
					{
						complete: function() {
							jQuery(this).hide();
						}
				    });					
				}
				else if (_freak_slider_scroll_type=="fade"){
					jQuery(this).hide();
				}
				else{
					jQuery(this).hide("slow");
				}
			});
			return;
		}

		function _freak_slider_refresh_counter () {
			//alert(_freak_slider_counter_id);
			var cpt=0;
			cpt = parseInt(_freak_slider_current_item) + 1;
			jQuery("#"+_freak_slider_counter_id).html(cpt+"/"+_freak_slider_nb_items);
			return;
		}

		function _freak_slider_refresh_squares () {
			i=0;
			jQuery("#"+_freak_slider_this_id).find("div.square").each(function() {
				if (i == _freak_slider_current_item){
					jQuery(this).addClass("square_selected");
				}
				else{
					jQuery(this).removeClass("square_selected");
				}
				i++;
			});
			return;
		}
	};	
	//alert($.fn.freak_slider);
	//alert("freak_slider loaded ...");

	jQuery.fn.freak_slider.defaults = { 
			loop: false,
			scroll_type: "slideLeftRight",
			items_class: "freak_slider_item",
			slideshow: false,
			slideshow_delay: 5000,
			slideshow_random: false,
			slideshow_stop_onclick: false,
			slideshow_stop_onmouseover: false
	};

})(jQuery);
