/*
function startSlider() {
	var opts = { 
		speed: 2000 // animation speed, milliseconds, ms to slide to next image
		,pause: 3000 // duration of each slide, milliseconds
		,pauseCB: onpause
	};
	new Sonata.Slider("slider2",opts);
	
	function onpause(slider,fPaused) {
		var pid = $("#sliderPauseId");
		if(fPaused) pid.css("visibility","visible");
		else pid.css("visibility","hidden");
	}
}
$(document).ready(function(){
	//don't start the slide show until the first image is downloaded
	var o = new Image();
	o.onload = imgLoaded;
	o.src = "newimages/ranch photo_21_sm.jpg";
	
	function imgLoaded() {
		startSlider();
	}
});	




*/


Sonata.Slider = function(sliderId,options) {
	var thisptr = this;
	this.sliderId = sliderId;
	this.sliderElem =$("#"+sliderId);
	//mprint("sliderElem="+this.sliderElem.size());
	this.sliderElem.attr("align","left");	//so the options.align and options.valign work
	this.sliderIndex = 0;
	this.jqUl = $("ul",this.sliderElem);
	this.jqUl.css("visibility","hidden");
	// default configuration properties
	var defaults = {			
		speed: 			800,
		pause:			2000,
		pausemouseover: true,
		slideafterpause: true,
		fill: true,
		align: "center",
		valign: "top",
		slidein: true,
		pauseCB: null	//pauseCB(sliderObj,fPause) where fPause==true when the slideshow is paused
	}; 
		
	this.options = $.extend(defaults, options);  
	this.fMousePaused = false;	//paused in mouse over
	this.pauseTimer = null;
	this.slideTimer = null;
	this.inPause = false;
	this.inSlide = false;
	this.pauseStartTime = 0;
	this.pauseTime = 0;
	this.dx = 10;
	this.slideDelay = 100;
	this.curPosX = 0;
	this.init();
	this.fSlidein = false;
	if(this.slideCount>1) {
		if(this.options.slidein) {
			//Sonata.Timer.setTimer(waitfor,100);
			startSlidein();
		}
		else {
			this.sliderElem.show();
			this.jqUl.show();
			this.jqUl.css("visibility","visible");
			this.beginPause(options.pause);
		}
	}
	else {
		this.sliderElem.show();
		this.jqUl.show();
		thisptr.slideIndex = 0;
		if(thisptr.options.fill)
			thisptr.$fillArea(0);
		thisptr.$valign(0);
		this.jqUl.css("visibility","visible");
	}
	

	function startSlidein() {			//mprint("slidein w="+this.sliderElem.width());
		thisptr.curPosX = thisptr.sliderElem.width();
		thisptr.jqUl.css("left",thisptr.curPosX);
		//make sure the element is  displayed
		thisptr.sliderElem.show();
		thisptr.jqUl.show();
		//now fill and align the first element
		thisptr.slideIndex = 0;
		if(thisptr.options.fill)
			thisptr.$fillArea(0);
		thisptr.$valign(0);
		thisptr.jqUl.css("visibility","visible");
		thisptr.fSlidein = true;
		thisptr.continueSlide();
	}
	
}
Sonata.Slider.prototype.init = function() {
	var obj = this.sliderElem;
	//mprint("height="+this.sliderElem.height());
	obj.css("overflow","hidden");
	obj.attr("align","left");	//so the options.align and options.valign work
	//obj.show();
	var thisptr = this;
	var lis = $("ul > li",obj);
	if(lis.size()==1) {
		this.slideCount = 1;
		return 1;
	}
	
	//dup the first li and add it to the end
	var fnode = lis[0].cloneNode(true);
	this.jqUl.append($(fnode));
	
	lis = $("ul > li",obj);

	this.slideCount = s = lis.length;
	this.slideWidth = w = obj.width();//lis.width(); 
	this.slideHeight = h = obj.height();//lis.height(); 
	//obj.width(w); 
	//obj.height(h); 
	//obj.css("position","relative");
	this.slideCountm1 = ts = s-1;
	this.sliderIndex = t = 0;
	this.jqUl.css('width',s*w);			
	this.jqUl.css('position',"relative");
	this.jqUl.css("overflow","hidden");
	lis.css('float','left');
	lis.css("list-style","none");
	this.jqLis = lis;
	this.bFillComplete = false;
	this.$mkListDiv(lis);
	
	//if(this.options.fill)
	//	this.$fillArea(0);
	//this.$valign(0);
	
	this.dx = calcDx();
	if(this.options.pausemouseover) {
		obj.hover(mover,mout);
	}
	return this.slideCount;
	
	function calcDx() {
		var speed = thisptr.options.speed;
		var dx = w/(speed/thisptr.slideDelay);
		//mprint("dx="+dx+" speed="+speed+" w="+w+" delay="+thisptr.slideDelay);
		return dx;
	}
	function mover() {
		thisptr.mouseover();
	}
	function mout() {
		thisptr.mouseout();
	}
}
Sonata.Slider.prototype.mouseover = function() {
	this.fMousePaused = true;
	if(this.inPause) {
		clearTimeout(this.pauseTimer);
		this.pauseTime = this.getTime()- this.pauseStartTime;
	}
	if(this.inSlide) clearTimeout(this.slideTimer);
	this.callPauseCB(this.fMousePaused);

}
Sonata.Slider.prototype.mouseout = function() {
	this.fMousePaused = false;
	var dif = this.options.pause-this.pauseTime;
	if(dif<0 || dif>this.options.pause) dif = 0;

	if(this.inPause && this.options.slideafterpause==false) {
		if(dif!=0)
			this.beginPause(dif)
		else
			this.continueSlide();
	}
	else
		this.continueSlide();
	this.callPauseCB(this.fMousePaused);

}
Sonata.Slider.prototype.$mkListDiv = function(lis) {
	var align= this.options.align;
	var w = this.slideWidth;
	var h = this.slideHeight;
	var div;
	var ul = this.jqUl;
	ul.css("overflow","hidden");
	var divList = [];
	lis.each(mkdiv);
	this.divList = divList;
	//mprint("sliderElem w="+w+" h="+h);
	function mkdiv() {
		var l = $(this);
		div = $("<div>");
		div.css("overflow","hidden");
		div.attr("align",align);
		div.width(w);
		div.height(h);
		//mprint("div w="+w+" h="+h);
		//div.css("border","solid 1px red");
		var img = l.children()[0];
		//replace the child of the <li> with our div
		l.html("");
		//mprint("align="+align+" src="+img.src);
		div.append(img);
		l.append(div);
		//mprint("height="+$(img).height());
		//mprint_text(l.html());
		divList.push({li:l,div:div,img:$(img),fillComplete:false});
	}
}
Sonata.Slider.prototype.$fillArea = function(index) {
	//return;
	//mprint("in fillarea index="+index);
	if(index>=this.slideCount) {
		index = 0;
		//this.bFillComplete = true;
		//return;
	}
	///if(this.bFillComplete) return;
	
	var fw = this.slideWidth;
	var fh = this.slideHeight;
	var divObj = this.divList[index];
	divObj.fillComplete = true;
	var img = divObj.img;
	var iw = img.width();
	var ih = img.height();
	
	//mprint("fw="+fw+" fh="+fh+" iw="+iw+" ih="+ih);
	if(ih==0) return;
	
	var w,h;
	//mprint("div w="+divObj.div.width()+" h="+divObj.div.height());
	//proportionate
	var r1 = fw/iw;
	var r2 = fh/ih;
	var ny = 0,nx = 0;
	//mprint("r1="+r1+" r2="+r2);
	if(r1<r2) {
		h = Math.floor(r1 * ih);
		w = Math.floor(fw);
		ny = (fh-h)/2; //middle
	}
	else {
		w = Math.floor(r2 * iw);
		h = Math.floor(fh);
		nx = (fw-w)/2;	//center
	}
	//mprint("w="+w+" h="+h);
	img.css("left","0px");
	img.css("top","0px");
	img.css("width",w+"px");
	img.css("height",h+"px");
	divObj.div.attr("align",this.options.align);
}
Sonata.Slider.prototype.$valign = function(index) {
	if(index>=this.slideCount) index = 0;
	var fh = this.sliderElem.height();//this.slideHeight;
	var divObj = this.divList[index];
	var img = divObj.img;
	var ih = img.height();
	var dy;
	//mprint("src="+img[0].src);
	if(ih==0) return;
	//mprint("fh="+fh+" h="+ih);
	if(this.options.valign=='middle')
		dy = Math.floor((fh-ih)/2);
	else if(this.options.valign=='bottom')
		dy = Math.floor(fh-ih);
	else if(this.options.valign=='top')
		dy = 0;
	//mprint("valign fh="+fh+" ih="+ih+" dy="+dy);
	divObj.div.css("padding-top",dy+"px");
}
Sonata.Slider.prototype.getTime = function() {
	return new Date().getTime();
}

Sonata.Slider.prototype.beginPause = function(pause) {
	var thisptr = this;
	if(this.options.fill)
		this.$fillArea(this.sliderIndex);
	this.$valign(this.sliderIndex);
	
	clearTimeout(this.slideTimer);
	if(this.options.pause == pause)
		this.pauseStartTime = this.getTime();
	if(this.options.fill)
		this.$fillArea(this.sliderIndex+1);
	this.$valign(this.sliderIndex+1);
	this.pauseTimer = setTimeout(endPause,pause);
	this.inPause = true;
	
	function endPause() {
		thisptr.endPause();
	}
}
Sonata.Slider.prototype.endPause = function() {
	this.inPause = false;
	this.slide();
}
Sonata.Slider.prototype.continueSlide = function() {
	var thisptr = this;
	this.slideTimer = setTimeout(slide,this.slideDelay);
	function slide() {
		thisptr.slide();
	}
}
Sonata.Slider.prototype.slide = function() {
	var thisptr = this;
	var w = this.slideWidth;
	var obj = this.sliderElem;
	
	//t = (ot>=ts) ? (options.continuous ? 0 : ts) : t+1;	
	this.inSlide = true;
	this.inPause = false;
	
	if(this.fSlidein) {
		this.curPosX -= this.dx;
		if(this.curPosX >= 0) {
			this.jqUl.css("left",this.curPosX);
			this.continueSlide();
			return;
		}
		this.curPosX = 0;
		this.fSlidein = false;
		this.beginPause(this.options.pause);
		return;
	}
	//t is the slide number from 0 to ts where ts is the dup of the first slide
	var ot = this.sliderIndex;//t;
	if(ot>=this.slideCountm1) {
		//restart the slide show
		//we already slid the last element (which is a dup of the first element) 
		//so reset to the first element then immediately start to animate to the next element
		this.sliderIndex=0;
		this.curPosX = 0;
		this.jqUl.css("left",-this.curPosX);
		this.continueSlide();
		return;

	}
	this.curPosX += this.dx;
	//mprint("curPosX="+this.curPosX + " dx="+this.dx);
	if(this.curPosX>= ((this.sliderIndex+1)*w)) {
		this.sliderIndex++;
		this.curPosX = this.sliderIndex*w;
		//mprint("t="+t+" curPosX="+curPosX);
		this.jqUl.css("left",-this.curPosX);
		this.beginPause(this.options.pause);
		return;
	}
	this.jqUl.css("left",-this.curPosX);
	this.continueSlide();
}
Sonata.Slider.prototype.callPauseCB = function(fPaused) {
	if(typeof this.options.pauseCB == 'function') {
		this.options.pauseCB(this.sliderElem,fPaused);
	}
}
