(function($){

	var accordion;
	var linkTour;
	
	function clickHeaderOf(linkEl) {
		// Find containing content
		var ct = $(linkEl).closest('.ui-accordion-content');
		if ( ct.length ) {
			var hd = $(ct[0]).prev('.ui-accordion-header');
			if ( hd.length ) {
				$(hd[0]).click();
			}
		}
	}
	
	$.tourGuide = function(accordEl, linkTourEl) {
		accordion = accordEl;
		linkTour = linkTourEl;
		linkTour.bind('visit', function(event){
			clickHeaderOf(event.target);
		});	
	};
})(jQuery);

(function($){
	
	var tourCt;
	var ssBorderOffColor;
	var ssBorderHovColor;
	
	function subImgProxy(j) {
		j.find('img.tour-imgproxy').each(function(i, imgEl) {
			$(imgEl).removeClass('tour-imgproxy');
			$(imgEl).attr('src', $(imgEl).attr('tour:imgsrc'));
		});
	}
	
	function switchToDefault(isHomePage) {
		var defActive = $(tourCt).find('.tour-default-active');
		if ( defActive ) {
			if (isHomePage) {
				switchPage($(defActive).attr('id'), false, true);
			} else {
				moveTo('#'+$(defActive).attr('id'));
			}
		}		
	}
	
	function switchPage(dispElId, animateReplace, isHomePage) {
		var elSel = '#' + dispElId; 
		
		// remove image proxies
		subImgProxy($(elSel));

		// Determine whether scrollbar is at top or not. if not we need to scroll up.
		var ScrollTop = document.body.scrollTop;
		if (ScrollTop == 0) {
    		if (window.pageYOffset) {
				ScrollTop = window.pageYOffset;
			} else {
				ScrollTop = (document.body.parentElement) ? document.body.parentElement.scrollTop : 0;
			}
		}
		if ( ScrollTop != 0 ) {
			$(window).scrollTo(0, {duration: 250, onAfter: function() { replaceContent(elSel, animateReplace) }});
			replaceContent(elSel, animateReplace);	
		} else {
			replaceContent(elSel, animateReplace); 
		} 
		// mimic replaced browser behavior for anchorhashes
		if (!isHomePage) {
			window.location = '#' + dispElId;
		}
	}

	function replaceContent(elSel, animateReplace) {
		if ( animateReplace ) {
            $('.tour-active').fadeOut(300, function(){
                replaceContent_HideOld(elSel);
                $(elSel).fadeIn(300, function(){
                    replaceContent_ShowNew(elSel);
                })
            });
		} else {
			replaceContent_HideOld(elSel);
			replaceContent_ShowNew(elSel);
		}
	}
	
	function replaceContent_ShowNew(elSel) {
		$(elSel).removeClass('tour-inactive');
		$(elSel).addClass('tour-active');
	}
	
	function replaceContent_HideOld(elSel) {
		$('.tour-item.tour-active').removeClass('tour-active');
		$('.tour-item.tour-active').addClass('tour-inactive');
	}
	
	function moveTo(linkEl, animateReplace) {
		var elId, tourLnk = tourLinks();
		if ('object' == typeof linkEl) {
			var href = $(linkEl).attr('href');
			if ( !href ) {
				return;
			}
			elId = href.split('#')[1];
			linkEl = tourIdx(linkEl);
		} else if ('number' == typeof linkEl) {
			var tLink = tourLnk[linkEl];
			if (!tLink) {
				return;
			}
			elId = $(tLink).attr('href').split('#')[1];
		} else if ('string' == typeof linkEl) {
			elId = linkEl.split('#')[1];
			var accordLinks = $(tourCt).find('a[href="#'+elId+'"]');
			linkEl = tourIdx(accordLinks[0]);
		}
		
		switchPage(elId, animateReplace);
		
		tourCt.data('activeidx', linkEl); // Record the current index
		$(tourCt).find('.tourlink-active').removeClass('tourlink-active');
		$(tourLnk[linkEl]).addClass('tourlink-active'); // Set the active class
		$(tourLnk[linkEl]).parent('.tourlink-wrap').addClass('tourlink-active');
		$(tourLnk[linkEl]).trigger('visit'); // <a> element dispatches visit event when visited
	}
	
	function tourIdx(linkEl) {
		return tourLinks().index(linkEl);
	}
	
	function tourLinks() {
		return $(tourCt).find('.tourlink');
	}
	
	function getPrevTourIdx() {
		var prevIdx = $(tourCt).data('activeidx') - 1;
		if ( prevIdx < 0 ) {
			prevIdx = (tourLinks().length - 1);
		}
		return prevIdx;		
	}
	
    function getNextTourIdx(){
		var nextIdx = $(tourCt).data('activeidx') + 1;
		if ( nextIdx > (tourLinks().length - 1) ) {
			nextIdx = 0;
		}
		return nextIdx;
    }
	
	function calcNavLinks() {
		var tourLnk = tourLinks();
		$('#tour-next').attr('href', $(tourLnk[getNextTourIdx()]).attr('href'));
		$('#tour-prev').attr('href', $(tourLnk[getPrevTourIdx()]).attr('href'));
	}

	$.linkTour = function(action, el, option) {
		if ( !action ) {
			action = 'init';
		}
		
		switch ( action ) {
			case 'init':
				tourCt = el; // Store tour container in scope
				
				var opts = $.extend({}, $.linkTour.defaults, option);
				ssBorderHovColor = opts.ssBorderHovColor;
				ssBorderOffColor = opts.ssBorderOffColor;
				
				$(tourCt).data('activeidx', 0);
				$(tourCt).click(function(event){
					var aTarget = $(event.target).closest('a');
					if ( aTarget ) {
						if (event) {
							event.preventDefault();
						}
						moveTo(aTarget, true);
					}
				});
				$('#tour-next').click(function(event){
					if (event) {
						event.preventDefault();
					} 
					$.linkTour('next');
				});
				$('#tour-prev').click(function(event){
					if (event) {
						event.preventDefault();
					}
					$.linkTour('prev');
				});
				$(window).history(function(event){ // requires history plugin: http://plugins.jquery.com/project/history-hashchange
					if (window.location.hash.length > 0) {
						moveTo(window.location.href, true);
					} else {
						switchToDefault(true);
					}
				});
				// Move based on the initial link the user used
				if ( window.location.hash.length > 0 ) {
					moveTo(window.location.href, false);	
				} else {
					// Take the default
					switchToDefault();
				}
				$('body').append('<div id="screenshot-mask" style="display:none"></div>');
				
				$('div.screenshot').hover(function(evt){
					var ss = $(evt.target).closest('div.screenshot');
					if ( ss.length ) {
						$(ss[0]).stop().animate({
							'borderTopColor': ssBorderHovColor,
							'borderBottomColor': ssBorderHovColor,
							'borderLeftColor': ssBorderHovColor,
							'borderRightColor': ssBorderHovColor
						}, {queue: false, duration: 'fast'});
					}
				}, function(evt){
					var ss = $(evt.target).closest('div.screenshot');
					if ( ss.length ) {
						$(ss[0]).stop().animate({
							'borderBottomColor': ssBorderOffColor,
							'borderTopColor': ssBorderOffColor,
							'borderLeftColor': ssBorderOffColor,
							'borderRightColor': ssBorderOffColor
						}, {queue: false, duration: 'fast'});
					}
				});
				
				calcNavLinks();
				break;
			case 'next':
				$(tourCt).data('activeidx', getNextTourIdx());
				moveTo($(tourCt).data('activeidx'), true);
				break;
			case 'prev':
				$(tourCt).data('activeidx', getPrevTourIdx());
				moveTo($(tourCt).data('activeidx'), true);
				break;
			case 'move':
				var idx = tourIdx(option);
				if ( idx != -1 ) {
					moveTo(idx, true);
				}
				break;
		}
		
	};
	
	$.linkTour.defaults = {
		ssBorderHovColor : '#fcc158',
		ssBorderOffColor : '#111213'
	};
})(jQuery);
