/* class for building slide execution */
var slider = {

	slideId    	 : "slider", // this is the main slider for the page
	slideClass   : "slide",
	slidePixels  : 200,
	slideSpeed   : 100,
	slideDeacc	 : 2,
	slideStarted : false,
	slideSpeedUp : false,
	slideMoving  : false,
	slideCurrent : 0,

	
	/* ************************************
	parentObj is the container for slides
	x = the slide number 0-9...
	************************************ */
	slidePan : function(sliderObj, x)
	{
		//	stores collected slides
		var slides 		= [];
		var movePixels  = slider.slidePixels;
		var speed = slider.slideSpeed;

		// start the sliding effect
		slider.slideStarted = true;
		
		//	get slides
		slides = dom.byClass(slider.slideClass, sliderObj);
		if((slides && (x < slides.length))){
			
			// get the width of a single slide
			var slideWidth  = slides[0].offsetWidth;
			var curMargin 	= dom.getMargin(sliderObj); // returns NEGATIVE value
			var gotoMargin  = -(x * slideWidth); 		// sets NEGATIVE value
			var pixels = 0;
			
			// add speed up on further away objects
			if(slider.slideSpeedUp){
				if(x > (slider.slideCurrent + 2) || x < (slider.slideCurrent - 2)){
					movePixels = slider.slidePixels * 2;
					speed = slider.slideSpeed / 2 ;
				}
			}
			
			if( curMargin > gotoMargin ){
				//	move slide left
				slider.slideMoving = true;
				if( Math.abs((gotoMargin - curMargin)) < slider.slidePixels){
					movePixels = Math.ceil(Math.abs((gotoMargin - curMargin)) / slider.slideDeacc);
				}
				sliderObj.style.marginLeft = (curMargin - movePixels) + "px"  ;
			}
			else if(curMargin < gotoMargin){
				// move slide right
				slider.slideMoving = true;
				if( Math.abs(curMargin - gotoMargin) < slider.slidePixels ){
					movePixels = Math.ceil(Math.abs((curMargin - gotoMargin)) / slider.slideDeacc);
				}
				sliderObj.style.marginLeft = (curMargin + (movePixels) + "px")  ;
				
			}
			else{
				// sliding has stopped. continue
				sliderObj.style.marginLeft = gotoMargin + "px";
				slider.slideCurrent = x;
				//	This is so the TAB key doesnt screw with the margin, hides all slides
				slider.enableSlideTabbing( false );
				slider.slideMoving  = false;
				slider.slideStarted = false;
				slider.slideSpeedUp = false;
				return;

			}
			
			if( slider.slideMoving ){
				setTimeout(function(){ slider.slidePan( sliderObj , x) }, speed );
			}
			
		}
	},
	
	/* *********************************************
	quickest way to disable the TAB key jumping from 
	one slide to another and destroying the margin, 
	as it will move the slide automatically creating a VERY BAD look
	********************************************* */
	enableSlideTabbing : function( enable )
	{
		//	state which elements which cause the TAB slide jump
		var tabElements = new Array("input", "select", "textarea");
		
		//	turn on slides, this is so the TAB doesnt screw up the margin
		var slides = slider.getSlides(slider.slideClass, dom.byId(slider.slideId));			
		
		for(var s = 0; s < slides.length; s++){
			
			//	make sure not to remove elemts from focused slide
			if( slider.slideCurrent != s ){
				//	get all tags
				var tags = dom.byTag("*", slides[s]);
				
				for(var t = 0; t < tags.length; t++){
					if(dom.inArray(tags[t].tagName.toLowerCase(), tabElements)){
						//	disable tab functionality
						if( enable ){
							tags[t].disabled = false;
						}else{
							tags[t].disabled = true;
						}
					}
				}
			}
		}
	},
	
	/* *********************************************
	Moves the slide.  Ensures that slide is not 
	currently sliding, otherwise error is caused
	********************************************* */
	slideStart : function(sliderObj, x)
	{
		if( !slider.slideStarted ){
			//	turn on slides, for viewing and moving
			slider.enableSlideTabbing( true );
			//	slide to....
			slider.slidePan(sliderObj, x);
			return true;
		}else{
			return false;
		}
	},
	
	
	getSlides : function(){
		 return dom.byClass(slider.slideClass, dom.byId(slider.slideId));
	},
	
	
	/* *********************************************
		create slide on content demand,
		param : destory : true  => otherwise finds existing slide
		param : history : function => creates custom backbutton
		param : menu : function => custom menu 
		param : content : str => can supply own content
	********************************************* */
	onDemandSlide : function(e, params)
	{
		//	make sure blank slide isn't created by double click
		//	and that a A tag is used
		if( dom.getEventElement(e).tagName.toLowerCase() == "a" && !slider.slideMoving ) {
	
			//	get the internal content of the slide...by href
			var url  = (dom.getEventElement(e).href).split("/");
			//	 get directory and page location
			var dir	 = url[url.length - 1].split(".")[0];	// dir
			var qry  = url[url.length - 1].split("?")[1];
			var page = (qry.split("&")[0]).split("=")[1];
						
			if( !slider.findSlideById(e, page) ){
				ajax.request("_includes/_ajax_public.php?request=get_page_content&dir="+ dir +"&"+ qry +"", slider.createOnDemandSlide, params);
				slider.slideMoving = true;
				
			}
		}
		dom.cancel(e);
	},
	
	
	/* *********************************************
		creates the onDemand slide for loading the content
	********************************************* */
	createOnDemandSlide : function(content, params)
	{
		//	destory required
		if( params && params.destroy ){
			
			var slides = slider.getSlides();
			//	destory all existing slides for display of new content wizard slides
			for(var i = slider.slideCurrent + 1; i < slides.length; i++){
				dom.delElement(slides[i]);
			}	
		}
		
		//	create new slide
		var slide = dom.create("div");
		
		slide.className = "slide";
		slide.innerHTML = (!content.responseText ? content : content.responseText );
		dom.byId(slider.slideId).appendChild(slide);
		
		//	dynamically load the javascript within the ajax content
		//  for safari and IE as Firefox automatically loads it.
		//	as ff will load it twice otherwise
		if( navigator.userAgent.indexOf( "Firefox" ) == -1 ){
			var srptTags = dom.byTag("script", slide);
			for(var s = 0; s < srptTags.length; s++){
				ajax.loadDynamicJS(srptTags[s].innerHTML, "");
			}
		}
		//	add back button if exists
		if( params && params.history ){
			slider.addSlideBackButton(slide);
		}
		
		//	add and start moving to end slide
		slider.slideStart(dom.byId(slider.slideId), dom.byClass(slider.slideClass, dom.byId(slider.slideId)).length -1);
		
	},
	
	
	/* *****************************************************
		finds the slide by the page/id value and moves to it
	***************************************************** */
	findSlideById : function(e, id)
	{
		//	get slides
		var slides = dom.byClass(slider.slideClass, dom.byId(slider.slideId));

		//	find existing slide based of id of content id="xxx" => index.php?page=xxx
		for(var i = 0; i < slides.length; i++){
			//	found page => IE fix! with this regexp as it imports and extracts all " symbols
			var regExp = new RegExp("id=\""+ id +"\"|id="+ id +"");
			
			if( (slides[i].innerHTML).search(regExp) != -1 ){
				//	goto slide that is found...
				slider.slideStart(dom.byId(slider.slideId), i);
				if(e){
					dom.cancel(e);
				}
				return true;
			}
		}
		return false;
	}
}
	
