status.html 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>{{ data['title'] }} Status display</title>
  6. <meta name="description"
  7. content="Status display generated by BORA.">
  8. <link rel="stylesheet" href="{{ static_url("style.css") }}">
  9. <link rel="stylesheet" href="{{ static_url("jquery-ui.min.css") }}">
  10. <!--[if IE]>
  11. <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script>
  12. <![endif]-->
  13. </head>
  14. <body>
  15. <div id="page_info">{{ data['title'] }} data monitoring. Last refreshed</div>
  16. <div id="page_title_cache" style="display:none;">{{ data['title'] }}</div>
  17. {% if data['style'] %}
  18. {% for key in data['style'] %}
  19. {% if data['style'][key]['type'] == "calc" %}
  20. <div style='position: absolute; top: {{ data['style'][key]['top'] }}; left:{{
  21. data['style'][key]['left'] }}; width:{{ data['style'][key]['width'] }}px;
  22. height:{{ data['style'][key]['height'] }}px;
  23. {% if "background_color" in data['style'][key] %}
  24. background-color:{{ data['style'][key]['background_color'] }}'
  25. {% else%}
  26. {% end %}
  27. {% if "condition" in data['style'][key] %}
  28. data-cond="{{ data['style'][key]['condition'] }}"
  29. {% else%}position
  30. {% end%}
  31. {% if "formula" in data['style'][key] %}
  32. data-formula="{{ data['style'][key]['formula'] }}"
  33. {% else %}
  34. {% end %}
  35. {% if "lesser" in data['style'][key] %}
  36. data-lesser="{{ data['style'][key]['lesser'] }}"
  37. {% else %}
  38. {% end %}
  39. {% if "larger" in data['style'][key] %}
  40. data-larger="{{ data['style'][key]['larger'] }}"
  41. {% else %}
  42. {% end %}
  43. {% if "decimal" in data['style'][key] %}
  44. data-decimal="{{ data['style'][key]['decimal'] }}"
  45. {% else %}
  46. {% end %}
  47. data-type="{{ data['style'][key]['type'] }}" class='databox' id="{{ key }}">
  48. <p><span style="color: #000; font-size: {{ data['style'][key]['header']['size'] }}px; font-weight: {{ data['style'][key]['header']['weight'] }};" class="title">{{ data['style'][key]['header']['title'] }} </span><span style="color: #000; font-size: {{ data['style'][key]['unit']['size'] }}px; font-weight: {{ data['style'][key]['unit']['weight'] }};" class="varval"> --- </span><span class='unit_title' style="color: #000; font-size: {{ data['style'][key]['unit']['size'] }}px; font-weight: {{ data['style'][key]['unit']['weight'] }};" > {{ data['style'][key]['unit']['title'] }}</span></p>
  49. </div>
  50. {% else %}
  51. {% end %}
  52. {% if data['style'][key]['type'] == "data" %}
  53. {% if "ref" in data['style'][key] %}
  54. <div tooltip="{{ data['style'][key]['ref'] }}"
  55. {% else %}
  56. <div tooltip="{{ key }}"
  57. {% end %}
  58. class="databox" style='position: absolute; top: {{ data['style'][key]['top'] }}; left:{{ data['style'][key]['left'] }}; width:{{ data['style'][key]['width'] }}px; height:{{ data['style'][key]['height'] }}px;
  59. {% if "background_color" in data['style'][key] %}
  60. background-color:{{ data['style'][key]['background_color'] }};'
  61. {% else%}
  62. {% end%}
  63. {% if "condition" in data['style'][key] %}
  64. data-cond="{{ data['style'][key]['condition'] }}"
  65. {% else%}
  66. {% end%}
  67. {% if "formula" in data['style'][key] %}
  68. data-formula="{{ data['style'][key]['formula'] }}"
  69. {% else %}
  70. {% end %}
  71. {% if "lesser" in data['style'][key] %}
  72. data-lesser="{{ data['style'][key]['lesser'] }}"
  73. {% else %}
  74. {% end %}
  75. {% if "larger" in data['style'][key] %}
  76. data-larger="{{ data['style'][key]['larger'] }}"
  77. {% else %}
  78. {% end %}
  79. {% if "decimal" in data['style'][key] %}
  80. data-decimal="{{ data['style'][key]['decimal'] }}"
  81. {% else %}
  82. {% end %}
  83. {% if "exponential" in data['style'][key] %}
  84. data-exponential="{{ data['style'][key]['exponential'] }}"
  85. {% else %}
  86. {% end %}
  87. {% if "trend" in data['style'][key] %}
  88. data-trend="{{ data['style'][key]['trend'] }}"
  89. {% else %}
  90. {% end %}
  91. {% if "linkhtml" in data['style'][key] %}
  92. {% if data['style'][key]['linkhtml'] == 'true' %}
  93. {% if "server" in data %}
  94. {% if data['style'][key]['ref'] in data['varname'] %}
  95. onclick="window.open( '{{ data["server"] }}#module=graph&{{ data['varname'][data['style'][key]['ref']] }}&experiment=-&window=86400&module=graph&virtual=srctree&srctree=&infomod=legend', '_blank');"
  96. {% else %}
  97. {% end %}
  98. {% else %}
  99. {% end %}
  100. {% else %}
  101. {% end %}
  102. {% else %}
  103. {% end %}
  104. {% if "ref" in data['style'][key] %}
  105. data-type="{{ data['style'][key]['type'] }}" id="{{ key }}">
  106. <p><span style="color: #000; font-size: {{ data['style'][key]['header']['size'] }}px; font-weight: {{ data['style'][key]['header']['weight'] }};" class="title">{{ data['style'][key]['header']['title'] }} </span><span style="color: #000; font-size: {{ data['style'][key]['unit']['size'] }}px; font-weight: {{ data['style'][key]['unit']['weight'] }};" class="varval"> --- </span><span class='unit_title' style="color: #000; font-size: {{ data['style'][key]['unit']['size'] }}px; font-weight: {{ data['style'][key]['unit']['weight'] }};"> {{ data['style'][key]['unit']['title'] }}</span>
  107. {% if "trend" in data['style'][key] %}
  108. {% if data['style'][key]['trend'] == 'true' %}
  109. </p>
  110. {% else %}
  111. {% end %}
  112. {% else %}
  113. {% end %}
  114. </div>
  115. {% else %}
  116. data-type="{{ data['style'][key]['type'] }}" id="{{ key }}">
  117. <p><span style="color: #000; font-size: {{ data['style'][key]['header']['size'] }}px; font-weight: {{ data['style'][key]['header']['weight'] }};" class="title">{{ data['style'][key]['header']['title'] }} </span><span style="color: #000; font-size: {{ data['style'][key]['unit']['size'] }}px; font-weight: {{ data['style'][key]['unit']['weight'] }};" class="varval"> --- </span><span class='unit_title' style="color: #000; font-size: {{ data['style'][key]['unit']['size'] }}px; font-weight: {{ data['style'][key]['unit']['weight'] }};"> {{ data['style'][key]['unit']['title'] }}</span>
  118. {% if "trend" in data['style'][key] %}
  119. {% if data['style'][key]['trend'] == 'true' %}
  120. </p>
  121. {% else %}
  122. {% end %}
  123. {% else %}
  124. {% end %}
  125. </div>
  126. {% end %}
  127. {% else %}
  128. {% end %}
  129. {% if data['style'][key]['type'] == "icon" %}
  130. {% if data['style'][key]['icon'] == "valve" %}
  131. {% if "ref" in data['style'][key] %}
  132. <div tooltip="{{ data['style'][key]['ref'] }}"
  133. {% else %}
  134. <div tooltip="{{ key }}"
  135. {% end %}
  136. style='position: absolute; top: {{ data['style'][key]['top'] }}; left:{{ data['style'][key]['left'] }}; width:{{ data['style'][key]['width'] }}px; height:{{ data['style'][key]['height'] }}px;
  137. {% if "background_color" in data['style'][key] %}
  138. background-color:{{ data['style'][key]['background_color'] }};'
  139. {% else%}
  140. {% end%}
  141. {% if "trend" in data['style'][key] %}
  142. data-trend="{{ data['style'][key]['trend'] }}"
  143. {% else %}
  144. {% end %}
  145. {% if data['style'][key]['linkhtml'] == 'true' %}
  146. {% if "server" in data %}
  147. onclick="window.open( '{{ data["server"] }}#module=graph&{{ data['varname'][data['style'][key]['ref']] }}&experiment=-&window=86400&module=graph&virtual=srctree&srctree=&infomod=legend', '_blank');"
  148. {% else %}
  149. {% end %}
  150. {% else %}
  151. {% end %}
  152. {% if "ref" in data['style'][key] %}
  153. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  154. {% if "trend" in data['style'][key] %}
  155. {% if data['style'][key]['trend'] == 'true' %}
  156. {% else %}
  157. {% end %}
  158. {% else %}
  159. {% end %}
  160. <div class="icon">
  161. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("valve_inactive.png") }}'></img>
  162. </div>
  163. </div>
  164. {% else %}
  165. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  166. {% if data['style'][key]['trend'] == 'true' %}
  167. {% else %}
  168. {% end %}
  169. <div class="icon">
  170. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("valve_inactive.png") }}'></img>
  171. </div>
  172. </div>
  173. {% end %}
  174. {% else %}
  175. {% end %}
  176. {% if data['style'][key]['icon'] == "commbit" %}
  177. {% if "ref" in data['style'][key] %}
  178. <div tooltip="{{ data['style'][key]['ref'] }}"
  179. {% else %}
  180. <div tooltip="{{ key }}"
  181. {% end %}
  182. style='position: absolute; top: {{ data['style'][key]['top'] }}; left:{{ data['style'][key]['left'] }}; width:{{ data['style'][key]['width'] }}px; height:{{ data['style'][key]['height'] }}px;
  183. {% if "background_color" in data['style'][key] %}
  184. background-color:{{ data['style'][key]['background_color'] }};'
  185. {% else%}
  186. {% end%}
  187. {% if "trend" in data['style'][key] %}
  188. data-trend="{{ data['style'][key]['trend'] }}"
  189. {% else %}
  190. {% end %}
  191. {% if data['style'][key]['linkhtml'] == 'true' %}
  192. {% if "server" in data %}
  193. onclick="window.open( '{{ data["server"] }}#module=graph&{{ data['varname'][data['style'][key]['ref']] }}&experiment=-&window=86400&module=graph&virtual=srctree&srctree=&infomod=legend', '_blank');"
  194. {% else %}
  195. {% end %}
  196. {% else %}
  197. {% end %}
  198. {% if "ref" in data['style'][key] %}
  199. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  200. {% if data['style'][key]['trend'] == 'true' %}
  201. {% else %}
  202. {% end %}
  203. <div class="icon">
  204. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("commbit_inactive.svg") }}'></img>
  205. </div>
  206. </div>
  207. {% else %}
  208. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  209. {% if data['style'][key]['trend'] == 'true' %}
  210. {% else %}
  211. {% end %}
  212. <div class="icon">
  213. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("commbit_inactive.svg") }}'></img>
  214. </div>
  215. </div>
  216. {% end %}
  217. {% else %}
  218. {% end %}
  219. {% if data['style'][key]['icon'] == "alarm" %}
  220. {% if "ref" in data['style'][key] %}
  221. <div tooltip="{{ data['style'][key]['ref'] }}"
  222. {% else %}
  223. <div tooltip="{{ key }}"
  224. {% end %}
  225. style='position: absolute; top: {{ data['style'][key]['top'] }}; left:{{ data['style'][key]['left'] }}; width:{{ data['style'][key]['width'] }}px; height:{{ data['style'][key]['height'] }}px;
  226. {% if "background_color" in data['style'][key] %}
  227. background-color:{{ data['style'][key]['background_color'] }};'
  228. {% else%}
  229. {% end%}
  230. {% if "trend" in data['style'][key] %}
  231. data-trend="{{ data['style'][key]['trend'] }}"
  232. {% else %}
  233. {% end %}
  234. {% if data['style'][key]['linkhtml'] == 'true' %}
  235. {% if "server" in data %}
  236. onclick="window.open( '{{ data["server"] }}#module=graph&{{ data['varname'][data['style'][key]['ref']] }}&experiment=-&window=86400&module=graph&virtual=srctree&srctree=&infomod=legend', '_blank');"
  237. {% else %}
  238. {% end %}
  239. {% else %}
  240. {% end %}
  241. {% if "ref" in data['style'][key] %}
  242. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  243. {% if data['style'][key]['trend'] == 'true' %}
  244. {% else %}
  245. {% end %}
  246. <div class="icon">
  247. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("alarm_inactive.svg") }}'></img>
  248. </div>
  249. </div>
  250. {% else %}
  251. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  252. {% if data['style'][key]['trend'] == 'true' %}
  253. {% else %}
  254. {% end %}
  255. <div class="icon">
  256. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("alarm_inactive.svg") }}'></img>
  257. </div>
  258. </div>
  259. {% end %}
  260. {% else %}
  261. {% end %}
  262. {% if data['style'][key]['icon'] == "TMP" %}
  263. {% if "ref" in data['style'][key] %}
  264. <div tooltip="{{ data['style'][key]['ref'] }}"
  265. {% else %}
  266. <div tooltip="{{ key }}"
  267. {% end %}
  268. style='position: absolute; top: {{ data['style'][key]['top'] }}; left:{{ data['style'][key]['left'] }}; width:{{ data['style'][key]['width'] }}px; height:{{ data['style'][key]['height'] }}px;
  269. {% if "background_color" in data['style'][key] %}
  270. background-color:{{ data['style'][key]['background_color'] }};'
  271. {% else%}
  272. {% end%}
  273. {% if "trend" in data['style'][key] %}
  274. data-trend="{{ data['style'][key]['trend'] }}"
  275. {% else %}
  276. {% end %}
  277. {% if data['style'][key]['linkhtml'] == 'true' %}
  278. {% if "server" in data %}
  279. onclick="window.open( '{{ data["server"] }}#module=graph&{{ data['varname'][data['style'][key]['ref']] }}&experiment=-&window=86400&module=graph&virtual=srctree&srctree=&infomod=legend', '_blank');"
  280. {% else %}
  281. {% end %}
  282. {% else %}
  283. {% end %}
  284. {% if "ref" in data['style'][key] %}
  285. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  286. {% if data['style'][key]['trend'] == 'true' %}
  287. {% else %}
  288. {% end %}
  289. <div class="icon">
  290. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("TMP_inactive.svg") }}'></img>
  291. </div>
  292. </div>
  293. {% else %}
  294. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  295. {% if data['style'][key]['trend'] == 'true' %}
  296. {% else %}
  297. {% end %}
  298. <div class="icon">
  299. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("TMP_inactive.svg") }}'></img>
  300. </div>
  301. </div>
  302. {% end %}
  303. {% else %}
  304. {% end %}
  305. {% if data['style'][key]['icon'] == "relay" %}
  306. {% if "ref" in data['style'][key] %}
  307. <div tooltip="{{ data['style'][key]['ref'] }}"
  308. {% else %}
  309. <div tooltip="{{ key }}"
  310. {% end %}
  311. style='position: absolute; top: {{ data['style'][key]['top'] }}; left:{{ data['style'][key]['left'] }}; width:{{ data['style'][key]['width'] }}px; height:{{ data['style'][key]['height'] }}px;
  312. {% if "background_color" in data['style'][key] %}
  313. background-color:{{ data['style'][key]['background_color'] }};'
  314. {% else%}
  315. {% end%}
  316. {% if "trend" in data['style'][key] %}
  317. data-trend="{{ data['style'][key]['trend'] }}"
  318. {% else %}
  319. {% end %}
  320. {% if data['style'][key]['linkhtml'] == 'true' %}
  321. {% if "server" in data %}
  322. onclick="window.open( '{{ data["server"] }}#module=graph&{{ data['varname'][data['style'][key]['ref']] }}&experiment=-&window=86400&module=graph&virtual=srctree&srctree=&infomod=legend', '_blank');"
  323. {% else %}
  324. {% end %}
  325. {% else %}
  326. {% end %}
  327. {% if "ref" in data['style'][key] %}
  328. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  329. {% if data['style'][key]['trend'] == 'true' %}
  330. {% else %}
  331. {% end %}
  332. <div class="icon">
  333. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("relay_inactive.svg") }}'></img>
  334. </div>
  335. </div>
  336. {% else %}
  337. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  338. {% if data['style'][key]['trend'] == 'true' %}
  339. {% else %}
  340. {% end %}
  341. <div class="icon">
  342. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("relay_inactive.svg") }}'></img>
  343. </div>
  344. </div>
  345. {% end %}
  346. {% else %}
  347. {% end %}
  348. {% if data['style'][key]['icon'] == "switch" %}
  349. {% if "ref" in data['style'][key] %}
  350. <div tooltip="{{ data['style'][key]['ref'] }}"
  351. {% else %}
  352. <div tooltip="{{ key }}"
  353. {% end %}
  354. style='position: absolute; top: {{ data['style'][key]['top'] }}; left:{{ data['style'][key]['left'] }}; width:{{ data['style'][key]['width'] }}px; height:{{ data['style'][key]['height'] }}px;
  355. {% if "background_color" in data['style'][key] %}
  356. background-color:{{ data['style'][key]['background_color'] }};'
  357. {% else%}
  358. {% end%}
  359. {% if "trend" in data['style'][key] %}
  360. data-trend="{{ data['style'][key]['trend'] }}"
  361. {% else %}
  362. {% end %}
  363. {% if data['style'][key]['linkhtml'] == 'true' %}
  364. {% if "server" in data %}
  365. onclick="window.open( '{{ data["server"] }}#module=graph&{{ data['varname'][data['style'][key]['ref']] }}&experiment=-&window=86400&module=graph&virtual=srctree&srctree=&infomod=legend', '_blank');"
  366. {% else %}
  367. {% end %}
  368. {% else %}
  369. {% end %}
  370. {% if "ref" in data['style'][key] %}
  371. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  372. {% if data['style'][key]['trend'] == 'true' %}
  373. {% else %}
  374. {% end %}
  375. <div class="icon">
  376. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("switch_inactive.svg") }}'></img>
  377. </div>
  378. </div>
  379. {% else %}
  380. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  381. {% if data['style'][key]['trend'] == 'true' %}
  382. {% else %}
  383. {% end %}
  384. <div class="icon">
  385. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("switch_inactive.svg") }}'></img>
  386. </div>
  387. </div>
  388. {% end %}
  389. {% else %}
  390. {% end %}
  391. {% if data['style'][key]['icon'] == "bottle" %}
  392. {% if "ref" in data['style'][key] %}
  393. <div tooltip="{{ data['style'][key]['ref'] }}"
  394. {% else %}
  395. <div tooltip="{{ key }}"
  396. {% end %}
  397. style='position: absolute; top: {{ data['style'][key]['top'] }}; left:{{ data['style'][key]['left'] }}; width:{{ data['style'][key]['width'] }}px; height:{{ data['style'][key]['height'] }}px;
  398. {% if "background_color" in data['style'][key] %}
  399. background-color:{{ data['style'][key]['background_color'] }};'
  400. {% else%}
  401. {% end%}
  402. {% if "trend" in data['style'][key] %}
  403. data-trend="{{ data['style'][key]['trend'] }}"
  404. {% else %}
  405. {% end %}
  406. {% if data['style'][key]['linkhtml'] == 'true' %}
  407. {% if "server" in data %}
  408. onclick="window.open( '{{ data["server"] }}#module=graph&{{ data['varname'][data['style'][key]['ref']] }}&experiment=-&window=86400&module=graph&virtual=srctree&srctree=&infomod=legend', '_blank');"
  409. {% else %}
  410. {% end %}
  411. {% else %}
  412. {% end %}
  413. {% if "ref" in data['style'][key] %}
  414. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  415. {% if data['style'][key]['trend'] == 'true' %}
  416. {% else %}
  417. {% end %}
  418. <div class="icon">
  419. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("bottle_inactive.svg") }}'></img>
  420. </div>
  421. </div>
  422. {% else %}
  423. data-type="{{ data['style'][key]['type'] }}" data-icon="{{ data['style'][key]['icon'] }}" data-off="{{ data['style'][key]['off'] }}" data-offexpression="{{ data['style'][key]['off_condition'] }}" data-on="{{ data['style'][key]['on'] }}" data-onexpression="{{ data['style'][key]['on_condition'] }}" class='databox' id="{{ key }}">
  424. {% if data['style'][key]['trend'] == 'true' %}
  425. {% else %}
  426. {% end %}
  427. <div class="icon">
  428. <img width="{{ data['style'][key]['width'] }}px" height="{{ data['style'][key]['height'] }}px" style='transform: {{ data['style'][key]['rotate'] }}' src='{{ static_url("bottle_inactive.svg") }}'></img>
  429. </div>
  430. </div>
  431. {% end %}
  432. {% else %}
  433. {% end %}
  434. {% else %}
  435. {% end %}
  436. {% if data['style'][key]['type'] == "integer-to-string" %}
  437. <div tooltip="{{ key }}" style='position: absolute; top: {{
  438. data['style'][key]['top'] }}; left:{{ data['style'][key]['left'] }};
  439. width:{{ data['style'][key]['width'] }}px; height:{{
  440. data['style'][key]['height'] }}px;
  441. {% if "background_color" in data['style'][key] %}
  442. background-color:{{ data['style'][key]['background_color'] }};'
  443. {% else%}
  444. '
  445. {% end%}
  446. {% if "cond" in data['style'][key] %}
  447. data-cond="{{ data['style'][key]['cond'] }}"
  448. {% else %}
  449. {% end %}
  450. {% if "trend" in data['style'][key] %}
  451. data-trend="{{ data['style'][key]['trend'] }}"
  452. {% else %}
  453. {% end %}
  454. {% if "linkhtml" in data['style'][key] %}
  455. {% if data['style'][key]['linkhtml'] == 'true' %}
  456. {% if "server" in data %}
  457. onclick="window.open( '{{ data["server"] }}#module=graph&{{ data['varname'][data['style'][key]['ref']] }}&experiment=-&window=86400&module=graph&virtual=srctree&srctree=&infomod=legend', '_blank');"
  458. {% else %}
  459. {% end %}
  460. {% else %}
  461. {% end %}
  462. {% else %}
  463. {% end %}
  464. data-dict="{{ data['style'][key]['dict'] }}" data-type="{{ data['style'][key]['type'] }}" class='databox' id="{{ key }}">
  465. <p><span style="color: #000; font-size: {{ data['style'][key]['header']['size'] }}px; font-weight: {{ data['style'][key]['header']['weight'] }};" class="title">{{ data['style'][key]['header']['title'] }} </span><br /><span style="color: #000; font-size: {{ data['style'][key]['unit']['size'] }}px; font-weight: {{ data['style'][key]['unit']['weight'] }};" class="varval">--- </span>
  466. {% if "trend" in data['style'][key] %}
  467. {% if data['style'][key]['trend'] == 'true' %}
  468. {% else %}
  469. {% end %}
  470. {% else %}
  471. {% end %}
  472. </p>
  473. </div>
  474. {% else %}
  475. {% end %}
  476. {% if data['style'][key]['type'] == "header" %}
  477. <div style='position: absolute; top: {{ data['style'][key]['top'] }}; left:{{
  478. data['style'][key]['left'] }}; width:{{ data['style'][key]['width'] }}px;
  479. height:{{ data['style'][key]['height'] }}px;
  480. {% if "background_color" in data['style'][key] %}
  481. background-color:{{ data['style'][key]['background_color'] }};'
  482. {% else %}
  483. {% end %}
  484. {% if "titlelink" in data['style'][key] %}
  485. onclick="window.open( '{{ data['style'][key]['titlelink'] }}' );"
  486. {% else %}
  487. {% end %}
  488. data-type="{{
  489. data['style'][key]['type'] }}" class='databox' id="{{ key }}">
  490. <p><span style="color: #000; font-size: {{ data['style'][key]['header']['size'] }}px; font-weight: {{ data['style'][key]['header']['weight'] }};" class="title">{{ data['style'][key]['header']['title'] }} </span></p>
  491. </div>
  492. {% else %}
  493. {% end %}
  494. {% end %}
  495. {% else %}
  496. {% end %}
  497. <img src="{{ static_url( 'background.png' ) }}"></img>
  498. <!-- java script -->
  499. <script src="{{ static_url("jquery-1.12.3.min.js") }}"></script>
  500. <script src="{{ static_url("jquery-ui.min.js") }}"></script>
  501. <script src="{{ static_url("math.min.js") }}"></script>
  502. <script>
  503. jQuery(window).load(function () {
  504. var win_width = $(document).width();
  505. var win_height = $(document).height();
  506. $(".databox").hover(function(){
  507. var trend_time = Math.floor(Date.now() / 1000);
  508. var key = $(this).attr('id');
  509. if ($("#" + key).attr('data-trend') == "true") {
  510. $('#'+ key).append('<span class="popup" style="top:0; left:250px;"><img src="/static/trends/'+key+'.png?time='+trend_time+'" width="600px" height="400px"/></span>');
  511. var key_left = parseInt($("#" + key).css("left"));
  512. var pos_left = key_left + 850;
  513. var key_top = parseInt($("#" + key).css("top"));
  514. var pos_top = key_top + 400;
  515. if(pos_left > win_width) {
  516. $("#" + key + " .popup").css({
  517. 'right':'250px',
  518. 'left': ''
  519. });
  520. }
  521. if(pos_top > win_height) {
  522. $("#" + key + " .popup").css({
  523. 'bottom':'0px',
  524. 'top': ''
  525. });
  526. }
  527. }
  528. });
  529. myTimer();
  530. var myVar = setInterval(myTimer, 10000);
  531. function myTimer() {
  532. var dataToSend = {};
  533. $.ajax({
  534. url: '/'+$("#page_title_cache").text().toLowerCase()+'/getdata/',
  535. //url: '/wgts/getabcddata/',
  536. type: 'GET',
  537. data: dataToSend,
  538. success: function (response) {
  539. //var objresponse = JSON.parse(response);
  540. console.log(response);
  541. for (var key in response) {
  542. //console.log(key, response[key]);
  543. data_type = $("#" + key).attr('data-type');
  544. if($("#" + key).length > 0) {
  545. if (data_type == "data") {
  546. //console.log("data");
  547. var datavalue, set_color, formula;
  548. var formula_attr = $("#" + key).attr('data-formula');
  549. var delta = (new Date().getTime()/1000.0) - response[key]["timestamp"];
  550. var dateTime = new Date( response[key]["timestamp"]*1000.0 );
  551. $("#"+key).attr('tooltip', key + "\nDeltaTime: " + parseFloat(delta).toFixed(3) + " s (" + parseFloat(delta / 60.0).toFixed(3) + " min)");
  552. if (response[key]["value"]) {
  553. if (formula_attr) {
  554. datavalue = parseFloat(response[key]["value"]).toFixed($("#" + key).attr('data-decimal'));
  555. formula = formula_attr.replace("x", datavalue.toString());
  556. datavalue = math.round(math.eval(formula),2);
  557. datavalue = datavalue.toFixed($("#" + key).attr('data-decimal'));
  558. } else {
  559. if ( ($("#" + key).attr('data-exponential')) == "True" || ($("#" + key).attr('data-exponential')) == "true" ) {
  560. datavalue = parseFloat(response[key]["value"]);
  561. datavalue = datavalue.toExponential(2)
  562. } else {
  563. datavalue = parseFloat(response[key]["value"]).toFixed($("#" + key).attr('data-decimal'));
  564. }
  565. }
  566. set_color = "green";
  567. } else {
  568. datavalue = "---";
  569. set_color = "black";
  570. }
  571. $(".varval", "#" + key).text(datavalue);
  572. var condition_attr = $("#" + key).attr('data-cond');
  573. var lesser_attr = $("#" + key).attr('data-lesser');
  574. var larger_attr = $("#" + key).attr('data-larger');
  575. //console.log(condition_attr);
  576. if (condition_attr) {
  577. if (response[key]["value"] == condition_attr) {
  578. set_color = "red";
  579. }
  580. }
  581. if (lesser_attr) {
  582. if (parseFloat(response[key]["value"]) < parseFloat(lesser_attr)) {
  583. set_color = "red";
  584. }
  585. }
  586. if (larger_attr) {
  587. if (parseFloat(response[key]["value"]) > parseFloat(larger_attr)) {
  588. set_color = "red";
  589. }
  590. }
  591. $(".varval", "#" + key).css("color", set_color);
  592. $(".unit_title", "#" + key).css("color", set_color);
  593. } else if (data_type == "icon") {
  594. //console.log("ventil");
  595. var delta = (new Date().getTime()/1000.0) - response[key]["timestamp"];
  596. var dateTime = new Date( response[key]["timestamp"]*1000.0 );
  597. $("#"+key).attr('tooltip', key + "\nDeltaTime: " + parseFloat(delta).toFixed(3) + " s (" + parseFloat(delta / 60.0).toFixed(3) + " min)");
  598. var on_attr = $("#" + key).attr('data-on');
  599. var off_attr = $("#" + key).attr('data-off');
  600. var on_condition = $("#" + key).attr('data-onexpression');
  601. var off_condition = $("#" + key).attr('data-offexpression');
  602. if (on_condition == 'onequal'){
  603. if (parseFloat(response[key]["value"]) == parseFloat(on_attr)) {
  604. $("img", "#" + key).attr("src", "/static/" + $("#" + key).attr('data-icon') + "_green.svg");
  605. }
  606. } else if (on_condition == 'onsmaller'){
  607. if (parseFloat(response[key]["value"]) < parseFloat(on_attr)) {
  608. $(".icon img", "#" + key).attr("src", "/static/" + $("#" + key).attr('data-icon') + "_green.svg");
  609. }
  610. } else if (on_condition == 'ongreater'){
  611. if (parseFloat(response[key]["value"]) > parseFloat(on_attr)) {
  612. $(".icon img", "#" + key).attr("src", "/static/" + $("#" + key).attr('data-icon') + "_green.svg");
  613. }
  614. }
  615. if (off_condition == 'offequal'){
  616. if (parseFloat(response[key]["value"]) == parseFloat(off_attr)) {
  617. $(".icon img", "#" + key).attr("src", "/static/" + $("#" + key).attr('data-icon') + "_red.svg");
  618. }
  619. } else if (off_condition == 'offsmaller'){
  620. if (parseFloat(response[key]["value"]) < parseFloat(off_attr)) {
  621. $(".icon img", "#" + key).attr("src", "/static/" + $("#" + key).attr('data-icon') + "_red.svg");
  622. }
  623. } else if (off_condition == 'offgreater'){
  624. if (parseFloat(response[key]["value"]) > parseFloat(off_attr)) {
  625. $(".icon img", "#" + key).attr("src", "/static/" + $("#" + key).attr('data-icon') + "_red.svg");
  626. }
  627. }
  628. } else if (data_type == "integer-to-string") {
  629. //console.log("integer-to-string");
  630. var delta = (new Date().getTime()/1000.0) - response[key]["timestamp"];
  631. var dateTime = new Date( response[key]["timestamp"]*1000.0 );
  632. $("#"+key).attr('tooltip', key + "\nDeltaTime: " + parseFloat(delta).toFixed(3) + " s (" + parseFloat(delta / 60.0).toFixed(3) + " min)");
  633. var dict_attr = JSON.parse($("#" + key).attr('data-dict'));
  634. var dict_cond;
  635. if ($("#"+key).attr("data-cond")) {
  636. dict_cond = JSON.parse($("#" + key).attr('data-cond'));
  637. } else {
  638. dict_cond = {};
  639. }
  640. var dict_color = "";
  641. if (key in response) {
  642. var token = response[key]["value"];
  643. if (token in dict_cond) {
  644. dict_color = dict_cond[token];
  645. }
  646. }
  647. $(".varval", "#" + key).css("color", dict_color);
  648. $(".varval", "#" + key).text(dict_attr[response[key]["value"]]);
  649. }
  650. }
  651. }
  652. $('[id^=virtual_]').each(function( index ) {
  653. var key = this.id;
  654. var ref = key.split("_");
  655. ref.shift();
  656. ref.pop();
  657. ref = ref.join("_");
  658. //ref = ref[1];
  659. //console.log(ref, key);
  660. data_type = $("#" + key).attr('data-type');
  661. if($("#" + key).length > 0) {
  662. if (data_type == "data") {
  663. //console.log(key);
  664. var datavalue, set_color, formula;
  665. var formula_attr = $("#" + key).attr('data-formula');
  666. var delta = (new Date().getTime()/1000.0) - response[ref]["timestamp"];
  667. var dateTime = new Date( response[ref]["timestamp"]*1000.0 );
  668. $("#"+ref).attr('tooltip', key + "\nDeltaTime: " + parseFloat(delta).toFixed(3) + " s (" + parseFloat(delta / 60.0).toFixed(3) + " min)");
  669. if (response[ref]["value"]) {
  670. if (formula_attr) {
  671. datavalue = parseFloat(response[ref]["value"]).toFixed($("#" + key).attr('data-decimal'));
  672. formula = formula_attr.replace("x", datavalue.toString());
  673. datavalue = math.round(math.eval(formula),2);
  674. datavalue = datavalue.toFixed($("#" + key).attr('data-decimal'));
  675. } else {
  676. datavalue = parseFloat(response[ref]["value"]).toFixed($("#" + key).attr('data-decimal'));
  677. }
  678. set_color = "green";
  679. } else {
  680. datavalue = "---";
  681. set_color = "black";
  682. }
  683. $(".varval", "#" + key).text(datavalue);
  684. var condition_attr = $("#" + key).attr('data-cond');
  685. var lesser_attr = $("#" + key).attr('data-lesser');
  686. var larger_attr = $("#" + key).attr('data-larger');
  687. //console.log(condition_attr);
  688. if (condition_attr) {
  689. if (response[ref]["value"] == condition_attr) {
  690. set_color = "red";
  691. }
  692. }
  693. if (lesser_attr) {
  694. if (parseFloat(response[ref]["value"]) < parseFloat(lesser_attr)) {
  695. set_color = "red";
  696. }
  697. }
  698. if (larger_attr) {
  699. if (parseFloat(response[ref]["value"]) > parseFloat(larger_attr)) {
  700. set_color = "red";
  701. }
  702. }
  703. $(".varval", "#" + key).css("color", set_color);
  704. $(".unit_title", "#" + key).css("color", set_color);
  705. } else if (data_type == "icon") {
  706. var on_attr = $("#" + key).attr('data-on');
  707. var off_attr = $("#" + key).attr('data-off');
  708. var on_condition = $("#" + key).attr('data-onexpression');
  709. var off_condition = $("#" + key).attr('data-offexpression');
  710. var delta = (new Date().getTime()/1000.0) - response[ref]["timestamp"];
  711. var dateTime = new Date( response[ref]["timestamp"]*1000.0 );
  712. $("#"+key).attr('tooltip', key + "\nDeltaTime: " + parseFloat(delta).toFixed(3) + " s (" + parseFloat(delta / 60.0).toFixed(3) + " min)");
  713. if (on_condition == 'onequal'){
  714. if (parseFloat(response[ref]["value"]) == parseFloat(on_attr)) {
  715. $("img", "#" + key).attr("src", "/static/" + $("#" + key).attr('data-icon') + "_green.svg");
  716. }
  717. } else if (on_condition == 'onsmaller'){
  718. if (parseFloat(response[ref]["value"]) < parseFloat(on_attr)) {
  719. $("img", "#" + key).attr("src", "/static/" + $("#" + key).attr('data-icon') + "_green.svg");
  720. }
  721. } else if (on_condition == 'ongreater'){
  722. if (parseFloat(response[ref]["value"]) > parseFloat(on_attr)) {
  723. $("img", "#" + key).attr("src", "/static/" + $("#" + key).attr('data-icon') + "_green.svg");
  724. }
  725. }
  726. if (off_condition == 'offequal'){
  727. if (parseFloat(response[ref]["value"]) == parseFloat(off_attr)) {
  728. $("img", "#" + key).attr("src", "/static/" + $("#" + key).attr('data-icon') + "_red.svg");
  729. }
  730. } else if (off_condition == 'offsmaller'){
  731. if (parseFloat(response[ref]["value"]) < parseFloat(off_attr)) {
  732. $("img", "#" + key).attr("src", "/static/" + $("#" + key).attr('data-icon') + "_red.svg");
  733. }
  734. } else if (off_condition == 'offgreater'){
  735. if (parseFloat(response[ref]["value"]) > parseFloat(off_attr)) {
  736. $("img", "#" + key).attr("src", "/static/" + $("#" + key).attr('data-icon') + "_red.svg");
  737. }
  738. }
  739. } else if (data_type == "integer-to-string") {
  740. var delta = (new Date().getTime()/1000.0) - response[key]["timestamp"];
  741. var dateTime = new Date( response[key]["timestamp"]*1000.0 );
  742. $("#"+key).attr('tooltip', key + "\nDeltaTime: " + parseFloat(delta).toFixed(3) + " s (" + parseFloat(delta / 60.0).toFixed(3) + " min)");
  743. var dict_attr = JSON.parse($("#" + key).attr('data-dict'));
  744. var dict_cond;
  745. if ($("#"+key).attr("data-cond")) {
  746. dict_cond = JSON.parse($("#" + key).attr('data-cond'));
  747. } else {
  748. dict_cond = {};
  749. }
  750. var dict_color = "";
  751. if (ref in response) {
  752. var token = response[ref]["value"];
  753. if (token in dict_cond) {
  754. dict_color = dict_cond[token];
  755. }
  756. }
  757. $(".varval", "#" + key).css("color", dict_color);
  758. $(".varval", "#" + key).text(dict_attr[response[ref]["value"]]);
  759. }
  760. }
  761. });
  762. $('[id^=calc_]').each(function( index ) {
  763. //console.log(this.id);
  764. //console.log($(this).attr('data-formula'));
  765. if (typeof $(this).attr('data-formula') != "undefined") {
  766. var myformula = $(this).attr('data-formula').trim();
  767. /*
  768. myformula = myformula.replace(/\[.*?\]/g, '__');
  769. console.log(myformula);
  770. */
  771. var data = myformula;
  772. var re= /\[(.*?)\]/g;
  773. var buffer = []
  774. for(m = re.exec(data); m; m = re.exec(data)){
  775. buffer.push(m[1]);
  776. }
  777. //console.log("Debug:");
  778. //console.log(buffer);
  779. var finalstring = "";
  780. var pattern = /\[(.*?)\]/g;
  781. var teststring = myformula.split(/[\[\]]+/);
  782. //console.log(teststring);
  783. //console.log(finalstring);
  784. for (var i = 0; i < teststring.length; i++) {
  785. var val = "";
  786. if (teststring[i] in response) {
  787. val = response[teststring[i]]["value"];
  788. } else {
  789. val = teststring[i];
  790. }
  791. finalstring += val;
  792. finalstring += " ";
  793. }
  794. finalstring = finalstring.trim();
  795. //console.log(finalstring);
  796. var myvalue = math.round(math.eval(finalstring),2);
  797. myvalue = myvalue.toFixed($("#" + this.id).attr('data-decimal'));
  798. set_color = "green";
  799. console.log(myvalue);
  800. $(".varval", "#" + this.id).text(myvalue);
  801. var condition_attr = $("#" + this.id).attr('data-cond');
  802. var lesser_attr = $("#" + this.id).attr('data-lesser');
  803. var larger_attr = $("#" + this.id).attr('data-larger');
  804. //console.log(condition_attr);
  805. if (condition_attr) {
  806. if (myvalue == condition_attr) {
  807. set_color = "red";
  808. }
  809. }
  810. if (lesser_attr) {
  811. if (parseFloat(myvalue) < parseFloat(lesser_attr)) {
  812. set_color = "red";
  813. }
  814. }
  815. if (larger_attr) {
  816. if (parseFloat(myvalue) > parseFloat(larger_attr)) {
  817. set_color = "red";
  818. }
  819. }
  820. $(".varval", "#" + this.id).css("color", set_color);
  821. $(".unit_title", "#" + this.id).css("color", set_color);
  822. }
  823. });
  824. var page_title_cache = $("#page_title_cache").text();
  825. var datetime = page_title_cache + " data monitoring page. Last Sync: " + response["time"];
  826. $("#page_info").text(datetime);
  827. console.log(datetime);
  828. },
  829. error: function () {
  830. console.log("Error.")
  831. }
  832. });
  833. }
  834. });
  835. </script>
  836. </body>
  837. </html>