var module = angular.module("cryto.openng", ["cryto.jsde"]);
module.controller("appController", function(){
});
(function($){
$.fn.restoreIcon = function() {
return this.removeClass().addClass(this.data("old-class"));
};
})(jQuery);
var jsde_creation_hook = function(win)
{
/* This function is a hook that is called after each creation of
* a JSDE window. */
}
var jsde_contents_hook = function(win)
{
/* This function is a hook that is called after each time
* content is set in a JSDE window. */
placeHooksForWindow(win);
}
notification_popups = [];
error_popups = [];
template_cache = {};
function hookSubmitEvent(form, callback, error)
{
/* Hooks a form to be submitted via AJAX, executing the given
* callback if the request succeeds.
*
* form: a jQuery object containing one or more form elements
* callback: the function to run after a successful request
* error: optionally, a callback function to run when the
* request fails
*/
form.each(function(index){
var element = $(this);
var method = element.attr("method");
var target = element.attr("action");
if(typeof method !== "undefined")
{
method = method.toUpperCase();
}
else
{
method = "GET";
}
element.submit(function(){
var submit_button = element.find("button[type=submit]");
var submit_icon = submit_button.data("submit-icon");
if(typeof submit_icon !== "undefined")
{
/* First we will try to replace an existing icon
* in the button. If there is no icon yet, the
* entire contents of the button will be replaced
* with the submission icon. */
var current_icon = submit_button.find("i");
if(current_icon.length == 0)
{
submit_button.html("");
current_icon = element.find("i");
}
current_icon.data("old-class", current_icon.attr("class")).removeClass().addClass(submit_icon);
}
var formdata = element.serialize();
console.log(formdata);
$.ajax({
type: method,
url: target,
data: formdata,
dataType: "json",
success: function(data, xhr){ console.log(data); callback(element, data, xhr); },
error: function(data, xhr, err){ if(typeof error !== "undefined") { error(element, data, xhr, err); } /* This handles HTTP errors, NOT application errors! */ }
});
return false;
});
});
}
function placeHooksForWindow(win)
{
console.log();
$(win._outer).find("form").each(function(){
var callback = $(this).data("hook-callback");
var error_callback = $(this).data("hook-error-callback");
if(typeof callback !== "undefined")
{
console.log("Hooking", this, "using callback", callback);
hookSubmitEvent($(this), window[callback], window[error_callback]);
}
});
}
function callbackNodeCreated(form, data)
{
if(data.result == "success")
{
spawnNotification(data.message);
var node_id = data.node_id;
form.getWindow().Close();
openWindowNodeDetails(node_id);
}
else if(data.result == "error")
{
form.find("button[type=submit] i").restoreIcon();
form.find("input, textarea").removeClass("invalid");
if(data.errorfields)
{
for(i in data.errorfields)
{
var field_name = data.errorfields[i];
form.find("input[name=" + field_name + "], textarea[name=" + field_name + "]").addClass("invalid");
}
}
spawnError(data.message);
}
}
function openWindowNodeDetails(id)
{
new JsdeWindow({
width: 680,
height: 420,
x: 100,
y: 100,
title: "Node lookup",
contents: "Loading...",
source_url: "/nodes/" + id
});
}
/*function callbackNodeCreationFailed(form, data)
{
form.find("button[type=submit]").restoreIcon();
}*/
function spawnNotification(message)
{
var popup = spawnPopup(message, "notification");
notification_popups.push(popup);
}
function spawnError(message)
{
var popup = spawnPopup(message, "error");
error_popups.push(popup);
}
function spawnPopup(message, template)
{
var popup = $("#jsde_templates").find(".template_" + template).clone().removeClass("template_notification template_error");
popup.find(".message").html(message.replace("\n", "
"));
popup.hide();
popup.prependTo("#notification_area");
popup.fadeIn(300).wait(5000).fadeOut(400, $).remove();
return popup
}
function spawnTemplate(name)
{
if(!template_cache[name])
{
template_cache[name] = $("*[data-template-name=" + name + "]").first();
}
return template_cache[name].clone();
}
function SearchCompletionSource(element)
{
this.element = element;
this.results = [];
}
SearchCompletionSource.prototype.getItemCount = function() {
return this.results.length;
}
SearchCompletionSource.prototype.getAll = function() {
return this.results;
}
SearchCompletionSource.prototype.getItem = function(index) {
return this.results[index];
}
SearchCompletionSource.prototype.updateItems = function(query, callback) {
if(typeof this.request !== "undefined")
{
this.request.abort();
}
this.request = $.ajax({
url: "/autocomplete/search/?q=" + escape(query),
dataType: "json",
success: function(result) { this.results = result; callback(); }.bind(this)
});
}
SearchCompletionSource.prototype.isInItems = function(query) {
for(i in this.results)
{
if(this.results[i].indexOf(query) > 0)
{
return true;
}
}
return false;
}
SearchCompletionSource.prototype.matchesItem = function(index, query) {
return (this.results[index].name.toLowerCase().indexOf(query.toLowerCase()) > -1);
}
function PropertyNameCompletionSource(element)
{
this.element = element;
this.results = [];
}
PropertyNameCompletionSource.prototype.getItemCount = function() {
return this.results.length;
}
PropertyNameCompletionSource.prototype.getAll = function() {
return this.results;
}
PropertyNameCompletionSource.prototype.getItem = function(index) {
return this.results[index];
}
PropertyNameCompletionSource.prototype.updateItems = function(query, callback) {
if(typeof this.request !== "undefined")
{
this.request.abort();
}
this.request = $.ajax({
url: "/autocomplete/propertyname/?q=" + escape(query),
dataType: "json",
success: function(result) { this.results = result; callback(); }.bind(this)
});
}
PropertyNameCompletionSource.prototype.isInItems = function(query) {
for(i in this.results)
{
if(this.results[i].indexOf(query) > 0)
{
return true;
}
}
return false;
}
PropertyNameCompletionSource.prototype.matchesItem = function(index, query) {
console.log("item", this.results[index].value.toLowerCase());
console.log("query", query.toLowerCase());
console.log("result", this.results[index].value.toLowerCase().indexOf(query.toLowerCase()));
return (this.results[index].value.toLowerCase().indexOf(query.toLowerCase()) > -1);
}
$(function(){
hookSubmitEvent($("#form_search"));
$("#button_toolbar_addnode").click(function(){
var win = new JsdeWindow({
width: 320,
height: 400,
x: 40,
y: 40,
title: "Create new node",
contents: "Loading...",
source_url: "/nodes/create",
callback: function(){ $(win._inner).find("input[name=name]").focus(); },
noscroll: true
});
});
/* Intro screen */
new JsdeWindow({
width: 640,
height: 480,
x: ($(window).width() / 2) - (640 / 2),
y: ($(window).height() / 2) - (480 / 2),
title: "Welcome!",
contents: "Loading...",
source_url: "/intro"
});
spawnNotification("Test notification");
spawnError("Test error");
$("body").on("input", ".auto-duplicate input", function(){
var parent = $(this).closest(".auto-duplicate");
if(!parent.data("duplicated"))
{
spawnTemplate(parent.data("template-name")).insertAfter(parent).find("input").val("");
parent.data("duplicated", true);
}
});
autocompleter_search = new AutoCompleter("search");
$("#input_search_query").autoComplete(autocompleter_search, SearchCompletionSource, function(data){
openWindowNodeDetails(data.value);
this.target.val("");
});
autocompleter_propertyname = new AutoCompleter("propertyname");
$("body").autoComplete(autocompleter_propertyname, PropertyNameCompletionSource, "input.input-propertyname");
$("body").keydown(function(event){
switch(event.which)
{
case 70: // F
if(event.ctrlKey)
{
$("#input_search_query").focus();
event.preventDefault();
}
break;
case 77: // M
if(event.ctrlKey)
{
$("#button_toolbar_addnode").click();
event.preventDefault();
}
break;
}
});
});