UI Fix: device popup not appearing
[controller.git] / opendaylight / web / devices / src / main / resources / js / page.js
1 /* 
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  All rights reserved. 
3  * 
4  * This program and the accompanying materials are made available under the 
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution, 
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8
9 //PAGE Devices
10 one.f = {};
11
12 // specify dashlets and layouts
13
14 one.f.dashlet = {
15         nodesLearnt : {
16                 id : 'nodesLearnt',
17             name : 'Nodes Learnt'
18         },
19     staticRouteConfig : {
20         id : 'staticRouteConfig',
21         name : 'Static Route Configuration'
22     },
23     subnetGatewayConfig : {
24         id : 'subnetGatewayConfig',
25         name : 'Subnet Gateway Configuration'
26     },
27     spanPortConfig : {
28         id : 'spanPortConfig',
29         name : 'SPAN Port Configuration'
30     }
31 };
32
33 one.f.menu = {
34     left : {
35         top : [
36             one.f.dashlet.nodesLearnt
37         ],
38         bottom : [
39             one.f.dashlet.staticRouteConfig
40         ]
41     },
42     right : {
43         top : [],
44         bottom : [
45             one.f.dashlet.subnetGatewayConfig,
46             one.f.dashlet.spanPortConfig
47         ]
48     }
49 };
50
51 /**Devices Modules */
52 one.f.switchmanager = {
53         rootUrl: "controller/web/devices",
54         createTable: function(columnNames, body) {
55                 var tableAttributes = ["table-striped", "table-bordered", "table-condensed"];
56                 var $table = one.lib.dashlet.table.table(tableAttributes);
57                 var tableHeaders = columnNames;
58                 var $thead = one.lib.dashlet.table.header(tableHeaders);
59                 var $tbody = one.lib.dashlet.table.body(body, tableHeaders);
60                 $table.append($thead)
61                 .append($tbody);
62                 return $table;
63         },
64         validateName: function(name) {
65         return (name.length < 256);
66         }
67 };
68
69 one.f.switchmanager.nodesLearnt = {
70         id: {
71                 dashlet: {
72                         popout: "one_f_switchmanager_nodesLearnt_id_dashlet_popout"
73                 },
74                 modal: {
75                         modal: "one_f_switchmanager_nodesLearnt_id_modal_modal",
76                         save: "one_f_switchmanager_nodesLearnt_id_modal_save",
77                         form: {
78                                 nodeId: "one_f_switchmanager_nodesLearnt_id_modal_form_nodeid",
79                                 nodeName : "one_f_switchmanager_nodesLearnt_id_modal_form_nodename",
80                                 portStatus : "one_f_switchmanager_nodesLearnt_id_modal_form_portstatus",
81                                 tier: "one_f_switchmanager_nodesLearnt_id_modal_form_tier",
82                                 operationMode: "one_f_switchmanager_nodesLearnt_id_modal_form_opmode"
83                         }
84                 }
85         },
86         dashlet: function($dashlet) {
87                 var url = one.f.switchmanager.rootUrl + "/nodesLearnt";
88                 one.lib.dashlet.empty($dashlet);
89                 $dashlet.append(one.lib.dashlet.header(one.f.dashlet.nodesLearnt.name));
90
91                 one.f.switchmanager.nodesLearnt.ajax.main(url, function(content) {
92                         var body = one.f.switchmanager.nodesLearnt.data.abridged(content);
93                         var $table = one.f.switchmanager.createTable(["Node Name", "Node ID", "Ports"], body);
94                         $dashlet.append($table);
95                 });
96         },
97         ajax : {
98                 main : function(url, callback) {
99                         $.getJSON(url, function(data) {
100                                 callback(data);
101                         });
102                 }
103         },
104         modal : {
105                 initialize: {
106                         updateNode: function(evt) {
107                     one.f.switchmanager.nodesLearnt.ajax.main(one.f.switchmanager.rootUrl + "/tiers", function(tiers) {
108
109                     var nodeId = decodeURIComponent(evt.target.id);
110                     var h3;
111                     var footer = [];
112                     var $body = one.f.switchmanager.nodesLearnt.modal.body.updateNode(nodeId, evt.target.switchDetails, tiers);
113                     if ( (one.main.registry == undefined || one.main.registry.container == 'default') && evt.target.privilege == 'WRITE'){
114                         h3 = "Update Node Information";
115                         footer = one.f.switchmanager.nodesLearnt.modal.footer.updateNode();
116                     } else { //disable node edit
117                         $body.find('*').attr('disabled', 'disabled');
118                         h3 = 'Node Information';
119                     }
120
121                     var $modal = one.lib.modal.spawn(one.f.switchmanager.nodesLearnt.id.modal.modal, h3, "", footer);
122                     // bind save button
123                     $('#' + one.f.switchmanager.nodesLearnt.id.modal.save, $modal).click(function() {
124                         one.f.switchmanager.nodesLearnt.modal.save($modal);
125                     });
126
127                         // inject body (nodePorts)
128                         one.lib.modal.inject.body($modal, $body);
129                         $modal.modal();
130                     });
131                         },
132                         popout: function() {
133                                 var h3 = "Nodes Learnt";
134                     var footer = one.f.switchmanager.nodesLearnt.modal.footer.popout();
135                     var $modal = one.lib.modal.spawn(one.f.switchmanager.nodesLearnt.id.modal.modal, h3, "", footer);
136                     var $body = one.f.switchmanager.nodesLearnt.modal.body.popout($modal);
137                     return $modal;
138                         }
139                 },
140                 body: {
141                         updateNode: function(nodeId, switchDetails, tiers) {
142                                 var $form = $(document.createElement('form'));
143                                 var $fieldset = $(document.createElement('fieldset'));
144                                 // node ID. not editable.
145                                 var $label = one.lib.form.label("Node ID");
146                                 var $input = one.lib.form.input("node id");
147                                 $input.attr('id', one.f.switchmanager.nodesLearnt.id.modal.form.nodeId);
148                                 $input.attr("disabled", true);
149                                 $input.attr("value", nodeId);
150                                 $fieldset.append($label).append($input);
151                                 // node name
152                                 var $label = one.lib.form.label("Node Name");
153                                 var $input = one.lib.form.input("Node Name");
154                                 $input.attr('id', one.f.switchmanager.nodesLearnt.id.modal.form.nodeName);
155                                 if(switchDetails["nodeName"] != null) {
156                                         $input.attr('value', switchDetails["nodeName"]);
157                                 }
158                                 $fieldset.append($label).append($input);
159                                 // node tier
160                                 var $label = one.lib.form.label("Tier");
161                                 var $select = one.lib.form.select.create(tiers);
162                                 $select.attr('id', one.f.switchmanager.nodesLearnt.id.modal.form.tier);
163                                 $select.val(switchDetails["tier"]);
164                                 $fieldset.append($label).append($select);
165                                 // operation mode
166                                 var $label = one.lib.form.label("Operation Mode");
167                                 var $select = one.lib.form.select.create(
168                                                 ["Allow reactive forwarding", "Proactive forwarding only"]);
169                                 $select.attr('id', one.f.switchmanager.nodesLearnt.id.modal.form.operationMode);
170                                 $select.val(switchDetails["mode"]);
171                                 $fieldset.append($label).append($select);
172                                 $form.append($fieldset);
173                                 return $form;
174                         },
175                         popout: function($modal) {
176                                 var url = one.f.switchmanager.rootUrl + "/nodesLearnt";
177                                 one.f.switchmanager.nodesLearnt.ajax.main(url, function(content) {
178                                         var tableContent = one.f.switchmanager.nodesLearnt.data.popout(content);
179                                         var $table = one.f.switchmanager.createTable(content.columnNames, tableContent);
180                                         one.lib.modal.inject.body($modal, $table);
181                                 });
182                         }
183                 },
184                 save: function($modal) {
185                         var result = {};
186             result['nodeName'] = $('#' + one.f.switchmanager.nodesLearnt.id.modal.form.nodeName, $modal).val();
187             if(!one.f.switchmanager.validateName(result['nodeName'])) {
188                 alert("Node name can contain upto 255 characters");
189                 return;
190             }
191             result['nodeId'] = $('#' + one.f.switchmanager.nodesLearnt.id.modal.form.nodeId, $modal).val();
192             result['tier'] = $('#' + one.f.switchmanager.nodesLearnt.id.modal.form.tier, $modal).val();
193             result['operationMode'] = $('#' + one.f.switchmanager.nodesLearnt.id.modal.form.operationMode, $modal).val();
194             one.f.switchmanager.nodesLearnt.modal.ajax(result, 
195                                 function(response) {
196                         if(response.status == true) {
197                                 $modal.modal('hide');
198                                 one.topology.update(); // refresh visual topology with new name
199                                 // TODO: Identify dashlet by inserting a nodesLearnt div 
200                                         // in the dashlet() instead
201                                 one.f.switchmanager.nodesLearnt.dashlet($("#left-top .dashlet"));
202                         } else {
203                                 alert(response.message);
204                         }
205                         
206                     });
207                 },
208                 ajax: function(requestData, callback) {
209                         $.getJSON(one.f.switchmanager.rootUrl + "/nodesLearnt/update", requestData, function(response) {
210                                 callback(response);
211                         });
212                 },
213                 footer: {
214                         updateNode: function() {
215                                 var footer = [];
216                 var saveButton = one.lib.dashlet.button.single("Save", one.f.switchmanager.nodesLearnt.id.modal.save, "btn-success", "");
217                 var $saveButton = one.lib.dashlet.button.button(saveButton);
218                 footer.push($saveButton);
219
220                     return footer;
221                         },
222                         popout: function() {
223                                 // TODO: Maybe put a close button in the footer?
224                                 return [];
225                         }
226                 }
227         },
228         // data functions
229         data : {
230                 abridged : function(data) {
231                         var result = [];
232                         $.each(data.nodeData, function(key, value) {
233                                 var tr = {};
234                                 var entry = [];
235                                 var nodenameentry = value["nodeName"] ? value["nodeName"] : "Click to update";
236
237                                 // TODO: Move anchor tag creation to one.lib.form.
238                                 var aTag;
239                 aTag = document.createElement("a");
240                 aTag.privilege = data.privilege;
241                 aTag.addEventListener("click", one.f.switchmanager.nodesLearnt.modal.initialize.updateNode);
242                 aTag.addEventListener("mouseover", function(evt) {
243                     evt.target.style.cursor = "pointer";
244                 }, false);
245                 aTag.setAttribute("id", encodeURIComponent(value["nodeId"]));
246                 aTag.switchDetails = value;
247                                 aTag.innerHTML = nodenameentry;
248                                 entry.push(aTag);
249                                 entry.push(value["nodeId"]);
250                                 entry.push(value["ports"]);
251                                 tr.entry = entry;
252                                 result.push(tr);
253                         });
254                         return result;
255                 },
256                 popout : function(data) {
257                         var result = [];
258                         $.each(data.nodeData, function(key, value) {
259                                 var tr = {};
260                                 // fill up all the td's
261                                 var entry = [];
262                                 var nodenameentry = value["nodeName"] ? value["nodeName"] : "No name provided";
263                                 entry.push(nodenameentry);
264                                 entry.push(value["nodeId"]);
265                                 entry.push(value["tierName"]);
266                                 entry.push(value["mac"]);
267                                 entry.push(value["ports"]);
268                                 entry.push(value["portStatus"]);
269                                 tr.entry = entry;
270                                 result.push(tr);
271                         });
272                         return result;
273                 }
274         }
275 };
276
277 one.f.switchmanager.subnetGatewayConfig = {
278         id: {
279                 dashlet: {
280                         addIPAddress: "one_f_switchmanager_subnetGatewayConfig_id_dashlet_addIP",
281                         addPorts: "one_f_switchmanager_subnetGatewayConfig_id_dashlet_addPorts",
282                         removeIPAddress: "one_f_switchmanager_subnetGatewayConfig_id_dashlet_removeIP"
283                 }, 
284                 modal: {
285                         modal: "one_f_switchmanager_subnetGatewayConfig_id_modal_modal",
286                         save: "one_f_switchmanager_subnetGatewayConfig_id_modal_save",
287                         form: {
288                                 name : "one_f_switchmanager_subnetGatewayConfig_id_modal_form_gatewayname",
289                                 gatewayIPAddress : "one_f_switchmanager_subnetGatewayConfig_id_modal_form_gatewayipaddress",
290                                 nodeId: "one_f_switchmanager_subnetGatewayConfig_id_modal_form_nodeid",
291                                 ports: "one_f_switchmanager_subnetGatewayConfig_id_modal_form_ports"
292                         }
293                 }
294         },
295         // device ajax calls
296         dashlet: function($dashlet) {
297                 one.lib.dashlet.empty($dashlet);
298                 $dashlet.append(one.lib.dashlet.header(one.f.dashlet.subnetGatewayConfig.name));
299                 // Add gateway IP Address button
300                 var url = one.f.switchmanager.rootUrl + "/subnets";
301                 one.f.switchmanager.subnetGatewayConfig.ajax.main(url, {}, function(content) {
302
303             if (content.privilege === 'WRITE') {
304                 var button = one.lib.dashlet.button.single("Add Gateway IP Address",
305                     one.f.switchmanager.subnetGatewayConfig.id.dashlet.addIPAddress, "btn-primary", "btn-mini");
306                 var $button = one.lib.dashlet.button.button(button);
307                 $button.click(function() {
308                     var $modal = one.f.switchmanager.subnetGatewayConfig.modal.initialize.gateway();
309                     $modal.modal();
310                 });
311                 $dashlet.append($button);
312
313                 // Delete gateway ip address button
314                 var button = one.lib.dashlet.button.single("Delete Gateway IP Address(es)",
315                     one.f.switchmanager.subnetGatewayConfig.id.dashlet.removeIPAddress, "btn-primary", "btn-mini");
316                 var $button = one.lib.dashlet.button.button(button);
317                 $button.click(function() {
318                     var requestData = {};
319                     var gatewaysToDelete = [];
320                     var checkedCheckBoxes = $("input:checked", $(this).closest(".dashlet").find("table"));
321                     checkedCheckBoxes.each(function(index, value) {
322                         gatewaysToDelete.push(checkedCheckBoxes[index].id);
323                     });
324                     if (gatewaysToDelete.length > 0) {
325                         requestData["gatewaysToDelete"] = gatewaysToDelete.toString();
326                         var url = one.f.switchmanager.rootUrl + "/subnetGateway/delete";
327                         one.f.switchmanager.subnetGatewayConfig.ajax.main(url, requestData, function(response) {
328                             if (response.status == true) {
329                                 // refresh dashlet by passing dashlet div as param
330                                 one.f.switchmanager.subnetGatewayConfig.dashlet($("#right-bottom .dashlet"));
331                             } else {
332                                 alert(response.message);
333                             }
334                         });
335                     }
336                 });
337                 $dashlet.append($button);
338
339                 // Add Ports button
340                 var button = one.lib.dashlet.button.single("Add Ports",
341                     one.f.switchmanager.subnetGatewayConfig.id.dashlet.addPorts, "btn-primary", "btn-mini");
342                 var $button = one.lib.dashlet.button.button(button);
343                 $button.click(function() {
344                     var $modal = one.f.switchmanager.subnetGatewayConfig.modal.initialize.ports();
345                     $modal.modal();
346                 });
347                 $dashlet.append($button);
348             }
349
350                         var body = one.f.switchmanager.subnetGatewayConfig.data.devices(content);
351                         // first column contains checkbox. no need for header
352                         content.columnNames.splice(0,0," ");
353                         var $table = one.f.switchmanager.createTable(content.columnNames, body);
354                         $dashlet.append($table);
355                 });
356         },
357         ajax : {
358                 main : function(url, requestData, callback) {
359                         $.getJSON(url, requestData, function(data) {
360                                 callback(data);
361                         });
362                 }
363         },
364         registry: {},
365         modal : {
366                 initialize: {
367                         gateway: function() {
368                                 var h3 = "Add Gateway IP Address";
369                     var footer = one.f.switchmanager.subnetGatewayConfig.modal.footer();
370                     var $modal = one.lib.modal.spawn(one.f.switchmanager.subnetGatewayConfig.id.modal.modal, h3, "", footer);
371                     // bind save button
372                     $('#' + one.f.switchmanager.subnetGatewayConfig.id.modal.save, $modal).click(function() {
373                         one.f.switchmanager.subnetGatewayConfig.modal.save.gateway($modal);
374                     });
375                     var $body = one.f.switchmanager.subnetGatewayConfig.modal.body.gateway();
376                     one.lib.modal.inject.body($modal, $body);
377                     return $modal;
378                         },
379                         ports: function() {
380                                 var h3 = "Add Ports";
381                     var footer = one.f.switchmanager.subnetGatewayConfig.modal.footer();
382                     var $modal = one.lib.modal.spawn(one.f.switchmanager.subnetGatewayConfig.id.modal.modal, h3, "", footer);
383                     // bind save button
384                     $('#' + one.f.switchmanager.subnetGatewayConfig.id.modal.save, $modal).click(function() {
385                         one.f.switchmanager.subnetGatewayConfig.modal.save.ports($modal);
386                     });
387                     
388                     // TODO: Change to subnetGateway instead.
389                     one.f.switchmanager.spanPortConfig.modal.ajax.nodes(function(nodes, nodeports) {
390                         var $body = one.f.switchmanager.subnetGatewayConfig.modal.body.ports(nodes, nodeports);
391                         one.lib.modal.inject.body($modal, $body);
392                     });
393                     return $modal;
394                         }
395                 },
396                 save: {
397                         gateway: function($modal) {
398                                 var result = {};
399                     result['gatewayName'] = $('#' + one.f.switchmanager.subnetGatewayConfig.id.modal.form.name, $modal).val();
400                     if(!one.f.switchmanager.validateName(result['gatewayName'])) {
401                         alert("Gateway name can contain upto 255 characters");
402                         return;
403                     }
404                     result['gatewayIPAddress'] = $('#' + one.f.switchmanager.subnetGatewayConfig.id.modal.form.gatewayIPAddress, $modal).val();
405                     one.f.switchmanager.subnetGatewayConfig.modal.ajax.gateway(result, 
406                                         function(response) {
407                                 if(response.status == true) {
408                                         $modal.modal('hide');
409                                         one.f.switchmanager.subnetGatewayConfig.dashlet($("#right-bottom .dashlet"));
410                                 } else {
411                                         alert(response.message);
412                                 }
413                             });
414                         },
415                         ports: function($modal) {
416                                 var result = {};
417                                 var gatewayRegistryIndex = $('#' + one.f.switchmanager.subnetGatewayConfig.id.modal.form.name, $modal).val();
418                     result['portsName'] = one.f.switchmanager.subnetGatewayConfig.registry.gateways[gatewayRegistryIndex];
419                     result['nodeId'] = $('#' + one.f.switchmanager.subnetGatewayConfig.id.modal.form.nodeId, $modal).val();
420                     result['ports'] = $('#' + one.f.switchmanager.subnetGatewayConfig.id.modal.form.ports, $modal).val();
421                     if(!result['portsName'] || result['portsName'] == "") {
422                         alert("No gateway chosen. Cannot add port");
423                         return;
424                     }
425                     if(!result['nodeId'] || result['nodeId'] == "") {
426                         alert("Please select a node.");
427                         return;
428                     }
429                     if(!result['ports'] || result['ports'] == "") {
430                         alert("Please choose a port.");
431                         return;
432                     }
433                     one.f.switchmanager.subnetGatewayConfig.modal.ajax.ports(result, 
434                                         function(response) {
435                                 if(response.status == true) {
436                                         $modal.modal('hide');
437                                         one.f.switchmanager.subnetGatewayConfig.dashlet($("#right-bottom .dashlet"));
438                                 } else {
439                                         alert(response.message);
440                                 }
441                                 });
442                         }
443                 },
444                 body: {
445                         gateway: function() {
446                                 var $form = $(document.createElement('form'));
447                                 var $fieldset = $(document.createElement('fieldset'));
448                                 // gateway name
449                                 var $label = one.lib.form.label("Name");
450                                 var $input = one.lib.form.input("Name");
451                                 $input.attr('id', one.f.switchmanager.subnetGatewayConfig.id.modal.form.name);
452                                 $fieldset.append($label).append($input);
453                                 // gateway IP Mask 
454                                 var $label = one.lib.form.label("Gateway IP Address/Mask");
455                                 var $input = one.lib.form.input("Gateway IP Address/Mask");
456                                 $input.attr('id', one.f.switchmanager.subnetGatewayConfig.id.modal.form.gatewayIPAddress);
457                                 $fieldset.append($label).append($input);
458                                 
459                                 $form.append($fieldset);
460                                 return $form;
461                         },
462                         ports: function(nodes, nodeports) {
463                                 var $form = $(document.createElement('form'));
464                                 var $fieldset = $(document.createElement('fieldset'));
465                                 // gateways drop down
466                                 var $label = one.lib.form.label("Gateway Name");
467                                 var $select = one.lib.form.select.create(one.f.switchmanager.subnetGatewayConfig.registry.gateways);
468                                 $select.attr('id', one.f.switchmanager.subnetGatewayConfig.id.modal.form.name);
469                                 $select.val($select.find("option:first").val());
470                                 $fieldset.append($label).append($select);
471
472                                 // node ID
473                                 var $label = one.lib.form.label("Node ID");
474                                 var $select = one.lib.form.select.create(nodes);
475                                 $select.attr('id', one.f.switchmanager.subnetGatewayConfig.id.modal.form.nodeId);
476                                 one.lib.form.select.prepend($select, { '' : 'Please Select a Node' });
477                                 $select.val($select.find("option:first").val());
478                                 $fieldset.append($label).append($select);
479
480                                 // bind onchange
481                                 $select.change(function() {
482                                     // retrieve port value
483                                     var node = $(this).find('option:selected').attr('value');
484                                     one.f.switchmanager.subnetGatewayConfig.registry['currentNode'] = node;
485                                     var $ports = $('#' + one.f.switchmanager.subnetGatewayConfig.id.modal.form.ports);
486                                     var ports = nodeports[node];
487                                     one.lib.form.select.inject($ports, ports);
488                                     one.lib.form.select.prepend($ports, { '' : 'Please Select a Port' });
489                                     $ports.val($ports.find("option:first").val());
490                                 });
491
492                                 // ports
493                                 var $label = one.lib.form.label("Select Port");
494                                 var $select = one.lib.form.select.create();
495                                 $select.attr('id', one.f.switchmanager.subnetGatewayConfig.id.modal.form.ports);
496                                 $fieldset.append($label).append($select);
497                                 
498                                 $form.append($fieldset);
499                                 return $form;
500                         }
501                 },
502                 ajax: {
503                         gateway: function(requestData, callback) {
504                                 $.getJSON(one.f.switchmanager.rootUrl + "/subnetGateway/add", requestData, function(data) {
505                                         callback(data);
506                         });
507                         },
508                         ports: function(requestData, callback) {
509                                 $.getJSON(one.f.switchmanager.rootUrl + "/subnetGateway/ports/add", requestData, function(data) {
510                                         callback(data);
511                         });
512                         }
513                 },
514                 footer : function() {
515             var footer = [];
516             var saveButton = one.lib.dashlet.button.single("Save", one.f.switchmanager.subnetGatewayConfig.id.modal.save, "btn-success", "");
517             var $saveButton = one.lib.dashlet.button.button(saveButton);
518             footer.push($saveButton);
519             return footer;
520         }
521         },
522         // data functions
523         data : {
524                 devices : function(data) {
525                         var result = [];
526                         one.f.switchmanager.subnetGatewayConfig.registry.gateways = [];
527                         $.each(data.nodeData, function(key, value) {
528                                 var tr = {};
529                                 // fill up all the td's
530                                 var subnetConfigObject = $.parseJSON(value["json"]);
531                                 var nodePorts = subnetConfigObject.nodePorts;
532                                 var $nodePortsContainer = $(document.createElement("div"));
533                                 
534                                 for(var i = 0; i < nodePorts.length; i++) {
535                                         var nodePort = nodePorts[i];
536                                         $nodePortsContainer.append(nodePort + " ");
537                                         // add delete anchor tag to delete ports
538                                         var aTag = document.createElement("a");
539                                         aTag.setAttribute("id", encodeURIComponent(nodePort));
540                                         aTag.gatewayName = value["name"];
541                                         aTag.addEventListener("click", function(evt) {
542                                                 var htmlPortAnchor = evt.target;
543                                                 var requestData = {};
544                                                 requestData["gatewayName"] = evt.target.gatewayName;
545                                                 requestData["nodePort"] = decodeURIComponent(evt.target.id);
546                                                 // make ajax call to delete port
547                                                 var url = one.f.switchmanager.rootUrl + "/subnetGateway/ports/delete";
548                                         one.f.switchmanager.subnetGatewayConfig.ajax.main(url, requestData, function(response) {
549                                                 if(response.status == true) {
550                                                         // refresh dashlet by passing dashlet div as param
551                                         one.f.switchmanager.subnetGatewayConfig.dashlet($("#right-bottom .dashlet"));
552                                                 } else {
553                                                         alert(response.message);
554                                                 }
555                                         });
556                                                 
557                                         });
558                                         aTag.addEventListener("mouseover", function(evt) {
559                                                 evt.target.style.cursor = "pointer";
560                                         }, false);
561                                         aTag.innerHTML = "Delete";
562                                         $nodePortsContainer.append(aTag);
563                                         $nodePortsContainer.append("<br/>");
564                                 }
565
566                                 // store gateways in the registry so that they can be used in the add ports popup
567                                 one.f.switchmanager.subnetGatewayConfig.registry.gateways.push(value["name"]);
568                                 var entry = [];
569                                 var checkbox = document.createElement("input");
570                                 checkbox.setAttribute("type", "checkbox");
571                                 checkbox.setAttribute("id", value["name"]);
572                                 entry.push(checkbox);
573                                 entry.push(value["name"]);
574                                 entry.push(value["subnet"]);
575                                 entry.push($nodePortsContainer);
576                                 tr.entry = entry;
577                                 result.push(tr);
578                         });
579                         return result;
580                 }
581         }
582 }
583
584 one.f.switchmanager.staticRouteConfig = {
585         id: {
586                 dashlet: {
587                         add: "one_f_switchmanager_staticRouteConfig_id_dashlet_add",
588                         remove: "one_f_switchmanager_staticRouteConfig_id_dashlet_remove"
589                 }, 
590                 modal: {
591                         modal: "one_f_switchmanager_staticRouteConfig_id_modal_modal",
592                         save: "one_f_switchmanager_staticRouteConfig_id_modal_save",
593                         form: {
594                                 routeName : "one_f_switchmanager_staticRouteConfig_id_modal_form_routename",
595                                 staticRoute : "one_f_switchmanager_staticRouteConfig_id_modal_form_staticroute",
596                 nextHop : "one_f_switchmanager_staticRouteConfig_id_modal_form_nexthop",
597                         }
598                 }
599         },
600         dashlet: function($dashlet) {
601                 one.lib.dashlet.empty($dashlet);
602                 
603
604                 var url = one.f.switchmanager.rootUrl + "/staticRoutes";
605                 one.f.switchmanager.staticRouteConfig.ajax.main(url, {}, function(content) {
606
607             if (content.privilege === 'WRITE') {
608                 // Add static route button
609                 var button = one.lib.dashlet.button.single("Add Static Route", one.f.switchmanager.staticRouteConfig.id.dashlet.add, "btn-primary", "btn-mini");
610                 var $button = one.lib.dashlet.button.button(button);
611                 $button.click(function() {
612                     var $modal = one.f.switchmanager.staticRouteConfig.modal.initialize();
613                     $modal.modal();
614                 });
615                 $dashlet.append(one.lib.dashlet.header(one.f.dashlet.staticRouteConfig.name));
616                 $dashlet.append($button);
617
618                 // Delete static route button
619                 var button = one.lib.dashlet.button.single("Delete Static Route(s)", one.f.switchmanager.staticRouteConfig.id.dashlet.remove, "btn-primary", "btn-mini");
620                 var $button = one.lib.dashlet.button.button(button);
621                 $button.click(function() {
622                     var requestData = {};
623                     var routesToDelete = [];
624                     var checkedCheckBoxes = $("input:checked", $(this).closest(".dashlet").find("table"));
625                     checkedCheckBoxes.each(function(index, value) {
626                         routesToDelete.push(checkedCheckBoxes[index].id);
627                     });
628                     if (routesToDelete.length > 0) {
629                         requestData["routesToDelete"] = routesToDelete.toString();
630                         var url = one.f.switchmanager.rootUrl + "/staticRoute/delete";
631                         one.f.switchmanager.staticRouteConfig.ajax.main(url, requestData, function(response) {
632                             if (response.status == true) {
633                                 // refresh dashlet by passing dashlet div as param
634                                 one.f.switchmanager.staticRouteConfig.dashlet($("#left-bottom .dashlet"));
635                             } else {
636                                 alert(response.message);
637                             }
638                         });
639                     }
640                 });
641                 $dashlet.append($button);
642             }
643
644                         var body = one.f.switchmanager.staticRouteConfig.data.staticRouteConfig(content);
645                         // first column contains checkbox. no need for header
646                         content.columnNames.splice(0,0," ");
647                         var tableHeaders = ['', 'Name', 'Static Route', 'Next Hop Address'];
648                         var $table = one.f.switchmanager.createTable(tableHeaders, body);
649                         $dashlet.append($table);
650                 });
651         },
652         // device ajax calls
653         ajax : {
654                 main : function(url, requestData, callback) {
655                         $.getJSON(url, requestData, function(data) {
656                                 callback(data);
657                         });
658                 }
659         },
660         registry: {},
661         modal : {
662                 initialize: function() {
663                         var h3 = "Add Static Route";
664             var footer = one.f.switchmanager.staticRouteConfig.modal.footer();
665             var $modal = one.lib.modal.spawn(one.f.switchmanager.staticRouteConfig.id.modal.modal, h3, "", footer);
666             // bind save button
667             $('#' + one.f.switchmanager.staticRouteConfig.id.modal.save, $modal).click(function() {
668                 one.f.switchmanager.staticRouteConfig.modal.save($modal);
669             });
670             var $body = one.f.switchmanager.staticRouteConfig.modal.body();
671             one.lib.modal.inject.body($modal, $body);
672             return $modal;
673                 },
674                 save: function($modal) {
675                         var result = {};
676             result['routeName'] = $('#' + one.f.switchmanager.staticRouteConfig.id.modal.form.routeName, $modal).val();
677             result['staticRoute'] = $('#' + one.f.switchmanager.staticRouteConfig.id.modal.form.staticRoute, $modal).val();
678             result['nextHop'] = $('#' + one.f.switchmanager.staticRouteConfig.id.modal.form.nextHop, $modal).val();
679                         one.f.switchmanager.staticRouteConfig.modal.ajax.staticRouteConfig(result, function(response) {
680                         if(response.status == true) {
681                                 $modal.modal('hide');
682                                 // refresh dashlet by passing dashlet div as param
683                                 one.f.switchmanager.staticRouteConfig.dashlet($("#left-bottom .dashlet"));
684                         } else {
685                                 // TODO: Show error message in a error message label instead.
686                                 alert(response.message);
687                         }
688                     });
689                 },
690                 body: function() {
691                         var $form = $(document.createElement('form'));
692                         var $fieldset = $(document.createElement('fieldset'));
693                         // static route name
694                         var $label = one.lib.form.label("Name");
695                         var $input = one.lib.form.input("Name");
696                         $input.attr('id', one.f.switchmanager.staticRouteConfig.id.modal.form.routeName);
697                         $fieldset.append($label).append($input);
698                         // static route IP Mask 
699                         var $label = one.lib.form.label("Static Route");
700                         var $input = one.lib.form.input("Static Route");
701                         $input.attr('id', one.f.switchmanager.staticRouteConfig.id.modal.form.staticRoute);
702                         $fieldset.append($label).append($input);
703                         // static route IP Mask 
704                         var $label = one.lib.form.label("Next Hop");
705                         var $input = one.lib.form.input("Next Hop");
706                         $input.attr('id', one.f.switchmanager.staticRouteConfig.id.modal.form.nextHop);
707                         $fieldset.append($label).append($input);
708                         // return
709                         $form.append($fieldset);
710                         return $form;
711                 },
712                 ajax: {
713                         staticRouteConfig: function(requestData, callback) {
714                                 $.getJSON(one.f.switchmanager.rootUrl + "/staticRoute/add", requestData, function(data) {
715                                         callback(data);
716                                 });
717                         }
718                 },
719                 data : {
720             
721         },
722                 footer : function() {
723             var footer = [];
724             var saveButton = one.lib.dashlet.button.single("Save", one.f.switchmanager.staticRouteConfig.id.modal.save, "btn-success", "");
725             var $saveButton = one.lib.dashlet.button.button(saveButton);
726             footer.push($saveButton);
727             return footer;
728         }
729         },
730         // data functions
731         data : {
732                 staticRouteConfig : function(data) {
733                         var result = [];
734                         $.each(data.nodeData, function(key, value) {
735                                 var tr = {};
736                                 // fill up all the td's
737                                 var entry = [];
738                                 var checkbox = document.createElement("input");
739                                 checkbox.setAttribute("type", "checkbox");
740                                 checkbox.setAttribute("id", value["name"]);
741                                 entry.push(checkbox);
742                                 entry.push(value["name"]);
743                                 entry.push(value["staticRoute"]);
744                                 entry.push(value["nextHop"]);
745                                 tr.entry = entry;
746                                 result.push(tr);
747                         });
748                         return result;
749                 }
750         }
751 }
752
753 one.f.switchmanager.spanPortConfig = {
754         id: {
755                 dashlet: {
756                         add: "one_f_switchmanager_spanPortConfig_id_dashlet_add",
757                         remove: "one_f_switchmanager_spanPortConfig_id_dashlet_remove"
758                 }, 
759                 modal: {
760                         modal: "one_f_switchmanager_spanPortConfig_id_modal_modal",
761                         save: "one_f_switchmanager_spanPortConfig_id_modal_save",
762                         form: {
763                                 name : "one_f_switchmanager_spanPortConfig_id_modal_form_name",
764                                 nodes : "one_f_switchmanager_spanPortConfig_id_modal_form_nodes",
765                 port : "one_f_switchmanager_spanPortConfig_id_modal_form_port",
766                         }
767                 }
768         },
769         dashlet: function($dashlet) {
770                 one.lib.dashlet.empty($dashlet);
771         
772         //populate table in dashlet
773                 var url = one.f.switchmanager.rootUrl + "/spanPorts";
774                 one.f.switchmanager.spanPortConfig.ajax.main(url, {}, function(content) {
775
776             if (content.privilege === 'WRITE') {
777
778                 // Add span port button
779                 var button = one.lib.dashlet.button.single("Add Span Port", one.f.switchmanager.spanPortConfig.id.dashlet.add, "btn-primary", "btn-mini");
780                 var $button = one.lib.dashlet.button.button(button);
781
782                 $button.click(function() {
783                     var $modal = one.f.switchmanager.spanPortConfig.modal.initialize();
784                     $modal.modal();
785                 });
786                 $dashlet.append(one.lib.dashlet.header(one.f.dashlet.spanPortConfig.name));
787                 $dashlet.append($button);
788
789                 // Delete span port button
790                 var button = one.lib.dashlet.button.single("Delete SPAN Port(s)", one.f.switchmanager.spanPortConfig.id.dashlet.remove, "btn-primary", "btn-mini");
791                 var $button = one.lib.dashlet.button.button(button);
792                 $button.click(function() {
793
794                     var checkedCheckBoxes = $("input:checked", $(this).closest(".dashlet").find("table"));
795                     if (checkedCheckBoxes.length > 0) {
796                         var spanPortsToDelete = "";
797                         checkedCheckBoxes.each(function(index, value) {
798                             spanPortsToDelete += checkedCheckBoxes[index].spanPort + "###";
799                         });
800
801                         var requestData = {};
802                         requestData["spanPortsToDelete"] = spanPortsToDelete;
803                         var url = one.f.switchmanager.rootUrl + "/spanPorts/delete";
804                         one.f.switchmanager.spanPortConfig.ajax.main(url, requestData, function(response) {
805                             if (response.status == true) {
806                                 // refresh dashlet by passing dashlet div as param
807                                 one.f.switchmanager.spanPortConfig.dashlet($("#right-bottom .dashlet"));
808                             } else {
809                                 alert(response.message);
810                             }
811                         });
812                     }
813                 });
814                 $dashlet.append($button);
815             }
816
817                         var body = one.f.switchmanager.spanPortConfig.data.devices(content);
818                         // first column contains the checkbox. no header required.
819                         content.columnNames.splice(0,0," ");
820                         var $table = one.f.switchmanager.createTable(content.columnNames, body);
821                         $dashlet.append($table);
822                 });
823         },
824         // device ajax calls
825         ajax : {
826                 main : function(url, requestData, callback) {
827                         $.getJSON(url, requestData, function(data) {
828                                 callback(data);
829                         });
830                 }
831         },
832         registry: {},
833         modal : {
834                 initialize: function() {
835                         var h3 = "Add SPAN Port";
836             var footer = one.f.switchmanager.spanPortConfig.modal.footer();
837             var $modal = one.lib.modal.spawn(one.f.switchmanager.spanPortConfig.id.modal.modal, h3, "", footer);
838             // bind save button
839             $('#' + one.f.switchmanager.spanPortConfig.id.modal.save, $modal).click(function() {
840                 one.f.switchmanager.spanPortConfig.modal.save($modal);
841             });
842
843             one.f.switchmanager.spanPortConfig.modal.ajax.nodes(function(nodes, nodeports) {
844                 var $body = one.f.switchmanager.spanPortConfig.modal.body(nodes, nodeports);
845                 one.lib.modal.inject.body($modal, $body);
846             });
847             return $modal;
848                 },
849                 save: function($modal) {
850                         var result = {};
851             result['nodeId'] = $('#' + one.f.switchmanager.spanPortConfig.id.modal.form.nodes, $modal).val();
852             result['spanPort'] = $('#' + one.f.switchmanager.spanPortConfig.id.modal.form.port, $modal).val();
853                         one.f.switchmanager.spanPortConfig.modal.ajax.saveSpanPortConfig(result, 
854                                 function(response) {
855                                         if(response.status == true) {
856                                                 $modal.modal('hide');
857                                                 one.f.switchmanager.spanPortConfig.dashlet($("#right-bottom .dashlet"));
858                                         } else {
859                                                 alert(response.message);
860                                         }
861                         
862                     });
863                 },
864                 body: function(nodes, nodeports) {
865                         var $form = $(document.createElement('form'));
866                         var $fieldset = $(document.createElement('fieldset'));
867                         // node
868                         var $label = one.lib.form.label("Node");
869                         var $select = one.lib.form.select.create(nodes);
870                         one.lib.form.select.prepend($select, { '' : 'Please Select a Node' });
871                         $select.attr('id', one.f.switchmanager.spanPortConfig.id.modal.form.nodes);
872                         
873                         // bind onchange
874                         $select.change(function() {
875                             // retrieve port value
876                             var node = $(this).find('option:selected').attr('value');
877                             one.f.switchmanager.spanPortConfig.registry['currentNode'] = node;
878                             var $ports = $('#' + one.f.switchmanager.spanPortConfig.id.modal.form.port);
879                             var ports = nodeports[node];
880                             one.lib.form.select.inject($ports, ports);
881                         });
882
883             $fieldset.append($label).append($select);
884                         // input port
885                         var $label = one.lib.form.label("Input Port");
886                         var $select = one.lib.form.select.create();
887                         $select.attr('id', one.f.switchmanager.spanPortConfig.id.modal.form.port);
888                         $fieldset.append($label).append($select);
889                         
890                         // return
891                         $form.append($fieldset);
892                         return $form;
893                 },
894                 ajax: {
895                         nodes: function(callback) {
896                                 $.getJSON(one.f.switchmanager.rootUrl + "/nodeports", function(data) {
897                     var nodes = one.f.switchmanager.spanPortConfig.modal.data.nodes(data);
898                     var nodeports = data;
899                     one.f.switchmanager.spanPortConfig.registry['nodeports'] = nodeports;
900                     callback(nodes, nodeports);
901                 });
902                         },
903                         saveSpanPortConfig: function(requestData, callback) {
904                                 var resource = {};
905                                 resource["jsonData"] = JSON.stringify(requestData);
906                                 $.getJSON(one.f.switchmanager.rootUrl + "/spanPorts/add", resource, function(data) {
907                                         callback(data);
908                                 });
909                         }
910                 },
911                 data : {
912             nodes : function(data) {
913                 result = {};
914                 $.each(data, function(key, value) {
915                     result[key] = key;
916                 });
917                 return result;
918             }
919         },
920                 footer : function() {
921             var footer = [];
922             var saveButton = one.lib.dashlet.button.single("Save", one.f.switchmanager.spanPortConfig.id.modal.save, "btn-success", "");
923             var $saveButton = one.lib.dashlet.button.button(saveButton);
924             footer.push($saveButton);
925             return footer;
926         }
927         },
928         // data functions
929         data : {
930                 devices : function(data) {
931                         var result = [];
932                         $.each(data.nodeData, function(key, value) {
933                                 var tr = {};
934                                 // fill up all the td's
935                                 var entry = [];
936                                 var checkbox = document.createElement("input");
937                                 checkbox.setAttribute("type", "checkbox");
938                                 checkbox.spanPort = value.json;
939                                 entry.push(checkbox);
940                                 entry.push(value["nodeName"]);
941                                 entry.push(value["spanPort"]);
942                                 tr.entry = entry;
943                                 result.push(tr);
944                         });
945                         return result;
946                 }
947         }
948 }
949
950 /** INIT **/
951 // populate nav tabs
952 $(one.f.menu.left.top).each(function(index, value) {
953     var $nav = $(".nav", "#left-top");
954     one.main.page.dashlet($nav, value);
955 });
956
957 $(one.f.menu.left.bottom).each(function(index, value) {
958     var $nav = $(".nav", "#left-bottom");
959     one.main.page.dashlet($nav, value);
960 });
961
962 $(one.f.menu.right.bottom).each(function(index, value) {
963     var $nav = $(".nav", "#right-bottom");
964     one.main.page.dashlet($nav, value);
965 });
966
967 one.f.addPopOut = function() {
968         $img1 = $(document.createElement("img"));
969         $img1.attr("src", "/img/Expand16T.png");
970         $img1.attr("style", "float: right;");
971         $img1.hover(function() {
972                 $img1.css("cursor", "pointer");
973         });
974         $img1.click(function() {
975                 var $modal = one.f.switchmanager.nodesLearnt.modal.initialize.popout();
976         $modal.css('width', 'auto');
977                 $modal.css('margin-left', '-40%');
978         $modal.modal();
979         });
980         $dash1 = $($("#left-top .nav")[0]);
981         $dash1.append($img1);
982 };
983 one.f.addPopOut();
984
985 // bind dashlet nav
986 $('.dash .nav a', '#main').click(function() {
987     // de/activation
988     var $li = $(this).parent();
989     var $ul = $li.parent();
990     one.lib.nav.unfocus($ul);
991     $li.addClass('active');
992     // clear respective dashlet
993     var $dashlet = $ul.parent().find('.dashlet');
994     one.lib.dashlet.empty($dashlet);
995
996     // callback based on menu
997     var id = $(this).attr('id');
998     var menu = one.f.dashlet;
999     switch (id) {
1000         case menu.nodesLearnt.id:
1001                 one.f.switchmanager.nodesLearnt.dashlet($dashlet);
1002             break;
1003         case menu.staticRouteConfig.id:
1004                 one.f.switchmanager.staticRouteConfig.dashlet($dashlet);
1005             break;
1006         case menu.subnetGatewayConfig.id:
1007                 one.f.switchmanager.subnetGatewayConfig.dashlet($dashlet);
1008             break;
1009         case menu.spanPortConfig.id:
1010                 one.f.switchmanager.spanPortConfig.dashlet($dashlet);
1011             break;
1012     };
1013 });
1014
1015 // activate first tab on each dashlet
1016 $('.dash .nav').each(function(index, value) {
1017     $($(value).find('li')[0]).find('a').click();
1018 });