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