removed template
[unfold.git] / plugins / scheduler2 / static / js / scheduler2.js
1 /*\r
2 #\r
3 # Copyright (c) 2013 NITLab, University of Thessaly, CERTH, Greece\r
4 #\r
5 # Permission is hereby granted, free of charge, to any person obtaining a copy\r
6 # of this software and associated documentation files (the "Software"), to deal\r
7 # in the Software without restriction, including without limitation the rights\r
8 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r
9 # copies of the Software, and to permit persons to whom the Software is\r
10 # furnished to do so, subject to the following conditions:\r
11 #\r
12 # The above copyright notice and this permission notice shall be included in\r
13 # all copies or substantial portions of the Software.\r
14 #\r
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
16 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\r
18 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
19 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r
20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r
21 # THE SOFTWARE.\r
22 #\r
23 #\r
24 # This is a MySlice plugin for the NITOS Scheduler\r
25 # Nitos Scheduler v1\r
26 #\r
27 */\r
28 \r
29 /* some params */\r
30 var init_start_visible_index = 10;\r
31 var init_end_visible_index = 21;\r
32 var rsvrTblNm = "scheduler-reservation-table";\r
33 var SchedulerResources = [];\r
34 var schdlr_totalColums = 0;\r
35 var SetPerFun = null;\r
36 var Sched2 = null;\r
37 var Debug = true;\r
38 var schdlr_PartsInOneHour = 6;\r
39 \r
40 (function ($) {\r
41     var Scheduler2 = Plugin.extend({\r
42 \r
43         /** XXX to check\r
44          * @brief Plugin constructor\r
45          * @param options : an associative array of setting values\r
46          * @param element : \r
47          * @return : a jQuery collection of objects on which the plugin is\r
48          *     applied, which allows to maintain chainability of calls\r
49          */\r
50         init: function (options, element) {\r
51             this.classname="scheduler2";\r
52             // Call the parent constructor, see FAQ when forgotten\r
53             this._super(options, element);\r
54 \r
55             schdlr_totalColums = $("#scheduler-reservation-table th").length;\r
56 \r
57             //selection from table \r
58             $(window).keydown(function (evt) {\r
59                 if (evt.which == 17) { // ctrl\r
60                     ctrlPressed = true;\r
61                 }\r
62             }).keyup(function (evt) {\r
63                 if (evt.which == 17) { // ctrl\r
64                     ctrlPressed = false;\r
65                 }\r
66             });\r
67             $("#" + rsvrTblNm).on('mousedown', 'td', rangeMouseDown).on('mouseup', 'td', rangeMouseUp).on('mousemove', 'td', rangeMouseMove);\r
68 \r
69             // Explain this will allow query events to be handled\r
70             // What happens when we don't define some events ?\r
71             // Some can be less efficient\r
72 \r
73             if (Debug) console.time("Listening_to_queries");\r
74             /* Listening to queries */\r
75             this.listen_query(options.query_uuid, 'all_ev');\r
76             this.listen_query(options.query_all_resources_uuid, 'all_resources');\r
77             this.listen_query(options.query_lease_uuid, 'lease');\r
78             //this.listen_query(options.query_lease_uuid, 'lease');\r
79             if (Debug) console.timeEnd("Listening_to_queries");\r
80 \r
81             $("#ShedulerNodes tbody").html('<tr><td id="schdlr_frstTD" style="background:transparent; height:45px; border:none;"></td></tr>');\r
82         },\r
83 \r
84         /* PLUGIN EVENTS */\r
85         // on_show like in querytable\r
86 \r
87 \r
88         /* GUI EVENTS */\r
89 \r
90         // a function to bind events here: click change\r
91         // how to raise manifold events\r
92 \r
93 \r
94         /* GUI MANIPULATION */\r
95 \r
96         // We advise you to write function to change behaviour of the GUI\r
97         // Will use naming helpers to access content _inside_ the plugin\r
98         // always refer to these functions in the remaining of the code\r
99 \r
100         show_hide_button: function () {\r
101             // this.id, this.el, this.cl, this.elts\r
102             // same output as a jquery selector with some guarantees\r
103         },\r
104 \r
105         //drawResources: function () {\r
106         drawLeases: function () {\r
107             \r
108             //if (Debug) this.debug('foo');\r
109             if (Debug) console.time("each:SchedulerResources");\r
110 \r
111             //scheduler-reservation-table main table columns\r
112             totalColums = $("#scheduler-reservation-table thead tr th").length;\r
113             //var totalCell = [];\r
114             //for (var i = 0; i < totalColums; i++) { totalCell.push("<td></td>"); }\r
115             //var srt_body = [];\r
116             var totalCell = "";\r
117             for (var i = 0; i < totalColums; i++) totalCell +="<td></td>"; \r
118             var srt_body = "";\r
119             /*\r
120             $.each(SchedulerResources, function (i, group) {\r
121                 console.log(group.groupName);\r
122                 //var groupTR = $("#ShedulerNodes tbody").html('<tr><td class="no-image verticalIndex" rowspan="' + group.resources.length + '"><div class="verticalText">' + group.groupName + '</div></td><td id="schdlr_frstTD" class="info fixed"></td></tr>');\r
123                 //var groupTR = $("#ShedulerNodes tbody").html('<tr><td class="no-image verticalIndex" rowspan="' + 30 + '"><div class="verticalText">' + group.groupName + '</div></td><td id="schdlr_frstTD" class="info fixed"></td></tr>');\r
124                 var groupTR = $("#ShedulerNodes tbody").html('<tr><td id="schdlr_frstTD" class="info fixed"></td></tr>');\r
125                 \r
126                 //$.each(group.resources.slice(0,30), function (i, resource) {\r
127                 $.each(group.resources, function (i, resource) {\r
128                     if (i == 0) {\r
129                         //$("#ShedulerNodes tbody tr:first").append('<td class="info fixed">' + resource.hostname + '</td>');\r
130                         $(groupTR).find("#schdlr_frstTD").html(resource.urn);\r
131                         //$(srt_body).html("<tr>" + totalCell + "</tr>");\r
132                     } else {\r
133                         $(groupTR).find("tr:last").after('<tr><td class="info fixed">' + resource.urn + '</td></tr>');\r
134                         //$(srt_body).find("tr:last").after("<tr>" + totalCell + "</tr>");\r
135                     }\r
136                     srt_body += "<tr>" + totalCell + "</tr>";\r
137                     //srt_body.push('<tr>'); srt_body = srt_body.concat(totalCell.concat()); srt_body.push('/<tr>');\r
138                 });\r
139             });\r
140             */\r
141             srt_body += "<tr>" + totalCell + "</tr>";\r
142             //$("#scheduler-reservation-table tbody").html(srt_body.join(""));\r
143             $("#scheduler-reservation-table tbody").append(srt_body);\r
144 \r
145             if (Debug) console.timeEnd("each:SchedulerResources");\r
146             \r
147 \r
148             $("#" + rsvrTblNm + " tbody tr").each(function (index) { $(this).attr("data-trindex", index); });\r
149 \r
150         },\r
151 \r
152         /* TEMPLATES */\r
153 \r
154         // see in the html template\r
155         // How to load a template, use of mustache\r
156 \r
157         /* QUERY HANDLERS */\r
158         loadWithDate: function () {\r
159             // only convention, not strictly enforced at the moment\r
160         },\r
161         // How to make sure the plugin is not desynchronized\r
162         // He should manifest its interest in filters, fields or records\r
163         // functions triggered only if the proper listen is done\r
164 \r
165         /* all_ev QUERY HANDLERS Start */\r
166         on_all_ev_clear_records: function (data) {\r
167             //alert('all_ev clear_records');\r
168         },\r
169         on_all_ev_query_in_progress: function (data) {\r
170            // alert('all_ev query_in_progress');\r
171         },\r
172         on_all_ev_new_record: function (data) {\r
173             //alert('all_ev new_record');\r
174         },\r
175         on_all_ev_query_done: function (data) {\r
176             //alert('all_ev query_done');\r
177         },\r
178         //another plugin has modified something, that requires you to update your display. \r
179         on_all_ev_field_state_changed: function (data) {\r
180             //alert('all_ev query_done');\r
181         },\r
182         /* all_ev QUERY HANDLERS End */\r
183         /* all_resources QUERY HANDLERS Start */\r
184         on_all_resources_clear_records: function (data) {\r
185             //data is empty on load\r
186         },\r
187         on_all_resources_query_in_progress: function (data) {\r
188             //data is empty on load\r
189         },\r
190         on_all_resources_new_record: function (data) {\r
191             $("#ShedulerNodes tbody").find("tr:last").after('<tr><td class="info fixed">' + data.urn + '</td></tr>');\r
192             this.drawLeases();\r
193             //console.log(data);\r
194             var tmpGroup = lookup(SchedulerResources, 'groupName', data.type);\r
195             if (tmpGroup == null) {\r
196                 tmpGroup = { groupName: data.type, resources: [] };\r
197                 SchedulerResources.push(tmpGroup);\r
198                 //if (data.type != "node")  alert('not all node');\r
199             }\r
200             tmpGroup.resources.push(data);\r
201             //alert('new_record');\r
202         },\r
203         on_all_resources_query_done: function (data) {\r
204             //this.drawResources();\r
205             //data is empty on load\r
206             /* GUI setup and event binding */\r
207             this._initUI();\r
208             this._SetPeriodInPage(init_start_visible_index, init_end_visible_index);\r
209             this.loadWithDate();\r
210         },\r
211         //another plugin has modified something, that requires you to update your display. \r
212         on_all_resources_field_state_changed: function (data) {\r
213             //alert('all_resources query_done');\r
214         },\r
215         /* all_resources QUERY HANDLERS End */\r
216         /* lease QUERY HANDLERS Start */\r
217         on_lease_clear_records: function (data) { console.log('clear_records'); },\r
218         on_lease_query_in_progress: function (data) { console.log('lease_query_in_progress'); },\r
219         on_lease_new_record: function (data) { console.log('lease_new_record'); },\r
220         on_lease_query_done: function (data) { console.log('lease_query_done'); },\r
221         //another plugin has modified something, that requires you to update your display. \r
222         on_lease_field_state_changed: function (data) { console.log('lease_field_state_changed'); },\r
223         /* lease QUERY HANDLERS End */\r
224 \r
225 \r
226         // no prefix\r
227 \r
228         on_filter_added: function (filter) {\r
229 \r
230         },\r
231 \r
232         // ... be sure to list all events here\r
233 \r
234         /* RECORD HANDLERS */\r
235         on_all_new_record: function (record) {\r
236             //\r
237             alert('on_all_new_record');\r
238         },\r
239 \r
240         debug : function (log_txt) {\r
241             if (typeof window.console != 'undefined') {\r
242                 console.debug(log_txt);\r
243             }\r
244         },\r
245 \r
246         /* INTERNAL FUNCTIONS */\r
247         _initUI: function () {\r
248             if (Debug) console.time("_initUI");\r
249             //fix margins in tables\r
250             mtNodesTbl = $("#" + rsvrTblNm + " tr:first").outerHeight() + 6;\r
251             mtSchrollCon = $("#nodes").outerWidth();\r
252             $("#nodes").css("margin-top", mtNodesTbl);\r
253             $("#reservation-table-scroll-container").css("margin-left", mtSchrollCon);\r
254             SetPerFun = this._SetPeriodInPage;\r
255             //slider\r
256             $("#time-range").slider({\r
257                 range: true,\r
258                 min: 0,\r
259                 max: 24,\r
260                 step: 0.5,\r
261                 values: [init_start_visible_index, init_end_visible_index],\r
262                 slide: function (event, ui) {\r
263                     SetPerFun(ui.values[0], ui.values[1]);\r
264                 }\r
265             });\r
266             $("#DateToRes").datepicker({\r
267                 dateFormat: "yy-mm-dd",\r
268                 minDate: 0,\r
269                 numberOfMonths: 3\r
270             }).change(function () {\r
271                 //Scheduler2.loadWithDate();\r
272             }).click(function () {\r
273                 $("#ui-datepicker-div").css("z-index", 5);\r
274             });\r
275             //other stuff\r
276             fixOddEvenClasses();\r
277             $("#" + rsvrTblNm + " td:not([class])").addClass("free");\r
278             if (Debug) console.timeEnd("_initUI");\r
279         },\r
280         _SetPeriodInPage: function (start, end) {\r
281             if (Debug) console.time("_SetPeriodInPage");\r
282             ClearTableSelection();\r
283             $("#lbltime").html(GetTimeFromInt(start) + " - " + GetTimeFromInt(end));\r
284             \r
285             var start_visible_index = (start * schdlr_PartsInOneHour) + 1;\r
286             var end_visible_index = (end * schdlr_PartsInOneHour);\r
287 \r
288             //hide - show\r
289             for (i = 0; i < start_visible_index; i++) {\r
290                 $("#" + rsvrTblNm + " td:nth-child(" + i + "), #" + rsvrTblNm + " th:nth-child(" + i + ")").hide();\r
291             }\r
292             for (i = end_visible_index + 1; i <= schdlr_totalColums; i++) {\r
293                 $("#" + rsvrTblNm + " td:nth-child(" + i + "), #" + rsvrTblNm + " th:nth-child(" + i + ")").hide();\r
294             }\r
295             /*$("#" + rsvrTblNm + " td:not([class*='info']), #" + rsvrTblNm + " th:not([class*='fixed'])").hide();*/\r
296             for (i = start_visible_index; i <= end_visible_index; i++) {\r
297                 $("#" + rsvrTblNm + " td:nth-child(" + i + "), #" + rsvrTblNm + " th:nth-child(" + i + ")").show();\r
298             }\r
299 \r
300             if ($("#" + rsvrTblNm + " th:visible:first").width() > 105) {\r
301                 $("#" + rsvrTblNm + " th span").css("display", "inline")\r
302             } else {\r
303                 $("#" + rsvrTblNm + " th span").css("display", "block");\r
304             }\r
305             mtNodesTbl = $("#" + rsvrTblNm + " tr:first").outerHeight() + 6;\r
306             $("#nodes").css("margin-top", mtNodesTbl);\r
307             //$("#scroll_container").width($("#Search").width() - $("#nodes").width());\r
308             //$("#nodes th").height($("#tblReservation th:visible:first").height() - 2);\r
309             if (Debug) console.timeEnd("_SetPeriodInPage");\r
310         }\r
311     });\r
312 \r
313     //Sched2 = new Scheduler2();\r
314 \r
315     /* Plugin registration */\r
316     $.plugin('Scheduler2', Scheduler2);\r
317 \r
318     // TODO Here use cases for instanciating plugins in different ways like in the pastie.\r
319 \r
320 \r
321 })(jQuery);\r
322 \r
323 \r
324 \r