/* Robs Router Loader */ tts.RouteObject = {}; /* This is the main Object to use for AJAX Pages */ var include_once_files = []; /* Was this Asset loaded yet, and did the PHP Footer file find this Asset */ tts.AddRouterCachedFile = function(filename) { include_once_files.push(filename); }; function doesAssetExists(filename) { // console.log(filename); return new Promise((resolve, reject) => { if (hasLoaded(filename) === false) { var exists = false; for (var i = 0; i < assets_files.length; i++) { if (filename == assets_files[i].filename) { tts.logger('Loading: ' + filename) include_once_files.push(filename); exists = true; break; } } if (exists === false) { reject("skipped: " + filename); } else { resolve(assets_files[i].ts); } } else { resolve("loaded"); } }); } function getClassName(obj) { if (typeof obj.constructor.name === "undefined") { return obj.constructor.toString().match(/^function\s(.+)\(/)[1]; } else { return obj.constructor.name; } } function hasLoaded(file) { return tts.inArray(file, include_once_files); } /* Just checks if file has been loaded once yet */ function apply_css(css_file, version) { return new Promise((resolve, reject) => { tts.getAsset({name: css_file, path: AJAX_Folder, version: version}).then(function () { resolve(); }).catch(function () { reject(); }); }); } function hasPromise(obj, fn, text) { // tts.logger("promise"+fn, "trace"); if (typeof text === "undefined") { text = ""; } return new Promise((resolve, reject) => { var usePromise = tts.getValue(obj.Promise, true); if (typeof fn === "undefined" && typeof fn !== "function") { reject(text + " Function does not exist"); } else { if (usePromise === true) { tts.logger("Promise exec of " + text); fn().then(function (out) { resolve(out); }).catch(function (e) { reject(e); }); } else { tts.logger("Exec of " + text); fn(); resolve(); } } }); } /* Run Main method on Class File */ function do_run_main(obj) { var className = getClassName(obj); return new Promise((resolve, reject) => { hasPromise(obj, obj['Main'], className).then(function () { resolve(); }).catch(function (e) { reject(e); }); }); } ; /* This will Run JS code for Tabs! */ function do_run(obj) { var className = getClassName(obj); return new Promise((resolve, reject) => { hasPromise(obj, obj[obj.tab], className + " " + obj.tab).then(function () { resolve(); }).catch(function (e) { reject(e); }); }); } ; function is_unknown(obj) { if (is_404(obj.tab)) { var className = getClassName(obj); tts.logger(className + " " + obj.tab + " tab FN not found!"); do_404_page(); return true; } return false; } function loadJS(scriptFile, version, obj, fn) { var stuff = { name: scriptFile, path: AJAX_Folder, ts: version }; // console.log(stuff); return new Promise((resolve, reject) => { tts.getAsset(stuff) .then(function () { switch (fn) { case 'ErrorMain': hasPromise(obj, obj.Main, "404").then(function () { resolve(); }).catch(function () { reject(); }); break; case 'do_run_main': do_run_main(obj).then(function () { resolve("js_complete"); }).catch(function (e) { reject(e); }); break; case 'do_run': do_run(obj).then(function () { resolve("js_complete"); }).catch(function (e) { reject(e); }); break; default: window[fn](obj).then(function () { resolve("js_complete"); }).catch(function (e) { reject(e); }); break; } }).catch(function (exception) { switch (fn) { case 'ErrorMain': tts.logger("404 Page - does not exist", "error"); break; case 'do_run_main': do_run_main(obj).catch(function () { reject(e); }); break; case 'do_run': do_run(obj).catch(function () { reject(e); }); break; default: window[fn](obj).catch(function () { }); break; } if (fn !== 'ErrorMain') { tts.logger("Something went wrong: " + exception, "warn"); } reject('Something went wrong'); }); }); } tts.JS_EXT = ".js"; tts.CSS_EXT = ".css"; /* Does Class StartUp, CSS, and JS - After Main JS has completed loading... */ function do_other_FN(obj) { return new Promise((resolve, reject) => { var className = getClassName(obj); var tab = tts.getValue(obj.tab, false); hasPromise(obj, obj['StartUp'], "Start Up").catch(function () { }); if (tab === false) { resolve(); } else { var Script_File = className + "_" + tab + tts.JS_EXT; var CSS_File = className + "_" + tab + tts.CSS_EXT; var MainCSS_File = className + "_Main" + tts.CSS_EXT; doesAssetExists(Script_File).then(function (versionNumber) { if (versionNumber === 'loaded') { do_run(obj).then(function (ok) { resolve(ok); }).catch(function (e) { reject(e); }); } else { loadJS(Script_File, versionNumber, obj, 'do_run').then(function (ok) { resolve(ok); }).catch(function (e) { reject(e); }); } }).catch(function (err) { do_run(obj).then(function (ok) { resolve(ok); }).catch(function (e) { is_unknown(obj); reject(e); }); }); doesAssetExists(MainCSS_File).then(function (versionNumber) { if (versionNumber !== 'loaded') { apply_css(MainCSS_File, versionNumber); } }).catch(function (e) { }); doesAssetExists(CSS_File).then(function (versionNumber) { if (versionNumber !== 'loaded') { apply_css(CSS_File, versionNumber); } }).catch(function (e) { }); } }); } function mainRouting(obj) { return new Promise((resolve, reject) => { tts.RouteObject = obj; var className = getClassName(obj); var MainScript_File = className + "_Main" + tts.JS_EXT; doesAssetExists(MainScript_File).then(function (versionNumber) { if (versionNumber === 'loaded') { do_run_main(obj).then(function () { do_other_FN(obj).then(function (ok) { resolve(ok); }).catch(function (e) { reject(e); }); }).catch(function (e) { reject(e); }); } else { loadJS(MainScript_File, versionNumber, obj, 'do_run_main').then(function () { do_other_FN(obj).then(function (ok) { resolve(ok); }).catch(function (e) { reject(e); }); }).catch(function (e) { reject(e); }); } }).catch(function (err) { do_run_main(obj).then(function () { do_other_FN(obj).then(function (ok) { resolve(ok); }).catch(function (e) { reject(e); }); }).catch(function (e) { reject(e); }); }); }); } tts.Route = function (obj) { /* This is the core loader for Tabs and Main Route */ tts.startCodeTimer(); return new Promise((resolve, reject) => { mainRouting(obj).then(function (r) { tts.endCodeTimer(); $_.logger(r + " - Resolved Took " + tts.completedCodeTimer); resolve(r); }).catch(function (e) { tts.endCodeTimer(); $_.logger(e + " - Rejected Took " + tts.completedCodeTimer); reject(e); }); }); }; /* Load 404 JS for doing 404 Page */ function do_404_page() { var ErrorScript_File = "PageNotFound_Main" + tts.JS_EXT; var err_page = new PageNotFound(false); doesAssetExists(ErrorScript_File).then(function (versionNumber) { if (versionNumber === 'loaded') { err_page.Main(); } else { loadJS(ErrorScript_File, versionNumber, err_page, "ErrorMain").catch(function (e) { }); } }).catch(function (err) { tts.logger("404 Page - does not exist", "error"); }); } /* Is 404 on, if so does Tab Method/File exists, if not was an exception made */ tts.do_404_page_on_bad_Route = true; tts.empty_Route_pages = []; function is_404(tab_name) { if (tts.do_404_page_on_bad_Route === false) return false; /* Is 404 off?? */ for (var i = 0; i < tts.empty_Route_pages.length; i++) { if (tts.empty_Route_pages[i] == tab_name) { return false; /* Found allowed empty tab page */ } } return true; /* Unable to find tab page hash in allowed list */ } /* End of Robs Router Loader */