/*jslint bitwise:true */
/*jslint browser:true */
/*jslint cap:false */
/*jslint debug:false */
/*jslint eqeqeq:true */
/*jslint evil:false */
/*jslint laxbreak:false */
/*jslint nomen:true */
/*jslint passfail:false */
/*jslint plusplus:false */
/*jslint rhino:false */
/*jslint undef:true */
/*jslint white:false */
/*jslint widget:false */


/*extern getImagesURI */
/*extern YAHOO */


var panels = function() {
	var containerid = 'tabview';
	var tabs = ['tab-successstories', 'tab-whatyouget'];
	var me;
	var current;

	function hideTab(id, region) {
		var pos;

		pos = new YAHOO.util.Point(region.right, region.top);
		YAHOO.util.Dom.setXY(id, pos);
		YAHOO.util.Dom.addClass(id, 'hide');
	}

	function showTab(id, region) {
		var pos;

		YAHOO.util.Dom.removeClass(id, 'hide');
		pos = new YAHOO.util.Point(region.left, region.top);
		YAHOO.util.Dom.setXY(id, pos);
	}

	function switchTab(id, region) {
		if ( null !== current ) {
			hideTab(current, region);
		}
		current = id;
		showTab(current, region);
	}

	function hideAllTabs(region) {
		var i;

		for (i in tabs) {
			hideTab(tabs[i], region);
		}
	}

	me = {
		initialize : function() {
			var region;

			region = YAHOO.util.Dom.getRegion(containerid);
			hideAllTabs(region);
			current = null;
		},

		showSuccessStories : function() {
			var region;

			region = YAHOO.util.Dom.getRegion(containerid);
			switchTab('tab-successstories', region);
		},

		showWhatYouGet : function() {
			var region;

			region = YAHOO.util.Dom.getRegion(containerid);
			switchTab('tab-whatyouget', region);
		}
	};
	return me;
}();


var successstory = function() {
	var containerid = 'tab-successstories';
	var storyRotationDelayInSecs = 20;
	var storySlideInSecs = 2;
	var me;
	var images;
	var stories;
	var current;
	var timer;
	var animation;

	function randInt(min, max) {
		return Math.round((max - min) * Math.random()) + min;
	}

	function getSuccessStoryImagesList() {
		var uri = getImagesURI();
		return [
			uri + '/benefits/benefit_success_story_bg_chris.jpg', 
			uri + '/benefits/benefit_success_story_bg_michelle.jpg', 
			uri + '/benefits/benefit_success_story_bg_tracy_2.jpg', 
			uri + '/benefits/benefit_success_story_bg_tracey.jpg'
		];
	}

	function shuffleStories(current) {
		var i;
		var story;
		var max;
		var index;

		stories = [];
		for (i in images) {
			story = images[i];
			if ( current !== story ) {
				stories.push(story);
			}
		}

		max = stories.length;
		for (i = 0; i < max; i++) {
			index = randInt(0, max - 1);
			story = stories[i];
			stories[i] = stories[index];
			stories[index] = story;
		}
	}

	function loadSuccessStoryImages() {
		var container;
		var region;
		var pos;
		var imagelist;
		var loadcount;
		var i;
		var img;
		var id;

		container = YAHOO.util.Dom.get(containerid);
		region = YAHOO.util.Dom.getRegion(container);
		pos = new YAHOO.util.Point(region.right, region.top);
		imagelist = getSuccessStoryImagesList();
		loadcount = imagelist.length;
		images = [];
		for (i in imagelist) {
			img = document.createElement('img');
			id = YAHOO.util.Dom.generateId(img);
			img.setAttribute('src', imagelist[i]);
			img.setAttribute('alt', 'Success Story');
			img.onload = function() {
				loadcount--;
				if ( 0 === loadcount ) {
					me.onInitialized.fire();
				}
			};
			container.appendChild(img);
			YAHOO.util.Dom.setXY(img, pos);
			YAHOO.util.Dom.setStyle(img, 'z-index', 0);

			images.push(id);
		}
		shuffleStories(current);
	}

	function showSuccessStory(id) {
		var region = YAHOO.util.Dom.getRegion(containerid);
		var pos;
		var img;

		img = YAHOO.util.Dom.get(id);
		YAHOO.util.Dom.setStyle(img, 'z-index', 0);
		pos = new YAHOO.util.Point(region.left, region.top);
		YAHOO.util.Dom.setXY(img, pos);
	}

	function hideSuccessStory(id) {
		var img;
		var attrib;

		img = YAHOO.util.Dom.get(id);
		YAHOO.util.Dom.setStyle(img, 'z-index', 1);
		attrib = {
			points: {
				to: YAHOO.util.Dom.getXY(img)
			}
		};
		attrib.points.to[0] += img.width;
		animation = new YAHOO.util.Motion(img, attrib, storySlideInSecs);
		animation.onComplete.subscribe(
			function() {
				animation = null;
			}
		);
		animation.animate();
	}

	function rotateNextStory() {
		timer = window.setTimeout(rotateNextStory, storyRotationDelayInSecs * 1000);
		if ( null !== timer ) {
			if ( 0 === stories.length ) {
				shuffleStories(current);
			}

			if ( null !== current ) {
				hideSuccessStory(current);
			}
			current = stories.shift();
			showSuccessStory(current);
		}
	}

	function stopStoryRotation() {
		if ( null !== animation ) {
			animation.stop(true);
		}
		if ( null !== timer ) {
			window.clearTimeout(timer);
			timer = null;
		}
	}

	function isRotatingStories() {
		return (null !== timer);
	}

	me = {
		onInitialized : new YAHOO.util.CustomEvent('initialized'), 

		initialize : function() {
			current = null;
			timer = null;
			animation = null;
			loadSuccessStoryImages();
		},

		start : function() {
			if ( !isRotatingStories() ) {
				rotateNextStory();
			}
		},

		stop : function() {
			if ( isRotatingStories() ) {
				stopStoryRotation();
			}
		}
	};
	return me;
}();


var rollover = function() {
	var containerid = 'tab-whatyouget';
	var items = ['greattools', 'community', 'dietplan', 'ckprogram'];
	var hideMenuDelayInSecs = 20;
	var arrowSlideInSecs = 0.5;
	var me;
	var current;
	var timer;
	var arrowId;
	var animation;

	function getOptionId(id) {
		return 'option-' + id;
	}

	function getViewId(id) {
		return 'view-' + id;
	}

	function showOption(id) {
		YAHOO.util.Dom.addClass(id, 'selected');
	}

	function hideOption(id) {
		YAHOO.util.Dom.removeClass(id, 'selected');
	}

	function hideArrow() {
		var region;
		var pos;

		if ( null !== animation ) {
			animation.stop(true);
		}

		region = YAHOO.util.Dom.getRegion(containerid);
		pos = new YAHOO.util.Point(region.right, region.top);
		YAHOO.util.Dom.setXY(arrowId, pos);
		YAHOO.util.Dom.addClass(arrowId, 'hide');
	}

	function showArrow(optionId) {
		var img;
		var optionRegion;
		var arrowRegion;
		var region;
		var heightDiff;
		var arrowWidth;
		var pos;
		var attrib;

		if ( null !== arrowId ) {
			YAHOO.util.Dom.removeClass(arrowId, 'hide');
			img = YAHOO.util.Dom.get(arrowId);
			optionRegion = YAHOO.util.Dom.getRegion(optionId);
			arrowRegion = YAHOO.util.Dom.getRegion(img);
			heightDiff = (arrowRegion.bottom - arrowRegion.top) - (optionRegion.bottom - optionRegion.top);
			arrowWidth = arrowRegion.right - arrowRegion.left;

			region = YAHOO.util.Dom.getRegion(containerid);
			pos = new YAHOO.util.Point(region.left - arrowWidth, optionRegion.top - (heightDiff / 2));
			YAHOO.util.Dom.setXY(img, pos);

			attrib = {
				points: {
					to: pos
				}
			};
			attrib.points.to[0] += arrowWidth;
			animation = new YAHOO.util.Motion(img, attrib, arrowSlideInSecs);
			animation.onComplete.subscribe(
				function() {
					animation = null;
				}
			);
			animation.animate();
		} else {
			hideArrow();
		}
	}

	function showView(id) {
		var region;
		var pos;

		region = YAHOO.util.Dom.getRegion(containerid);
		pos = new YAHOO.util.Point(region.left, region.top);
		YAHOO.util.Dom.setXY(id, pos);
		YAHOO.util.Dom.removeClass(id, 'hide');
	}

	function hideView(id) {
		var region;
		var pos;

		YAHOO.util.Dom.addClass(id, 'hide');
		region = YAHOO.util.Dom.getRegion(containerid);
		pos = new YAHOO.util.Point(region.right, region.top);
		YAHOO.util.Dom.setXY(id, pos);
	}

	function showItem(id) {
		var optionId;

		current = id;
		optionId = getOptionId(current);
		showOption(optionId);
		showView(getViewId(current));
		showArrow(optionId);
	}

	function hideItem() {
		hideArrow();
		hideView(getViewId(current));
		hideOption(getOptionId(current));
		current = null;
	}

	function onLeave() {
		timer = null;
		hideItem();
		me.onLeave.fire();
	}

	function checkHovering(ev) {
		if ( null === timer ) {
			timer = window.setTimeout(onLeave, hideMenuDelayInSecs * 1000);
		}
	}

	function continueHovering(ev) {
		if ( null !== timer ) {
			window.clearTimeout(timer);
			timer = null;
		}
	}

	function beginHover(ev, id) {
		continueHovering(ev);

		if ( current !== id ) {
			if ( null !== current ) {
				hideItem();
			} else {
				me.onHover.fire();
			}
			showItem(id);
		}
	}

	function loadArrowImage() {
		var img;
		var id;
		var url;
		var container;

		img = document.createElement('img');
		id = YAHOO.util.Dom.generateId(img);
		url = getImagesURI() + '/benefits/benefit_middle_section_arrow.gif';
		img.setAttribute('src', url);
		img.setAttribute('alt', '');
		img.onload = function() {
			arrowId = id;
		};
		container = YAHOO.util.Dom.get(containerid);
		container.appendChild(img);
		YAHOO.util.Dom.addClass(arrowId, 'hide');
	}

	function setListener(id, value, optionId, viewId) {
	}

	me = {
		onHover : new YAHOO.util.CustomEvent('hover'),
		onLeave : new YAHOO.util.CustomEvent('leave'),

		initialize : function() {
			var i;
			var id;
			var optionId;
			var viewId;

			current = null;
			timer = null;
			arrowId = null;
			animation = null;
			loadArrowImage();
			for (i in items) {
				id = items[i];
				optionId = getOptionId(id);
				viewId = getViewId(id);
				hideView(viewId);
				setListener(id, true, optionId, viewId);
			}
		},

		getItems : function() {
			return items;
		},

		emphasiseCurrentItem : function() {
			var optionId;

			hideArrow();
			showArrow(getOptionId(current));
		},

		enable : function(value) {
			var i;
			var id;
			var optionId;
			var viewId;

			if ( !value ) {
				continueHovering(null);
			}
			for (i in items) {
				id = items[i];
				optionId = getOptionId(id);
				viewId = getViewId(id);
				setListener(id, value, optionId, viewId);
			}
			if ( value ) {
				checkHovering(null);
			}
		}
	};
	return me;
}();


var lightboxes = function() {
	var me;
	var dialogs;

	function getThumbnailLinks(viewId) {
		var root;
		var links;
		var thumbnails;
		var i;
		var n;
		var j;
		var nodes;

		root = YAHOO.util.Dom.get(viewId);
		links = [];
		thumbnails = YAHOO.util.Dom.getElementsByClassName('thumbnails', 'div', root);
		for (i = 0; i < thumbnails.length; i++) {
			n = thumbnails[i];
			nodes = n.getElementsByTagName('a');
			for (j = 0; j < nodes.length; j++) {
				links.push(nodes[j]);
			}
		}
		return links;
	}

	function getDialogIdFromURL(url) {
		var id;
		var regex;
		var matches;

		id = null;

		regex = new RegExp('^[^#]*#(.+)$');
		matches = regex.exec(url);
		if ( null !== matches ) {
			if ( 2 === matches.length ) {
				id = matches[1];
				if ( 1 !== YAHOO.util.Dom.get([id]).length ) {
					id = null;
				}
			}
		}

		return id;
	}

	function createDialog(id) {
		var config;
		var dlg;

		config = {
			visible: false, 
			fixedcenter: true, 
			constraintoviewport: true, 
			draggable: false, 
			modal: true, 
			close: true, 
			width: 'auto'
		};
		dlg = new YAHOO.widget.Dialog(id, config);
		dlg.cancelEvent.subscribe(function(ev) {
			rollover.enable(true);
		});
		dlg.render();
		return dlg;
	}

	function showLightbox(id) {
		rollover.enable(false);
		dialogs[id].show();
	}

	me = {
		initialize : function(items) {
			var links;
			var i;
			var anchor;
			var dlgid;

			links = [];
			for (i in items) {
				links = links.concat(getThumbnailLinks('view-' + items[i]));
			}

			dialogs = [];
			for (i in links) {
				anchor = links[i];
				dlgid = getDialogIdFromURL(anchor.href);
				if ( null !== dlgid ) {
					dialogs[dlgid] = createDialog(dlgid);

					YAHOO.util.Event.addListener(
						anchor, 
						'click', 
						function(ev, id) {
							YAHOO.util.Event.preventDefault(ev);
							showLightbox(id);
						}, 
						dlgid);
				}
			}
		}
	};
	return me;
}();


successstory.onInitialized.subscribe(function(ev) {
	var items;
	var i;

	rollover.initialize();

	items = rollover.getItems();
	lightboxes.initialize(items);
	for (i in items) {
		YAHOO.util.Event.addListener(
			items[i] + '-moreinfo', 
			'click', 
			function(ev) {
				YAHOO.util.Event.preventDefault(ev);
				rollover.emphasiseCurrentItem();
			}
		);
	}

	successstory.start();
});
rollover.onHover.subscribe(function(ev) {
	successstory.stop();
	panels.showWhatYouGet();
});
rollover.onLeave.subscribe(function(ev) {
	panels.showSuccessStories();
	successstory.start();
});
panels.initialize();
panels.showSuccessStories();
successstory.initialize();
