The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
/**
 * Open file(s) dialog
 */
$(function() {
	var $dialog    = $("#open-files-dialog");

	// Find file
	var findFile = function() {
		var filename = $("#file", $dialog).val();
		$("#matched-files", $dialog).empty();
		$("#ok-button", $dialog).attr("disabled","disabled");
		
		// Send a websocket-based message to find this file
		window.sendMessage("find-file", { "filename": filename }, function(results) {
			// Build matched files HTML
			var html = '';
			for(var i = 0; i < results.length; i++) {
				var result = results[i];
				html += "<option id='" + result.id + "' "  + 
					((i === 0) ? "selected" : "") + 
					">" + 
					result.name + 
					"</option>";
			}

			// OK button is disabled for now
			$("#ok-button", $dialog).removeAttr("disabled");

			// Add matched files HTML
			$("#matched-files", $dialog).html(html);

			// On each selection change in the matched files list, display the corresponding path
			$("#matched-files", $dialog).change(function() {
				var html = [];
				$("#matched-files :selected", $dialog).each(function(key, value) {
					html.push($(value).attr("id"));
				});
				$("#path", $dialog).html(html.join("<br>"));
			});

			$("#matched-files :selected", $dialog).change();

		});
	};

	// Called the open files action is triggered
	$(document).on('action-open-file', function() {
		// Open the dialog
		$dialog.modal('show');
		
		// Called when the dialog is shown
		$dialog.on('shown', function() {
			$("#file", $dialog).val('').focus();
			$("#matched-files", $dialog).empty();
			$("#ok-button", $dialog).attr("disabled","disabled");
			findFile();
		});
	});

	// On each file text field input change find that file
	var timeoutId;
	$("#file", $dialog).on('input', function() {
		clearTimeout(timeoutId);
		timeoutId = setTimeout(function() {
			findFile();
		}, 250);
	});

	// Handle DOWN and ENTER
	$("#file", $dialog).keyup(function(e) {
		var keyCode = e.keyCode;
		if(keyCode == 40) {
			// Focus on the matched file list
			$("#matched-files", $dialog).focus();
		} else if(keyCode == 13) {
			// Open selected file(s)
			$("#ok-button", $dialog).click();
		}
	});

	// Handle double click event on the matched files list as an action trigger
	$("#matched-files", $dialog).dblclick(function() {
		$("#ok-button", $dialog).click();
	});
	
	if(navigator.userAgent.indexOf("Firefox") != -1) {
		// Firefox-specfic bug: Enter resets multiple selection to currently selected
		$("#matched-files", $dialog).keypress(function(e) {
			if(e.keyCode == 13) {
				// Open selected file(s)
				$("#ok-button", $dialog).click();
			}
		});
	} else {
		// Non-firefox browsers
		$("#matched-files", $dialog).keyup(function(e) {
			if(e.keyCode == 13) {
				// Open selected file(s)
				$("#ok-button", $dialog).click();
			}
		});
	}

	// Called when the OK button is clicked
	$("#ok-button", $dialog).click(function() {

		if($(this).is(':disabled')) {
			// Do nothing if the button is disabled
			return;
		}

		// Open selected file(s)
		$("#matched-files option:selected", $dialog).each(function(key, value) { 
			var filename = $(value).attr("id");

			if (filename.length === 0) {
				console.warn("file name is empty");
				return;
			}

			// Send an open-file websocket message
			window.sendMessage(
				"open-file", { "filename": filename }, function(result) {
					if(result.ok) {
						// Open the file in a new tab
						AddEditorTab(result.filename, filename, result.mode, result.value);
					} else {
						// Error
						alert(result.value);
					}
				}
			);
		});

	});

});