core_webinterface.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. // Copyright (c) 2013 Datenstrom, http://www.datenstrom.se
  2. // This file may be used and distributed under the terms of the public license.
  3. // Yellow main API
  4. var yellow =
  5. {
  6. version: "0.0.0", //Hello web interface!
  7. onClick: function(e) { yellow.webinterface.hidePanesOnClick(e); },
  8. onShow: function(id) { yellow.webinterface.showPane(id); },
  9. onReset: function(id) { yellow.webinterface.resetPane(id); },
  10. onResize: function() { yellow.webinterface.resizePanes(); },
  11. webinterface:{}, page:{}, pages:{}, toolbox:{}, config:{}, text:{}
  12. }
  13. // Yellow web interface
  14. yellow.webinterface =
  15. {
  16. created: false, //interface created? (boolean)
  17. timerId: 0, //interface timer ID
  18. heightOld: 0, //height of big panes
  19. // Initialise web interface
  20. init: function()
  21. {
  22. this.intervalId = window.setInterval("yellow.webinterface.create()", 1);
  23. window.onresize = yellow.onResize;
  24. window.onclick = yellow.onClick;
  25. },
  26. // Create action bar and panes
  27. create: function()
  28. {
  29. var body = document.getElementsByTagName("body")[0];
  30. if(!body || !body.firstChild || this.created) return;
  31. if(yellow.debug) console.log("yellow.webinterface.create email:"+yellow.config.userEmail+" "+yellow.config.userName);
  32. if(yellow.config.userEmail)
  33. {
  34. var location = yellow.config.baseLocation+yellow.config.pluginsLocation;
  35. var element = document.createElement("div");
  36. element.className = "yellowbar";
  37. element.setAttribute("id", "yellowbar");
  38. element.innerHTML =
  39. "<div class=\"yellowbarleft\">"+
  40. "<img src=\""+location+"core_webinterface.png\" width=\"16\" height=\"16\"> Yellow"+
  41. "<button class=\"yellowbarlink\" onclick=\"yellow.onShow('yellowpaneedit');\">"+this.getText("Edit")+"</button>"+
  42. "<button class=\"yellowbarlink\" onclick=\"yellow.onShow('yellowpaneshow');\">"+this.getText("Show")+"</button>"+
  43. "</div>"+
  44. "<div class=\"yellowbarright\">"+
  45. "<button class=\"yellowbarlink\" onclick=\"yellow.onShow('yellowpaneuser');\" id=\"yellowusername\">"+this.getText("User")+"</button>"+
  46. "</div>";
  47. body.insertBefore(element, body.firstChild);
  48. yellow.toolbox.insertAfter(this.createPane("yellowpaneedit"), body.firstChild);
  49. yellow.toolbox.insertAfter(this.createPane("yellowpaneshow", yellow.pages), body.firstChild);
  50. yellow.toolbox.insertAfter(this.createPane("yellowpaneuser"), body.firstChild);
  51. yellow.toolbox.setText(document.getElementById("yellowusername"), yellow.config.userName+" ↓");
  52. yellow.toolbox.setText(document.getElementById("yellowedittext"), yellow.page.rawData);
  53. } else {
  54. var element = document.createElement("div");
  55. element.className = "yellowlogin yellowbubble";
  56. element.setAttribute("id", "yellowlogin");
  57. element.innerHTML =
  58. "<form method=\"post\" name=\"formlogin\">"+
  59. "<input type=\"hidden\" name=\"action\" value=\"login\"/>"+
  60. "<h1>"+this.getText("LoginText")+"</h1>"+
  61. "<p>"+this.getText("LoginEmail")+" <input name=\"email\" maxlength=\"64\" /></p>"+
  62. "<p>"+this.getText("LoginPassword")+" <input type=\"password\" name=\"password\" maxlength=\"64\" /></p>"+
  63. "<p><input type=\"submit\" value=\""+this.getText("LoginButton")+"\"/></p>"+
  64. "</form>";
  65. body.insertBefore(element, body.firstChild);
  66. }
  67. window.clearInterval(this.intervalId);
  68. this.created = true;
  69. this.resizePanes(true);
  70. },
  71. // Create pane
  72. createPane: function (id, data)
  73. {
  74. if(yellow.debug) console.log("yellow.webinterface.createPane id:"+id);
  75. var outDiv = document.createElement("div");
  76. if(id == "yellowpaneedit")
  77. {
  78. outDiv.innerHTML =
  79. "<p>Editing page...</p>"+
  80. "<form method=\"post\" name=\"formeditor\">"+
  81. "<input type=\"hidden\" name=\"action\" value=\"edit\"/>"+
  82. "<textarea id=\"yellowedittext\" name=\"rawdata\"></textarea>"+
  83. "<div id=\"yelloweditbuttons\">"+
  84. "<input type=\"submit\" value=\""+this.getText("SaveButton")+"\"/>"+
  85. "<input type=\"button\" value=\""+this.getText("CancelButton")+"\" onclick=\"yellow.onReset('yellowpaneedit');\"/>"+
  86. "</div>"+
  87. "</form>";
  88. } else if(id == "yellowpaneshow") {
  89. outDiv.innerHTML = "<p>Showing files...</p>";
  90. for(var n in data)
  91. {
  92. var outUl = document.createElement("ul");
  93. var outLi = document.createElement("li");
  94. var outA = document.createElement("a");
  95. outA.setAttribute("href", data[n]["location"]);
  96. yellow.toolbox.setText(outA, data[n]["title"]);
  97. outLi.appendChild(outA);
  98. outUl.appendChild(outLi);
  99. outDiv.appendChild(outUl);
  100. }
  101. } else if(id == "yellowpaneuser") {
  102. outDiv.innerHTML =
  103. "<p>"+yellow.config.userEmail+"</p>"+
  104. "<form method=\"post\" name=\"formlogout\">"+
  105. "<input type=\"hidden\" name=\"action\" value=\"logout\"/>"+
  106. "<p><a href=\"javascript:document.formlogout.submit();\">"+this.getText("UserLogout")+"</a></p> "+
  107. "</form>";
  108. }
  109. var element = document.createElement("div");
  110. element.className = "yellowpane yellowbubble";
  111. element.setAttribute("id", id);
  112. element.appendChild(outDiv);
  113. return element;
  114. },
  115. // Reset pane
  116. resetPane: function(id)
  117. {
  118. if(id == "yellowpaneedit")
  119. {
  120. document.formeditor.reset();
  121. yellow.toolbox.setText(document.getElementById("yellowedittext"), yellow.page.rawData);
  122. this.hidePane(id);
  123. }
  124. },
  125. // Show pane
  126. showPane: function(id)
  127. {
  128. if(document.getElementById(id).style.display == "block")
  129. {
  130. this.hidePanes();
  131. } else {
  132. this.hidePanes();
  133. if(yellow.debug) console.log("yellow.webinterface.showPane id:"+id);
  134. document.getElementById(id).style.display = "block";
  135. this.resizePanes(true);
  136. }
  137. },
  138. // Hide pane
  139. hidePane: function(id)
  140. {
  141. if(document.getElementById(id)) document.getElementById(id).style.display = "none";
  142. },
  143. // Hide all panes
  144. hidePanes: function ()
  145. {
  146. for(var element=document.getElementById("yellowbar"); element; element=element.nextSibling)
  147. {
  148. if(element.className && element.className.indexOf("yellowpane")>=0)
  149. {
  150. this.hidePane(element.getAttribute("id"));
  151. }
  152. }
  153. },
  154. // Hide all panes on mouse click
  155. hidePanesOnClick: function(e)
  156. {
  157. var element = e.target || e.srcElement;
  158. while(element = element.parentNode)
  159. {
  160. if(element.className)
  161. {
  162. if(element.className.indexOf("yellowpane")>=0 || element.className.indexOf("yellowbar")>=0) return;
  163. }
  164. }
  165. this.hidePanes();
  166. },
  167. // Resize panes, recalculate height and width where needed
  168. resizePanes: function(force)
  169. {
  170. var interfaceHeight = Number(window.innerHeight);
  171. if((interfaceHeight!=this.heightOld || force) && document.getElementById("yellowbar"))
  172. {
  173. this.heightOld = interfaceHeight;
  174. var elementBar = document.getElementById("yellowbar");
  175. var borderRadius = 6;
  176. var panePadding = 5;
  177. var editPadding = 5;
  178. var interfaceTop = elementBar.offsetHeight + 1;
  179. interfaceHeight -= interfaceTop + borderRadius*2;
  180. if(yellow.debug) console.log("yellow.webinterface.resizePanes windowY:"+interfaceHeight+" actionbarY:"+document.getElementById("yellowbar").offsetHeight+" buttonsY:"+document.getElementById("yelloweditbuttons").offsetHeight+" editorX:"+document.getElementById("yellowpaneedit").offsetWidth);
  181. this.setPaneHeight(document.getElementById("yellowpaneedit"), interfaceHeight, null, interfaceTop);
  182. this.setPaneHeight(document.getElementById("yellowpaneshow"), null, interfaceHeight, interfaceTop);
  183. this.setPaneHeight(document.getElementById("yellowpaneuser"), null, null, interfaceTop);
  184. var editTextHeight = interfaceHeight - panePadding*2 - editPadding*2 - 10
  185. - (document.getElementById("yellowedittext").offsetTop-document.getElementById("yellowpaneedit").getElementsByTagName("p")[0].offsetTop)
  186. - document.getElementById("yelloweditbuttons").offsetHeight;
  187. document.getElementById("yellowpaneedit").style.width = (elementBar.offsetWidth - panePadding*2).toString()+"px";
  188. document.getElementById("yellowedittext").style.height = editTextHeight.toString()+"px";
  189. document.getElementById("yellowedittext").style.width = (document.getElementById("yellowpaneedit").offsetWidth - 2 - panePadding*2 - editPadding*2).toString()+"px";
  190. document.getElementById("yellowpaneuser").style.marginLeft = (elementBar.offsetWidth - document.getElementById("yellowpaneuser").offsetWidth).toString()+"px";
  191. }
  192. },
  193. // Set pane height
  194. setPaneHeight: function(element, height, maxHeight, top)
  195. {
  196. if(maxHeight)
  197. {
  198. element.style.maxHeight = maxHeight.toString()+"px";
  199. } else if(height) {
  200. element.style.height = height.toString()+"px";
  201. }
  202. element.style.top = top+"px";
  203. },
  204. // Return text string
  205. getText: function(key)
  206. {
  207. return ("webinterface"+key in yellow.text) ? yellow.text["webinterface"+key] : "[webinterface"+key+"]";
  208. }
  209. }
  210. // Yellow toolbox with helpers
  211. yellow.toolbox =
  212. {
  213. // Set element text
  214. setText: function(element, text)
  215. {
  216. while(element.firstChild!==null) element.removeChild(element.firstChild);
  217. element.appendChild(document.createTextNode(text));
  218. },
  219. // Insert element after element
  220. insertAfter: function(newElement, referenceElement)
  221. {
  222. referenceElement.parentNode.insertBefore(newElement, referenceElement.nextSibling);
  223. }
  224. }
  225. yellow.webinterface.init();