Main.js 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. MWF.xApplication.SmartOfficeRoom.options.multitask = false;
  2. MWF.xApplication.SmartOfficeRoom.Main = new Class({
  3. Extends: MWF.xApplication.Common.Main,
  4. Implements: [Options, Events],
  5. options: {
  6. "style1": "default",
  7. "style": "default",
  8. "name": "SmartOfficeRoom",
  9. "icon": "icon.png",
  10. "width": "420",
  11. "height": "680",
  12. "isResize": false,
  13. "isMax": false,
  14. "title": MWF.xApplication.SmartOfficeRoom.LP.title
  15. },
  16. onQueryLoad: function(){
  17. this.lp = MWF.xApplication.SmartOfficeRoom.LP;
  18. this.action = MWF.Actions.get("x_smartoffice_control");
  19. },
  20. reload: function(){
  21. this.deviceContent.setStyle("display", "block");
  22. if (this.selectDeviceContent) this.selectDeviceContent.setStyle("display", "none");
  23. },
  24. loadApplication: function(callback){
  25. this.devices = [];
  26. this.size = this.content.getSize();
  27. var itemWidth = (this.size.x/2).toInt()-22;
  28. this.css.itemNode.width = ""+itemWidth+"px";
  29. this.loadDeviceContent();
  30. if (callback) callback();
  31. },
  32. loadDeviceContent: function(){
  33. this.deviceContent = new Element("div", {"styles": this.css.contentNode}).inject(this.content);
  34. this.loadDevices();
  35. this.loadConfigButton();
  36. },
  37. loadDevices: function(){
  38. this.action.listDevice(function(json){
  39. if (callback) callback();
  40. });
  41. },
  42. loadConfigButton: function(){
  43. this.addActionNode = new Element("div", {"styles": this.css.itemNode}).inject(this.deviceContent);
  44. this.addActionTextNode = new Element("div", {"styles": this.css.addActionTextNode, "text": this.lp.add}).inject(this.addActionNode);
  45. this.addActionIconNode = new Element("div", {"styles": this.css.addActionIconNode}).inject(this.addActionNode);
  46. this.addActionIconNode.addEvents({
  47. "mouseover": function(){this.addActionIconNode.setStyles(this.css.addActionIconNode_over); this.addActionTextNode.setStyle("color", "#3498db");}.bind(this),
  48. "mouseout": function(){this.addActionIconNode.setStyles(this.css.addActionIconNode); this.addActionTextNode.setStyle("color", "#999");}.bind(this),
  49. "click": function(e){
  50. this.addActionIconNode.setStyles(this.css.addActionIconNode); this.addActionTextNode.setStyle("color", "#999");
  51. this.createNewDevice(e);
  52. }.bind(this)
  53. });
  54. },
  55. createNewDevice: function(){
  56. this.deviceContent.setStyle("display", "none");
  57. if (!this.selectDeviceContent) this.createSelectDeviceContent();
  58. this.selectDeviceContent.setStyle("display", "block");
  59. },
  60. createSelectDeviceContent: function(){
  61. var _self = this;
  62. this.selectDeviceContent = new Element("div", {"styles": this.css.contentNode}).inject(this.content);
  63. MWF.getJSON(this.path+"device.json", function(json){
  64. Object.each(json, function(dev){
  65. var node = new Element("div", {"styles": this.css.selectDeviceNode}).inject(this.selectDeviceContent);
  66. node.store("dev", dev);
  67. var iconNode = new Element("div", {"styles": this.css.selectDeviceIconNode}).inject(node);
  68. iconNode.setStyle("background-image", "url("+this.path+this.options.style+"/device/"+dev.icon+"-off-64.png)");
  69. var flagNode = new Element("div", {"styles": this.css.selectDeviceFlagNode}).inject(node);
  70. var contentNode = new Element("div", {"styles": this.css.selectDeviceContentNode}).inject(node);
  71. var textNode = new Element("div", {"styles": this.css.selectDeviceTextNode, "text": dev.name}).inject(contentNode);
  72. var desNode = new Element("div", {"styles": this.css.selectDeviceDesNode, "text": dev.description}).inject(contentNode);
  73. node.addEvents({
  74. "mouseover": function(){this.setStyles(_self.css.selectDeviceNode_over);},
  75. "mouseout": function(){this.setStyles(_self.css.selectDeviceNode);},
  76. "click": function(e){_self.createDevice(this)}
  77. });
  78. }.bind(this))
  79. }.bind(this));
  80. },
  81. createDevice: function(node){
  82. var dev = node.retrieve("dev");
  83. if (dev && dev["class"]){
  84. var device = new MWF.xApplication.SmartOfficeRoom.Device[dev["class"]](this);
  85. device.create();
  86. }
  87. }
  88. });
  89. MWF.xApplication.SmartOfficeRoom.Device = new Class({
  90. initialize: function(app, data){
  91. this.app = app;
  92. this.css = this.app.css;
  93. this.lp = this.app.lp;
  94. this.data = data;
  95. this.init();
  96. },
  97. init: function(){},
  98. load: function(){},
  99. getNewData: function(){
  100. return {
  101. "name": "",
  102. "sn": "",
  103. "description": ""
  104. }
  105. },
  106. create: function(){
  107. this.data = this.getNewData();
  108. this.createAreaNode();
  109. },
  110. createAreaNode: function(){
  111. this.areaNode = new Element("div", {"styles": this.css.createContentNode}).inject(this.app.content);
  112. var size = this.app.content.getSize();
  113. this.areaNode.setStyle("left", ""+size.x+"px");
  114. this.createConfigTitle();
  115. this.createConfigAction();
  116. this.createConfigContent();
  117. new Fx.Morph(this.areaNode, {
  118. "duration": "200"
  119. }).start({"left": "0px"});
  120. },
  121. createConfigTitle: function(){
  122. this.configTitleNode = new Element("div", {"styles": this.css.configContentTitleNode}).inject(this.areaNode);
  123. this.configIconNode = new Element("div", {"styles": this.css.configContentIconNode}).inject(this.configTitleNode);
  124. this.configTextNode = new Element("div", {"styles": this.css.configContentTextNode}).inject(this.configTitleNode);
  125. },
  126. createConfigAction: function(){
  127. this.configActionAreaNode = new Element("div", {"styles": this.css.configActionAreaNode}).inject(this.areaNode);
  128. this.configSaveActionNode = new Element("div", {"styles": this.css.configSaveActionNode, "text": this.lp.save}).inject(this.configActionAreaNode);
  129. this.configCancelActionNode = new Element("div", {"styles": this.css.configCancelActionNode, "text": this.lp.cancel}).inject(this.configActionAreaNode);
  130. this.configSaveActionNode.addEvent("click", this.saveDevice.bind(this));
  131. this.configCancelActionNode.addEvent("click", this.cancelDevice.bind(this));
  132. },
  133. createConfigContent: function(){
  134. this.configContentNode = new Element("div", {"styles": this.css.configContentNode}).inject(this.areaNode);
  135. var size = this.app.content.getSize();
  136. var titleSize = this.configTitleNode.getSize();
  137. var actionSize = this.configActionAreaNode.getSize();
  138. var h = size.y-titleSize.y-actionSize.y;
  139. this.configContentNode.setStyle("height", ""+h+"px");
  140. this.createConfigInputContent()
  141. },
  142. cancelDevice: function(){
  143. var size = this.app.content.getSize();
  144. this.app.reload();
  145. new Fx.Morph(this.areaNode, {
  146. "duration": "200"
  147. }).start({"left": ""+size.x+"px"}).chain(function(){
  148. this.destroy();
  149. }.bind(this));
  150. },
  151. destroy: function(){
  152. this.areaNode.destroy();
  153. MWF.release(this);
  154. },
  155. saveDevice: function(){
  156. this.saveDeviceAction(function(){
  157. this.cancelDevice();
  158. }.bind(this));
  159. },
  160. saveDeviceAction: function(callback){
  161. if (callback) callback();
  162. }
  163. });
  164. MWF.xApplication.SmartOfficeRoom.Device.Light = new Class({
  165. Extends: MWF.xApplication.SmartOfficeRoom.Device,
  166. createConfigInputContent: function(){
  167. this.configIconNode.setStyle("background-image", "url("+this.app.path+this.app.options.style+"/device/light-32.png)");
  168. this.configTextNode.set("text", this.data.name || this.lp.newLight);
  169. var nameTitleNode = new Element("div", {"styles": this.css.configContentItemTitleNode, "text": this.lp.inputName}).inject(this.configContentNode);
  170. var nameInputAreaNode = new Element("div", {"styles": this.css.configContentItemInputAreaNode}).inject(this.configContentNode);
  171. this.nameInputNode = new Element("input", {"styles": this.css.configContentItemInputNode}).inject(nameInputAreaNode);
  172. var snTitleNode = new Element("div", {"styles": this.css.configContentItemTitleNode, "text": this.lp.inputSn}).inject(this.configContentNode);
  173. var snInputAreaNode = new Element("div", {"styles": this.css.configContentItemInputAreaNode}).inject(this.configContentNode);
  174. this.snInputNode = new Element("input", {"styles": this.css.configContentItemInputNode}).inject(snInputAreaNode);
  175. var descriptionTitleNode = new Element("div", {"styles": this.css.configContentItemTitleNode, "text": this.lp.inputDescription}).inject(this.configContentNode);
  176. var descriptionInputAreaNode = new Element("div", {"styles": this.css.configContentItemTextareaAreaNode}).inject(this.configContentNode);
  177. this.descriptionInputNode = new Element("textarea", {"styles": this.css.configContentItemTextareaNode}).inject(descriptionInputAreaNode);
  178. },
  179. saveDeviceAction: function(callback){
  180. var name = this.nameInputNode.get("value");
  181. var sn = this.snInputNode.get("value");
  182. var description = this.descriptionInputNode.get("value");
  183. if (!name){
  184. this.app.notice(this.lp.noname, "error");
  185. return false;
  186. }
  187. if (!sn){
  188. this.app.notice(this.lp.nosn, "error");
  189. return false;
  190. }
  191. var data = {
  192. "type": "light",
  193. "name": name,
  194. "sn": sn,
  195. "description": description
  196. };
  197. this.app.action.saveDevice(data, function(){
  198. if (callback) callback();
  199. });
  200. }
  201. });