Statistics
| Branch: | Tag: | Revision:

root / ui / templates / machines.html @ 88bdf273

History | View | Annotate | Download (26.1 kB)

1
{% load i18n %}
2

    
3
<div id="machines" class="separator"></div>
4

    
5
<!-- the create button -->
6
<div id="createcontainer">
7
    <span id="createbody">{% trans "Start by creating a new Virtual Machine:" %}</span><br />
8
    <a id="create" rel="#wizard" href="#">{% trans "Create New +" %}</a>
9
</div>
10

    
11
<!-- changing between standard/list view -->
12
<div id="view-select">
13
    <a id="standard" href="/machines/standard"></a>
14
    <a id="list" href="/machines/list"></a>
15
    <a id="single" href="#"></a>
16
</div>
17

    
18
<div id="emptymachineslist"><h1 id="welcomeheader">{% trans "Welcome to the ocean!" %}</h1><br />
19
    <span class="welcomebody">{% trans "From this panel you will be able to manage your Virtual Machines (VMs). If you don't know what a VM is: take the " %}<a href="#">{% trans "tour" %}</a>.</span><br /><br />
20
    <span class="welcomebody">{% trans "The panel is currently empty, because you don't have any VMs yet. You can start by creating your new VM by clicking the blue button on the right. The wizard will guide you through the hole process." %}</span><br /><br />
21
    <span class="welcomefooter">{% trans "For more information or help, click " %}<a href="#">{% trans "here" %}</a>.</span>
22
</div>
23

    
24
<!-- the form -->
25
<form action="#">
26
        <!-- scrollable root element -->
27
        <div class="modal" id="wizard">
28
                <!-- status bar -->
29
                <ul id="status">
30
                        <li class="active"><span class="headernumber" class="first">1</span><div class="headerbody first">{% trans "Image" %}</div></li>
31
                        <li><span class="headernumber">2</span><div class="headerbody">{% trans "Flavor" %}</div></li>
32
                        <li class="third"><span class="headernumber">3</span><div class="headerbody">{% trans "Name" %}</div></li>
33
                </ul>
34
                <!-- scrollable items -->
35
                <div class="items">
36
                        <!-- pages -->
37
                        <div class="page">
38
                <h2>{% trans "Select an OS" %}</h2>
39
                <hr class="topruler" />
40
                <ul class="tabs">
41
                    <li><a href="#">{% trans "system images" %}</a></li>
42
                    <li><a href="#">{% trans "custom images" %}</a></li>
43
                </ul>
44
                <div class="panes">
45
                            <li id="image-template" style="display:none">
46
                                    <label for="image.id"> 
47
                            <a>
48
                                <div class="image-container">
49
                                    <div class="image">
50
                                        <input class="radio" type="radio" name="image-id" id="image-id" />
51
                                        <img src="" class="image-logo"/>
52
                                        <strong class="image-title">image.title</strong>
53
                                        <br />
54
                                        <span class="description">image.description</span> 
55
                                        <span id="size" class="size">?? MB</span><span class="size"> MB</span>                         
56
                                    </div>
57
                                </div>  
58
                            </a>
59
                                    </label>
60
                            </li>
61
                    <ul class="pane" id="standard-images">
62
                                            <!-- standard images -->
63
                                    </ul>
64
                    <ul class="pane" id="custom-images">
65
                                            <!-- custom images -->
66
                    </ul>
67
                </div>
68
                <hr class="bottomruler" />
69
                                <button type="button" class="prev" id="cancel">{% trans "Cancel" %}</button>
70
                                <button type="button" class="next right">{% trans "Next" %}</button>
71
            </div>
72
                        <div class="page">
73
                                <h2>{% trans "Select CPUs, RAM and Disk Size" %}</h2>
74
                <hr class="topruler" />
75
                <ul>
76
                    <li id="machinetype">
77
                        <div class="machine-type">
78
                            <label for="small" id="small">
79
                                <input type="radio" id="small" name="machine-type" value="small" checked="true" />
80
                                <span class="typebody" id="small-body">{% trans "small" %}</span>
81
                            </label>
82
                        </div>
83
                        <div class="machine-type">      
84
                            <label for="medium" id="medium">
85
                                <input type="radio" id="medium" name="machine-type" value="medium" />                  
86
                                <span class="typebody" id="medium-body">{% trans "medium" %}</span>
87
                            </label>
88
                        </div>
89
                        <div class="machine-type">
90
                            <label for="large" id="large">
91
                                <input type="radio" id="large" name="machine-type" value="large" />
92
                                <span class="typebody" id="large-body">{% trans "large" %}</span>
93
                            </label>
94
                        </div>
95
                        <div class="machine-type">
96
                            <label for="custom" id="custom">
97
                                <input type="radio" name="machine-type" id="custom" value="large" />
98
                                <span class="typebody" id="custom-body">{% trans "custom" %}</span>
99
                            </label>
100
                        </div>
101
                    </li>
102
                    <div id="page2-container">
103
                        <li class="slider-container">
104
                                        <label><strong class="sliders">CPUs</strong></label>
105
                            <input type="range" id="cpu" style="display:none" />
106
                            <input type="text" class="range" id="cpu-indicator" />
107
                                        <span class="units">cores</span>
108
                        </li>
109
                        <li class="slider-container">
110
                                        <label><strong class="sliders">RAM</strong></label>
111
                            <input type="range" id="ram" style="display:none" />
112
                            <input type="text" class="range" id="ram-indicator" />
113
                                        <span class="units">MB</span>
114
                        </li>
115
                        <li class="slider-container">
116
                                    <label><strong class="sliders">Size</strong></label>
117
                            <input type="range" id="storage" style="display:none" />
118
                            <input type="text" class="range" id="storage-indicator" />
119
                                        <span class="units">GB</span>
120
                        </li>
121
                        <li>
122
                            <div class="cost">
123
                                <span> {% trans "Your wallet:" %} 10,000 Credits </span> | <span>{% trans "This setup will cost you:" %}<input type="text" id="credits-indicator" value="20" class="range" disabled="disabled" /> {% trans "C/hour" %}</span>
124
                            </div>
125
                        </li>
126
                    </div>
127
                </ul>
128
                <hr class="bottomruler" />
129
                                <button type="button" class="prev">{% trans "Back" %}</button>
130
                                <button type="button" class="next right">{% trans "Next" %}</button>
131
            </div>
132
                        <div class="page">
133
                                <h2>{% trans "Confirm your settings" %}</h2>
134
                <hr class="topruler" />
135
                <ul id="page3-container">
136
                    <li class="required" id="label-name">
137
                        <label>
138
                            <strong>Name:</strong>
139
                            <input type="text" class="text" name="machine_name" id="name" value="My Ubuntu 10.04 x86_64 server"/>
140
                        </label>
141
                    </li>
142
                    <li>
143
                        <span>{% trans "Image:" %}</span> <span id="machine_image-label">Ubuntu 10.04 x86_64 server</span>
144
                    </li>
145
                    <li>
146
                        <span>{% trans "CPUs:" %}</span> <span id="machine_cpu-label">2</span> <span>{% trans "cores" %}</span>
147
                    </li>
148
                    <li>
149
                        <span>{% trans "RAM:" %}</span> <span id="machine_ram-label">1024</span><span>MB</span>
150
                    </li>
151
                    <li>
152
                        <span>{% trans "System Disk:" %}</span> <span id="machine_storage-label">10</span><span>GB</span>
153
                    </li>
154
                    <li>
155
                        <span>{% trans "Cost per Hour:" %}</span> <span>40 {% trans "credits" %}</span>
156
                    </li>
157
                    <li>
158
                        <span>{% trans "Credits in Wallet:" %}</span> <span>10.000</span>
159
                    </li>
160
                </ul>
161
                <hr class="bottomruler" />
162
                                <button type="button" class="prev">{% trans "Back" %}</button>
163
                                <button type="button" class="next right" id="start">{% trans "Create VM" %}</button>        
164
            </div>
165
                </div>
166
        </div>
167
</form>
168

    
169
<!-- base notification for error/success reporting -->
170
<a id="notification" rel="#error-success" href="#"></a>
171

    
172
<div class="modal" id="error-success">
173
    <h3>{% trans "Error!/Success!" %}</h3>
174
    <div><p>{% trans "More details about the result"%}</p></div>
175
</div>
176

    
177

    
178
<a id="meta-editor-1" rel="#editor-1" href="#"></a>
179

    
180
<div class="meta-modal" id="editor-1">
181
    <h3>
182
        <label>{% trans "Metadata for machine:" %}</label>
183
        <span></span>
184
    </h3>
185
    <hr class="topruler" />
186
    <hr class="fatruler" />
187
    <div class="content">
188
        <ul class="meta-template" style="display:none">
189
            <li>
190
                <label>{% trans "Metadata key" %}</label>
191
                <button type="button" class="remove">{% trans "remove x" %}</button>
192
                <hr class="meta-separator">
193
                <p>{% trans "Metadata value" %}</p>
194
                <button type="button" class="edit">{% trans "edit" %}</button>
195
            </li>
196
        </ul>
197
        <ul class="meta-list">
198
        </ul>
199
    </div>
200
    <button type="button" class="create">{% trans "Create New+" %}</button>
201
    <div class="bottomruler" /> 
202
</div>
203

    
204
<a id="meta-editor-2" rel="#editor-2" href="#"></a>
205

    
206
<div class="meta-modal" id="editor-2">
207
    <h3>
208
        <label>{% trans "Metadata for machine:" %}</label>
209
        <span></span>
210
    </h3>
211
    <hr class="topruler" />
212
    <hr class="fatruler" />
213
    <div class="content">
214
        <label class="meta-key">{% trans "Key:" %}</label>
215
        <input type="text" maxlength="15" class="key" value="max 15 characters"/>
216
        <hr class="meta-separator">
217
        <label class="meta-value">{% trans "Value:" %}</label>
218
        <input type="text" maxlength="150" class="value" value="max 150 characters"/>
219
    </div>
220
    <button type="button" class="cancel">{% trans "Cancel" %}</button>
221
    <button type="button" class="save">{% trans "Save" %}</button>
222
    <div class="bottomruler" /> 
223
</div>
224

    
225
<div id="machinesview"></div>
226

    
227
<div class="confirm_multiple">
228
    <p>{% trans "Your actions will affect" %} <span class="actionLen">XX</span> {% trans "machines" %}</p>
229
    <button class="yes">{% trans "Confirm All" %}</button>
230
        <button class="no">{% trans "Cancel All" %}</button>
231
</div>
232

    
233
<div id="machines" class="separator"></div>
234

    
235
<script>
236
//add hover to labels
237
$('span.typebody').mouseover(function() {
238
    $(this).addClass('typehover');
239
});
240
$('span.typebody').mouseout(function() {
241
    $(this).removeClass('typehover');
242
});
243

244
// return value from metadata key "OS", if it exists
245
function os_icon(metadata) {
246
    if (!metadata) {
247
        return 'unknown';
248
    }
249

250
    if (metadata.values.OS == undefined || metadata.values.OS == '') {
251
        return 'unknown';
252
    } else {
253
        return metadata.values.OS;
254
    }
255
} 
256

257
// switch to list view
258
$("a#list").click(function(){
259
    list_view(); 
260
    return false;
261
});
262

263
// switch to standard view
264
$("a#standard").click(function(){
265
    standard_view();
266
    return false;
267
});
268

269
// launch VM creation wizard
270
$("a#create").click(function(){
271
    // launch wizard only if images and flavors are found
272
    if (images.length > 0  && flavors.length > 0) {
273
        $("#wizard").scrollable().begin();
274
        $("#wizard").show();
275
        $('a#create').data('overlay').load()   
276
    } else if (images.length == 0 ) {
277
        ajax_error('NO_IMAGES');
278
        return false;   
279
    } else if (flavors.length == 0) {
280
        ajax_error('NO_FLAVORS');
281
        return false;
282
    }
283
});
284

285
// create wizard overlay
286
$(function() { 
287
    $("a#create").overlay({
288
        mask: '#000', 
289
        effect: 'default', 
290
        top: '5%', 
291
        oneInstance: false,
292
        closeOnClick: false
293
    });
294
});
295

296
// wizard
297
$(function() {
298
    var root = $("#wizard").scrollable();
299
    var api = root.scrollable();
300
    // rangeinput with default configuration
301
    // validation logic is done inside the onBeforeSeek callback
302
    api.onBeforeSeek(function(event, i) {
303
            // we are going 1 step backwards so no need for validation
304
            if (api.getIndex() < i) {
305
             // 1. get current page
306
                     var page = root.find(".page").eq(api.getIndex()),
307
                         // 2. .. and all required fields inside the page
308
                         inputs = page.find(".required :input").removeClass("error"),
309
                         // 3. .. which are empty
310
                         empty = inputs.filter(function() {
311
                                return $(this).val().replace(/\s*/g, '') == '';
312
                         });
313
                     // if there are empty fields, then
314
                    if (empty.length) {
315
                            // add a CSS class name "error" for empty & required fields
316
                            empty.addClass("error");
317
                            // cancel seeking of the scrollable by returning false
318
                            return false;
319
                    // everything is good
320
                    } 
321
            }
322
            // update status bar
323
            $("#status li").removeClass("active").eq(i).addClass("active");
324
        // update confirm step
325
        if (api.getIndex()==0) {
326
            var image = $("input[type=radio][name=image-id]:checked");
327
            var imageRef = image.length ? image[0].id : false
328
            if (imageRef) {
329
                var imageName = $("label[for=" + imageRef + "] .image-title").text();
330
                $("#machine_image-label")[0].textContent = imageName;
331
                $("input[type=text][name=machine_name]")[0].value = "My " + imageName + " server";
332
            }
333
        } else if (api.getIndex()==1) {
334
            $("#machine_cpu-label")[0].textContent = $("#cpu-indicator")[0].value;
335
            $("#machine_ram-label")[0].textContent = $("#ram-indicator")[0].value;
336
            $("#machine_storage-label")[0].textContent = $("#storage-indicator")[0].value;
337
        }    
338
    });
339
    // if tab is pressed on the next button seek to next page
340
    $(root).live('keydown', function (e) {
341
       if ( e.keyCode == 9 ){
342
           if(e.preventDefault) {
343
               e.preventDefault();
344
           }
345
           return false;
346
        }
347
    });
348
    //submit wizard by pressing enter on the name textbox
349
    $("#name").keypress(function (e) {
350
                if ((e.which && e.which == 13) || (e.keyCode && e.keyCode == 13)) {
351
                        $('#start').click();
352
                        return false;
353
                } else {
354
                        return true;
355
                }
356
    });
357
});
358

359
// disable sliders in flavor selection
360
function disableSliders() {
361
    $("#cpu").attr('disabled',true);
362
    $("#ram").attr('disabled',true);
363
    $("#storage").attr('disabled',true);
364
}
365

366
//update radio button when clicking on text
367
$("#small-body").live('click' ,function() { 
368
    $(this).parent().find("#small").click();
369
});
370
$("#medium-body").live('click' ,function() { 
371
    $(this).parent().find("#medium").click();
372
});
373
$("#large-body").live('click' ,function() { 
374
    $(this).parent().find("#large").click();
375
});
376
$("#custom-body").live('click' ,function() { 
377
    $(this).parent().find("#custom").click();
378
});
379

380
//select image div on radio button select
381
$('.radio').live('click' ,function() {           
382
    $(this).parents("div").find(".image").removeClass('selecteddiv');
383
    if($(this).is(':checked'))  {
384
        $(this).parent().addClass('selecteddiv');
385
    }
386
});
387

388
// validate cpu input box
389
$("#cpu-indicator").live('change',function(){
390
    var v = Number(this.value);
391
    var i = cpus.indexOf(v);
392
    if (isNaN(v)) {
393
        $(this).value = cpus[0];
394
        $("#cpu").data('rangeinput').setValue(0);
395
    } else if (i == -1) {
396
        for (var j=0; j < cpus.length; j++)
397
            if (v<cpus[j])
398
                break;
399
        $("#cpu").data('rangeinput').setValue(j);
400
    } else {
401
        $("#cpu").data('rangeinput').setValue(i);
402
    }   
403
    return false;
404
});
405

406
// validate ram input box
407
$("#ram-indicator").live('change',function(){
408
    var v = Number(this.value);
409
    var i = ram.indexOf(v);
410
    if (isNaN(v)) {
411
        $(this).value = cpus[0];
412
        $("#ram").data('rangeinput').setValue(0);
413
    } else if (i == -1) {
414
        for (var j=0; j < ram.length; j++)
415
            if (v<ram[j])
416
                break;
417
        $("#ram").data('rangeinput').setValue(j);
418
    } else {
419
        $("#ram").data('rangeinput').setValue(i);
420
    }   
421
    return false;
422
});
423

424

425
// validate storage input box
426
$("#storage-indicator").live('change',function(){
427
    var v = Number(this.value);
428
    var i = disks.indexOf(v);
429
    if (isNaN(v)) {
430
        $(this).value = disks[0];
431
        $("#storage").data('rangeinput').setValue(0);
432
    } else if (i == -1) {
433
        for (var j=0; j < disks.length; j++)
434
            if (v<disks[j])
435
                break;
436
        $("#storage").data('rangeinput').setValue(j);
437
    } else {
438
        $("#storage").data('rangeinput').setValue(i);
439
    }   
440
    return false;
441
});
442

443
// selecting the small size
444
$("#small").click(function(){
445
    $("#cpu").data('rangeinput').setValue(0);
446
    $("#ram").data('rangeinput').setValue(0);
447
    $("#storage").data('rangeinput').setValue(0);
448
    $("#cpu-indicator")[0].value = cpus[0];
449
    $("#ram-indicator")[0].value = ram[0];
450
    $("#storage-indicator")[0].value = disks[0];
451
    $("#small").addClass("active");
452
    $("#medium").removeClass("active");    
453
    $("#large").removeClass("active");    
454
    $("#custom").removeClass("active");    
455
});
456

457
// selecting the medium size
458
$("#medium").click(function(){
459
    $("#cpu").data('rangeinput').setValue(1);
460
    $("#ram").data('rangeinput').setValue(1);
461
    $("#storage").data('rangeinput').setValue(1);
462
    $("#cpu-indicator")[0].value = cpus[1];
463
    $("#ram-indicator")[0].value = ram[1];
464
    $("#storage-indicator")[0].value = disks[1];  
465
    $("#medium").addClass("active");  
466
    $("#small").removeClass("active");    
467
    $("#large").removeClass("active");    
468
    $("#custom").removeClass("active");  
469
});
470

471
// selecting the large size
472
$("#large").click(function(){
473
    $("#cpu").data('rangeinput').setValue(2);
474
    $("#ram").data('rangeinput').setValue(2);
475
    $("#storage").data('rangeinput').setValue(2);
476
    $("#cpu-indicator")[0].value = cpus[2];
477
    $("#ram-indicator")[0].value = ram[2];
478
    $("#storage-indicator")[0].value = disks[2];   
479
    $("#large").addClass("active"); 
480
    $("#medium").removeClass("active");    
481
    $("#small").removeClass("active");    
482
    $("#custom").removeClass("active");  
483
});
484

485
// selecting the custom flavor enables the sliders
486
$("#custom").click(function(){
487
    $("#cpu").attr('disabled',false);
488
    $("#ram").attr('disabled',false);
489
    $("#storage").attr('disabled',false);
490
    $("strong.sliders").style = 'color: #778899;';
491
    $("#custom").addClass("active"); 
492
    $("#medium").removeClass("active");    
493
    $("#large").removeClass("active");    
494
    $("#small").removeClass("active");  
495
});
496

497
//when textbox gains focus, add selection in css
498
$('#cpu-indicator').focus(function() {
499
    $(this).addClass('selectedrange');
500
});
501
$('#ram-indicator').focus(function() {
502
    $(this).addClass('selectedrange');
503
});
504
$('#storage-indicator').focus(function() {
505
    $(this).addClass('selectedrange');
506
});
507

508
//when textbox loses focus, clear selection in css
509
$('#cpu-indicator').blur(function() {
510
    $(this).removeClass('selectedrange');
511
});
512
$('#ram-indicator').blur(function() {
513
    $(this).removeClass('selectedrange');
514
});
515
$('#storage-indicator').blur(function() {
516
    $(this).removeClass('selectedrange');
517
});
518

519
// exit the wizard
520
$("#cancel").click(function(){
521
    $("a#create").overlay().close();
522
});
523

524
// starting a new VM through the wizard
525
$("#start").click(function(){
526
    var imageRef = $('input[type=radio][name=image-id]:checked')[0].id.replace('img-radio-','');   
527
    var flavorRef = identify_flavor($("#cpu-indicator")[0].value, $("#storage-indicator")[0].value, $("#ram-indicator")[0].value);
528
    var machineName = $('input[name=machine_name]')[0].value;
529
    if (jQuery.trim(machineName) == ''){
530
        return false;
531
    }
532
    create_vm(machineName, imageRef, flavorRef);
533

534
    $('a#create').data('overlay').close();
535

536
    try{console.warn('creating ' + $("input[name=machine_name]")[0].value)} catch(err){}
537

538
    $("#wizard").hide();
539
});
540

541
// confirm all actions
542
$("div.confirm_multiple .yes").live('click', function(){
543
    while(pending_actions.length > 0){ // if there is a pending action for this server execute it
544
        action = pending_actions.pop(); // extract action
545
        var serverID = action[1];
546
        if ($.cookie("list") != '1') { // standard view
547
            $('#' + serverID + ' .selected').removeClass('selected');
548
            $('#' + serverID + ' .display').removeClass('display');
549
            if (action[0] == shutdown) {
550
                $('#' + serverID + ' .status').text('Shutting down');
551
            } else if (action[0] == start) {
552
                $('#' + serverID + ' .status').text('Starting');
553
            } else if (action[0] == reboot) {
554
                $('#' + serverID + ' .status').text('Rebooting');
555
            } else if (action[0] == destroy) {
556
                $('#' + serverID + ' .status').text('Destroying');
557
            }
558
            $('#' + serverID + ' .spinner').show();
559
        } else { // list view
560
            osIcon = $('#'+serverID).parent().parent().find('.list-logo');
561
            osIcon.attr('os',osIcon.attr('src'));
562
            osIcon.attr('src','static/progress.gif');
563
            if (action[0] == shutdown) {
564
                $('#' + serverID).parent().parent().find('span.status').text('Shutting down');
565
            } else if (action[0] == start) {
566
                $('#' + serverID).parent().parent().find('span.status').text('Starting');
567
            } else if (action[0] == reboot) {
568
                $('#' + serverID).parent().parent().find('span.status').text('Rebooting');
569
            } else if (action[0] == destroy) {
570
                $('#' + serverID).parent().parent().find('span.status').text('Destroying');
571
            }
572
        }
573
        action[0]([serverID]); // execute action
574
    }
575
    update_confirmations();    
576
});
577

578
// cancel all actions
579
$("div.confirm_multiple .no").live('click', function(){
580
    pending_actions = [];
581
    $('.machine .selected').removeClass('selected');
582
    $('.machine .display').removeClass('display');
583
    update_confirmations();
584
});
585

586
// bring up edit metadata overlay
587
function editMetadata() {
588
    var triggers = $("a#meta-editor-1").overlay({
589
        // some mask tweaks suitable for modal dialogs
590
        mask: '#000',
591
        effect: 'default',
592
        top: '10%',
593
        closeOnClick: false,
594
        oneInstance: false,
595
        load: false,
596
        onClose: function() {
597
            // remove all entries so they won't be preloaded next time you open the dialog
598
            $("#editor-1 div.content ul.meta-list").empty();
599
        },
600
        onLoad: function() {
601
            // this is a work around for the mask not appearing problem
602
            $("#editor-1").expose();
603
        }
604
    });
605
    // get metadata for current server and fill the dialog
606
    serverID = $("#editor-1 h3").attr('id');
607
    get_metadata(serverID);
608
    $("a#meta-editor-1").data('overlay').load();
609
    return false; 
610
}
611

612
// bring up add metadata overlay
613
function addMetadata() {
614
    var triggers = $("a#meta-editor-2").overlay({
615
        // some mask tweaks suitable for modal dialogs
616
        mask: '#000',
617
        effect: 'default',
618
        top: '10%',
619
        closeOnClick: false,
620
        oneInstance: false,
621
        load: false,
622
        onLoad: function() {
623
            // this is a work around for the mask not appearing problem
624
            $("#editor-2").expose();
625
        }
626
    });
627
    $("a#meta-editor-2").data('overlay').load();
628
    return false; 
629
}
630

631
// intercept click on create button in metadata edit dialog
632
$('#editor-1.meta-modal button.create').click( function(){
633
    // close edit metadata and open add metadata dialog
634
    $('a#meta-editor-1').data('overlay').close();
635
    addMetadata();
636
});
637

638
// intercept click on remove button in metadata edit dialog
639
$('#editor-1.meta-modal button.remove').live('click', function() { 
640
    // get the server id and meta key needed for the ajax call   
641
    var serverID = $(this).parent().parent().parent().parent().children("h3").attr('id');
642
    var meta_key = $(this).parent().find("label").text();
643
    // make the ajax call and list the new GET results
644
    delete_metadata(serverID, meta_key);
645
    return false;
646
});
647

648
// intercept click on edit button in metadata edit dialog
649
$('#editor-1.meta-modal button.edit').click( function(){
650
    // inline editing of selected key-value pair
651
    // on submission ajax call from updating
652
    // on success update the overlay
653
    // TODO
654
});
655

656
// intercept click on cancel button in metadata add dialog
657
$('#editor-2.meta-modal button.cancel').click( function(){
658
    // close add metadata and open edit metadata dialog
659
    $('a#meta-editor-2').data('overlay').close();
660
    editMetadata();
661
});
662

663
// intercept click on save button in metadata add dialog
664
$('#editor-2.meta-modal button.save').live('click', function() {
665
    // get the server id, meta key and meta value needed for the ajax call       
666
    var serverID = $(this).parent().children("h3").attr('id');
667
    var meta_key = $(this).parent().find(".content input.key").attr('value');
668
    var meta_value = $(this).parent().find(".content input.value").attr('value');
669
    // make the ajax call and list the new GET results
670
    add_metadata(serverID, meta_key, meta_value);
671
    // close add metadata and open edit metadata dialog
672
    $('a#meta-editor-2').data('overlay').close();
673
    editMetadata();
674
    return false;
675
});
676

677
// update metadata in edit dialog
678
function list_metadata(data) {    
679
    // empty the list if it already exists
680
    $("#editor-1 div.content ul.meta-list").empty();
681
    // get the values to show
682
    meta = data.metadata.values;
683
    // show values
684
    for (key in meta) {
685
        pair = $("ul.meta-template li").clone();
686
        pair.find("label").text(key);
687
        pair.find("p").text(meta[key]);
688
        pair.appendTo("#editor-1 div.content ul.meta-list").fadeIn();
689
    }
690
}
691

692
// basic functions executed on page load
693
if (images.length > 0) {
694
    // populate image list
695
    update_wizard_images();
696
}
697
if (flavors.length > 0) {
698
    // configure flavors
699
    update_wizard_flavors(); 
700
}
701
// create tabs for main menu
702
$("ul.tabs").tabs("div.panes ul");
703

    
704
</script>