Statistics
| Branch: | Tag: | Revision:

root / ui / templates / networks.html @ 77d4b76f

History | View | Annotate | Download (36.9 kB)

1
{% load i18n %}
2

    
3
<!-- the create button -->
4
<div id="networks-createcontainer">
5
    <div id="beforecreate"></div>
6
    <a id="networkscreate" rel="#networks-wizard" href="#">{% trans "Create New +" %}</a>
7
</div>
8

    
9
<!-- add new network overlay -->
10
<div>
11
    <div class="modal" id="networks-wizard">
12
        <div class="header">
13
        </div>
14
        <h2>{% trans "Name your network" %}</h2>
15
        <hr class="topruler" />
16
        <div class="container">
17
            <div class="name-input">
18
                <label>{% trans "Name" %}:</label>
19
                <input type="text" class="text" name="machine_name"></input>
20
                <span class="help">{% trans "(* Required field)" %}</span>
21
            </div>
22
        </div>
23
        <hr class="bottomruler" />
24
        <button type="button" id="add-network-cancel" class="cancel">{% trans "Cancel" %}</button>
25
        <button type="button" id="add-network-create" class="create">{% trans "Create Network" %}</button>
26
        <hr class="separator-end"></hr>
27
    </div>
28
</div>
29

    
30
<!-- networks list -->
31
<div id="networks-container">
32
    <!-- spinner while loading list -->
33
    <div class = "large-spinner"></div>
34

    
35
    <!-- public network template -->
36
    <div class="network" id="public-template">
37
        <div class="actions">
38
            {# Commented out the following until there is full public network support #}
39
            {# <a href="#" class="action-add">{% trans "Add Machine" %}</a> #}
40
        </div>
41
        <div class="confirm_single">
42
            <button class="yes">{% trans "Confirm" %}</button>
43
            <button class="no">{% trans "Cancel" %}</button>
44
        </div>
45
        <div class="action_error" align="center">
46
            {% trans "<span class='orange'>Error</span> on" %} <span class="action">{% trans "error action" %}</span>
47
            <span class="code"></span>
48
            <span class="message"></span>
49
            <button class="details">{% trans "Details" %}</button>
50
        </div>
51
        <div class="state">
52
            <div class="status">{% trans "Public Network" %}</div>
53
            <div class="indicator"></div>
54
            <div class="indicator"></div>
55
            <div class="indicator"></div>
56
            <div class="indicator"></div>
57
        </div>
58
        <img class="network-logos" src="static/internet.png" />
59
        <div href="#" class="name-div">
60
            <h5 class="namecontainer">
61
                <span class="name">{% trans "Internet" %}</span>
62
            </h5>
63
        </div>
64
        <h5 class="network-machines">
65
            {% trans "Show:" %} <span class="show-machines">{% trans "machines" %}</span>
66
            (<span class="machines-count">0</span>)
67
        </h5>
68
        <div class="network-contents">
69
            <div class="network-placeholder">
70
                <div class="network-contents-start-separator"></div>
71
                <div class="machines-list">
72
                <!-- append machines here -->
73
                </div>
74
                <div class="empty-network-slot" id="machine-template">
75
                    <div class='network-add-machine'>
76
                        {# Replace the following with the comment below for full public network functionality #}
77
                        {# <span class="add-icon">+</span> #}
78
                        <span>&nbsp;</span>
79
                    </div>
80
                </div>
81
            </div>
82
            <div class="network-contents-end-separator"></div>
83
        </div>
84
    </div>
85

    
86
    <!-- template for machines in public network -->
87
    <div class="network-machine" id="public-machine-template">
88
        <div class="machine-actions">
89
            <a href="#" class="action-details">{% trans "Details" %}</a>
90
        </div>
91
        <div class="confirm_single">
92
            <button class="yes">{% trans "Confirm" %}</button>
93
            <button class="no">{% trans "Cancel" %}</button>
94
        </div>
95
        <div class="action_error" align="center">
96
            {% trans "<span class='orange'>Error</span> on" %} <span class="action">{% trans "error action" %}</span>
97
            <span class="code"></span>
98
            <span class="message"></span>
99
            <button class="details">{% trans "Details" %}</button>
100
        </div>
101
        <div class="state">
102
            <div class="ip4-container status">
103
                <span class="discreet">{% trans "IPv4" %}: </span>
104
                <span class="ip4">192.94.73.15</span>
105
            </div>
106
            <div class="ip6-container status">
107
                <span class="discreet">{% trans "IPv6" %}: </span>
108
                <span class="ip6">vv</span>
109
            </div>
110
            <img class="spinner" style="display:none" src="static/icons/indicators/medium/progress.gif" />
111
            <img class="wave" style="display:none" src="static/icons/indicators/medium/wave.gif" />
112
        </div>
113
        <img class="logo" src="static/icons/machines/medium/debian-on.png" />
114
        <div class='network-remove-machine'>
115
            {# Replace the following with the comment below for full public network functionality #}
116
            {# <span class="remove-icon">X</span> #}
117
            <span>&nbsp;</span>
118
        </div>
119
        <div href="#" class="machine-name-div">
120
            <h5 class="namecontainer">
121
                <span class="name">my desktop1</span>
122
            </h5>
123
        </div>
124
        <h5 class="machine-settings">
125
            <span class="ip">{% trans "IPs" %}</span> |
126
            <span class="show-firewall">{% trans "Firewall" %}</span>
127
            (<span class="firewall-off">{% trans "Off" %}</span>)
128
        </h5>
129
        <div class="firewall-content">
130
            <div class="firewall-contents-start-separator"></div>
131
            <input type="radio" class="checkboxes" name="image-id1" />
132
            <span class="checkbox-legends">{% trans "Unprotected mode (Firewall off)" %}</span>
133
            <br />
134
            <input type="radio" class="checkboxes" name="image-id1" />
135
            <span class="checkbox-legends">{% trans "Fully protected mode (Firewall on)" %}</span>
136
            <br />
137
            <input type="radio" class="checkboxes" name="image-id1" />
138
            <span class="checkbox-legends">{% trans "Basically protected mode (Firewall on)" %}</span>
139
            <br />
140
            <input type="radio" class="checkboxes" name="image-id1" />
141
            <span class="checkbox-legends">{% trans "Custom protection" %} <a href="#" class="firewall-settings">{% trans "settings" %}</a> {% trans "(Advanced users only)" %}</span>
142
            <button type="submit" class="firewall-apply">{% trans "Apply" %}</button>
143
            <div class="firewall-contents-end-separator"></div>
144
        </div>
145
        <div class="network-separator machines"></div>
146
    </div>
147

    
148
    <!-- private network template -->
149
    <div class="network" id="private-template">
150
        <div class="actions">
151
            <a href="#" class="action-add">{% trans "Add Machine" %}</a>
152
            <a href="#" class="action-network-destroy">{% trans "Destroy" %}</a>
153
        </div>
154
        <div class="confirm_single">
155
            <button class="yes">{% trans "Confirm" %}</button>
156
            <button class="no">{% trans "Cancel" %}</button>
157
        </div>
158
        <div class="action_error" align="center">
159
            {% trans "<span class='orange'>Error</span> on" %} <span class="action">{% trans "error action" %}</span>
160
            <span class="code"></span>
161
            <span class="message"></span>
162
            <button class="details">{% trans "Details" %}</button>
163
        </div>
164
        <div class="state">
165
            <div class="status">{% trans "Private Network" %}</div>
166
            <div class="indicator"></div>
167
            <div class="indicator"></div>
168
            <div class="indicator"></div>
169
            <div class="indicator"></div>
170
            <img class="spinner" style="display:none" src="static/icons/indicators/medium/progress.gif" />
171
            <img class="wave" style="display:none" src="static/icons/indicators/medium/wave.gif" />
172
        </div>
173
        <img class="network-logos" src="static/network.png" />
174
        <div href="#" class="name-div">
175
            <h5 class="namecontainer editable">
176
                <span class="name">{% trans "My Network 1" %}</span>
177
                <span class="rename-network"></span>
178
                <div class="editbuttons" style="display:none">
179
                    <span class="save" />
180
                    <span class="cancel" />
181
                </div>
182
            </h5>
183
        </div>
184
        <h5 class="network-machines">
185
            {% trans "Show:" %} <span class="show-machines">{% trans "machines" %}</span>
186
            (<span class="machines-count">0</span>)
187
        </h5>
188
        <div class="network-contents">
189
            <div class="network-placeholder">
190
                <div class="network-contents-start-separator"></div>
191
                <div class="machines-list">
192
                <!-- append machines here -->
193
                </div>
194
                <div class="empty-network-slot" id="machine-template">
195
                    <div class='network-add-machine'><span class="add-icon">+</span></div>
196
                </div>
197
            </div>
198
            <div class="network-contents-end-separator"></div>
199
        </div>
200
        <div class="separator"></div>
201
    </div>
202

    
203
    <!-- template for machines in private network -->
204
    <div class="network-machine" id="private-machine-template">
205
        <div class="machine-actions">
206
            <a href="#" class="action-disconnect">{% trans "Disconnect" %}</a>
207
            <a href="#" class="action-details">{% trans "Details" %}</a>
208
        </div>
209
        <div class="confirm_single">
210
            <button class="yes">{% trans "Confirm" %}</button>
211
            <button class="no">{% trans "Cancel" %}</button>
212
        </div>
213
        <div class="action_error" align="center">
214
            {% trans "<span class='orange'>Error</span> on" %} <span class="action">{% trans "error action" %}</span>
215
            <span class="code"></span>
216
            <span class="message"></span>
217
            <button class="details">{% trans "Details" %}</button>
218
        </div>
219
        <div class="state">
220
            <img class="spinner" style="display:none" src="static/icons/indicators/medium/progress.gif" />
221
            <img class="wave" style="display:none" src="static/icons/indicators/medium/wave.gif" />
222
        </div>
223
        <img class="logo" src="static/icons/machines/medium/debian-on.png" />
224
        <div class='network-remove-machine'><span class="remove-icon">X</span></div>
225
        <div href="#" class="machine-name-div">
226
            <h5 class="namecontainer editable">
227
                <span class="name">my desktop1</span>
228
            </h5>
229
        </div>
230
        <h5 class='machine-connect'>
231
            <span>{% trans "Connect" %}</span> {% trans "to manage private IPs" %}
232
        </h5>
233
        <div class="network-separator machines"></div>
234
    </div>
235

    
236
    <!-- the actual structure to be populated -->
237
    <div class="public-networks"></div>
238
    <div class="private-networks" style="display:none;"></div>
239
</div>
240

    
241
<!-- add servers to network overlay -->
242
<div>
243
    <div id="add-machines-wizard" class="modal">
244
        <h3 class="popup-header">{% trans "Add machine" %}</h3>
245
        <p style='display:none;'>hidden network id</p>
246
        <div class="popup-body">
247
            <div class="popup-body-inner">
248
                <div class="popup-title">{% trans "Select machines to add to:" %}</div>
249
                <div class="network-name"></div>
250
                <div class="popup-separator"></div>
251
                <div class="machines-container">
252
                    <div class="large-spinner"></div>
253
                    <div id='machine-entry-template' style="display:none;">
254
                        <input type="checkbox" />
255
                        <img class=list-logo src="static/icons/machines/small/debian-on.png" title="debian"></img>
256
                        <span class="machine-name">kati</span>
257
                    </div>
258
                </div>
259
            </div>
260
        </div>
261
        <div class="buttons">
262
            <button type="button" class="cancel" id="add-server-cancel">{% trans "Cancel" %}</button>
263
            <button type="button" class="add" id="add-server-add">{% trans "Add" %}</button>
264
        </div>
265
    </div>
266
</div>
267

    
268
<a id="add-machines-overlay" href="#" rel="#add-machines-wizard"></a>
269

    
270
<!-- multiple confirmation dialog -->
271
<div class="confirm_multiple">
272
    <p>{% trans "Your actions will affect" %} <span class="actionLen">XX</span> {% trans "networks" %}</p>
273
    <button class="yes">{% trans "Confirm All" %}</button>
274
    <button class="no">{% trans "Cancel All" %}</button>
275
</div>
276

    
277
<script>
278
// add network wizard initialization
279
$(function() {
280
    // create wizard overlay
281
    $("a#networkscreate").overlay({
282
        mask: '#000',
283
        effect: 'default',
284
        top: '10%',
285
        closeOnClick: false,
286
        oneInstance: false,
287
        closeOnEsc: true,
288
        load: false
289
    });
290
});
291

292
// intercept click to create new private network
293
$("#networkscreate").click(function() {
294
    // reset and load wizard
295
    $('#networks-wizard span.help').removeClass('red');
296
    $('#networks-wizard input').val('');
297
    $('#networks-wizard #add-network-create').text('{% trans 'Create Network' %}');
298
    $("#networks-wizard").show();
299
    $('#networks-wizard input').focus();
300
    $("a#networkscreate").data('overlay').load();
301
    return false;
302
});
303

304
// exit the add machine to network wizard
305
$("#add-network-cancel").live('click', function() {
306
    $("a#networkscreate").overlay().close();
307
});
308

309
// add selected machines to network
310
$("#add-network-create").live('click', function() {
311
    if ($('#networks-wizard input').val() == '') {
312
        $('#networks-wizard input').focus();
313
        $('#networks-wizard span.help').addClass('red');
314
    } else {
315
        $(this).text('');
316
        $(this).html('<img src="static/icons/indicators/medium/horizontal-progress.gif"></img>');
317
        networkName = $('#networks-wizard input').val();
318
        create_network(networkName);
319
    }
320
    return false;
321
});
322

323
// toggle component with class network-contents
324
$("#networks-pane .show-machines").live('click', function() {
325
    if ($('#networks-pane .network-contents .network-machine').length > 0) {
326
        $(this).parent().next("#networks-pane .network-contents").slideToggle(600);
327
    }
328
    return false;
329
});
330

331
// toggle component with class network-contents
332
$("#networks-pane .network-logos").live('click', function() {
333
    $(this).siblings("#networks-pane .network-contents").slideToggle(600);
334
    return false;
335
});
336

337
//initiate network renaming
338
$("#networks-pane .name-div .rename-network, #networks-pane .name-div h5.editable span.name").live('click', function() {
339
    $(this).parent().find('.name').html("<input id=\"txtEdit\" type=\"text\" class=\"nametextbox\" value=\"" +
340
                                        $(this).parent().find('.name').text() +
341
                                        "\" / ><span class=\"oldValue\">" +
342
                                        $(this).parent().find('.name').text() + "</span>");
343
    $(this).parent().find('.rename-network').hide();
344
    $(this).parent().find(".editbuttons").fadeIn();
345
    $(this).parent().find(".nametextbox").focus().select();
346
    $(this).parent().removeClass('editable');
347

348
    //submit wizard by pressing enter on the name textbox
349
    $("#txtEdit").keydown(function (e) {
350
        if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
351
            $(this).parent().parent().find('div.editbuttons span.save').click();
352
            return false;
353
        } else if ((e.which && e.which == 27) || (e.keyCode && e.keyCode == 27)) {
354
            $(this).parent().parent().find('div.editbuttons span.cancel').click();
355
            return true;
356
        }
357
    });
358
    return false;
359
});
360

361
//rename machine
362
$("#networks-pane .name-div .editbuttons .save").live('click', function() {
363
    networkID = $(this).closest('.network').attr("id").split('-').pop();
364
    networkName = $(this).parent().parent().find('.nametextbox').val();
365
    if (networkName.trim() == ''){
366
        return false;
367
    }
368
    $(this).parent().parent().find('.name').html($(this).parent().parent().find('.nametextbox').val());
369
    $(this).parent().parent().find(".editbuttons").fadeOut("fast");
370
    $(this).parent().parent().find(".rename-network").fadeIn("slow");
371
    rename_network(networkID, networkName);
372
    return false;
373
});
374

375
//cancel renaming
376
$("#networks-pane .name-div .editbuttons .cancel").live('click', function() {
377
    $(this).parent().parent().find('.name').html($(this).parent().parent().find('.oldValue').text());
378
    $(this).parent().parent().find(".editbuttons").hide();
379
    $(this).parent().parent().find(".rename-network").fadeIn();
380
    $(this).parent().parent().addClass('editable');
381
    return false;
382
});
383

384
// intercept click to delete network
385
$("#networks-pane .action-network-destroy").live('click', function() {
386
    var networkID = $(this).parent().parent().attr('id').split('-').pop();
387
    var networkName = $(this).parent().parent().find(".name-div span.name").text();
388
    var found = false;
389
    $(this).parent().children('a').removeClass('selected');
390
    $(this).addClass('selected');
391
    $(this).parent().addClass('display')
392
    $(this).parent().parent().find('.action_error').hide();
393
    for (i=0; i < pending_actions.length; i++){ // if there is already a pending action for this network replace it
394
        if (pending_actions[i][0] == delete_network && pending_actions[i][1] == networkID){
395
            pending_actions[i][0] = delete_network;
396
            found = true
397
        }
398
    }
399
    if (!found) {
400
        // no pending action for this network was found, so let's just add it to the list
401
        pending_actions.push([delete_network, networkID, networkName]);
402
    }
403
    update_network_confirmations();
404
    return false;
405
});
406

407
// intercept click to remove machine from network
408
$("#networks-pane .remove-icon").live('click', function() {
409
    $(this).closest('.network-machine').find('.action-disconnect').click();
410
    return false;
411
});
412

413
// intercept click to remove machine from network
414
$("#networks-pane .action-disconnect").live('click', function() {
415
    var serverID = $(this).parent().parent().attr('id').split('-').pop();
416
    var networkID = $(this).closest('.network').attr('id').split('-').pop();
417
    var found = false;
418
    $(this).parent().children('a').removeClass('selected');
419
    $(this).addClass('selected');
420
    $(this).parent().addClass('display')
421
    $(this).parent().parent().find('.action_error').hide();
422
    for (i=0; i < pending_actions.length; i++){
423
        // if there is already a pending action for this network replace it
424
        if (pending_actions[i][0] == remove_server_from_network &&
425
            pending_actions[i][1] == networkID &&
426
            pending_actions[i][2] == serverID) {
427
                pending_actions[i][0] = remove_server_from_network;
428
                found = true
429
        }
430
    }
431
    if (!found) {
432
        // no pending action for this network was found, so let's just add it to the list
433
        pending_actions.push([remove_server_from_network, networkID, serverID]);
434
    }
435
    update_network_confirmations();
436
    return false;
437
});
438

439
$("#networks-pane .action-details").live('click', function() {
440
    var serverID = $(this).parent().parent().attr('id').split('-').pop();
441
    $.cookie('view', '2');
442
    $.cookie('server', serverID);
443
    $('a#machines').click();
444
    return false
445
});
446

447
// add machines wizard initialization
448
$(function() {
449
    // create wizard overlay
450
    $("a#add-machines-overlay").overlay({
451
        mask: '#000',
452
        effect: 'default',
453
        top: '10%',
454
        closeOnClick: false,
455
        oneInstance: false,
456
        closeOnEsc: true,
457
        load: false
458
    });
459
});
460

461
// intercept click to add machine to  network
462
$("#networks-pane .action-add").live('click', function() {
463
    // reset pre-existing values
464
    $('#add-server-add').text('{% trans 'Add' %}');
465
    $("#add-machines-wizard .network-name").text($(this).closest('.network').find('.name-div span.name').text());
466
    $("#add-machines-wizard p").text($(this).closest('.network').attr('id').split('-').pop());
467
    $("#add-machines-wizard .large-spinner").show();
468
    $('[id^="list-entry-server-"]').remove();
469
    // list new values
470
    list_machines();
471
    // load wizard
472
    $("#add-machines-wizard").show();
473
    $("a#add-machines-overlay").data('overlay').load();
474
    return false;
475
});
476

477
//submit wizard by pressing enter on the name textbox
478
$("#networks-wizard div.name-input input.text").keypress(function (e) {
479
    if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
480
        $('#add-network-create').click();
481
        return false;
482
    } else {
483
        return true;
484
    }
485
});
486

487
// intercept click to bring up the add machine to network wizard
488
$("#networks-pane .add-icon").live('click', function() {
489
    $(this).closest('.network').find('.action-add').click();
490
});
491

492
// get machines in public network and list them in add server to network wizard
493
function list_machines() {
494
    var networkID = $("#add-machines-wizard p").text();
495
    // get the list of servers from the UI
496
    var all_machines = $("#networks-pane .public-networks .network-machine");
497

498
    $.each(all_machines, function(i, machine) {
499
        var currentID = machine.id.split('-').pop();
500
        // if machine already exists in private network
501
        if ( $('#net-' + networkID + '-server-' + currentID).length > 0 ) {
502
            // do nothing
503
        } else {
504
            // put it in the list
505
            var entry = $("#add-machines-wizard #machine-entry-template").clone().attr("id", "list-entry-server-" + currentID);
506
            entry.find('input').attr("name", currentID);
507
            entry.find('img').attr('src', 'static/icons/machines/small/' + $(machine).find('img.logo').attr('src').split('/').pop());
508
            entry.find('.machine-name').text($(machine).find('span.name').text());
509
            entry.appendTo("#add-machines-wizard .machines-container");
510
        }
511
    });
512
    $("#add-machines-wizard .large-spinner").hide();
513
    $('[id^="list-entry-server-"]').fadeIn("slow");
514
    return false;
515
}
516

517
// exit the add machine to network wizard
518
$("#add-server-cancel").live('click', function() {
519
    $("a#add-machines-overlay").overlay().close();
520
});
521

522
// add selected machines to network
523
$("#add-server-add").live('click', function() {
524
    var selections = $("#add-machines-wizard :checkbox:checked");
525
    var networkID = $("#add-machines-wizard p").text();
526
    var serverIDs = [];
527
    $.each(selections, function(i, selection) {
528
        serverIDs.push(selection.name);
529
    });
530
    $(this).text('');
531
    add_server_to_network(networkID, serverIDs);
532
    $(this).html('<img src="static/icons/indicators/medium/horizontal-progress.gif"></img>');
533
    return false;
534
});
535

536
// toggle component with class firewall-contents
537
$("#networks-pane .show-firewall").live('click', function() {
538
    $(this).parent().next(".firewall-content").slideToggle(600);
539
    return false;
540
});
541

542
//hide firewall content on apply click
543
$("#networks-pane .firewall-apply").live('click', function() {
544
    $(this).parent().slideToggle(600);
545
    return false;
546
});
547

548
// confirm single action
549
$("#networks-pane div.confirm_single .yes").live('click', function() {
550
    // this works both for server and network actions
551
    var serverID = [];
552
    if ($(this).closest('.network-machine').attr('id')) {
553
        serverID = $(this).closest('.network-machine').attr('id').split('-').pop();
554
    }
555
    var networkID = $(this).closest('.network').attr("id").split('-').pop();
556
    // execute actions
557
    for (i=0;i<pending_actions.length;i++){
558
        // if there is a pending action for this server execute it
559
        if (pending_actions[i][0] == delete_network &&
560
            pending_actions[i][1] == networkID){
561
                action = pending_actions.splice(i,1)[0];
562
                $(this).parent().parent().find('.status').text(TRANSITIONS['Destroying']);
563
                $(this).parent().parent().find('.spinner').show();
564
                action[0]([action[1]]); // execute action
565
        } else if ( pending_actions[i][0] == remove_server_from_network &&
566
                    pending_actions[i][1] == networkID &&
567
                    pending_actions[i][2] == serverID) {
568
                        action = pending_actions.splice(i,1)[0];
569
                        action[0]([action[1]], [action[2]]); // execute action
570
        }
571
    }
572
    $(this).parent().hide();
573
    $(this).parent().prev().children('a').removeClass('selected');
574
    $(this).parent().prev().removeClass('display');
575
    update_network_confirmations();
576
    return false;
577
});
578

579
// cancel single action
580
$("#networks-pane div.confirm_single .no").live('click', function(){
581
    // this works both for server and network actions
582
    var serverID = [];
583
    if ($(this).closest('.network-machine').attr('id')) {
584
        serverID = $(this).closest('.network-machine').attr('id').split('-').pop();
585
    }
586
    var networkID = $(this).closest('.network').attr("id").split('-').pop();
587
    // remove the action from the pending list
588
    $(this).parent().prev().children('a').removeClass('selected');
589
    $(this).parent().prev().removeClass('display');
590
    for (i=0; i < pending_actions.length; i++){ // if there is a pending action for this network remove it
591
        if (pending_actions[i][0] == delete_network && pending_actions[i][1] == networkID){
592
                pending_actions.splice(i,1);
593
        } else if ( pending_actions[i][0] == remove_server_from_network &&
594
                    pending_actions[i][1] == networkID &&
595
                    pending_actions[i][2] == serverID) {
596
                        pending_actions.splice(i,1);
597
        }
598
    }
599
    $(this).parent().hide();
600
    update_network_confirmations();
601
    return false;
602
});
603

604
// show, single action, error details
605
$("#networks-pane div.action_error .details").live('click', function(){
606
    // remove the action from the pending list
607
    ajax_error($(this).parent().children('.code').text(),
608
                 undefined,
609
                 $(this).parent().children('.action').text(),
610
                 $(this).parent().children('.message').text());
611
    $(this).parent().hide();
612
    return false;
613
});
614

615
// confirm all actions
616
$("#networks-pane div.confirm_multiple .yes").live('click', function(){
617
    while(pending_actions.length > 0){ // if there is a pending action for this network execute it
618
        action = pending_actions.pop(); // extract action
619
        var networkID = action[1];
620
        $('#networks-pane .selected').removeClass('selected');
621
        $('#networks-pane .display').removeClass('display');
622
        if (action[0] == delete_network) {
623
            $('#networks-pane #net-' + networkID + ' .status').text(TRANSITIONS['Destroying']);
624
            $('#networks-pane #net-' + networkID + ' .spinner').show();
625
            action[0]([networkID]); // execute action
626
        } else if (action[0] == remove_server_from_network) {
627
            action[0]([action[1]], [action[2]]); // execute action
628
        }
629
    }
630
    update_network_confirmations();
631
    return false;
632
});
633

634
// cancel all actions
635
$("#networks-pane div.confirm_multiple .no").live('click', function(){
636
    pending_actions = [];
637
    $('#networks-pane .selected').removeClass('selected');
638
    $('#networks-pane .display').removeClass('display');
639
    update_network_confirmations();
640
    return false;
641
});
642

643
// update the networks list
644
function update_networks_view(servers_data, networks_data){
645
    /*
646
    Go through the input data. Update existing entries, add
647
    new ones to the list
648
    */
649

650
    // check for changes in networks
651
    if (networks_data){
652
        /*
653
        Here we are interested in private networks only
654
        and not for any server they might contain
655
        */
656

657
        // update private networks
658
        $.each(networks_data.networks.values, function(i,network) {
659
            // search DOM for this network
660
            existing = $('#networks-pane #net-' + network.id);
661

662
            // if multiple machines exist in the DOM, delete all but one
663
            // defensive coding - that shouldn't happen normally
664
            while (existing.length > 1){
665
                existing.remove();
666
            }
667
            // If network already exists in DOM, update it
668
            if (existing.length){
669
                // network was deleted
670
                if (network.status == 'DELETED') {
671
                    existing.remove();
672
                }
673

674
                // network was renamed
675
                if (existing.find('.name-div span.name').text() != network.name) {
676
                    // set the new name
677
                    existing.find('.name-div span.name').text(network.name);
678
                }
679
            }
680
            // If network does not exist in DOM, create it, do not take into account public network
681
            else if (network.id != 'public'){
682
                var privNet = $("#networks-pane #private-template").clone().attr("id", "net-" + network.id);
683
                privNet.find(".name-div span.name").text(network.name).fadeIn("slow");
684
                privNet.appendTo("#networks-pane .private-networks");
685
            }
686
        });
687
    }
688

689
    // check for changes in servers
690
    if (servers_data) {
691
        /*
692
        Here we are interested in any server contained
693
        either in a public network or a private one
694
        */
695
        $.each(servers_data.servers.values, function(i,server) {
696
            /*
697
            First update the public network
698
            */
699

700
            // search public network's DOM for this server
701
            existing_public = $('#networks-pane #net-pub-server-' + server.id);
702
            // get the server's OS icon
703
            var server_image = os_icon(server.metadata);
704

705
            // if multiple servers exist in public network, delete all but one
706
            // defensive coding - that shouldn't happen normally
707
            while (existing_public.length > 1){
708
                existing_public.remove();
709
            }
710

711
            // server was deleted
712
            if (server.status == 'DELETED') {
713
                existing_public.remove();
714
            }
715

716
            // If server already exists in public network, update it
717
            if (existing_public.length){
718
                // server was renamed
719
                if (server.name != existing_public.find('span.name').text()) {
720
                    existing_public.find('span.name').text(server.name);
721
                }
722
                // server has changed state
723
                if (server.status=='BUILD' || server.status=='ACTIVE' ||server.status=='REBOOT') {
724
                    existing_public.find("img.logo").attr("src","static/icons/machines/medium/" + server_image + '-on.png');
725
                } else {
726
                    existing_public.find("img.logo").attr("src","static/icons/machines/medium/" + server_image + '-off.png');
727
                }
728
                // server has new ips
729
                var old_ip4 = existing_public.find('span.ip4').text();
730
                var old_ip6 = existing_public.find('span.ip6').text();
731
                // the following are valid because the public ips always come in this order from the api
732
                var new_ips = get_public_ips(server);
733
                var new_ip4 = new_ips['ip4'];
734
                var new_ip6 = new_ips['ip6'];
735
                if (old_ip4 != new_ip4) {
736
                    if (new_ips['ip4'] == undefined) {
737
                        existing_public.find(".ip4-container").hide();
738
                    } else {
739
                        existing_public.find('span.ip4').text(new_ip4);
740
                    }
741
                }
742
                if (old_ip6 != new_ip6) {
743
                    if (new_ip6 == undefined) {
744
                        existing_public.find(".ip6-container").hide();
745
                    } else {
746
                        existing_public.find('span.ip6').text(new_ip6);
747
                    }
748
                }
749
                //TODO: server has changed OS
750
            }
751
            // If server does not exist in public network, create it
752
            else {
753
                var machine = $("#networks-pane #public-machine-template").clone().attr("id", "net-pub-server-" + server.id).fadeIn("slow");
754
                machine.find('span.name').text(server.name);
755
                // find and display ips
756
                var ips = get_public_ips(server);
757
                if (ips['ip4'] == undefined) {
758
                    machine.find(".ip4-container").hide();
759
                } else {
760
                    machine.find("span.ip4").text(ips['ip4']);
761
                }
762
                if (ips['ip6'] == undefined) {
763
                    machine.find(".ip6-container").hide();
764
                } else {
765
                    machine.find("span.ip6").text(ips['ip6']);
766
                }
767
                // add the proper icon
768
                if (server.status=='BUILD' || server.status=='ACTIVE' ||server.status=='REBOOT') {
769
                    machine.find("img.logo").attr("src","static/icons/machines/medium/" + server_image + '-on.png');
770
                } else {
771
                    machine.find("img.logo").attr("src","static/icons/machines/medium/" + server_image + '-off.png');
772
                }
773
                machine.appendTo("#networks-pane .public-networks .machines-list");
774
            }
775
            /*
776
            Now update all private networks
777
            Since one server may belong to more than one private networks,
778
            we follow a different approach.
779
            We check each server and add, update or leave it as it is accordingly
780
            */
781
            try {
782
                $.each(server.addresses.values, function(i,server_net) {
783
                    // find in which private networks it belongs
784
                    if (server_net.id != "public") {
785
                        var existing_private = $("#networks-pane .private-networks #net-" + server_net.id + "-server-" + server.id);
786
                        // add new server
787
                        if (!existing_private.length) {
788
                            var machine = $("#networks-pane #private-machine-template").clone().attr("id", "net-" + server_net.id + "-server-" + server.id).fadeIn("slow");
789
                            machine.find('span.name').text(server.name);
790
                            if (server.status=='BUILD' || server.status=='ACTIVE' ||server.status=='REBOOT') {
791
                                machine.find("img.logo").attr("src","static/icons/machines/medium/" + server_image + '-on.png');
792
                            } else {
793
                                machine.find("img.logo").attr("src","static/icons/machines/medium/" + server_image + '-off.png');
794
                            }
795
                            machine.appendTo("#networks-pane .private-networks #net-" + server_net.id + " .machines-list");
796
                        }
797
                        // server was deleted
798
                        if (server.status == 'DELETED') {
799
                            existing_private.remove();
800
                        }
801
                        // server was renamed
802
                        if (server.name != existing_private.find('span.name').text()) {
803
                            existing_private.find('span.name').text(server.name);
804
                        }
805
                        // server has changed state
806
                        if (server.status=='BUILD' || server.status=='ACTIVE' ||server.status=='REBOOT') {
807
                            existing_private.find("img.logo").attr("src","static/icons/machines/medium/" + server_image + '-on.png');
808
                        } else {
809
                            existing_private.find("img.logo").attr("src","static/icons/machines/medium/" + server_image + '-off.png');
810
                        }
811
                        //TODO: server has changed OS
812
                    }
813
                });
814
            } catch (err) {
815
                try{console.info('Server ' + server.id + ' has no network addresses')}catch(err){};
816
            }
817
        });
818
    }
819

820
    $("#networks-pane #networks-container > .large-spinner").hide();
821

822
    // show all separators and hide the last one
823
    $("div.private-networks div.network div.separator").show();
824
    $("div.private-networks div.network div.separator:last").hide();
825
    // update the counters of servers in each network
826
    var nets = $('#networks-pane .network');
827
    $.each(nets, function(i,net) {
828
        $(net).find('span.machines-count').text($(net).find('.network-machine').length);
829
    });
830

831
    // the private div shows only when private networks are available
832
    if ($("div.private-networks div.network").length > 0) {
833
        $("div.private-networks").fadeIn("slow");
834
    } else {
835
        $("div.private-networks").fadeOut("slow");
836
    }
837

838
    // tag the last seperator for better styling
839
    $("#pub .network-machine").removeClass('last');
840
    $("#pub .network-machine").last().addClass('last');
841
}
842

843
// reposition multiple confirmation box on window resize
844
$(window).resize(function(){
845
    if (this.innerHeight - 220 < $('#networks-pane #networks-container').height())
846
        $('#networks-pane .confirm_multiple').addClass('fixed');
847
    else
848
        $('#networks-pane .confirm_multiple').removeClass('fixed');
849
});
850

851
// basic functions executed on page load
852
// hide the all of the networks contents
853
$("#networks-pane .network-contents").hide();
854
// hide the all of the firewall contents
855
$("#networks-pane .firewall-content").hide();
856
changes_since = 0; // to reload full list of servers
857
networks_changes_since= 0; // to reload full list of networks
858
// there is alway one public network to render
859
var pubNet = $("#networks-pane #public-template").clone().attr("id", "pub").fadeIn("slow");
860
pubNet.appendTo("#networks-pane .public-networks");
861
update_networks(UPDATE_INTERVAL);
862

    
863
</script>