/*\
title: $:/core/modules/story.js
type: application/javascript
module-type: global

Lightweight object for managing interactions with the story and history lists.

\*/
(function(){

/*jslint node: true, browser: true */
/*global $tw: false */
"use strict";

/*
Construct Story object with options:
wiki: reference to wiki object to use to resolve tiddler titles
storyTitle: title of story list tiddler
historyTitle: title of history list tiddler
*/
function Story(options) {
	options = options || {};
	this.wiki = options.wiki || $tw.wiki;
	this.storyTitle = options.storyTitle || "$:/StoryList";
	this.historyTitle = options.historyTitle || "$:/HistoryList";
};

Story.prototype.navigateTiddler = function(navigateTo,navigateFromTitle,navigateFromClientRect) {
	this.addToStory(navigateTo,navigateFromTitle);
	this.addToHistory(navigateTo,navigateFromClientRect);
};

Story.prototype.getStoryList = function() {
	return this.wiki.getTiddlerList(this.storyTitle) || [];
};

Story.prototype.addToStory = function(navigateTo,navigateFromTitle,options) {
	options = options || {};
	var storyList = this.getStoryList();
	// See if the tiddler is already there
	var slot = storyList.indexOf(navigateTo);
	// Quit if it already exists in the story river
	if(slot >= 0) {
		return;
	}
	// First we try to find the position of the story element we navigated from
	var fromIndex = storyList.indexOf(navigateFromTitle);
	if(fromIndex >= 0) {
		// The tiddler is added from inside the river
		// Determine where to insert the tiddler; Fallback is "below"
		switch(options.openLinkFromInsideRiver) {
			case "top":
				slot = 0;
				break;
			case "bottom":
				slot = storyList.length;
				break;
			case "above":
				slot = fromIndex;
				break;
			case "below": // Intentional fall-through
			default:
				slot = fromIndex + 1;
				break;
		}
	} else {
		// The tiddler is opened from outside the river. Determine where to insert the tiddler; default is "top"
		if(options.openLinkFromOutsideRiver === "bottom") {
			// Insert at bottom
			slot = storyList.length;
		} else {
			// Insert at top
			slot = 0;
		}
	}
	// Add the tiddler
	storyList.splice(slot,0,navigateTo);
	// Save the story
	this.saveStoryList(storyList);
};

Story.prototype.saveStoryList = function(storyList) {
	var storyTiddler = this.wiki.getTiddler(this.storyTitle);
	this.wiki.addTiddler(new $tw.Tiddler(
		this.wiki.getCreationFields(),
		{title: this.storyTitle},
		storyTiddler,
		{list: storyList},
		this.wiki.getModificationFields()
	));
};

Story.prototype.addToHistory = function(navigateTo,navigateFromClientRect) {
	var titles = $tw.utils.isArray(navigateTo) ? navigateTo : [navigateTo];
	// Add a new record to the top of the history stack
	var historyList = this.wiki.getTiddlerData(this.historyTitle,[]);
	$tw.utils.each(titles,function(title) {
		historyList.push({title: title, fromPageRect: navigateFromClientRect});
	});
	this.wiki.setTiddlerData(this.historyTitle,historyList,{"current-tiddler": titles[titles.length-1]});
};

Story.prototype.storyCloseTiddler = function(targetTitle) {
// TBD
};

Story.prototype.storyCloseAllTiddlers = function() {
// TBD
};

Story.prototype.storyCloseOtherTiddlers = function(targetTitle) {
// TBD
};

Story.prototype.storyEditTiddler = function(targetTitle) {
// TBD
};

Story.prototype.storyDeleteTiddler = function(targetTitle) {
// TBD
};

Story.prototype.storySaveTiddler = function(targetTitle) {
// TBD
};

Story.prototype.storyCancelTiddler = function(targetTitle) {
// TBD
};

Story.prototype.storyNewTiddler = function(targetTitle) {
// TBD
};

exports.Story = Story;


})();