﻿/// <reference path="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.5-vsdoc.js" />
///<reference path="http://ajax.microsoft.com/ajax/jquery.templates/beta1/jquery.tmpl.js" />
///<reference path="/debugversions/underscore.js" />
/// <reference path="BondiTouch.Toc.js" />
/// <reference path="BondiTouch.IssueListing.js" />
///<reference path="/Scripts/BondiTouch.Utility.js" />
///<reference path="/Scripts/BondiTouch.Tasks.js" />
///<reference path="/Scripts/BondiTouch.Core.js" />

_b.Workflow = {

	/*______________________________________________________________________________________________________________________________________________________________________________________*/
	executeIssueLoad: function (state) {
		///<summary>Load page resources and set state in appropriate order.</summary>
		var cb = _b.Workflow.executeIssueLoad;
		if (!state) {
			// first task
			_b.Tasks.checkIssueState(cb);
			return;
		};
		// debug.log("executeIssueLoad: " + state);
		//TODO: use optimized version of timeout code that only calls setTimeout before the next op if we've already taken a while (Zakas or Souders - forget which)
		setTimeout(function (state) {
			switch (state) {
				case "checkIssueState_Done":
					_b.Tasks.displayWorking(cb);
					break;
				case "displayWorking_Done":
					_b.Tasks.loadIssueData(cb);
					// hook up the search events while we're waiting for the issue data
					_b.Search.onReady();
					break;
				case "loadIssueData_Done":
					_b.Tasks.setScreenSize(cb);
					break;
				case "setScreenSize_Done":
					_b.Tasks.setScreenMode(cb);
					break;
				case "setScreenMode_Done":
					_b.Tasks.displayPaging(cb);
					break;
				case "displayPaging_Done":
					_b.Tasks.createThumbnails(cb);
					break;
				case "createThumbnails_Done":
					_b.Tasks.setCurrentPageIndex(cb);
					break;
				case "setCurrentPageIndex_Done":
					_b.Tasks.resizeImages(cb);
					break;
				case "resizeImages_Done":
					_b.Tasks.transitionScreenToPage(cb);
					break;
				case "transitionScreenToPage_Done":
					_b.Tasks.cacheState(cb);
					break;
				case "cacheState_Done":
					_b.Tasks.transitionThumbstrip(cb);
					break;
				case "transitionThumbstrip_Done":
					_b.Tasks.loadThumbnailsInitial(cb);
					break;
				case "loadThumbnailsInitial_Done":
					_b.Tasks.hideWorking(cb);
					break;
				case "hideWorking_Done":
					_b.Tasks.hidePaging(cb);
					break;
				case "hidePaging_Done":
					_b.Tasks.loadJumpLinks(cb);
					break;
				case "loadJumpLinks_Done":
					_b.Tasks.loadThumbnailsRemaining(cb);
					break;
				case "loadThumbnailsRemaining_Done":
					_b.Tasks.displayJumpLinks(cb);
					break;
				case "displayJumpLinks_Done":
					//continue in post-load
					_b.Workflow.executeIssuePostLoad();
					break;
			};
		}, 25, state);
	},

	/*______________________________________________________________________________________________________________________________________________________________________________________*/
	executeIssuePostLoad: function (state) {
		if (!state) {
			setTimeout(function () {
				//Configure post load modules
				//debug.trace();
				//debug.log({ "executeIssuePostLoad": _b.Core.pageListing });
				_b.IssueListing.loadTimeline();
				_b.Tasks.resizeFullHeightMenus();
				_b.Toc.load(_b.Core.navState.issueKey);
			}, 100);
			return;
		}
	},

	/*______________________________________________________________________________________________________________________________________________________________________________________*/
	// TODO: if we call executePagination()
	// with no change in currentIndex, itemsInTransition
	// gets set to something >0, and then Core.onFilmStripClick
	// fails to paginate, assuming a transition is in progress.
	executePagination: function (state) {
		var cb = _b.Workflow.executePagination;
		if (!state) {
			// First operation
			_b.Tasks.transitionScreenToPage(cb);
			return;
		};
		setTimeout(function (state) {
			switch (state) {
				case "transitionScreenToPage_Done":
					_b.Tasks.transitionThumbstrip(cb);
					break;
				case "transitionThumbstrip_Done":
					_b.Tasks.cacheState(cb);
					break;
				case "cacheState_Done":
					_b.Tasks.displayJumpLinks(cb);
					break;
				case "displayJumpLinks_Done":
					_b.Tasks.displaySearchTermHighlights(cb);
					break;
				case "displaySearchTermHighlights_Done":
					// NEXT
					break;
			};
		}, 25, state);
	},

	/*______________________________________________________________________________________________________________________________________________________________________________________*/
	executeResize: function (state) {
		var cb = _b.Workflow.executeResize;
		if (!state) {
			_b.Tasks.displayWorking(cb);
			return;
		};
		setTimeout(function (state) {
			switch (state) {
				case "displayWorking_Done":
					_b.Tasks.setScreenSize(cb);
					break;
				case "setScreenSize_Done":
					_b.Tasks.setScreenMode(cb);
					break;
				case "setScreenMode_Done":
					_b.Tasks.displayPaging(cb);
					break;
				case "displayPaging_Done":
					_b.Tasks.resizeImages(cb);
					break;
				case "resizeImages_Done":
					_b.Tasks.transitionScreenToPage(cb);
					break;
				case "transitionScreenToPage_Done":
					_b.Tasks.transitionThumbstrip(cb);
					break;
				case "transitionThumbstrip_Done":
					_b.Tasks.hideWorking(cb);
					break;
				case "hideWorking_Done":
					_b.Tasks.hidePaging(cb);
					break;
				case "hidePaging_Done":
					_b.Tasks.resizeFullHeightMenus(cb);
					break;
				case "resizeFullHeightMenus_Done":
					_b.Tasks.resizeOverlays(cb);
					break;
				case "resizeOverlays_Done":
					_b.Tasks.displayJumpLinks(cb);
					break;
				case "displayJumpLinks_Done":
					// NEXT
					break;
			};
		}, 25, state);
	}

};


