/*global $,window */

/*
	MENU
*/
var menu = {
	
	options: {
		//menu element
		elem: null,
		//menu trigger element
		trigger: null,
		//menu content element
		content: null,
		//deploy effect speed
		deploySpeed: 800,
		//highlight speed
		highlightSpeed: 400,
		//delay time between highlights
		highlightDelay: 100,
		//menu a's color
		color: '#B3B3B3'
	},	
	//maximized dimensions
	max_dim: {
		width: null,
		height: null
	},
	//minimized dimensions
	min_dim: {
		width: null,
		height: null
	},
	
	construct: function(options) {
		$.extend(this.options, options);
		
		this.elem = $(this.options.elem);
		this.content = $(this.options.content);
		this.trigger = $(this.options.trigger);

		this.content.css({ //set panel dimensions css to avoid floating problems
			width: this.content.width() + 15,
			height: this.content.height() + 15
		});

		this.max_dim = {
			width: this.content.width(),
			height: this.content.height() + 15
		};
		
		this.min_dim = {
			width: this.trigger.outerWidth(),
			height: this.trigger.outerHeight()
		};
	},
	
	show: function() {
		this.content.show();
		this.elem.stop().animate(this.max_dim, this.options.deploySpeed);
	},
	
	hide: function() {
		this.elem.stop().animate(this.min_dim, this.options.deploySpeed, function() {
			menu.content.hide();
			menu.clearHighlight();
		});
	},
	
	highlight: function(elem) { //clear previous highlights
		this.clearHighlight();
		elem = $(elem);
		var parts = elem.attr('rel').split(',');
		var rel = parts[0];
		var highlight_color = null;
		if(parts.length > 1 && parts[1] != '') {
			highlight_color = parts[1];
		} else {
			highlight_color = '#6666F0';
		}
		
		elem.animate({color: highlight_color}, this.options.highlightSpeed).addClass('highlighted');
		elem.parents('ul.categories-menu')
			.nextAll('ul.projects-menu')
			.find('a[rel*=' + rel + ']')
			.each(function(i, elem) {
				$(elem).clearQueue();
				$(elem).delay(i * menu.options.highlightDelay).animate({color: highlight_color}, {duration: menu.options.highlightSpeed}).addClass('highlighted');
		});
	},
	
	clearHighlight: function() {
		this.elem.find('a.highlighted').each(function(i, elem) {
			$(elem).animate({color: menu.options.color}, menu.options.highlightSpeed).removeClass('highlighted');
		});
	}
};

/*
	SLIDER
*/
var slider = {
	
	options: {
		//speed of fade effect
		fadeSpeed: 800,
		//slide speed
		speed: 1300,
		//animations chaining
		clickableAni: true,
		//slide easing effect
		ease: 'easeInOutExpo',
		//slides to use
		slides: [],
		//captions to use
		captions: [],
		//caption elem
		captionElem: null,
		//controls elem
		controlsElemId: 'slider-controls',
		//startSlide
		startSlide: null,
		//loadingText
		loadingText: '.',
		//preloadAjax
		preloadAjax: false
	},
	
	//element to apply slider to
	elem: null,
	//caption elem
	captionElem: null,
	//current slide
	currentSlide: 1,
	//next slide
	nextSlide: 1,
	//update label?
	updateLabel: true,
	
	
	construct: function(elem, options) {
		$.extend(this.options, options);
		this.elem = $(elem);
		this.captionElem = $(this.options.captionElem) || null;
		
		this.elem.css('width', $(window).width()); //slider is 100% width
		//sudoSlider init
		this.elem.sudoSlider({
			speed: this.options.speed,
			controlsFadeSpeed: this.options.fadeSpeed,
			controlsAttr: 'id="' + this.options.controlsElemId + '"',
			clickableAni: this.options.clickableAni,
			ease: this.options.ease,
			autoheight: false,
			beforeAniFunc: this.startSlide,
			afterAniFunc: this.endSlide,
			docAjaxFunction: this.onAjaxLoad,
			ajax: this.options.slides,
			startSlide: this.options.startSlide || 1,
			loadingText: this.options.loadingText,
			preloadAjax: this.options.preloadAjax
		});
		this.elem.find('li').css('width', $(window).width()); ////slides are 100% width
		this.currentSlide = this.options.startSlide;
		
		//arrow replacements
		var img_left = $('<img src="css/img/left-arrow_dark.png" alt="left arrow" />');
		img_left.css({
			position: 'absolute',
			top: '50%',
			left: '5%',
			marginTop: '-16px',
			opacity: 0
		});
		$('#' + this.options.controlsElemId + ' .prevBtn').append(img_left)
			.hover(function(evt) {
				//hover in
				img_left.stop().fadeTo(500, 1);
			}, function(evt) {
				//hover out
				img_left.stop().fadeTo(500, 0);
		});
		
		var img_right = $('<img src="css/img/right-arrow_dark.png" alt="right arrow" />');
		img_right.css({
			position: 'absolute',
			top: '50%',
			right: '5%',
			marginTop: '-16px',
			opacity: 0
		});
		$('#' + this.options.controlsElemId + ' .nextBtn').append(img_right)
			.hover(function(evt) {
				//hover in
				img_right.stop().fadeTo(500, 1);
			}, function(evt) {
				//hover out
				img_right.stop().fadeTo(500, 0);
		});
	},
	
	fade: function() {
		this.elem.fadeOut(this.options.fadeSpeed);
	},
	
	unfade: function() {
		this.elem.fadeIn(this.options.fadeSpeed);
	},
	
	moveToSlide: function(slide_dest) {
		this.fade();
		$.timer(this.options.fadeSpeed, function() {
			slider.updateLabel = true;
			slider.elem.sudoSlider(slide_dest);
		});
	},
	
	startSlide: function(destSlide) {
		slider.nextSlide = destSlide;
		
		if(slider.options.captions[destSlide - 1]) {
			slider.captionElem.html(slider.options.captions[destSlide - 1]); //display slide caption
		} else {
			slider.captionElem.html('');
		}
	},
	
	endSlide: function(destSlide) {
		slider.currentSlide = destSlide;
		slider.unfade();
		
		if(slider.options.captions[destSlide - 1]) {
			slider.captionElem.html(slider.options.captions[destSlide - 1]); //display slide caption
		} else {
			slider.captionElem.html('');
		}
	},
	
	onAjaxLoad: function(slide) {
		var img = $(this).children('img');
		if(img.length) { //if it's not a text slide
			slider.options.captions[slide - 1] = img.attr('title') || '';
			//$(img).fadeOut(0);
			//$(img).load(function() {
			//	$(this).fadeIn(slider.options.fadeSpeed);
			//});
		} else {
			slider.options.captions[slide - 1] = '';
		}
		
		if(slider.updateLabel) {
			slider.captionElem.html(slider.options.captions[slider.currentSlide - 1]); //display slide caption
			slider.updateLabel = false;
		}
	}
	
};

