(function($) {
  var cache = [];
  // Arguments are image paths relative to the current page.
  $.preLoadImages = function() {
    var args_len = arguments.length;


    for (var i = args_len; i--;) {
      var cacheImage = document.createElement('img');
      cacheImage.src = arguments[i];
      cache.push(cacheImage);


    }
  }
})(jQuery)



function Gallery (slug, target) {
	
	this.slug = slug;
	this.target = target;
	
	
	this.prevBtn = $("#prev_"+slug);
	this.nextBtn = $("#next_"+slug);
	this.counter = $("#counter_"+slug);

	this.loadingImage = false;
	
	
	this.imgNumber = 0;
	this.crtImage = 1;	
	this.imagesUrl = [];
	
	// public functions
	this.next = Gallery_next;
	this.prev = Gallery_prev;
	this.goto = Gallery_goto;
	this.addImage = Gallery_addImage;
	this.initButtons = Gallery_initButtons;

	// private functions
	
	this._preloadSiblings = Gallery_preloadSiblings;
	this._changeImage = G_changeImage;
	
	
	// INITIALIZE Gallery
	this.initButtons ();
	this._preloadSiblings ();
	
}


function Gallery_preloadSiblings () {
	var crt = this.crtImage;
	
	var nxt = 0;
	var prv = 0;
	if (crt == 1) 
		prv = this.imgNumber;
	else prv = crt-1;
	
	if (crt == this.imgNumber)
		nxt = 1;
	else nxt = crt +1;
	
	jQuery.preLoadImages(this.imagesUrl [prv-1], this.imagesUrl [nxt-1]);
	// var imagePrv = document.createElement ('img');
	// imagePrv.src = this.imagesUrl [prv];
	// var imageNxt = document.createElement ('img');
	// imageNxt.src = this.imagesUrl [nxt];

	
	
	
}






function G_changeImage (src) {
	// Get image instance.
    //var image = new Image();
	
	this.target.stop ();

	this.loadingImage = false;

	var tgt = this.target;
	var imgs = this.imagesUrl;
	var crt = this.crtImage;
	
	this.target.animate({
		opacity: 0
		}, 200, "linear", function () {
			tgt.attr("src", imgs [crt-1]);
			tgt.animate ({opacity:1}, 800);
		});
		
	this._preloadSiblings ();

}

function Gallery_next () {
	if (!this.loadingImage) {
		//// //console.log ('next '+this.slug);
	
		var crt = this.crtImage;
		var num = this.imgNumber;
	
		this.loadingImage = true;

	
		// 0. find next image url
		if ((crt +1) > num)
			crt = 1;
		else 
			crt ++;

		var crtIndex = crt - 1;

	
		this.crtImage = crt; 
		this.counter.html ("Images ("+crt+"/"+num+")");
		
		this._changeImage ();	
	}
	return false;

}

function Gallery_prev () {
	if (!this.loadingImage) {
		this.loadingImage = true;
		
		var crt = this.crtImage;
		var num = this.imgNumber;
	
		if ((crt -1) < 1)
			crt = num;
		else 
			crt --;

		var crtIndex = crt - 1;
	
		this.crtImage = crt; 
		this.counter.html ("Images ("+crt+"/"+num+")");
		
		this._changeImage ();
	}
	return false;
}

function Gallery_goto (imgNum) {
//	// //console.log ('goto '+this.slug+" -> "+imgNum);
}


function Gallery_initButtons () {
	// //console.log ('init buttons : '+s );
	
	// save a reference to this because in the click function, 
	// this refers to the DOM
	// don't forget 'var' !!! 
	// else the variable is not correctyl set in memory and will be global
	var this_gallery = this;	
	
	this.prevBtn.click (function () {
		this_gallery.prev ();
		return false;
	})
	
	this.nextBtn.click (function () {
		this_gallery.next ();
		return false;
	})
	
	this.target.css ({cursor:"pointer"});
	this.target.click (function () {
		this_gallery.next ();
		return false;
	})
	
}



function Gallery_addImage (imgUrl) {
//	// //console.log ("addImg : "+imgUrl);
	this.imagesUrl.push (imgUrl);
	this.imgNumber ++;
	this.counter.html ("Images ("+this.crtImage +"/"+this.imgNumber+")");
	
	this._preloadSiblings ();

}



jQuery.preloadImages = function()
{
  for(var i = 0; i<arguments.length; i++)
  {
    jQuery("<img>").attr("src", arguments[i]);

  }
return false;
}


