var _slides  = {
  'slideShow' : {},
  'register' : function(id, effect, delay, speed, dynamic) {
	  _slides.slideShow[id] = new slideshow(false, effect, dynamic);
	  _slides.slideShow[id].delay=delay;
	  _slides.slideShow[id].speed=speed;
	  _loadOb.slides = _slides.loadShow;
  },
  'registerSlide' : function(id, dvid) {
	  return _slides.slideShow[id].addSlide(dvid);
  },
  'loadShow' : function() {
	  for (var i in _slides.slideShow) {
		  if (_slides.slideShow[i].dynamic) {
			  //pull in all the slides inside the toggle element
			 var tog=document.getElementById(i);
			 for (var x=0,n=tog.childNodes.length; x<n; x++) {
				 if (tog.childNodes[x].nodeType==1) {
					 _slides.slideShow[i].addSlide(tog.childNodes[x]);
				 }
			 }
			 tog=null;
		  } else {
		   var el=document.getElementById(i);
		   _slides.slideShow[i].slideDv=el;
		   for (var x=0,y=_slides.slideShow[i].slides.length; x<y;x++) {
			  _slides.slideShow[i].slides[x] = document.getElementById(_slides.slideShow[i].slides[x]);
			  if (_slides.slideShow[i].effect == "3dflip") {
				  _slides.slideShow[i].slides[x].className += " webkit_flip";
				  if (x > 0) _slides.slideShow[i].slides[x].className += " webkit_flipout";
				  _slides.slideShow[i].onmouseover = _slides.slideShow[i].next();
			  }
		   }
		   el=null;
		  }
		  if (_slides.slideShow[i].effect != "3dflip") _slides.slideShow[i].jumpToSlide(0);
	  }
  }
}


function slide(src, caption) {
	this.img=document.createElement("img");
	this.img.src=src;
	this.img.style.position="absolute";
	this.caption=caption;
}

function slideshow(slideDv, effect, dynamic) {
	this.slideDv=slideDv;
	this.dynamic=dynamic;
	this.curslide=0;
	this.slides=[];
	this.effect=effect;
	this.dir;
	this.delay;
	this.lastslide=false;
	this.speed=1;
	this.handles={};
	this.highlights={};
	this.buttons={};
	this.timeoutid;
}

slideshow.prototype.makeOptions = function() {
	var dv=document.createElement("div");
	dv.style.position="absolute";
	dv.style.bottom="10px";
	dv.style.left="10px";
	dv.style.zIndex=5;
	var a;
	var listid=listener.addListen();
	for (var i=0,n=this.slides.length; i<n; i++) {
		a=document.createElement("a");
		a.style.display="block";
		a.innerHTML = i;
		a.onclick=_show.jumpToSlide;
		a.style.cursor="pointer";
		a.id="i";
		dv.appendChild(a);
		a=null;
	}
	this.slideDv.appendChild(dv);
}


slideshow.prototype.addSlide = function(src, caption, highlight_id, normalState, active) {
	var l=this.slides.length
	this.slides[l] = src;
	return l;
}

slideshow.prototype.addButton = function(id, type) {
	hands.reg(id, 'onclick', this);
	var nm=parseInt(type);
	if (isNaN(nm)) this.buttons[id] = type;
	else {
		this.buttons[id] = nm - 1;
		this.highlights[nm - 1] = id;
	}
}

slideshow.prototype.addHighlight = function(slide, elid, group) {
  this.highlights[slide] = state.reg(elid, group);
}

slideshow.prototype.next=function() {
	this.remSlide();
	if (this.highlights[this.curslide]) {
		state.inactive(this.highlights[this.curslide]);
	}
	this.lastslide=this.slides[this.curslide];
	this.curslide++;
	if (this.curslide >= this.slides.length) this.curslide=0;
	this.change();
}

slideshow.prototype.prev=function() {
	this.remSlide();
	if (this.highlights[this.curslide]) {
		state.inactive(this.highlights[this.curslide]);
	}
	this.lastslide=this.slides[this.curslide];
	this.curslide--;
	if (this.curslide < 0) this.curslide = this.slides.length - 1;
	this.change();
}

slideshow.prototype.jumpToSlide = function(num) {
	this.remSlide();
	if (this.highlights[this.curslide]) {
		state.inactive(this.highlights[this.curslide]);
	}
	if (this.curslide) this.lastslide=this.slides[this.curslide];
	this.curslide=num;
	this.change();
}

slideshow.prototype.remSlide = function() {
	var sl=this.lastslide;
	if (sl) {
	 if (sl.effects) {
		 sl.effects.cancelEffect(true);
		 sl.effects=null;
	 }
	 sl.style.visibility="hidden";
	 sl=null;
	}
}

slideshow.prototype.autoJump = function() {
	var _self=this;
	this.timeoutid=set.timeoutWithScope(_self, _self.nextns, this.delay * 1000);
	_self=null;
}

slideshow.prototype.nextns = function(_self) {
	_self.next();
}

slideshow.prototype.listener = function(id, tp, ob) {
	clearTimeout(this.timeoutid);
	if (this.handles[id] == "delete") {
		clearTimeout(this.timeoutid);
		this.remSlide();
	} else if (this.buttons[id]) {
	  if (tp==="onclick") {
		  clearTimeout(this.timeoutid);
		if (this[this.buttons[id]]) this[this.buttons[id]]();
		else this.jumpToSlide(this.buttons[id]);
	  }	
	} else {
		if (this.effect==="fade") this.remSlide();
		this.autoJump();
	}
}

slideshow.prototype.activateFromLink = function(id) {
	for (var i in this.highlights) {
		if (this.highlights[i] == id) {
			this.jumpToSlide(i);
			break;
		}
	}
}

slideshow.prototype.change = function() {
	if (this.highlights[this.curslide]) {
		state.active(this.highlights[this.curslide]);
	}
	var dv=this.slides[this.curslide],eff;
	dv.style.visibility="hidden";
	if (this.effect=="slide_lr") {
    	   if (this.lastslide) {
    		   eff = new effects(this.lastslide, this.speed, 1, this.slideDv.offsetWidth);
    		   this.handles[eff.listenid] = "delete";
    		   eff.slide_horiz();
    	   }
    	   dv.style.top=0;
    	   dv.style.left = (0 - dv.offsetWidth) + "px";
    	   eff = new effects(dv, this.speed, 1, 0);
    	   this.handles[eff.listenid] = "next";
    	   listener.addHandle(eff.listenid, this);
    	   eff.slide_horiz();
	} else if (this.effect =="slide_rl") {
    	   if (this.lastslide) {
    		   eff = new effects(this.lastslide, this.speed, 1, 0 - this.slideDv.offsetWidth);
    		   this.handles[eff.listenid] = "delete";
    		   listener.addHandle(eff.listenid, this);
    		   eff.slide_horiz();
    	   }
    	   dv.style.top=0;
    	   dv.style.left = this.slideDv.offsetWidth + "px";
    	   eff = new effects(dv, this.speed, -1, 0);
    	   this.handles[eff.listenid] = "next";
    	   listener.addHandle(eff.listenid, this);
    	   eff.slide_horiz();
      } else if (this.effect == "slide_tb") {
    	   if (this.lastslide) {
    		   eff = new effects(this.lastslide, this.speed, 1, this.slideDv.offsetHeight);
    		   this.handles[eff.listenid] = "delete";
    		   listener.addHandle(eff.listenid, this);
    		   eff.slide_vert();
    	   }
    	   dv.style.left=0;
    	   dv.style.top=(0 - dv.offsetHeight)  + "px";
    	   eff = new effects(dv, this.speed, 1, 0);
    	   this.handles[eff.listenid] = "next";
    	   listener.addHandle(eff.listenid, this);
    	   eff.slide_vert();
       } else if (this.effect=="slide_bt") {
    	   if (this.lastslide) {
    		   eff = new effects(this.lastslide, this.speed, 1, 0 - this.slideDv.offsetWidth);
    		   this.handles[eff.listenid] = "delete";
    		   listener.addHandle(eff.listenid, this);
    		   eff.slide_vert();
    	   }
    	   dv.style.left=0;
    	   dv.style.top=this.slideDv.offsetHeight + "px";
    	   eff = new effects(img, this.speed, -1, 0);
    	   this.handles[eff.listenid] = "next";
    	   listener.addHandle(eff.listenid, this);
    	   eff.slide_vert();
       //need to set starting position according to direction
	} else if (this.effect=="fade") {
	   dv.style.top="0px";
	   dv.style.left="0px";
	   dv.style.opacity=0;
	   eff = new effects(dv, this.speed, 1, 1);
	   this.handles[eff.listenid] = "next";
	   listener.addHandle(eff.listenid, this);
	   eff.fade_in();
	} else if (this.effect=="crossfade") {
		dv.style.top="0px";
		dv.style.left="0px";
		dv.style.zIndex=1;
		dv.style.opacity=0;
		if (this.lastslide) {
		this.lastslide.style.zIndex=2;
		var eff1 = new effects(this.lastslide, this.speed, 1);
		this.handles[eff1.listenid] = "delete";
		listener.addHandle(eff1.listenid, this);
		eff1.fade_out();
		}
		eff=new effects(dv, this.speed, 1);
		this.handles[eff.listenid] = "next";
		listener.addHandle(eff.listenid, this);
		eff.fade_in();
		eff=eff1=null;
	} else if (this.effect=="scroll_in") {
		if (this.dir=="tr") {
			dv.style.width="0px";
			dv.style.height="0px";
			if (this.lastslide) {
				var eff=new effects(this.lastslide, this.speed, 1);
			}
		}
	} else if (this.effect=="manual") {
		this.remSlide();
	} else if (this.effect=="3dflip") {
		if (dv.className.indexOf("webkit_flipin") > -1) {
		  if (this.lastslide) {
			var eff1=new effects(dv, this.speed, 1);
			eff1.flip_in();
		  }
		  eff=new effects(dv, this.speed, 1);
		  eff.flip_out();
		} else {
			if (this.lastslide) {
			 var eff1 = new effects(this.lastslide, this.speed, 1);
			 eff1.flip_out();
			}
			eff=new effects(dv, this.speed, 1);
			eff.flip_in();
			eff=eff1=null;
		}
		this.autoJump();
	}		
	dv.style.visibility="visible";
	var _self=this;
	dv=eff=_self=null;
}
