1 /**
  2  * Creates a new OpenDocumentView. This view shows a dialog from which the user
  3  * can select a mind map from the local storage or a hard disk.
  4  * 
  5  * @constructor
  6  */
  7 mindmaps.OpenDocumentView = function() {
  8 	var self = this;
  9 
 10 	// create dialog
 11 	var $dialog = $("#template-open").tmpl().dialog({
 12 		autoOpen : false,
 13 		modal : true,
 14 		zIndex : 5000,
 15 		width : 550,
 16 		close : function() {
 17 			$(this).dialog("destroy");
 18 			$(this).remove();
 19 		}
 20 	});
 21 
 22 	$dialog.find("input").bind("change", function(e) {
 23 		if (self.openExernalFileClicked) {
 24 			self.openExernalFileClicked(e);
 25 		}
 26 	});
 27 
 28 	var $table = $dialog.find(".localstorage-filelist");
 29 	$table.delegate("a.title", "click", function() {
 30 		if (self.documentClicked) {
 31 			var t = $(this).tmplItem();
 32 			self.documentClicked(t.data);
 33 		}
 34 	}).delegate("a.delete", "click", function() {
 35 		if (self.deleteDocumentClicked) {
 36 			var t = $(this).tmplItem();
 37 			self.deleteDocumentClicked(t.data);
 38 		}
 39 	});
 40 
 41 	/**
 42 	 * Render list of documents in the local storage
 43 	 * 
 44 	 * @param {mindmaps.Document[]} docs
 45 	 */
 46 	this.render = function(docs) {
 47 		// empty list and insert list of documents
 48 		var $list = $(".document-list", $dialog).empty();
 49 
 50 		$("#template-open-table-item").tmpl(docs, {
 51 			format : function(date) {
 52 				var day = date.getDate();
 53 				var month = date.getMonth() + 1;
 54 				var year = date.getFullYear();
 55 				return day + "/" + month + "/" + year;
 56 			}
 57 		}).appendTo($list);
 58 	};
 59 
 60 	/**
 61 	 * Shows the dialog.
 62 	 * 
 63 	 * @param {mindmaps.Document[]} docs
 64 	 */
 65 	this.showOpenDialog = function(docs) {
 66 		this.render(docs);
 67 		$dialog.dialog("open");
 68 	};
 69 
 70 	/**
 71 	 * Hides the dialog.
 72 	 */
 73 	this.hideOpenDialog = function() {
 74 		$dialog.dialog("close");
 75 	};
 76 };
 77 
 78 /**
 79  * Creates a new OpenDocumentPresenter. The presenter can load documents from
 80  * the local storage or hard disk.
 81  * 
 82  * @constructor
 83  * @param {mindmaps.EventBus} eventBus
 84  * @param {mindmaps.MindMapModel} mindmapModel
 85  * @param {mindmaps.OpenDocumentView} view
 86  */
 87 mindmaps.OpenDocumentPresenter = function(eventBus, mindmapModel, view) {
 88 
 89 	// TODO experimental, catch errrs
 90 	// http://www.w3.org/TR/FileAPI/#dfn-filereader
 91 	/**
 92 	 * View callback: external file has been selected. Try to read and parse a
 93 	 * valid mindmaps Document.
 94 	 * 
 95 	 * @ignore
 96 	 */
 97 	view.openExernalFileClicked = function(e) {
 98 		var files = e.target.files;
 99 		var file = files[0];
100 
101 		var reader = new FileReader();
102 		reader.onload = function() {
103 			var doc = mindmaps.Document.fromJSON(reader.result);
104 			mindmapModel.setDocument(doc);
105 			view.hideOpenDialog();
106 		};
107 
108 		reader.readAsText(file);
109 	};
110 
111 	/**
112 	 * View callback: A document in the local storage list has been clicked.
113 	 * Load the document and close view.
114 	 * 
115 	 * @ignore
116 	 * @param {mindmaps.Document} doc
117 	 */
118 	view.documentClicked = function(doc) {
119 		mindmapModel.setDocument(doc);
120 		view.hideOpenDialog();
121 	};
122 
123 	/**
124 	 * View callback: The delete link the local storage list has been clicked.
125 	 * Delete the document, and render list again.
126 	 * 
127 	 * @ignore
128 	 * @param {mindmaps.Document} doc
129 	 */
130 	view.deleteDocumentClicked = function(doc) {
131 		// TODO event
132 		mindmaps.LocalDocumentStorage.deleteDocument(doc);
133 
134 		// re-render view
135 		var docs = mindmaps.LocalDocumentStorage.getDocuments();
136 		view.render(docs);
137 	};
138 
139 	/**
140 	 * Initialize.
141 	 */
142 	this.go = function() {
143 		var docs = mindmaps.LocalDocumentStorage.getDocuments();
144 		docs.sort(mindmaps.Document.sortByModifiedDateDescending);
145 		view.showOpenDialog(docs);
146 	};
147 };