diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ef1b45e --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.project +/temp \ No newline at end of file diff --git a/_site/css/960.css b/_site/css/960.css deleted file mode 100644 index 260fa15..0000000 --- a/_site/css/960.css +++ /dev/null @@ -1,653 +0,0 @@ -/* - 960 Grid System ~ Core CSS. - Learn more ~ http://960.gs/ - - Licensed under GPL and MIT. -*/ - -/* - Forces backgrounds to span full width, - even if there is horizontal scrolling. - Increase this if your layout is wider. - - Note: IE6 works fine without this fix. -*/ - -body { - min-width: 960px; -} - -/* `Container -----------------------------------------------------------------------------------------------------*/ - -.container_12, -.container_16 { - margin-left: auto; - margin-right: auto; - width: 960px; -} - -/* `Grid >> Global -----------------------------------------------------------------------------------------------------*/ - -.grid_1, -.grid_2, -.grid_3, -.grid_4, -.grid_5, -.grid_6, -.grid_7, -.grid_8, -.grid_9, -.grid_10, -.grid_11, -.grid_12, -.grid_13, -.grid_14, -.grid_15, -.grid_16 { - display: inline; - float: left; - margin-left: 10px; - margin-right: 10px; -} - -.push_1, .pull_1, -.push_2, .pull_2, -.push_3, .pull_3, -.push_4, .pull_4, -.push_5, .pull_5, -.push_6, .pull_6, -.push_7, .pull_7, -.push_8, .pull_8, -.push_9, .pull_9, -.push_10, .pull_10, -.push_11, .pull_11, -.push_12, .pull_12, -.push_13, .pull_13, -.push_14, .pull_14, -.push_15, .pull_15 { - position: relative; -} - -.container_12 .grid_3, -.container_16 .grid_4 { - width: 220px; -} - -.container_12 .grid_6, -.container_16 .grid_8 { - width: 460px; -} - -.container_12 .grid_9, -.container_16 .grid_12 { - width: 700px; -} - -.container_12 .grid_12, -.container_16 .grid_16 { - width: 940px; -} - -/* `Grid >> Children (Alpha ~ First, Omega ~ Last) -----------------------------------------------------------------------------------------------------*/ - -.alpha { - margin-left: 0; -} - -.omega { - margin-right: 0; -} - -/* `Grid >> 12 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_12 .grid_1 { - width: 60px; -} - -.container_12 .grid_2 { - width: 140px; -} - -.container_12 .grid_4 { - width: 300px; -} - -.container_12 .grid_5 { - width: 380px; -} - -.container_12 .grid_7 { - width: 540px; -} - -.container_12 .grid_8 { - width: 620px; -} - -.container_12 .grid_10 { - width: 780px; -} - -.container_12 .grid_11 { - width: 860px; -} - -/* `Grid >> 16 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_16 .grid_1 { - width: 40px; -} - -.container_16 .grid_2 { - width: 100px; -} - -.container_16 .grid_3 { - width: 160px; -} - -.container_16 .grid_5 { - width: 280px; -} - -.container_16 .grid_6 { - width: 340px; -} - -.container_16 .grid_7 { - width: 400px; -} - -.container_16 .grid_9 { - width: 520px; -} - -.container_16 .grid_10 { - width: 580px; -} - -.container_16 .grid_11 { - width: 640px; -} - -.container_16 .grid_13 { - width: 760px; -} - -.container_16 .grid_14 { - width: 820px; -} - -.container_16 .grid_15 { - width: 880px; -} - -/* `Prefix Extra Space >> Global -----------------------------------------------------------------------------------------------------*/ - -.container_12 .prefix_3, -.container_16 .prefix_4 { - padding-left: 240px; -} - -.container_12 .prefix_6, -.container_16 .prefix_8 { - padding-left: 480px; -} - -.container_12 .prefix_9, -.container_16 .prefix_12 { - padding-left: 720px; -} - -/* `Prefix Extra Space >> 12 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_12 .prefix_1 { - padding-left: 80px; -} - -.container_12 .prefix_2 { - padding-left: 160px; -} - -.container_12 .prefix_4 { - padding-left: 320px; -} - -.container_12 .prefix_5 { - padding-left: 400px; -} - -.container_12 .prefix_7 { - padding-left: 560px; -} - -.container_12 .prefix_8 { - padding-left: 640px; -} - -.container_12 .prefix_10 { - padding-left: 800px; -} - -.container_12 .prefix_11 { - padding-left: 880px; -} - -/* `Prefix Extra Space >> 16 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_16 .prefix_1 { - padding-left: 60px; -} - -.container_16 .prefix_2 { - padding-left: 120px; -} - -.container_16 .prefix_3 { - padding-left: 180px; -} - -.container_16 .prefix_5 { - padding-left: 300px; -} - -.container_16 .prefix_6 { - padding-left: 360px; -} - -.container_16 .prefix_7 { - padding-left: 420px; -} - -.container_16 .prefix_9 { - padding-left: 540px; -} - -.container_16 .prefix_10 { - padding-left: 600px; -} - -.container_16 .prefix_11 { - padding-left: 660px; -} - -.container_16 .prefix_13 { - padding-left: 780px; -} - -.container_16 .prefix_14 { - padding-left: 840px; -} - -.container_16 .prefix_15 { - padding-left: 900px; -} - -/* `Suffix Extra Space >> Global -----------------------------------------------------------------------------------------------------*/ - -.container_12 .suffix_3, -.container_16 .suffix_4 { - padding-right: 240px; -} - -.container_12 .suffix_6, -.container_16 .suffix_8 { - padding-right: 480px; -} - -.container_12 .suffix_9, -.container_16 .suffix_12 { - padding-right: 720px; -} - -/* `Suffix Extra Space >> 12 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_12 .suffix_1 { - padding-right: 80px; -} - -.container_12 .suffix_2 { - padding-right: 160px; -} - -.container_12 .suffix_4 { - padding-right: 320px; -} - -.container_12 .suffix_5 { - padding-right: 400px; -} - -.container_12 .suffix_7 { - padding-right: 560px; -} - -.container_12 .suffix_8 { - padding-right: 640px; -} - -.container_12 .suffix_10 { - padding-right: 800px; -} - -.container_12 .suffix_11 { - padding-right: 880px; -} - -/* `Suffix Extra Space >> 16 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_16 .suffix_1 { - padding-right: 60px; -} - -.container_16 .suffix_2 { - padding-right: 120px; -} - -.container_16 .suffix_3 { - padding-right: 180px; -} - -.container_16 .suffix_5 { - padding-right: 300px; -} - -.container_16 .suffix_6 { - padding-right: 360px; -} - -.container_16 .suffix_7 { - padding-right: 420px; -} - -.container_16 .suffix_9 { - padding-right: 540px; -} - -.container_16 .suffix_10 { - padding-right: 600px; -} - -.container_16 .suffix_11 { - padding-right: 660px; -} - -.container_16 .suffix_13 { - padding-right: 780px; -} - -.container_16 .suffix_14 { - padding-right: 840px; -} - -.container_16 .suffix_15 { - padding-right: 900px; -} - -/* `Push Space >> Global -----------------------------------------------------------------------------------------------------*/ - -.container_12 .push_3, -.container_16 .push_4 { - left: 240px; -} - -.container_12 .push_6, -.container_16 .push_8 { - left: 480px; -} - -.container_12 .push_9, -.container_16 .push_12 { - left: 720px; -} - -/* `Push Space >> 12 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_12 .push_1 { - left: 80px; -} - -.container_12 .push_2 { - left: 160px; -} - -.container_12 .push_4 { - left: 320px; -} - -.container_12 .push_5 { - left: 400px; -} - -.container_12 .push_7 { - left: 560px; -} - -.container_12 .push_8 { - left: 640px; -} - -.container_12 .push_10 { - left: 800px; -} - -.container_12 .push_11 { - left: 880px; -} - -/* `Push Space >> 16 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_16 .push_1 { - left: 60px; -} - -.container_16 .push_2 { - left: 120px; -} - -.container_16 .push_3 { - left: 180px; -} - -.container_16 .push_5 { - left: 300px; -} - -.container_16 .push_6 { - left: 360px; -} - -.container_16 .push_7 { - left: 420px; -} - -.container_16 .push_9 { - left: 540px; -} - -.container_16 .push_10 { - left: 600px; -} - -.container_16 .push_11 { - left: 660px; -} - -.container_16 .push_13 { - left: 780px; -} - -.container_16 .push_14 { - left: 840px; -} - -.container_16 .push_15 { - left: 900px; -} - -/* `Pull Space >> Global -----------------------------------------------------------------------------------------------------*/ - -.container_12 .pull_3, -.container_16 .pull_4 { - left: -240px; -} - -.container_12 .pull_6, -.container_16 .pull_8 { - left: -480px; -} - -.container_12 .pull_9, -.container_16 .pull_12 { - left: -720px; -} - -/* `Pull Space >> 12 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_12 .pull_1 { - left: -80px; -} - -.container_12 .pull_2 { - left: -160px; -} - -.container_12 .pull_4 { - left: -320px; -} - -.container_12 .pull_5 { - left: -400px; -} - -.container_12 .pull_7 { - left: -560px; -} - -.container_12 .pull_8 { - left: -640px; -} - -.container_12 .pull_10 { - left: -800px; -} - -.container_12 .pull_11 { - left: -880px; -} - -/* `Pull Space >> 16 Columns -----------------------------------------------------------------------------------------------------*/ - -.container_16 .pull_1 { - left: -60px; -} - -.container_16 .pull_2 { - left: -120px; -} - -.container_16 .pull_3 { - left: -180px; -} - -.container_16 .pull_5 { - left: -300px; -} - -.container_16 .pull_6 { - left: -360px; -} - -.container_16 .pull_7 { - left: -420px; -} - -.container_16 .pull_9 { - left: -540px; -} - -.container_16 .pull_10 { - left: -600px; -} - -.container_16 .pull_11 { - left: -660px; -} - -.container_16 .pull_13 { - left: -780px; -} - -.container_16 .pull_14 { - left: -840px; -} - -.container_16 .pull_15 { - left: -900px; -} - -/* `Clear Floated Elements -----------------------------------------------------------------------------------------------------*/ - -/* http://sonspring.com/journal/clearing-floats */ - -.clear { - clear: both; - display: block; - overflow: hidden; - visibility: hidden; - width: 0; - height: 0; -} - -/* http://www.yuiblog.com/blog/2010/09/27/clearfix-reloaded-overflowhidden-demystified */ - -.clearfix:before, -.clearfix:after, -.container_12:before, -.container_12:after, -.container_16:before, -.container_16:after { - content: '.'; - display: block; - overflow: hidden; - visibility: hidden; - font-size: 0; - line-height: 0; - width: 0; - height: 0; -} - -.clearfix:after, -.container_12:after, -.container_16:after { - clear: both; -} - -/* - The following zoom:1 rule is specifically for IE6 + IE7. - Move to separate stylesheet if invalid CSS is a problem. -*/ - -.clearfix, -.container_12, -.container_16 { - zoom: 1; -} \ No newline at end of file diff --git a/_site/index.html b/_site/index.html index 046fe67..23869de 100644 --- a/_site/index.html +++ b/_site/index.html @@ -1,130 +1,132 @@ - - - - - - SegmentSpy - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - - - \ No newline at end of file + + + + + + SegmentSpy + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+ + + + + diff --git a/_site/js/app.js b/_site/js/app.js index ccef44f..19c70d9 100644 --- a/_site/js/app.js +++ b/_site/js/app.js @@ -1,279 +1,306 @@ -$(document).ready(function () { - (function($) { - - - - var sort_by = function(field, reverse, primer){ - var key = function (x) {return primer ? primer(x[field]) : x[field]}; - return function (a,b) { - var A = key(a), B = key(b); - return (A < B ? -1 : (A > B ? 1 : 0)) * [1,-1][+!!reverse]; - } - } - - function log10(val) { - return Math.log(val) / Math.LN10; - } - - var global = {}; - global.homeTemplate = Handlebars.compile($("#home-template").html()); - global.indicesTemplate = Handlebars.compile($("#indices-template").html()); - global.graphTemplate = Handlebars.compile($("#graph-template").html()); - global.host = window.location.host; - global.graphs = []; - global.previousSegments = {}; - global.loaded = false; - global.refreshInterval = 500; - - - var app = Sammy("body", function() { - - this.use('Handlebars', 'hb'); - - //////////////////////////////////////// - this.helpers({ - - initPage: function() { - var context = this, - acceptedParams = ['host', 'refreshInterval']; - - $.each(acceptedParams, function(index, key) { - var value = context.params[key]; - if (value) { - global[key] = value; - $('#' + key).val(value); - } - }); - - clearTimeout(global.pollID); - - if (global.loaded == false) { - context.loadIndices(); - context.jq_pauseButton(); - context.jq_refreshInterval(); - context.jq_changeHostButton(); - $("#host").val(global.host); - global.loaded = true; - } - }, - - jq_pauseButton: function() { - $("#pause").click(function(e) { - if($(this).hasClass('btn-danger') == true) { - global.pause = true; - $(this).text("Unpause"); - } else { - global.pause = false; - $(this).text("Pause"); +$(document).ready(function () { + (function($) { + + + + var sort_by = function(field, reverse, primer){ + var key = function (x) {return primer ? primer(x[field]) : x[field]}; + return function (a,b) { + var A = key(a), B = key(b); + return (A < B ? -1 : (A > B ? 1 : 0)) * [1,-1][+!!reverse]; + } + } + + function log10(val) { + return Math.log(val) / Math.LN10; + } + + var global = {}; + global.homeTemplate = Handlebars.compile($("#home-template").html()); + global.indicesTemplate = Handlebars.compile($("#indices-template").html()); + global.graphTemplate = Handlebars.compile($("#graph-template").html()); + global.host = window.location.host; + global.graphs = []; + global.previousSegments = {}; + global.loaded = false; + global.refreshInterval = 500; + global.sortIndices = false; + + + var app = Sammy("body", function() { + + this.use('Handlebars', 'hb'); + + //////////////////////////////////////// + this.helpers({ + + initPage: function() { + var context = this, + acceptedParams = ['host', 'refreshInterval']; + + $.each(acceptedParams, function(index, key) { + var value = context.params[key]; + if (value) { + global[key] = value; + $('#' + key).val(value); + } + }); + + clearTimeout(global.pollID); + + if (global.loaded == false) { + context.loadIndices(); + context.jq_pauseButton(); + context.jq_refreshInterval(); + context.jq_changeHostButton(); + $("#host").val(global.host); + global.loaded = true; + } + }, + + jq_pauseButton: function() { + $("#pause").click(function(e) { + if($(this).hasClass('btn-danger') == true) { + global.pause = true; + $(this).text("Unpause"); + } else { + global.pause = false; + $(this).text("Pause"); + } + $(this).toggleClass('btn-danger btn-success'); + }); + }, + + jq_changeHostButton: function() { + var context = this; + $("#changeHost").click(function(e) { + global.host = $("#host").val().replace(/http:\/\//g,""); + global.host = global.host.replace(/\/$/g, ""); + + context.loadIndices(); + }); + }, + + jq_refreshInterval: function() { + $("#changeRefresh").click(function(e) { + global.refreshInterval = $("#refreshInterval").val(); + }); + }, + + loadIndices: function() { + + var context = this; + + var loadOptions = {type: 'get', dataType: 'json'}; + var stateOptions = "?filter_metadata=true&filter_blocks=true"; + context.load("//" + global.host + "/_cluster/state" + stateOptions, loadOptions) + .then(function(state) { + context.cluster_name = state.cluster_name; + context.master_node = state.master_node; + context.indices = []; + $.each(state.routing_table.indices, function (index, v) { + context.indices.push(index.toString()); + }); + + return context; + }) + .render(global.indicesTemplate) + .replace("#indices"); + }, + + + poll: function(index) { + + //Kill caching for all subsequent caching requests + $.ajaxSetup ({ + cache: false + }); + + var formattedIndex = index; + + if (typeof index === 'undefined') { + formattedIndex = "/"; + } else { + formattedIndex += "/"; + } + + var context = this; + + global.pollID = setTimeout(function(){ + + if (global.pause == true) { + context.poll(index); + return; + } + + //console.log("Poll: " + index); + $.getJSON("//" + global.host + "/" + formattedIndex + "_segments/", function(data) { + var segments = {}; + + $.each(data.indices[index].shards, function (shardKey, shardValue) { + $.each(shardValue, function(shardKeyPR, shardValuePR) { + + var divId = "node_" + shardValuePR.routing.node + "_" + shardKey; + + if (typeof segments[divId] === 'undefined') + segments[divId] = []; + + segments[divId].push(['Segment ID', 'Fully Synced', 'Committed', 'Uncommitted', 'Deleted Docs']); + // flushed + $.each(shardValuePR.segments, function (k,v) { + + //bit of math to normalize our values, since Google Charts doesn't do stacked log scales. + var total = v.num_docs + v.deleted_docs; + var deleted = 1 + log10(total) - log10(v.num_docs); + + if (deleted == 1) + deleted = 0; + else if (!isFinite(deleted)) + deleted = 0; + + //artificially boost num_docs by one, so you can see very small segments + v.num_docs += 1; + + //fully committed/flushed and in memory + if (v.search === true && v.committed === true) + segments[divId].push([k, v.num_docs, 0, 0, deleted]); + + //Lucene Committed to disk + else if (v.search === false && v.committed === true) { + segments[divId].push([k, 0, v.num_docs, 0, deleted]); + //console.log('v.search === true && v.committed === false'); + } + + //Resident in NRT IndexReader (in memory), not Lucene Committed yet + else if (v.search === true && v.committed === false){ + segments[divId].push([k, 0, 0, v.num_docs, deleted]); + //console.log(v); + } + + //After reading the ES source, this option does not appear possible + //else if (v.search === false && v.committed === false) + // segments[divId].push([k, 0, 0, 0, v.num_docs, deleted]); + + }); + }); + }); + + if (segments !== {}) { + $.each(segments, function (divId, segmentList) { + if (global.sortIndices){ + segmentList = segmentList.sort(function(a, b) { + //we can do this because only one of these values will be >0 due to + //the quirky need to abuse Google Charts for multicolor + var docsA = a[1] + a[2] + a[3]; + var docsB = b[1] + b[2] + b[3]; + return parseInt(docsB) - parseInt(docsA); + }); + } + var len = segmentList.length; + var j; + for (j = 50; j < len; j += 25); + for (var i = len; i < j; i++) + segments[divId].push(['_0', 0, 0, 0, 0]); + global.graphs[divId].setData(segmentList); + global.graphs[divId].drawChart(); + + + }); + } + + + }) + .always(function() { context.poll(index); }); + },global.refreshInterval); + + }, + }); + ///////////////////////////////////////////// End Helpers + + + this.get('#/', function(context) { + + context.initPage(); + + + context.render(global.homeTemplate) + .replace("#content") + }); + + this.get('#/:index/', function(context) { + + context.initPage(); + + var targetIndex = context.params.index; + + var loadOptions = {type: 'get', dataType: 'json'}; + var stateOptions = "?filter_metadata=true&filter_blocks=true"; + context.load("//" + global.host + "/_cluster/state" + stateOptions, loadOptions) + .then(function(state) { + + context.cluster_name = state.cluster_name; + context.master_node = state.master_node; + + context.nodes = {}; + + try{ + $.each(state.routing_table.indices[targetIndex].shards, function (shardId, shard) { + $.each(shard, function(prId, pr) { + if (pr.node !== null) + var nodeName = state.nodes[pr.node].name; + if (typeof context.nodes[nodeName] === 'undefined') { + + context.nodes[nodeName] = new Array(); + } + + var Pri=''; + var St=''; + if (pr.primary) + Pri = 'Primary '; + if (pr.state === 'UNASSIGNED') + St = 'Unassigned '; + //css ids can't start with numbers, prepend with "node" + context.nodes[nodeName].push({ + id : "node_" + pr.node + "_" + shardId, + tag: shardId, + node: pr.node, + index: pr.index, + //primary: pr.primary} + primary: Pri, + state: St}); + + }); + + + + + }); } - $(this).toggleClass('btn-danger btn-success'); - }); - }, - - jq_changeHostButton: function() { - var context = this; - $("#changeHost").click(function(e) { - global.host = $("#host").val().replace(/http:\/\//g,""); - global.host = global.host.replace(/\/$/g, ""); - - context.loadIndices(); - }); - }, - - jq_refreshInterval: function() { - $("#changeRefresh").click(function(e) { - global.refreshInterval = $("#refreshInterval").val(); - }); - }, - - loadIndices: function() { - - var context = this; - - var loadOptions = {type: 'get', dataType: 'json'}; - var stateOptions = "?filter_metadata=true&filter_blocks=true"; - context.load("//" + global.host + "/_cluster/state" + stateOptions, loadOptions) - .then(function(state) { - context.cluster_name = state.cluster_name; - context.master_node = state.master_node; - context.indices = []; - $.each(state.routing_table.indices, function (index, v) { - context.indices.push(index.toString()); - }); - - return context; - }) - .render(global.indicesTemplate) - .replace("#indices"); - }, - - - poll: function(index) { - - //Kill caching for all subsequent caching requests - $.ajaxSetup ({ - cache: false - }); - - var formattedIndex = index; - - if (typeof index === 'undefined') { - formattedIndex = "/"; - } else { - formattedIndex += "/"; - } - - var context = this; - - global.pollID = setTimeout(function(){ - - if (global.pause == true) { - context.poll(index); - return; - } - - //console.log("Poll: " + index); - $.getJSON("//" + global.host + "/" + formattedIndex + "_segments/", function(data) { - var segments = {}; - - $.each(data.indices[index].shards, function (shardKey, shardValue) { - $.each(shardValue, function(shardKeyPR, shardValuePR) { - - var divId = "node_" + shardValuePR.routing.node + "_" + shardKey; - - if (typeof segments[divId] === 'undefined') - segments[divId] = []; - - segments[divId].push(['Segment ID', 'Fully Synced', 'Committed', 'Uncommitted', 'Deleted Docs']); - // flushed - $.each(shardValuePR.segments, function (k,v) { - - //bit of math to normalize our values, since Google Charts doesn't do stacked log scales. - var total = v.num_docs + v.deleted_docs; - var deleted = 1 + log10(total) - log10(v.num_docs); - - if (deleted == 1) - deleted = 0; - else if (!isFinite(deleted)) - deleted = 0; - - //artificially boost num_docs by one, so you can see very small segments - v.num_docs += 1; - - //fully committed/flushed and in memory - if (v.search === true && v.committed === true) - segments[divId].push([k, v.num_docs, 0, 0, deleted]); - - //Lucene Committed to disk - else if (v.search === false && v.committed === true) { - segments[divId].push([k, 0, v.num_docs, 0, deleted]); - //console.log('v.search === true && v.committed === false'); - } - - //Resident in NRT IndexReader (in memory), not Lucene Committed yet - else if (v.search === true && v.committed === false){ - segments[divId].push([k, 0, 0, v.num_docs, deleted]); - //console.log(v); - } - - //After reading the ES source, this option does not appear possible - //else if (v.search === false && v.committed === false) - // segments[divId].push([k, 0, 0, 0, v.num_docs, deleted]); - - }); - }); - }); - - if (segments !== {}) { - $.each(segments, function (divId, segmentList) { - segmentList = segmentList.sort(function(a,b) { - //we can do this because only one of these values will be >0 due to - //the quirky need to abuse Google Charts for multicolor - var docsA = a[1] + a[2] + a[3]; - var docsB = b[1] + b[2] + b[3]; - return parseInt(docsB) - parseInt(docsA); - }); - - global.graphs[divId].setData(segmentList); - global.graphs[divId].drawChart(); - - - }); - } - - - }) - .always(function() { context.poll(index); }); - },global.refreshInterval); - - }, - }); - ///////////////////////////////////////////// End Helpers - - - this.get('#/', function(context) { - - context.initPage(); - - - context.render(global.homeTemplate) - .replace("#content") - }); - - this.get('#/:index/', function(context) { - - context.initPage(); - - var targetIndex = context.params.index; - - var loadOptions = {type: 'get', dataType: 'json'}; - var stateOptions = "?filter_metadata=true&filter_blocks=true"; - context.load("//" + global.host + "/_cluster/state" + stateOptions, loadOptions) - .then(function(state) { - - context.cluster_name = state.cluster_name; - context.master_node = state.master_node; - - context.nodes = {}; - $.each(state.routing_table.indices[targetIndex].shards, function (shardId, shard) { - $.each(shard, function(prId, pr) { - if (typeof context.nodes[pr.node] === 'undefined') { - context.nodes[pr.node] = new Array(); - } - - //css ids can't start with numbers, prepend with "node" - context.nodes[pr.node].push( {id: "node_" + pr.node + "_" + shardId, - node: pr.node, - index: pr.index, - primary: pr.primary} ); - - }); - - - - - }); - - - return context; - }) - .render(global.graphTemplate) - .replace("#content") - .then(function() { - $.each(context.nodes, function (nodeId,node) { - $.each(node, function (k, div) { - global.graphs[div.id] = getGrapher(); - global.graphs[div.id].init(div.id); - }); - }); - - context.poll(targetIndex); - }); - }); - - }); - - app.run('#/'); - - })(jQuery); -}); + catch(err) + { + alert("The Host '"+global.host+"' might not have the Index '"+targetIndex+"' ...please verify!"); + } + + + return context; + }) + .render(global.graphTemplate) + .replace("#content") + .then(function() { + $.each(context.nodes, function (nodeId,node) { + $.each(node, function (k, div) { + global.graphs[div.id] = getGrapher(); + global.graphs[div.id].init(div.id); + }); + }); + + context.poll(targetIndex); + }); + }); + + }); + + app.run('#/'); + + })(jQuery); +}); diff --git a/_site/js/graph.js b/_site/js/graph.js index f48c896..e96f6ee 100644 --- a/_site/js/graph.js +++ b/_site/js/graph.js @@ -1,40 +1,40 @@ -$(function(){ - google.load("visualization", "1", {packages:["corechart"]});; -}); - -function getGrapher() { - - var grapher = { -//vAxis: {logScale: false}, - options : { - title: 'Segments', - hAxis: {title: 'Segments', titleTextStyle: {color: 'red'}}, - - isStacked: true, - vAxes: {0: {logScale: true}, - 1: {logScale: true, maxValue:1000000}}, - series:[{color: '#0008FF'}, {color: '#0099FF'},{color: 'orange'}, {color: 'red'}], - bar: {groupWidth: "90%"}, - chartArea: {left:100,top:10,width:"800px"}, - - }, - - drawChart : function () { - this.chart.draw(this.segments, this.options); - }, - - init : function(divId) { - this.chart = new google.visualization.ColumnChart(document.getElementById(divId)); - - }, - - setData : function(data) { - this.segments = google.visualization.arrayToDataTable(data); - } - - }; - - - return grapher; - -}; \ No newline at end of file +$(function(){ + google.load("visualization", "1", {packages:["corechart"]});; +}); + +function getGrapher() { + + var grapher = { +//vAxis: {logScale: false}, + options : { + title: 'Segments', + hAxis: {title: 'Segments', titleTextStyle: {color: 'red'}}, + + isStacked: true, + vAxes: {0: {title: 'Segments', logScale: true}, + 1: {logScale: true, maxValue:1000000}}, + series:[{color: '#0008FF'}, {color: '#0099FF'},{color: 'orange'}, {color: 'red'}], + bar: {groupWidth: "50%"}, + chartArea: {left:100,top:10,width:"800px"}, + + }, + + drawChart : function () { + this.chart.draw(this.segments, this.options); + }, + + init : function(divId) { + this.chart = new google.visualization.ColumnChart(document.getElementById(divId)); + + }, + + setData : function(data) { + this.segments = google.visualization.arrayToDataTable(data); + } + + }; + + + return grapher; + +}; diff --git a/_site/js/lib/sammy/sammy-0.7.5.min.js b/_site/js/lib/sammy/sammy-0.7.5.min.js new file mode 100644 index 0000000..f22e459 --- /dev/null +++ b/_site/js/lib/sammy/sammy-0.7.5.min.js @@ -0,0 +1,5 @@ +// -- Sammy.js -- /sammy.js +// http://sammyjs.org +// Version: 0.7.5 +// Built: 2014-02-22 10:57:15 +0200 +(function(factory){if(typeof define==="function"&&define.amd){define(["jquery"],factory)}else{jQuery.sammy=window.Sammy=factory(jQuery)}})(function($){var Sammy,PATH_REPLACER="([^/]+)",PATH_NAME_MATCHER=/:([\w\d]+)/g,QUERY_STRING_MATCHER=/\?([^#]*)?$/,_makeArray=function(nonarray){return Array.prototype.slice.call(nonarray)},_isFunction=function(obj){return Object.prototype.toString.call(obj)==="[object Function]"},_isArray=function(obj){return Object.prototype.toString.call(obj)==="[object Array]"},_isRegExp=function(obj){return Object.prototype.toString.call(obj)==="[object RegExp]"},_decode=function(str){return decodeURIComponent((str||"").replace(/\+/g," "))},_encode=encodeURIComponent,_escapeHTML=function(s){return String(s).replace(/&(?!\w+;)/g,"&").replace(//g,">").replace(/"/g,""")},_routeWrapper=function(verb){return function(){return this.route.apply(this,[verb].concat(Array.prototype.slice.call(arguments)))}},_template_cache={},_has_history=!!(window.history&&history.pushState),loggers=[];Sammy=function(){var args=_makeArray(arguments),app,selector;Sammy.apps=Sammy.apps||{};if(args.length===0||args[0]&&_isFunction(args[0])){return Sammy.apply(Sammy,["body"].concat(args))}else if(typeof(selector=args.shift())=="string"){app=Sammy.apps[selector]||new Sammy.Application;app.element_selector=selector;if(args.length>0){$.each(args,function(i,plugin){app.use(plugin)})}if(app.element_selector!=selector){delete Sammy.apps[selector]}Sammy.apps[app.element_selector]=app;return app}};Sammy.VERSION="0.7.5";Sammy.addLogger=function(logger){loggers.push(logger)};Sammy.log=function(){var args=_makeArray(arguments);args.unshift("["+Date()+"]");$.each(loggers,function(i,logger){logger.apply(Sammy,args)})};if(typeof window.console!="undefined"){if(typeof window.console.log==="function"&&_isFunction(window.console.log.apply)){Sammy.addLogger(function(){window.console.log.apply(window.console,arguments)})}else{Sammy.addLogger(function(){window.console.log(arguments)})}}else if(typeof console!="undefined"){Sammy.addLogger(function(){console.log.apply(console,arguments)})}$.extend(Sammy,{makeArray:_makeArray,isFunction:_isFunction,isArray:_isArray});Sammy.Object=function(obj){return $.extend(this,obj||{})};$.extend(Sammy.Object.prototype,{escapeHTML:_escapeHTML,h:_escapeHTML,toHash:function(){var json={};$.each(this,function(k,v){if(!_isFunction(v)){json[k]=v}});return json},toHTML:function(){var display="";$.each(this,function(k,v){if(!_isFunction(v)){display+=""+k+" "+v+"
"}});return display},keys:function(attributes_only){var keys=[];for(var property in this){if(!_isFunction(this[property])||!attributes_only){keys.push(property)}}return keys},has:function(key){return this[key]&&$.trim(this[key].toString())!==""},join:function(){var args=_makeArray(arguments);var delimiter=args.shift();return args.join(delimiter)},log:function(){Sammy.log.apply(Sammy,arguments)},toString:function(include_functions){var s=[];$.each(this,function(k,v){if(!_isFunction(v)||include_functions){s.push('"'+k+'": '+v.toString())}});return"Sammy.Object: {"+s.join(",")+"}"}});Sammy.targetIsThisWindow=function targetIsThisWindow(event,tagName){var targetElement=$(event.target).closest(tagName);if(targetElement.length===0){return true}var targetWindow=targetElement.attr("target");if(!targetWindow||targetWindow===window.name||targetWindow==="_self"){return true}if(targetWindow==="_blank"){return false}if(targetWindow==="top"&&window===window.top){return true}return false};Sammy.DefaultLocationProxy=function(app,run_interval_every){this.app=app;this.is_native=false;this.has_history=_has_history;this._startPolling(run_interval_every)};Sammy.DefaultLocationProxy.fullPath=function(location_obj){var matches=location_obj.toString().match(/^[^#]*(#.+)$/);var hash=matches?matches[1]:"";return[location_obj.pathname,location_obj.search,hash].join("")};$.extend(Sammy.DefaultLocationProxy.prototype,{bind:function(){var proxy=this,app=this.app,lp=Sammy.DefaultLocationProxy;$(window).bind("hashchange."+this.app.eventNamespace(),function(e,non_native){if(proxy.is_native===false&&!non_native){proxy.is_native=true;window.clearInterval(lp._interval);lp._interval=null}app.trigger("location-changed")});if(_has_history&&!app.disable_push_state){$(window).bind("popstate."+this.app.eventNamespace(),function(e){app.trigger("location-changed")});$(document).delegate("a","click.history-"+this.app.eventNamespace(),function(e){if(e.isDefaultPrevented()||e.metaKey||e.ctrlKey){return}var full_path=lp.fullPath(this),hostname=this.hostname?this.hostname:function(a){var l=document.createElement("a");l.href=a.href;return l.hostname}(this);if(hostname==window.location.hostname&&app.lookupRoute("get",full_path)&&Sammy.targetIsThisWindow(e,"a")){e.preventDefault();proxy.setLocation(full_path);return false}})}if(!lp._bindings){lp._bindings=0}lp._bindings++},unbind:function(){$(window).unbind("hashchange."+this.app.eventNamespace());$(window).unbind("popstate."+this.app.eventNamespace());$(document).undelegate("a","click.history-"+this.app.eventNamespace());Sammy.DefaultLocationProxy._bindings--;if(Sammy.DefaultLocationProxy._bindings<=0){window.clearInterval(Sammy.DefaultLocationProxy._interval);Sammy.DefaultLocationProxy._interval=null}},getLocation:function(){return Sammy.DefaultLocationProxy.fullPath(window.location)},setLocation:function(new_location){if(/^([^#\/]|$)/.test(new_location)){if(_has_history&&!this.app.disable_push_state){new_location="/"+new_location}else{new_location="#!/"+new_location}}if(new_location!=this.getLocation()){if(_has_history&&!this.app.disable_push_state&&/^\//.test(new_location)){history.pushState({path:new_location},window.title,new_location);this.app.trigger("location-changed")}else{return window.location=new_location}}},_startPolling:function(every){var proxy=this;if(!Sammy.DefaultLocationProxy._interval){if(!every){every=10}var hashCheck=function(){var current_location=proxy.getLocation();if(typeof Sammy.DefaultLocationProxy._last_location=="undefined"||current_location!=Sammy.DefaultLocationProxy._last_location){window.setTimeout(function(){$(window).trigger("hashchange",[true])},0)}Sammy.DefaultLocationProxy._last_location=current_location};hashCheck();Sammy.DefaultLocationProxy._interval=window.setInterval(hashCheck,every)}}});Sammy.Application=function(app_function){var app=this;this.routes={};this.listeners=new Sammy.Object({});this.arounds=[];this.befores=[];this.namespace=(new Date).getTime()+"-"+parseInt(Math.random()*1e3,10);this.context_prototype=function(){Sammy.EventContext.apply(this,arguments)};this.context_prototype.prototype=new Sammy.EventContext;if(_isFunction(app_function)){app_function.apply(this,[this])}if(!this._location_proxy){this.setLocationProxy(new Sammy.DefaultLocationProxy(this,this.run_interval_every))}if(this.debug){this.bindToAllEvents(function(e,data){app.log(app.toString(),e.cleaned_type,data||{})})}};Sammy.Application.prototype=$.extend({},Sammy.Object.prototype,{ROUTE_VERBS:["get","post","put","delete"],APP_EVENTS:["run","unload","lookup-route","run-route","route-found","event-context-before","event-context-after","changed","error","check-form-submission","redirect","location-changed"],_last_route:null,_location_proxy:null,_running:false,element_selector:"body",debug:false,raise_errors:false,run_interval_every:50,disable_push_state:false,template_engine:null,toString:function(){return"Sammy.Application:"+this.element_selector},$element:function(selector){return selector?$(this.element_selector).find(selector):$(this.element_selector)},use:function(){var args=_makeArray(arguments),plugin=args.shift(),plugin_name=plugin||"";try{args.unshift(this);if(typeof plugin=="string"){plugin_name="Sammy."+plugin;plugin=Sammy[plugin]}plugin.apply(this,args)}catch(e){if(typeof plugin==="undefined"){this.error("Plugin Error: called use() but plugin ("+plugin_name.toString()+") is not defined",e)}else if(!_isFunction(plugin)){this.error("Plugin Error: called use() but '"+plugin_name.toString()+"' is not a function",e)}else{this.error("Plugin Error",e)}}return this},setLocationProxy:function(new_proxy){var original_proxy=this._location_proxy;this._location_proxy=new_proxy;if(this.isRunning()){if(original_proxy){original_proxy.unbind()}this._location_proxy.bind()}},log:function(){Sammy.log.apply(Sammy,Array.prototype.concat.apply([this.element_selector],arguments))},route:function(verb,path){var app=this,param_names=[],add_route,path_match,callback=Array.prototype.slice.call(arguments,2);if(callback.length===0&&_isFunction(path)){callback=[path];path=verb;verb="any"}verb=verb.toLowerCase();if(path.constructor==String){PATH_NAME_MATCHER.lastIndex=0;while((path_match=PATH_NAME_MATCHER.exec(path))!==null){param_names.push(path_match[1])}path=new RegExp(path.replace(PATH_NAME_MATCHER,PATH_REPLACER)+"$")}$.each(callback,function(i,cb){if(typeof cb==="string"){callback[i]=app[cb]}});add_route=function(with_verb){var r={verb:with_verb,path:path,callback:callback,param_names:param_names};app.routes[with_verb]=app.routes[with_verb]||[];app.routes[with_verb].push(r)};if(verb==="any"){$.each(this.ROUTE_VERBS,function(i,v){add_route(v)})}else{add_route(verb)}return this},get:_routeWrapper("get"),post:_routeWrapper("post"),put:_routeWrapper("put"),del:_routeWrapper("delete"),any:_routeWrapper("any"),mapRoutes:function(route_array){var app=this;$.each(route_array,function(i,route_args){app.route.apply(app,route_args)});return this},eventNamespace:function(){return["sammy-app",this.namespace].join("-")},bind:function(name,data,callback){var app=this;if(typeof callback=="undefined"){callback=data}var listener_callback=function(){var e,context,data;e=arguments[0];data=arguments[1];if(data&&data.context){context=data.context;delete data.context}else{context=new app.context_prototype(app,"bind",e.type,data,e.target)}e.cleaned_type=e.type.replace(app.eventNamespace(),"");callback.apply(context,[e,data])};if(!this.listeners[name]){this.listeners[name]=[]}this.listeners[name].push(listener_callback);if(this.isRunning()){this._listen(name,listener_callback)}return this},trigger:function(name,data){this.$element().trigger([name,this.eventNamespace()].join("."),[data]);return this},refresh:function(){this.last_location=null;this.trigger("location-changed");return this},before:function(options,callback){if(_isFunction(options)){callback=options;options={}}this.befores.push([options,callback]);return this},after:function(callback){return this.bind("event-context-after",callback)},around:function(callback){this.arounds.push(callback);return this},onComplete:function(callback){this._onComplete=callback;return this},isRunning:function(){return this._running},helpers:function(extensions){$.extend(this.context_prototype.prototype,extensions);return this},helper:function(name,method){this.context_prototype.prototype[name]=method;return this},run:function(start_url){if(this.isRunning()){return false}var app=this;$.each(this.listeners.toHash(),function(name,callbacks){$.each(callbacks,function(i,listener_callback){app._listen(name,listener_callback)})});this.trigger("run",{start_url:start_url});this._running=true;this.last_location=null;if(!/\#(.+)/.test(this.getLocation())&&typeof start_url!="undefined"){this.setLocation(start_url)}this._checkLocation();this._location_proxy.bind();this.bind("location-changed",function(){app._checkLocation()});this.bind("submit",function(e){if(!Sammy.targetIsThisWindow(e,"form")){return true}var returned=app._checkFormSubmission($(e.target).closest("form"));return returned===false?e.preventDefault():false});$(window).bind("unload",function(){app.unload()});return this.trigger("changed")},unload:function(){if(!this.isRunning()){return false}var app=this;this.trigger("unload");this._location_proxy.unbind();this.$element().unbind("submit").removeClass(app.eventNamespace());$.each(this.listeners.toHash(),function(name,listeners){$.each(listeners,function(i,listener_callback){app._unlisten(name,listener_callback)})});this._running=false;return this},destroy:function(){this.unload();delete Sammy.apps[this.element_selector];return this},bindToAllEvents:function(callback){var app=this;$.each(this.APP_EVENTS,function(i,e){app.bind(e,callback)});$.each(this.listeners.keys(true),function(i,name){if($.inArray(name,app.APP_EVENTS)==-1){app.bind(name,callback)}});return this},routablePath:function(path){return path.replace(QUERY_STRING_MATCHER,"")},lookupRoute:function(verb,path){var app=this,routed=false,i=0,l,route;if(typeof this.routes[verb]!="undefined"){l=this.routes[verb].length;for(;i0){before=befores.shift();if(app.contextMatchesOptions(context,before[0])){returned=before[1].apply(context,[context]);if(returned===false){return false}}}app.last_route=route;context.trigger("event-context-before",{context:context});if(typeof route.callback==="function"){route.callback=[route.callback]}if(route.callback&&route.callback.length){i=-1;nextRoute=function(){i++;if(route.callback[i]){returned=route.callback[i].apply(context,callback_args)}else if(app._onComplete&&typeof(app._onComplete==="function")){app._onComplete(context)}};callback_args.push(nextRoute);nextRoute()}context.trigger("event-context-after",{context:context});return returned};$.each(arounds.reverse(),function(i,around){var last_wrapped_route=wrapped_route;wrapped_route=function(){return around.apply(context,[last_wrapped_route])}});try{final_returned=wrapped_route()}catch(e){this.error(["500 Error",verb,path].join(" "),e)}return final_returned}else{return this.notFound(verb,path)}},contextMatchesOptions:function(context,match_options,positive){var options=match_options;if(typeof options==="string"||_isRegExp(options)){options={path:options}}if(typeof positive==="undefined"){positive=true}if($.isEmptyObject(options)){return true}if(_isArray(options.path)){var results,numopt,opts,len;results=[];for(numopt=0,len=options.path.length;numopt-1?true:false;return positive?matched:!matched}if(options.only){return this.contextMatchesOptions(context,options.only,true)}else if(options.except){return this.contextMatchesOptions(context,options.except,false)}var path_matched=true,verb_matched=true;if(options.path){if(!_isRegExp(options.path)){options.path=new RegExp(options.path.toString()+"$")}path_matched=options.path.test(context.path)}if(options.verb){if(typeof options.verb==="string"){verb_matched=options.verb===context.verb}else{verb_matched=options.verb.indexOf(context.verb)>-1}}return positive?verb_matched&&path_matched:!(verb_matched&&path_matched)},getLocation:function(){return this._location_proxy.getLocation()},setLocation:function(new_location){return this._location_proxy.setLocation(new_location)},swap:function(content,callback){var $el=this.$element().html(content);if(_isFunction(callback)){callback(content)}return $el},templateCache:function(key,value){if(typeof value!="undefined"){return _template_cache[key]=value}else{return _template_cache[key]}},clearTemplateCache:function(){return _template_cache={}},notFound:function(verb,path){var ret=this.error(["404 Not Found",verb,path].join(" "));return verb==="get"?ret:true},error:function(message,original_error){if(!original_error){original_error=new Error}original_error.message=[message,original_error.message].join(" ");this.trigger("error",{message:original_error.message,error:original_error});if(this.raise_errors){throw original_error}else{this.log(original_error.message,original_error)}},_checkLocation:function(){var location,returned;location=this.getLocation();if(!this.last_location||this.last_location[0]!="get"||this.last_location[1]!=location){this.last_location=["get",location];returned=this.runRoute("get",location)}return returned},_getFormVerb:function(form){var $form=$(form),verb,$_method;$_method=$form.find('input[name="_method"]');if($_method.length>0){verb=$_method.val()}if(!verb){verb=$form[0].getAttribute("method")}if(!verb||verb===""){verb="get"}return $.trim(verb.toString().toLowerCase())},_checkFormSubmission:function(form){var $form,path,verb,params,returned;this.trigger("check-form-submission",{form:form});$form=$(form);path=$form.attr("action")||"";verb=this._getFormVerb($form);if(this.debug){this.log("_checkFormSubmission",$form,path,verb)}if(verb==="get"){params=this._serializeFormParams($form);if(params!==""){path+="?"+params}this.setLocation(path);returned=false}else{params=$.extend({},this._parseFormParams($form));returned=this.runRoute(verb,path,params,form.get(0))}return typeof returned=="undefined"?false:returned},_serializeFormParams:function($form){var queryString="",fields=$form.serializeArray(),i;if(fields.length>0){queryString=this._encodeFormPair(fields[0].name,fields[0].value);for(i=1;i0){this.then(this.callbacks.shift())}},load:function(location,options,callback){var context=this;return this.then(function(){var should_cache,cached,is_json,location_array;if(_isFunction(options)){callback=options;options={}}else{options=$.extend({},options)}if(callback){this.then(callback)}if(typeof location==="string"){is_json=location.match(/\.json(\?|$)/)||options.json;should_cache=is_json?options.cache===true:options.cache!==false;context.next_engine=context.event_context.engineFor(location);delete options.cache;delete options.json;if(options.engine){context.next_engine=options.engine;delete options.engine}if(should_cache&&(cached=this.event_context.app.templateCache(location))){return cached}this.wait();$.ajax($.extend({url:location,data:{},dataType:is_json?"json":"text",type:"get",success:function(data){if(should_cache){context.event_context.app.templateCache(location,data)}context.next(data)}},options));return false}else{if(location.nodeType){return location.innerHTML}if(location.selector){context.next_engine=location.attr("data-engine");if(options.clone===false){return location.remove()[0].innerHTML.toString()}else{return location[0].innerHTML.toString()}}}})},loadPartials:function(partials){var name;if(partials){this.partials=this.partials||{};for(name in partials){(function(context,name){context.load(partials[name]).then(function(template){this.partials[name]=template})})(this,name)}}return this},render:function(location,data,callback,partials){if(_isFunction(location)&&!data){return this.then(location)}else{if(_isFunction(data)){partials=callback;callback=data;data=null}else if(callback&&!_isFunction(callback)){partials=callback;callback=null}return this.loadPartials(partials).load(location).interpolate(data,location).then(callback)}},partial:function(location,data,callback,partials){if(_isFunction(callback)){return this.render(location,data,partials).swap(callback)}else if(_isFunction(data)){return this.render(location,{},callback).swap(data)}else{return this.render(location,data,callback).swap()}},send:function(){var context=this,args=_makeArray(arguments),fun=args.shift();if(_isArray(args[0])){args=args[0]}return this.then(function(content){args.push(function(response){context.next(response)});context.wait();fun.apply(fun,args);return false})},collect:function(array,callback,now){var context=this;var coll=function(){if(_isFunction(array)){callback=array;array=this.content}var contents=[],doms=false;$.each(array,function(i,item){var returned=callback.apply(context,[i,item]);if(returned.jquery&&returned.length==1){returned=returned[0];doms=true}contents.push(returned);return returned});return doms?contents:contents.join("")};return now?coll():this.then(coll)},renderEach:function(location,name,data,callback){if(_isArray(name)){callback=data;data=name;name=null}return this.load(location).then(function(content){var rctx=this;if(!data){data=_isArray(this.previous_content)?this.previous_content:[]}if(callback){$.each(data,function(i,value){var idata={},engine=this.next_engine||location;if(name){idata[name]=value}else{idata=value}callback(value,rctx.event_context.interpolate(content,idata,engine))})}else{return this.collect(data,function(i,value){var idata={},engine=this.next_engine||location;if(name){idata[name]=value}else{idata=value}return this.event_context.interpolate(content,idata,engine)},true)}})},interpolate:function(data,engine,retain){var context=this;return this.then(function(content,prev){if(!data&&prev){data=prev}if(this.next_engine){engine=this.next_engine;this.next_engine=false}var rendered=context.event_context.interpolate(content,data,engine,this.partials);return retain?prev+rendered:rendered})},swap:function(callback){return this.then(function(content){this.event_context.swap(content,callback);return content}).trigger("changed",{})},appendTo:function(selector){return this.then(function(content){$(selector).append(content)}).trigger("changed",{})},prependTo:function(selector){return this.then(function(content){$(selector).prepend(content)}).trigger("changed",{})},replace:function(selector){return this.then(function(content){$(selector).html(content)}).trigger("changed",{})},trigger:function(name,data){return this.then(function(content){if(typeof data=="undefined"){data={content:content}}this.event_context.trigger(name,data);return content})}});Sammy.EventContext=function(app,verb,path,params,target){this.app=app;this.verb=verb;this.path=path;this.params=new Sammy.Object(params);this.target=target};Sammy.EventContext.prototype=$.extend({},Sammy.Object.prototype,{$element:function(){return this.app.$element(_makeArray(arguments).shift())},engineFor:function(engine){var context=this,engine_match;if(_isFunction(engine)){return engine}engine=(engine||context.app.template_engine).toString();if(engine_match=engine.match(/\.([^\.\?\#]+)(\?|$)/)){engine=engine_match[1]}if(engine&&_isFunction(context[engine])){return context[engine]}if(context.app.template_engine){return this.engineFor(context.app.template_engine)}return function(content,data){return content}},interpolate:function(content,data,engine,partials){return this.engineFor(engine).apply(this,[content,data,partials])},render:function(location,data,callback,partials){return new Sammy.RenderContext(this).render(location,data,callback,partials)},renderEach:function(location,name,data,callback){return new Sammy.RenderContext(this).renderEach(location,name,data,callback)},load:function(location,options,callback){return new Sammy.RenderContext(this).load(location,options,callback)},loadPartials:function(partials){return new Sammy.RenderContext(this).loadPartials(partials)},partial:function(location,data,callback,partials){return new Sammy.RenderContext(this).partial(location,data,callback,partials)},send:function(){var rctx=new Sammy.RenderContext(this);return rctx.send.apply(rctx,arguments)},redirect:function(){var to,args=_makeArray(arguments),current_location=this.app.getLocation(),l=args.length;if(l>1){var i=0,paths=[],pairs=[],params={},has_params=false;for(;i