diff --git a/js/layoutloader.js b/js/layoutloader.js index 5e7a9540e184621e5cf6d7dee0e1770c79debf43..042551c567df91b8de61a979cf53e0f9b2c86678 100755 --- a/js/layoutloader.js +++ b/js/layoutloader.js @@ -1,161 +1,401 @@ layout = {}; +layout.templates = {}; +layout.cycler = []; +layout.defaultCycleTime = 3; +layout.readyCounter = 0; +layout.resizeLayout = function () { + for (var tmp in layout.templates) { + tmp = layout.templates[tmp]; + for (var p in tmp.panels) { + p = tmp.panels[p]; + p.resize(); + } + } +} -layout.processLayout = function(json, container) { - switch(json.type) { - case "ysplit": - var cont = $("<div>").attr("data-container","split"); - $(container).append(cont); - layout.processLayout(json.up, cont).css("height",json.cut+"%"); - layout.processLayout(json.down, cont).css("height",(100.0-json.cut)+"%"); - return cont; - case "xsplit": - var cont = $("<div>").attr("data-container","split"); - $(container).append(cont); - layout.processLayout(json.left, cont).css("width",json.cut+"%"); - layout.processLayout(json.right, cont).css("width",(100.0-json.cut)+"%"); - return cont; - case "panel": - - if (json.name == "") { - layout.error(json); +layout.panelJSPrototype = function (js) { + js = js.prototype; + js.hide = function () { + + }; + js.show = function () { + + }; + js.loaded = function () { + + }; + js.unload = function () { + + } + js.checkShowCondition = function () { + return 0; + } + js.resize = function () { + + } +} + +layout.createPanel = function (dom, innerDOM, json) { + layout.readyCounter++; + this.name = json.name; + this.dom = dom; + this.innerDOM = innerDOM; + this.js = null; + this.needResize = false; + this.hidden = true; + this.config = json.config; + this.json = json; + /* this.hide=function(){this.js.hide()}; + this.show=function(){this.js.show()}; + this.loaded=function(){this.js.loaded()}; + this.unload=function(){this.js.unload()};*/ +} + +/* TODO: Search for a Panel in checkCondition instead of show */ +layout.createCycler = function (dom, panels, duration_, forceDuration) { + this.dom = dom; + this.duration = duration_ || layout.defaultCycleTime; + this.forceDuration = forceDuration || false; + var panels = panels || []; + var panelIdx = 0; + var interval = null; + var c = this; + this.hidden = false; + + + var doTick = function () { + if (hidden) return; + var gefunden = false; + for (var i = 1; i <= panels.length; i++) { + var j = (i + panelIdx) % panels.length; + var panelDuration = panels[j].inner.checkShowCondition(); + if (panelDuration >= 0) { + gefunden = true; + + panels[panelIdx].inner.hide(); + panels[panelIdx].container.css("display", "none"); + + var fd = panels[j].inner.json.forceDuration; + var realForceDuration = (typeof(fd) == "undefined" ? forceDuration : fd); + + panelIdx = j; + panels[panelIdx].container.css("display", "block"); + var realDuration = (realForceDuration || (panelDuration == 0)) ? (panels[j].inner.json.duration || this.duration) : panelDuration; + + panels[panelIdx].inner.show(realDuration); + console.log(realDuration); + interval = setTimeout(doTick.bind(c), realDuration * 1000); + break; + } + } + if (!gefunden) { + layout.error("no panel found to show in cycler D: search again in " + layout.defaultCycleTime + " seconds"); + interval = setTimeout(doTick.bind(c), layout.defaultCycleTime * 1000); } - var p = $("<div>") - .attr("data-container","panel") - .attr("data-template",json.name) - .attr("data-config",json.config); - var cont = $("<div>").attr("data-container","panelContainer").append(p); - $(container).append(cont); + } - layout.insertTemplate(json.name,p); + this.hide = function () { + hidden = true; + } + this.show = function (showDuration) { + hidden = false; + //interval = setTimeout(doTick.bind(this), 1*1000); + // panelIdx--; + doTick.call(c, showDuration); + //showPanel(); + } + this.checkShowCondition = function () { + } +} + +/* TODO: create a strategy to determinate how to concat the checkShowCondition of the subpanels */ +layout.createYSpliter = function (dom, first, second, cut) { + this.dom = dom; + this.cut = cut; + this.first = first; + this.second = second; + this.up = first; + this.down = second; + + this.up.dom.css("height", (cut) + "%"); + this.down.dom.css("height", (100.0 - cut) + "%"); - return cont; - default: - layout.error(json); - break; - } + this.hide = function () { + this.first.hide(); + this.second.hide(); + } + this.show = function (duration) { + this.first.show(duration); + this.second.show(duration); + } + this.checkShowCondition = function () { + + } } +/* TODO: same as createYSpliter */ +layout.createXSpliter = function (dom, first, second, cut) { + this.dom = dom; + this.cut = cut; + this.first = first; + this.second = second; + this.left = first; + this.right = second; -layout.insertTemplate = function(name, panel) { - for (var tmp in layout.templates) { - if (layout.templates[tmp].name == name) - { - layout.templates[tmp].panels.push(panel); - return; + this.left.dom.css("width", (cut) + "%"); + this.right.dom.css("width", (100.0 - cut) + "%"); + + this.hide = function () { + this.first.hide(); + this.second.hide(); + } + this.show = function (duration) { + this.first.show(duration); + this.second.show(duration); } + this.checkShowCondition = function () { + + } +} + +layout.processLayout = function (json, container) { + switch (json.type) { + case "ysplit": + var cont = $("<div>").attr("data-container", "split"); + $(container).append(cont); + var first = layout.processLayout(json.up, cont); + var second = layout.processLayout(json.down, cont); + + var thisSplit = new layout.createYSpliter(cont, first, second, json.cut); - } + return thisSplit; + case "xsplit": + var cont = $("<div>").attr("data-container", "split"); + $(container).append(cont); + var first = layout.processLayout(json.left, cont); + var second = layout.processLayout(json.right, cont); - this.templates.push( + var thisSplit = new layout.createXSpliter(cont, first, second, json.cut); + return thisSplit; + case "cycler": + var dom = $("<div>").attr("data-container", "cycler"); + var myPanels = []; + + $(container).append(dom); + json.panels.forEach(function (subpanel) { + console.log(subpanel); + var subcont = $("<div>").attr("data-container", "cycleContainer"); + $(dom).append(subcont); + var subsubpanel = layout.processLayout(subpanel, subcont); + myPanels.push({ + "container": subcont, + "inner": subsubpanel + }); + }); + + var thisCycler = new layout.createCycler(dom, myPanels, json.duration, json.forceDuration); + + layout.cycler.push(thisCycler); + return thisCycler; + case "panel": + if (json.name == "") { + layout.error(json); + } + + var innerDOM = $("<div>") + .attr("data-container", "panel") + .attr("data-template", json.name) + .attr("data-config", json.config); + + var dom = $("<div>").attr("data-container", "panelContainer").append(innerDOM); + $(container).append(dom); + + var panelWrapper = new layout.createPanel(dom, innerDOM, json); + layout.insertTemplate(panelWrapper); + + return panelWrapper; + default: + layout.error(json); + break; + } +} + + +layout.insertTemplate = function (wrap) { + + if (typeof(layout.templates[wrap.name]) != "undefined") { + layout.templates[wrap.name].panels.push(wrap); + return; + } + + + layout.templates[wrap.name] = { - "name": name, - "template": null, - "panels": [panel], - "script": function() {}, - "css": null, - "loadTemplate": function() { - var t = this; - var e = {}; - - var doMore = function() { - if (e.js == null || e.css == null || e.template == null) - return; - - if (e.js != null) { - eval("doStuff = function() {\n" + e.js + "\n}"); - t.script = doStuff; - doStuff = null; - } - - t.template = $.parseHTML(e.template); - - for (p in t.panels) { - t.panels[p].append( - $(t.template).clone() - ).ready(function() { - if (t.script == null) { - - } else { - t.panels[p].js=new t.script(); - try { - if (typeof t.panels[p].js.loaded == 'function') - t.panels[p].js.loaded(t.panels[p], t.panels[p].attr("data-config")); - } catch (ex) { - console.log("Layout: exception when running loading for " + t.name + "\n" + ex); + "name": wrap.name, + "template": null, + "panels": [wrap], + "script": function () { + }, + "css": null, + "loadTemplate": function () { + var t = this; + var e = {}; + var doMore = function () { + if (e.js == null || e.css == null || e.template == null) + return; + + if (e.js != null) { + eval("doStuff = function() {\n" + e.js + "\n}"); + t.script = doStuff; + layout.panelJSPrototype(t.script); + doStuff = null; } - } + + t.template = $.parseHTML(e.template); + t.panels.forEach(function (panel) { + panel.innerDOM.append( + $(t.template).clone() + ).ready(function () { + if (t.script == null) { + + } else { + panel.js = new t.script(); + //hide function + panel.hide = function () { + panel.hidden = true; + try { + panel.js.hide.call(panel.js); + } catch (ex) { + console.log("Layout: exception when running hide for " + panel.name + "\n" + ex); + } + } + //show function + panel.show = function (duration) { + panel.hidden = false; + try { + panel.js.show.call(panel.js, duration); + } catch (ex) { + console.log("Layout: exception when running show for " + panel.name + "\n" + ex); + } + if (panel.needResize) { + panel.resize.call(panel.js); + } + }; + panel.loaded = function () { + try { + panel.js.loaded.call(panel.js, panel.innerDOM, panel.config); + } catch (ex) { + console.log("Layout: exception when running loaded for " + panel.name + "\n" + ex); + } + } + panel.unload = function () { + try { + panel.js.unload.bind(panel.js); + } catch (ex) { + console.log("Layout: exception when running unload for " + panel.name + "\n" + ex); + } + } + panel.resize = function () { + if (panel.hidden) { + panel.needResize = true; + } else { + panel.needResize = false; + try { + panel.js.resize.call(panel.js); + } catch (ex) { + console.log("Layout: exception when running resize for " + panel.name + "\n" + ex); + } + } + } + panel.checkShowCondition = function () { + try { + var res = panel.js.checkShowCondition.call(panel.js); + } catch (ex) { + console.log("Layout: exception when running checkShowCondition for " + panel.name + "\n" + ex); + return -1; + } + if (typeof(res) != "number") + return 0; + return res; + } + + panel.js.panel = panel.innerDOM; + + panel.loaded(); + + layout.readyCounter--; + if (layout.readyCounter == 0) { + layout.startMainLayout(); + } + } + }); + }) + } + var n = this.name; + $.get("panels/" + n + "/template.html", function (k) { + console.log("get success of template " + n) + e.template = k; + doMore(); + }, "text") + .fail(function () { + layout.error("get fail of template " + n); + }); + + + t.css = $("<link>").attr("rel", "stylesheet").attr("href", "panels/" + n + "/style.less").attr("data-template", t.name); + + + t.css.on("load", function () { + console.log("get success of style " + n); + e.css = t.css; + doMore(); }); - } - } - var n = this.name; - $.get("panels/" + n + "/template.html", function(k) { - console.log("get success of template " + n) - e.template=k; - doMore(); - },"text") - .fail(function() { - layout.error("get fail of template " + n ); - }); - - - t.css = $("<link>").attr("rel","stylesheet").attr("href", "panels/" + n + "/style.less").attr("data-template",t.name); - - - t.css.on("load",function() { - console.log("get success of style " + n); - e.css= t.css; - doMore(); - }); - - - /*.fail(function() { - layout.error("get fail of style " + n); - });*/ - - $("head").append(t.css); - /*$.get("panels/" + n + "/style.less", function(k) { - e.css=k; - doMore(); - },"text") - */ - - - $.get("panels/" + n + "/script.js", function(k){ - console.log("get success of script " + n) - e.js=k; - doMore(); - },"text") - .fail(function(e) { - layout.error("get fail of script " + n); - console.log(e); - }); - - } - } - ) + + + /*.fail(function() { + layout.error("get fail of style " + n); + });*/ + + $("head").append(t.css); + + $.get("panels/" + n + "/script.js", function (k) { + console.log("get success of script " + n) + e.js = k; + doMore(); + }, "text") + .fail(function (e) { + layout.error("get fail of script " + n); + console.log(e); + }); + + } + } + } -layout.panelLoaded = function(panel) { - console.log(panel); +layout.loadLayout = function (layoutname) { + var w = "config/layouts/" + layoutname + ".json"; + console.log(w); + $.get(w, function (e) { + var mainLayout = layout.processLayout(e, $("[data-container=main]")); + + layout.startMainLayout = function () { + $(window).resize(layout.resizeLayout); + mainLayout.show(); + layout.resizeLayout(); + }; + + for (var tmp in layout.templates) { + layout.templates[tmp].loadTemplate(); + } + + }).fail(function () { + layout.error("get fail"); + }); } -layout.loadLayout = function(layoutname) { - var w = "config/layouts/"+layoutname+".json"; - console.log(w); - $.get(w, function(e) { - layout.processLayout(e, $("[data-container=main]")); - for (var tmp in layout.templates) { - layout.templates[tmp].loadTemplate(); - } - }).fail(function() { - layout.error("get fail"); - }); -}, - - -layout.error = function(e) { - console.log("Layout: Error " + e); -}, - -layout.templates = []; \ No newline at end of file + +layout.error = function (e) { + console.error("Layout: Error " + e); +}