summaryrefslogtreecommitdiffstats
path: root/javascripts/fiddle_backbone/router.js
diff options
context:
space:
mode:
Diffstat (limited to 'javascripts/fiddle_backbone/router.js')
-rw-r--r--javascripts/fiddle_backbone/router.js295
1 files changed, 295 insertions, 0 deletions
diff --git a/javascripts/fiddle_backbone/router.js b/javascripts/fiddle_backbone/router.js
new file mode 100644
index 0000000..83e52b5
--- /dev/null
+++ b/javascripts/fiddle_backbone/router.js
@@ -0,0 +1,295 @@
+// Filename: router.js
+define([
+ 'jQuery',
+ 'Underscore',
+ 'Backbone',
+ 'BrowserEngines',
+ 'models/DBTypesList',
+ 'models/SchemaDef',
+ 'models/Query',
+ 'models/MyFiddleHistory',
+ 'views/DBTypesList'
+], function($, _, Backbone, dbTypes, schemaDef, query, myFiddleHistory, dbTypesListView ){
+
+ var AppRouter = Backbone.Router.extend({
+
+ routes: {
+ "!:db_type_id": "DBType", // #!1
+ "!:db_type_id/:short_code":"SchemaDef", // #!1/abc12
+ "!:db_type_id/:short_code/:query_id":"Query", // #!1/abc12/1
+ "!:db_type_id/:short_code/:query_id/:set_id":"SetAnchor" // #!1/abc12/1/1
+ },
+
+ DBType: function (db_type_id) {
+ // update currently-selected dbtype
+ dbTypes.setSelectedType(db_type_id, true);
+ dbTypesListView.render();
+ },
+
+ SchemaDef: function (db_type_id, short_code) {
+ this.loadContent(db_type_id, "!" + db_type_id + "/" + short_code);
+ },
+
+ Query: function (db_type_id, short_code, query_id) {
+ this.loadContent(db_type_id, "!" + db_type_id + "/" + short_code + "/" + query_id);
+ },
+ SetAnchor: function (db_type_id, short_code, query_id, set_id) {
+
+ var selectSet = function () {
+ if ($("#set_" + set_id).length)
+ {
+ window.scrollTo(0,$("#set_" + set_id).offset()["top"]-50);
+ $("#set_" + set_id).addClass("highlight");
+ }
+ };
+
+ if (
+ !dbTypes.getSelectedType() ||
+ dbTypes.getSelectedType().get("id") != db_type_id ||
+ schemaDef.get("short_code") != short_code ||
+ query.get("id") != query_id
+ )
+ {
+ query.bind("reloaded", _.once(selectSet));
+ this.loadContent(db_type_id, "!" + db_type_id + "/" + short_code + "/" + query_id);
+ }
+ else
+ {
+ $(".set").removeClass("highlight");
+ selectSet();
+ }
+ },
+
+ loadContent: function (db_type_id,frag) {
+
+ this.DBType(db_type_id);
+
+ if (query.get("pendingChanges") && !confirm("Warning! You have made changes to your query which will be lost. Continue?'"))
+ return false;
+
+ schemaDef.set("loading", true);
+
+ $(".helpTip").css("display", "none");
+ $("body").block({ message: "Loading..."});
+
+ $.getJSON("index.cfm/fiddles/loadContent", {fragment: frag}, function (resp) {
+ schemaDef.set("loading", false);
+
+ if (resp["short_code"])
+ {
+
+ var selectedDBType = dbTypes.getSelectedType();
+
+ if (selectedDBType.get("context") == "browser")
+ {
+ if (
+ selectedDBType.get("className") == "sqljs" &&
+ browserEngines["websql"].nativeSQLite
+ )
+ {
+ if (confirm("Fiddle originally built with SQL.js, but you have WebSQL available - would you like to use that instead (it'll be faster to load)?"))
+ {
+ dbTypes.setSelectedType($("#db_type_id a:contains('WebSQL')").closest('li').attr('db_type_id'));
+ selectedDBType = dbTypes.getSelectedType();
+ schemaDef.set({
+ "ddl": resp["ddl"],
+ "dbType": selectedDBType,
+ "statement_separator": resp["schema_statement_separator"]
+ });
+ if (resp["sql"])
+ {
+ query.set({
+ "schemaDef": schemaDef,
+ "sql": resp["sql"],
+ "statement_separator": resp["query_statement_separator"]
+ });
+ schemaDef.on("built", _.once(function () {
+ query.execute();
+ }));
+
+ }
+ schemaDef.build();
+
+
+ }
+ }
+
+ browserEngines[selectedDBType.get("className")].buildSchema({
+
+ short_code: $.trim(resp["short_code"]),
+ statement_separator: resp["schema_statement_separator"],
+ ddl: resp["ddl"],
+ success: function () {
+
+ schemaDef.set({
+ "short_code": resp["short_code"],
+ "ddl": resp["ddl"],
+ "ready": true,
+ "valid": true,
+ "errorMessage": "",
+ "statement_separator": resp["schema_statement_separator"],
+ "dbType": dbTypes.getSelectedType()
+ });
+ renderTerminator($(".panel.schema"), resp["schema_statement_separator"]);
+
+ if (resp["sql"])
+ {
+ myFiddleHistory.insert(new UsedFiddle({
+ "fragment": "!" + db_type_id + "/" + resp["short_code"] + "/" + resp["id"]
+ }));
+
+ query.set({
+ "id": resp["id"],
+ "sql": resp["sql"],
+ "statement_separator": resp["query_statement_separator"]
+ });
+ }
+ else
+ {
+ myFiddleHistory.insert(new UsedFiddle({
+ "fragment": "!" + db_type_id + "/" + resp["short_code"]
+ }));
+ }
+
+ browserEngines[selectedDBType.get("className")].getSchemaStructure({
+ callback: function (schemaStruct) {
+ schemaDef.set({
+ "schema_structure": schemaStruct
+ });
+
+ schemaDef.trigger("reloaded");
+
+ if (resp["sql"])
+ {
+ browserEngines[selectedDBType.get("className")].executeQuery({
+ sql: resp["sql"],
+ statement_separator: resp["query_statement_separator"],
+ success: function (sets) {
+
+ query.set({
+ "sets": sets
+ });
+
+ query.trigger("reloaded");
+
+ $("body").unblock();
+ },
+ error: function (e) {
+
+ query.set({
+ "sets": []
+ });
+
+ query.trigger("reloaded");
+
+ $("body").unblock();
+ }
+ });
+ }
+ else
+ {
+ $("body").unblock();
+ } // end if resp["sql"]
+
+ }
+ });
+
+
+ },
+ error: function (message) {
+
+ schemaDef.set({
+ "short_code": resp["short_code"],
+ "ddl": resp["ddl"],
+ "ready": true,
+ "valid": false,
+ "errorMessage": message,
+ "dbType": dbTypes.getSelectedType(),
+ "statement_separator": resp["schema_statement_separator"],
+ "schema_structure": []
+ });
+
+ renderTerminator($(".panel.schema"), resp["schema_statement_separator"]);
+
+ if (resp["sql"])
+ {
+ query.set({
+ "id": resp["id"],
+ "sql": resp["sql"],
+ "statement_separator": resp["query_statement_separator"],
+ "schemaDef": schemaDef
+ });
+ query.trigger("reloaded");
+ }
+
+ schemaDef.trigger("failed");
+ schemaDef.trigger("reloaded");
+
+ $("body").unblock();
+
+ }
+
+ });
+ }
+ else // context not "browser"
+ {
+
+ schemaDef.set({
+ "short_code": resp["short_code"],
+ "ddl": resp["ddl"],
+ "ready": true,
+ "valid": true,
+ "errorMessage": "",
+ "statement_separator": resp["schema_statement_separator"],
+ "schema_structure": resp["schema_structure"]
+ });
+ renderTerminator($(".panel.schema"), resp["schema_statement_separator"]);
+ schemaDef.trigger("reloaded");
+
+ if (resp["sql"])
+ {
+ myFiddleHistory.insert(new UsedFiddle({
+ "fragment": "!" + db_type_id + "/" + resp["short_code"] + "/" + resp["id"]
+ }));
+
+ query.set({
+ "id": resp["id"],
+ "sql": resp["sql"],
+ "sets": resp["sets"],
+ "statement_separator": resp["query_statement_separator"]
+ });
+ query.trigger("reloaded");
+ }
+ else
+ {
+ myFiddleHistory.insert(new UsedFiddle({
+ "fragment": "!" + db_type_id + "/" + resp["short_code"]
+ }));
+ }
+
+ $("body").unblock();
+
+ }
+
+ }
+ else
+ {
+ $("body").unblock();
+ }
+ });
+
+
+ }
+
+
+ });
+
+
+ var initialize = function(){
+ var app_router = new AppRouter;
+ Backbone.history.start();
+ };
+ return {
+ initialize: initialize
+ };
+}); \ No newline at end of file