var tcSliderHelper = {

	init:function(slider, slideHandle, transition) {
		if (slider.slides.length == 0) {
			return false;
		}
		
		this.loadSlide(slider, slideHandle, transition);

		$('a.tc-slider-link-'+slider.sliderHandle).click(function(e){
			if ($(this).attr('disabled') != 'disabled') {
				var href = $(this).attr('href'), pos;
				var slide = null, transition = null;
				var handle = $(this).attr('class');
				handle = handle.substr(handle.search(/tc-slider-link-/)+15);
				if ((pos = handle.search(' ')) !== -1) handle = handle.substr(0,pos);
				eval('var slider = tcSlider'+handle);
				if ((pos = href.search(/tc-slide=/)) !== -1) {
					slide = href.substr(pos+9);
					if ((pos = slide.search(/&/)) !== -1) {
						slide = slide.substr(0,pos);
					}
				}
				if ((pos = href.search(/tc-transition=/)) !== -1) {
					transition = href.substr(pos+14);
					if ((pos = transition.search(/&/)) !== -1) {
						slide = transition.substr(0,pos);
					}
				}
				tcSliderHelper.loadSlide(slider, slide, transition);
			}
	
			e.stopPropagation();
			return false;
		});
	},

	activate:function(el, active) {
		if (active) {
			el.addClass('tc-active');
		} else {
			el.removeClass('tc-active');
		}
	},

	enable:function(el, enabled) {
		if (enabled) {
			el.attr('disabled','');
			el.removeClass('tc-disabled');
		} else {
			el.attr('disabled','disabled');
			el.addClass('tc-disabled');
		}
	},

    getSlide:function(slider, idxNow, idxTo, delta) {
		var idx;

		if (slider.sliderOrder != '- slide -') {
			idxTo = slider.sliderOrder;
		}

		if (idxTo == '- none -') {
			idx = -1;
		} else if (idxTo == '- position -') {
			idx = idxNow + delta;
			if (idx < 0) idx = slider.slides.length-1;
			else if (idx >= slider.slides.length) idx = 0;
		} else if (idxTo == '- random -') {
			idx = idxNow;
			while (slider.slides.length > 1 && idx == idxNow) {
				idx = Math.floor(Math.random() * slider.slides.length);
			}
		} else {
			for (i = 0; i < slider.slides.length; i++) {
				if (slider.slides[i].slideHandle == idxTo) return i;
			}
		}
		return idx;
	},

	getStyle:function(container, transition) {
		var style = '';

		if (transition == 'slide-left') {
        	style = 'left: '+container.width();
    	} else if (transition == 'slide-right') {
        	style = 'left: -'+container.width();
    	} else if (transition == 'slide-up') {
        	style = 'top: '+container.height();
    	} else if (transition == 'slide-down') {
        	style = 'top: -'+container.height();
    	} else {
			return '';
		}

		return ' style="'+style+'px"';
	},

	invertTransition:function(transition) {
		if (transition == 'slide-left') {
        	transition = 'slide-right';
    	} else if (transition == 'slide-right') {
        	transition = 'slide-left';
    	} else if (transition == 'slide-up') {
        	transition = 'slide-down';
    	} else if (transition == 'slide-down') {
        	transition = 'slide-up';
    	}
		return transition;
	},

	loadSlide:function(slider, idx, transition) {
		var invert = false;
		var slide = slider.slide;
		if (slide == -1) slide = 0;

		if (idx == 'slide-prev') {
			invert = true;
			idx = this.getSlide(slider, slide, slider.slides[slide].slidePrevSlide, -1);
		} else if (idx == 'slide-next') {
			idx = this.getSlide(slider, slide, slider.slides[slide].slideNextSlide, 1);
		} if (parseInt(idx).toString() != idx) {
			for (var i = 0; i < slider.slides.length; i++) {
				if (slider.slides[i].slideHandle == idx) break;
			}
			if (i >= slider.slides.length) return;
			idx = i;
		} else {
			idx |= 0;
		}
		if (idx < 0) return;

		if (slider.slide == idx) return;

		if (slider.slide >= 0) {
			this.activate($('#'+slider.slides[slider.slide].slideHandle+'.tc-slider-link-'+slider.sliderHandle), false);
		}
		slider.slide = idx;
		this.activate($('#'+slider.slides[slider.slide].slideHandle+'.tc-slider-link-'+slider.sliderHandle), true);

		var idxPrev = this.getSlide(slider, idx, slider.slides[idx].slidePrevSlide, -1),
			idxNext = this.getSlide(slider, idx, slider.slides[idx].slideNextSlide, 1);
		this.enable($('.tc-slider-link-'+slider.sliderHandle+'.tc-slider-linkprev'), (idxPrev >= 0));
		this.enable($('.tc-slider-link-'+slider.sliderHandle+'.tc-slider-linknext'), (idxNext >= 0));

		slide = slider.slides[idx];

		if (!transition) {
			if (slider.sliderTransition == '- slide -') {
				transition = slide.slideTransition;
			} else {
				transition = slider.sliderTransition;
			}
		}
		if (invert) transition = this.invertTransition(transition);

		var content = '';
		if (slide.slideType == 'block') {
			if (slider.sliderAjaxBlocks) {
    			$.ajax({
      				type: "POST",
      				url: slider.sliderBlockViewUrl,
					data: 'bid='+slide.slideBID,
					success: function(result) {
						content = result;
						tcSliderHelper.showSlide(slider, slide, transition, content);
					},
					error: function(xhdr, status, err) {
						content = "Error";
						tcSliderHelper.showSlide(slider, slide, transition, content);
					}
				});

				return;
			}
		} else if (slide.slideType == 'image' || slide.slideType == 'fileset') {
			content = '<img src="'+slide.slideImagePath+'"/>';
		} else if (slide.slideType == 'url') {
			if (slider.sliderAjaxUrls) {
    			$.ajax({
      				type: "POST",
      				url: slide.slideUrl,
					data: 'slider='+slider.sliderHandle+'&slide='+slide.slideHandle,
					success: function(result) {
						content = result;
						tcSliderHelper.showSlide(slider, slide, transition, content);
					},
					error: function(xhdr, status, err) {
						content = "Error";
						tcSliderHelper.showSlide(slider, slide, transition, content);
					}
				});

				return;
			}
		}

		this.showSlide(slider, slide, transition, content);
	},

	showSlide:function(slider, slide, transition, content) {
		var container = $('#tc-slider-'+slider.sliderHandle+' .tc-slide-container-'+slider.sliderHandle);
		container.stop(true, true);

		var inDuration = slider.sliderInDuration;
		if (inDuration < 0) {
			inDuration = slide.slideInDuration;
		}
		if (inDuration < 0) {
			inDuration = 0;
		}

		var showDuration = slider.sliderShowDuration;
		if (showDuration < 0) {
			showDuration = slide.slideShowDuration;
		}
		showDuration += inDuration;

		if (   content == ''
			&& (   slide.slideType == 'content'
			    || (slide.slideType == 'block' && !slider.sliderAjaxBlocks)
			    || (slide.slideType == 'url' && !slider.sliderAjaxUrls))) {
			content = $('#tc-static-'+slider.sliderHandle+'-'+slide.slideHandle).html();
		}
		content = '<div class="tc-slide-'+slider.sliderHandle+'"'+this.getStyle(container, transition)+'>'+content+'</div>';

  		if (transition == 'swap') {
    		container.html(content);
			if (slide.slideNextSlide != '- none -' && showDuration > inDuration && slider.sliderActive) {
				window.clearTimeout(slider.timeout);
				slider.timeout = window.setTimeout(function() { tcSliderHelper.loadSlide(slider, 'slide-next'); }, showDuration * 1000);
			}
			return;
		}

		var el = $(content);
		var children = container.children();

  		if (transition == 'fade') {
			el.css({'left':0,'top':0,'position':'absolute','display':'none'});
  			container.append(el);
			el.fadeIn(inDuration * 1000, function(){
				children.remove();
			});
  		} else if (transition == 'slide-left' || transition == 'slide-right') {
  			container.append(el);
			var width = container.width();
			var twidth = width;
			$('#tc-slider-'+slider.sliderHandle+' .tc-slide-'+slider.sliderHandle).width(width);
    		container.width(width*2);
    		if (transition == 'slide-left') twidth *= -1;
    		container.animate({'left': twidth}, inDuration * 1000, function(){
				children.remove();
      			container.width(width);
      			container.css('left','0px');
      			$('#tc-slider-'+slider.sliderHandle+' .tc-slide-'+slider.sliderHandle).css('left','0px');
    		});
  		} else if (transition == 'slide-up' || transition == 'slide-down') {
  			container.append(el);
			var height = container.height();
			var theight = height;
			container.height(height*2);
    		if (transition == 'slide-up') theight *= -1;
    		container.animate({'top': theight}, inDuration * 1000, function(){
				children.remove();
      			container.height(height);
      			container.css('top','0px');
      			$('#tc-slider-'+slider.sliderHandle+' .tc-slide-'+slider.sliderHandle).css('top','0px');
    		});
  		}

		if (slide.slideNextSlide != '- none -' && showDuration > inDuration && slider.sliderActive) {
			window.clearTimeout(slider.timeout);
			slider.timeout = window.setTimeout(function() { tcSliderHelper.loadSlide(slider, 'slide-next'); }, showDuration * 1000);
		}
	}

}
