Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / new_ui / ui / javascripts / okeanos.js @ 49342f82

History | View | Annotate | Download (46.3 kB)

1
/*
2
* Various functions that will be used throughout all templates
3
* are inside ui Object
4
*/
5

    
6
ui = {};
7
/*
8
* ui.wizards get populated in vm-wizard.js
9
* here is the declaration only
10
*/
11
ui.wizard = {};
12
ui.checkbox = {};
13
ui.radiobtn = {};
14

    
15
/* when closeEl el is clicked, its parent with class divToCloseClass slidesUp */
16
ui.closeDiv = function(closeEl, divToCloseClass) {
17
    closeEl.click(function(e){
18
        e.preventDefault();
19
        $(this).parents(divToCloseClass).slideUp('slow');
20
    });
21
}
22

    
23

    
24
ui.trimChars = function( str, chars) {
25
    if ( str.length>chars){
26
        return $.trim(str).substring(0, chars)+ "...";
27
    } else {
28
        return str;
29
    }
30
}
31

    
32

    
33
/* Sets element min-height
34
* Used for .details, .lt-bar divs
35
*/
36
ui.setElminHeight = function(el){
37
    var WindowHeight = $(window).height();
38
    var header = $('.header').outerHeight();
39
    var actions = $('.actions-bar').height();
40
    var h1= WindowHeight - (header+actions);
41
    el.css('min-height', h1);
42
}
43

    
44
/* Sets element height
45
* Used for .details, .lt-bar divs
46
*/
47
ui.setElHeight = function(el){
48
    var WindowHeight = $(window).height();
49
    var header = $('.header').outerHeight();
50
    var actions = $('.actions-bar').height();
51
    var h1= WindowHeight - (header+actions);
52
    el.css('height', h1);
53
}
54

    
55
/* Sets element max-height
56
* Used for div.storage-progress
57
*/
58
ui.setElmaxHeight = function(el){
59
    var WindowHeight = $(window).height();
60
    var header = $('.header').outerHeight();
61
    var actions = $('.actions-bar').height();
62
    var h1= WindowHeight - (header+actions);
63
    el.css('max-height', h1);
64
}
65

    
66
/* 
67
* Logic for Entities actions. Present in items_list pages
68
* Available categories are :
69
*  - both/single ( for multiple entities/single entities)
70
*  - running/off ( for running/off entities)
71
*  - permanent ( for entities always active )
72
* Can be used for pithos as well
73
* Available categories are :
74
* - files ( for files only actions)
75
* - folders ( for folders only actions)
76
* - all ( for files/folders actions)
77
*/
78
ui.entitiesActionsEnabled = function(){
79
    var all = $('.snf-checkbox-checked').length;
80
    var running = $('.snf-checkbox-checked').parents('li.running').length;
81
    var off = $('.snf-checkbox-checked').parents('li.off').length;
82
    var files = $('.snf-checkbox-checked').parents('li.file').length;
83
    var folders = $('.snf-checkbox-checked').parents('li.folder').length;
84

    
85
    console.log(files,'files');
86
    console.log(folders,'folders');
87

    
88
    $('.lt-bar .lt-actions li:not(.permanent) a').removeClass('active');
89

    
90
    if ( ( files * folders )>0 ) {
91
        $('.lt-actions li.all a').addClass('active');
92
    } else {
93
        if ( files>0 ) {
94
            $('.lt-actions li.files a').addClass('active');
95
        }
96
        if ( folders>0 ){
97
            $('.lt-actions li.folders a').addClass('active');
98
        }
99
    }
100

    
101
    if ( (running*off) > 0 ){
102
         $('.lt-actions li.both a').addClass('active');
103
         $('.lt-actions li.single a').removeClass('active');
104
    } else {
105
        if (running > 0) {
106
            $('.lt-actions li.both a').addClass('active');
107
            $('.lt-actions li.running a').addClass('active');
108
        } else if (off>0) {
109
            $('.lt-actions li.both a').addClass('active');
110
            $('.lt-actions li.off a').addClass('active');
111
        }
112
        if ( all > 1 ) {
113
            $('.lt-actions li.single a').removeClass('active');
114
        }
115
    }
116
}
117

    
118
ui.inactiveActions = function() {
119

    
120
    // Availble actions: connect, reboot, shut, destroy, start
121
    // These actions will be DISABLED
122
    var statesActions ={
123
        'off'      : ['connect', 'reboot', 'shut'],
124
        'error'    : ['connect', 'reboot', 'shut', 'start'],
125
        'building' : ['reboot', 'start'],
126
        'running'  : ['start'],
127
        'rebooting': ['start'],
128
        'starting' : ['start'],
129
        'shutting' : ['connect', 'reboot', 'shut']
130
    } ;
131

    
132
    _.each (statesActions, function(val, key) {
133
        _.each(val, function(value) {
134
            var el = '.' + key + ' .' + value;
135
            $(el).addClass('inactive');
136
        });
137
    })
138
}
139

    
140
ui.detailsCustom = function(area) {
141
    // position last connected item
142
    var el = area.find('.item').last();
143
    // -2 is the border width;
144
    var moveY = el.find('.connections >li').last().outerHeight(true) - 2;
145
    el.css('top',moveY);
146
    el.css('marginTop', -moveY);
147
}
148

    
149
ui.firewallSetup = function(){
150
    $('.firewall').each(function(){
151
        $(this).removeClass('fully unprotected basic');
152
        $(this).addClass($(this).data('firewall'));
153
        if($(this).hasClass('unprotected')){
154
            $(this).find('p').first().find('em').html('off');
155
        } else {
156
            $(this).find('p').first().find('em').html('on');
157
        }
158
    });
159
}
160

    
161

    
162

    
163
/*
164
* In order for the editable value functionality to work, the html markup
165
* should be:
166
    <div class="editable">
167
        <span class="input-txt">editable value</span>
168
        <input type="text">
169
        <a href="#" class="edit">edit</a>
170
        <a href="#" class="save">save</a>
171
        <a href="#" class="cancel">cancel</a>
172
    </div>
173
*/
174
ui.editable = function(){
175

    
176
/*
177
* resetForm hides save and cancel buttons,
178
* text input and shows input-txt. resetForm does not alter
179
* input-txt content.
180
*/
181

    
182
    function resetForm(e, elem) {
183
        var el = elem.parents('.editable');
184
        el.find('input[type="text"]').hide();
185
        el.find('a.cancel, a.save').hide();
186
        el.find('a.edit, .input-txt').show();
187
    }
188

    
189
/* 
190
* showForm hides input-txt, shows save and cancel buttons and
191
* sets input value to input-txt content.
192
*/
193
    function showForm(e,elem) {
194
        e.stopPropagation(); 
195
        e.preventDefault();
196
        var el = elem.parents('.editable'); 
197
        el.find('input[type="text"]').val(el.find('.input-txt').html());
198
        el.find('input[type="text"]').show().focus();
199
        el.find('a.cancel, a.save').show();
200
        elem.hide();
201
        el.find('.input-txt').hide();
202
    }
203

    
204
/*
205
setValue sets input-txt value to the input value.
206
Makes sure that the input value is not empty.
207
TODO:
208
Ajax request to submit form
209
*/
210

    
211
    function setValue(elem) {
212
        var el = elem.parents('.editable');
213
        if( el.find('input[type="text"]').val() ) {
214
            el.find('.input-txt').html(el.find('input[type="text"]').val());
215
        }
216
    }
217

    
218

    
219
    $('.editable .edit').click(function(e){
220
        showForm(e, $(this));
221
    })
222

    
223
    $('.editable .cancel').click(function(e){
224
        e.stopPropagation();
225
        e.preventDefault();
226
        resetForm(e, $(this));
227
    })
228

    
229
    $('.editable .save').click(function(e){
230
        e.stopPropagation();
231
        e.preventDefault();
232
        setValue($(this));
233
        resetForm(e, $(this));
234

    
235
    })
236

    
237

    
238
    $('.editable input[type="text"]').click(function(e){
239
        e.stopPropagation();
240
    })
241

    
242
    $('.editable input[type="text"]').keyup(function(e){
243
        if(e.keyCode == 13) { 
244
            setValue($(this));
245
            resetForm(e, $(this));
246
            
247
        }
248
    
249
    })
250

    
251
    $('html').click(function(e) {
252
        resetForm(e, $('.editable a.cancel'));
253
    });
254

    
255
}
256

    
257
/* TODO: better overlay functionality */
258
ui.overlay = function() {
259
    $('[data-overlay-id]').click(function(e){
260
        e.preventDefault();
261
        var el = $(this);
262
        var id = '#'+el.data('overlay-id');
263

    
264
        $('.overlay-area-custom').fadeIn(100);
265
        $('body').addClass('with-overlay');
266
        $(id).fadeIn('slow');
267
        if (id=='#network-wizard') {
268
            $(id).find('input').first().focus();
269
            return false;
270
        }
271
        $(id).find('a').first().focus();
272
    });
273
}
274

    
275
function goToByScroll(id){
276
      // Remove "link" from the ID
277
    id = id.replace("link", "");
278
      // Scroll
279
    $('html,body').animate({
280
        scrollTop: $("#"+id).offset().top},
281
        'slow');
282
}
283

    
284

    
285
// toggle expand arrrow  and  area
286
// todo: one function for all the areas we reveal
287
ui.expandDownArea = function(arrow_link, area) {
288
    var arrow_link = $(arrow_link);
289
    var area = $(area);
290
            arrow_link.find('span.snf-arrow-up, span.snf-arrow-down').toggleClass('snf-arrow-up snf-arrow-down');
291
            // $('.wizard-content').removeAttr('style');
292
            area.stop().slideToggle(600, function() {
293
                if (area.is(':visible')) {
294
                    arrow_link.find('.snf-arrow-down .snf-arrow-up').removeClass('snf-arrow-down').addClass('snf-arrow-up');
295
                } else {
296
                    arrow_link.find('.snf-arrow-down .snf-arrow-up').addClass('snf-arrow-down');
297
                }
298

    
299
            });
300
}
301

    
302
// toggle checkbox and area
303
ui.slideHiddenArea = function(checkbox_link, area) {
304
    area.stop().slideToggle(400, function() {
305
        if (area.is(':visible')) {
306
            ui.checkbox.check(checkbox_link);
307
        } else {
308
           ui.checkbox.uncheck(checkbox_link);
309
        }
310
    });
311
};
312
/* Tabs functionality
313
* tabsEl is the div/ul with the links to the sections and the sections that
314
* with toggle have class sectionEl.
315
* Markup needed is an href to each a with the id of the relative section.
316
*/
317

    
318
ui.tabsSection = function(link, sectionEl) {
319
    sectionEl.hide();
320
    var el = $(link.attr('href'));
321
    el.stop(true, true).show(0);
322
    el.css('opacity',0);
323
    ui.detailsCustom(el);
324
    el.animate({
325
        'opacity':1,
326
    }, 500)
327
}
328

    
329
ui.tabs = function(tabsEl, sectionEl) {
330
    var tabLink = tabsEl.find('a');
331
    ui.replaceClass(tabLink.find('.active'), 'outline', 'full', 'snf-');
332
    function href(a) {
333
        return a.attr('href');
334
    }
335
    tabLink.click(function(e){
336
        e.preventDefault();
337
        if ( $(this).hasClass('active')){
338
             return false;
339
        } else {
340
            window.location.hash = $(this).attr('href');
341
            ui.replaceClass($(this).parents(tabsEl).find('.active'), 'full', 'outline', 'snf-');
342
            $(this).parents(tabsEl).find('a').removeClass('active');
343
            $(this).addClass('active');
344
            ui.replaceClass($(this), 'outline', 'full', 'snf-');
345
            ui.tabsSection( $(this), sectionEl);
346
        }
347
    })
348
}
349

    
350
// the function replaces part of the class of a span that is placed inside an a element
351
// the class is a word with the form : firstSubStr+*+str1 and it will be converted to: firstSubStr+*+str2
352
// it must be uniquely recognized by the firstSubStr and the str1.
353

    
354
ui.replaceClass = function(elements, str1, str2, firstSubStr) {
355
    $.each($(elements), function() {
356
        var classOld = $(this).find('span').attr('class');
357
        var classNew;
358
        if(classOld != undefined && classOld.indexOf(str1) != -1) {
359
            if(classOld.indexOf(' ') == -1) {
360
                classNew = classOld.replace(str1, str2);
361
                $(this).find('.'+classOld).removeClass(classOld).addClass(classNew);
362
            }
363
            else {
364
                // the string starts with the firstSubStr and after the end of the word there's a space
365
                var expr1 = new RegExp('^'+firstSubStr+'+(\\S*)+'+str1+'+(\\s+)', 'g');
366

    
367
                // the word is between spaces
368
                var expr2 = new RegExp('(\\s+)'+firstSubStr+'+(\\S*)+'+str1+'+(\\s+)', 'g');
369

    
370
                // before the word there's at least one space and the string ends with this word
371
                var expr3 = new RegExp('(\\s+)'+firstSubStr+'+(\\S*)+'+str1+'$', 'g');
372

    
373
                // spaces all over the string
374
                var spacesExp = new RegExp('\\s+', 'g');
375

    
376
                if(classOld.match(expr1) != null) {
377
                    classToReplace = classOld.match(expr1);
378
                }
379
                else if(classOld.match(expr2) != null) {
380
                    classToReplace = classOld.match(expr2);
381
                }
382
                else if (classOld.match(expr3) != null) {
383
                    classToReplace = classOld.match(expr3);
384
                }
385
                classToReplace = classToReplace.toString().replace(spacesExp,"");
386
                classNew = classToReplace.replace(str1, str2);
387
                $(this).find('.'+classToReplace).removeClass(classToReplace).addClass(classNew);
388
            }
389
        }
390
    });
391
}
392

    
393
// in a page with tabs, allow navigation with hash tags
394
ui.hashTabs = function(tabsEl, sectionEl){
395
    var hash = window.location.hash;
396
    if ($(hash).length<=0){
397
        return;
398
    }
399
    tabsEl.find('a').removeClass('active');
400
    var link = tabsEl.find('a[href="'+hash+'"]');
401
    link.addClass('active');
402
    ui.tabsSection(link, sectionEl);
403

    
404
}
405

    
406
// in a page with tabs, allow navigation with hash tags
407
ui.hashViews = function(viewsEl, sectionEl){
408
    var hash = window.location.hash;
409
    if (!(hash)){
410
        return;
411
    }
412
    var link = viewsEl.find('a[href="'+hash+'"]');
413
    console.log('link', link);
414
    if (link.length<=0){
415
        return;
416
    }
417
    viewsEl.find('a span').removeClass('current');
418
    link.find('span').addClass('current');
419
    sectionEl.removeClass('grid-view list-view');
420
    var sectionClass = hash.slice(1) + '-view';
421
    sectionEl.addClass(sectionClass);
422
}
423

    
424
ui.ltBarToggle = function(speed){
425

    
426
    var cmarg = parseInt($('.lt-bar').width()) - parseInt($('.toggle-lt-bar').outerWidth(true));        
427
    var ctemp = cmarg / parseInt($('.lt-bar').width());
428
    var cvelocity = parseInt($('.lt-bar').width())/speed;
429
    var cdelay = parseInt($('.toggle-lt-bar').outerWidth(true))/cvelocity;
430

    
431
    $('.lt-bar').click(function(e) {
432
        e.stopPropagation();
433
    })
434
    $('.toggle-lt-bar').click(function(e){
435
        e.preventDefault();
436
        e.stopPropagation();
437
        var self =this;
438
        if($(this).hasClass('fix-position')) {
439
            var marg = parseInt($(self).css('marginLeft')) - cmarg;
440
            $(this).animate({
441
                'margin-left': marg,
442
            }, ctemp * speed, 'linear', function(){
443
                $(self).removeAttr('style');
444
                $(self).removeClass('fix-position');
445
            });
446
            $('.lt-bar').animate({
447
                width: 'toggle'
448
            }, speed, 'linear');
449
        }
450
        else {
451
            $(this).addClass('fix-position');
452
           var scrollBarWidth = 14;
453
            var marg = parseInt($(self).css('marginLeft')) + cmarg - scrollBarWidth;
454
            setTimeout(function(){
455
                $(self).animate({
456
                    'margin-left': marg,
457
                }, speed, 'linear')
458
            }, cdelay);
459
            $('.lt-bar').animate({
460
                width: 'toggle'
461
            }, speed, 'linear', ui.setCustomScrollBar);
462
        }
463
    });
464
}
465

    
466

    
467
ui.setCustomScrollBar = function() {
468
    $('.scroll-pane-arrows').jScrollPane({
469
        showArrows: true,
470
        horizontalGutter: 10,
471
        verticalDragMinHeight: 300,
472
        verticalDragMaxHeight: 300,
473
        mouseWheelSpeed: 50
474
});
475
}
476

    
477
function bytesToSize(bytes) {
478
    var sizes = [ 'n/a', 'bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
479
    var i = +Math.floor(Math.log(bytes) / Math.log(1024));
480
    return  (bytes / Math.pow(1024, i)).toFixed( 0 ) + sizes[ isNaN( bytes ) ? 0 : i+1 ];
481
}
482
function date_ddmmmyytime(date)
483
{
484
  var d = date.getDate();
485
  var m = date.getMonth();
486
  var y = date.getYear();
487
  if(y >= 100)
488
  {
489
    y -= 100;
490
    y += 2000;
491
  }
492

    
493
    var curr_hour = date.getHours();
494

    
495
    if (curr_hour < 12){
496
        a_p = "am";
497
    } else {
498
       a_p = "pm";
499
    }
500

    
501
    if (curr_hour == 0) {
502
       curr_hour = 12;
503
    }
504
    if (curr_hour > 12){
505
       curr_hour = curr_hour - 12;
506
    }
507

    
508
    var curr_min = date.getMinutes();
509

    
510
  return "" +
511
    (d<10?"0"+d:d) + "/" +m + "/" + y + ' '+curr_hour + ":" + curr_min + a_p;
512
}
513

    
514
 // returns the file class/extension of a file
515
ui.mimeToExt = function( mimetype) {
516
  var mimeExt = {
517
    'image/jpeg': 'jpg',
518
    'image/png': 'png',
519
    'application/pdf': 'pdf',
520
    'text/plain': 'txt',
521
  };
522
  console.log(mimetype);
523
  return mimeExt[mimetype] || 'unknown';
524
}
525

    
526
$(document).ready(function(){
527

    
528
    $('html').click(function(e) {
529
        // not sure if we want to hide the error window after every click in the ui
530
        if($('.communication-error').css('bottom') == '0px') {
531
            $('.communication-error').animate({bottom: "-151px"});
532
        }
533
    });
534

    
535
    if($('.vms.entities').length!=0){
536
        ui.inactiveActions();
537
    };
538
    ui.setElminHeight($('.main > .details'));
539
    ui.setElminHeight($('.lt-bar'));
540
    ui.setElmaxHeight($('.storage-progress'));
541
    ui.setElHeight($('.scroll-wrap'));
542
    $('#hd-search .hd-icon-search').click(function(e){
543
        var that = this;
544
        $(this).parents('.hd-search').toggleClass('hd-open');
545
        if ($(this).parents('.hd-search').hasClass('hd-open')) {
546
            $(that).parents('.hd-search').find('input[type="search"]').focus();
547
        } else {
548
            $(that).parents('.hd-search').find('input[type="search"]').val('');
549
        }
550
    })
551

    
552
    $('.header .login').mouseenter(function(e){
553
        $(this).find('ul').stop(true, true).slideDown(200);
554
    });
555
    $('.header .login').mouseleave(function(e){
556
        $(this).find('ul').stop(true, true).slideUp(200);
557
    });
558

    
559
    $('.entities a').click(function(){
560
        if ($(this).attr('data-reveal-id') && !($(this).hasClass('inactive'))) {
561
            $('.entities li .more').hide();
562
        }
563
    });
564

    
565
    $('.inactive').click(function(e){
566
        e.stopPropagation();
567
        e.preventDefault();
568
     });
569

    
570
    $('.arrows').on('click','.inactive', function(e){
571
        e.preventDefault();
572
        e.stopPropagation();
573
    });
574

    
575

    
576
    $('.lt-actions a:not(.active)').click(function(e){
577
        e.preventDefault();
578
    })
579

    
580
    if ($('.entities .items-list >li').length == 1) {
581
        $('.body-wrapper').addClass('no-vm');
582
    };
583
    $('.entities li .more').each(function(){
584
        var width = $(this).parent('li').outerWidth()  + 20;
585
        $(this).css('width', width);
586
    });
587

    
588
    $('.items-list li .img-wrap').on("mouseenter", function(e) {
589
        var that = this;
590
        if ($(this).parents('.entities').hasClass('grid-view')) {
591
            if ($(that).parent('.container').siblings('.more').length>0) {
592
                $(that).parent('.container').fadeOut(50,'easeInCirc');
593
                $(that).parent('.container').siblings('.more').fadeIn(150,'easeInCirc');
594
            }
595
        }
596
    });
597
    $('.entities li .more').mouseleave(function(e) {
598
        $(this).fadeOut(50, function() {
599
            $(this).siblings('.container').fadeIn(50);
600
        });
601
    });
602
    $('.grid-view .items-list > li').mouseleave(function(e){
603
        var that = this;
604
        setTimeout(function(){
605
            $(that).find('.more').fadeOut(200, function() {
606
                $(this).siblings('.container').fadeIn('fast');
607
            });
608
        },50)
609
    });
610

    
611
    ui.closeDiv($('.info .close'), '.info');
612
    ui.editable();
613
    ui.overlay();
614
    ui.colorPickerVisible = 0;
615

    
616
    $("a.disabled").each(function() {
617
        $(this).removeAttr('href');
618
    });
619
    
620
    $("a.disabled").click(function(e) {
621
        e.preventDefault();
622
    });
623

    
624
    $('.main-actions li a').click(function(e){
625
        if (!($(this).hasClass('active'))) {
626
            e.preventDefault();
627
        }
628
    });
629

    
630
    $('.main-actions li a').click(function(e){
631
        if (!($(this).hasClass('active'))) {
632
            e.preventDefault();
633
        }
634
    });
635
    $('.overlay-area-custom').children('.close').click(function(e){
636
        e.preventDefault();
637
        e.stopPropagation();
638
        $(this).parents('.overlay-area-custom').hide();
639
        $(this).parents('.overlay-area-custom').find($('.overlay-div')).hide();
640
        $('body').removeClass('with-overlay');
641
    })
642

    
643
    $('.browse-files').click(function(e){
644
        e.preventDefault();
645
    });
646

    
647
    $('.main .files').magnificPopup({
648
        delegate: 'a.show.image',
649
        type: 'image',
650
        tLoading: 'Loading image #%curr%...',
651
        mainClass: 'mfp-img-mobile',
652
        gallery: {
653
            enabled: true,
654
            navigateByImgClick: true,
655
            preload: [0,1] // Will preload 0 - before current, and 1 after the current image
656
        },
657
        image: {
658
            tError: 'The image could not be loaded.',
659
            titleSrc: function(item) {
660
                return item.el.data('title');
661
            }
662
        }
663
    });
664

    
665
    if($('#picker-1').length>0) {
666
        $('#picker-1').farbtastic('#color-1');
667
    };
668
    if($('#picker-2').length>0) {
669
        $('#picker-2').farbtastic('#color-2');
670
    };
671
    if($('#sb-search').length>0) {
672
        new UISearch( document.getElementById( 'sb-search' ) );
673
    }
674

    
675
    if ($('.toggle-lt-bar').length>0) {
676
        ui.ltBarToggle(400);
677
    }
678

    
679
    /* grid/list view for items-list */
680

    
681
    $('.actions-bar .list, .actions-bar .grid').click(function(e){
682
        //e.preventDefault();
683
        if (!($(this).find('span').hasClass('current'))) {
684
            $('.actions-bar .grid span, .actions-bar .list span').removeClass('current');
685
            $(this).find('span').addClass('current');
686
            $('.entities').toggleClass('grid-view list-view');
687
        }
688
    });
689

    
690

    
691

    
692
    // set filter visible
693
    $('.filter-menu .filter').click(function(e) {
694
        e.preventDefault();
695
        $(this).parents('.filter-menu').toggleClass('current');
696
    });
697

    
698
    // temp function used to demonstrate the visual effect of the building state of vm
699
    $('[data-status="building"] .btn5.temp').click(function(e) {
700
        e.preventDefault();
701
        $(this).siblings('.container').find('.complete').toggleClass('build-progress');
702
    });
703

    
704
    $('[data-status="rebooting"] .btn5.temp').click(function(e) {
705
        e.preventDefault();
706
        $(this).siblings('.container').find('.snf-pc-full').toggleClass('reboot-progress');
707
    })
708

    
709
    // //temp function to preventDefault of links in modal
710
    // $('.reveal-modal a:not(".close-reveal-modal, .generate-key-btn, .import-key-btn")').click(function(e){
711
    //     e.preventDefault();
712
    //     $('a.close-reveal-modal').trigger('click');
713
    // });
714

    
715
     // temp btn to show communication error message
716
    $('.temp-for-btns .communication-error-btn').click(function(e) {
717
         e.preventDefault();
718
         e.stopPropagation();
719
         $('.communication-error').animate({bottom: "0px"});
720
     });
721

    
722
    $('.communication-error a').click(function(e) {
723
        e.preventDefault();
724
        e.stopPropagation();
725
        $('.communication-error').animate({bottom: "-151px"});
726

    
727
    });
728
    $('.communication-error').click(function(e) {
729
        e.stopPropagation();
730
    });
731

    
732
    $('.show-add-tag').click(function(e) {
733
    e.preventDefault();
734
    $(this).parents('.tags-area, .tags').find('.snf-color-picker').slideDown('slow', function() {
735
        $('#hide-add-tag-dummy').scrollintoview({
736
            'duration': 'slow'
737
        });
738
    });
739
    ui.colorPickerVisible = 1;
740
    });
741

    
742
    $('.hide-add-tag').click(function(e) {
743
    e.preventDefault();
744
    $(this).parents('.tags-area, .tags').find('.snf-color-picker').slideUp(400, function() {
745
        $('.show-add-tag').first().scrollintoview({
746
            'duration': 'slow'
747
        });
748
        ui.colorPickerVisible = 0;
749
    });
750
    });
751

    
752
    // connected details js
753
    ui.detailsCustom($('#disk-connected'));
754
    ui.detailsCustom($('#network-connected'));
755
    ui.detailsCustom($('#vm-connected'));
756
    ui.firewallSetup();
757

    
758
    $('.firewall').mouseenter(function(e){
759
        $(this).css('z-index',2);
760
        $(this).find('.more').stop(true, true).slideDown(200);
761
    });
762
    $('.firewall').mouseleave(function(e){
763
        $(this).css('z-index',1);
764
        $(this).find('.more').stop(true, true).slideUp(200);
765
    });
766
    ui.tabs($('.tabs'), $('.content'));
767
    ui.hashTabs($('.tabs'), $('.content'));
768
    ui.hashViews($('.actions-bar .rt-actions'), $('.entities'));
769

    
770
    $('.act').click(function(e) {
771
        $(this).addClass('pending last');
772
    });
773

    
774
    $('.remove .cancel').click(function(e) {
775
        e.preventDefault();
776
        $('a.close-reveal-modal').trigger('click');
777
        $('.last').removeClass('pending last');
778
    });
779

    
780
    $('.remove .ok').click(function(e) {
781
        e.preventDefault();
782
        $('a.close-reveal-modal').trigger('click');
783
        var connection_img = $('.connections').find('.last');
784
        connection_img.addClass('open', 0);
785
        connection_img.removeClass('last');
786
        var img = connection_img.closest('.item').find('.img-wrap .snf-font');
787
        img.addClass('reboot-progress');
788
        setTimeout(function() {
789
            var connections_list = connection_img.closest('.connections').children('li:not(".hidden")');
790
            if(connections_list.length>1) {
791
                connection_img.closest('li').slideUp(function(){
792
                    connection_img.closest('li').addClass('hidden');
793
                    if(connections_list.find('.pending').length == 0) {
794
                      img.removeClass('reboot-progress');
795
                    }
796
                });
797
            }
798
            else {
799
                connection_img.closest('.item').slideUp(function(){
800
                    img.closest('li').addClass('hidden');
801
                    img.removeClass('reboot-progress');
802
                    img.removeClass('reboot-progress');
803
                });
804
            }
805
            connection_img.removeClass('pending');
806
        }, 3000)
807
    });
808
    // end of connected details js
809

    
810
    ui.replaceClass($('a.current, a.active'), 'outline', 'full', 'snf-');
811

    
812
    $('.tag-data').mouseover(function() {
813
        $(this).find('.delete').css({visibility: 'visible'})
814
    });
815
    $('.tag-data').mouseleave(function(){
816
        $(this).find('.delete').css({visibility: 'hidden'})
817
    });
818
    $('.tag-data .delete').click(function(e) {
819
        e.preventDefault();
820
        $(this).closest('div').fadeOut('slow');
821
    });
822

    
823
    $('.storage-progress').hover(
824
        function(e){
825
            $(this).find('.details').stop(false,true).slideDown();
826
        },
827
        function(e){
828
            $(this).find('.details').stop(false,true).slideUp();
829
        }
830
    );
831

    
832
    $('.btn-more').mouseenter(function(e) {
833
        $(this).find('.explain').stop(true, true).show('slow');
834
    });
835

    
836
    $('.btn-more').click(function(e) {
837
        e.preventDefault();
838
        e.stopPropagation();
839
        $('.btn-more').removeClass('clicked');
840
        $('.btn-more').siblings('ul').hide();
841
        $(this).addClass('clicked');
842
        $(this).siblings('ul').stop(true, true).slideDown('slow');
843
    });
844
    $('.containers .project').mouseleave(function(e){
845
        $(this).find('ul').fadeOut();
846
        $(this).find('.btn-more').removeClass('clicked');
847
    })
848

    
849
    if ($('.containers .btn-more').length>0) {
850
        $('body').click(function(e){
851
            $('.btn-more').removeClass('clicked');
852
            $('.btn-more').siblings('ul').fadeOut();
853
        })
854
    }
855

    
856
    // add a <span> element inside the content of each a.wrap-a element
857
    $('a.wrap-a').wrapInner('<span></span>');
858

    
859

    
860
    $('.side-actions .bottom .reassign').click(function(e){
861
        e.preventDefault();
862
        $(this).parents('.bottom').find('ul').hide();
863
        $(this).parents('.bottom').find('ul.options').show();
864
    });
865

    
866
    $('.side-actions ul.options').mouseleave(function(e){
867
        $(this).hide();
868
        $(this).siblings('ul').removeAttr('style');
869
    })
870

    
871
})
872

    
873

    
874
$(window).resize(function(e){
875
    ui.setElminHeight($('.main > .details'));
876
    ui.setElminHeight($('.lt-bar'));
877
    ui.setElHeight($('.scroll-wrap'));
878
    ui.setCustomScrollBar();
879
    ui.setElmaxHeight($('.storage-progress'));
880

    
881
})
882
;/*
883
* functions concerning checkboxes and radiobuttons links
884
*/
885

    
886

    
887

    
888
/*ui.checkbox = {
889
    changeState : function(checkbox_link) {
890
        $(checkbox_link).find('.snf-checkbox-unchecked, .snf-checkbox-checked').toggleClass('snf-checkbox-unchecked snf-checkbox-checked');
891
        $(checkbox_link).closest('li').toggleClass('selected');
892
    },
893
    check : function(checkbox_link) {
894
        $(checkbox_link).find('span').removeClass('snf-checkbox-unchecked').addClass('snf-checkbox-checked');
895
        $(checkbox_link).closest('li').addClass('selected');
896
    },
897
    uncheck : function(checkbox_link) {
898
        $(checkbox_link).find('span').removeClass('snf-checkbox-checked').addClass('snf-checkbox-unchecked');
899
        $(checkbox_link).closest('li').removeClass('selected');
900
    },
901

902
    reset: function(area) {
903
        $(area).find('.snf-radio-checked').not('.prechecked').toggleClass('snf-radio-checked snf-radio-unchecked');
904
        $(area).find('.snf-radio-unchecked.prechecked').toggleClass('snf-radio-checked snf-radio-unchecked');
905
    }
906

907
};
908
*/
909

    
910
ui.radiobtn = {
911
    changeState: function(radiobtn_link) {
912
        $(radiobtn_link).find('span.snf-radio-unchecked, span.snf-radio-checked').toggleClass('snf-radio-unchecked snf-radio-checked');
913
        $(radiobtn_link).closest('li').addClass('selected');
914
    },
915
    obtainOneChecked : function(radiobtn_link) {
916
        $(radiobtn_link).closest('ul').find('li').removeClass('selected');
917
        $(radiobtn_link).closest('ul').find('span.snf-radio-checked').toggleClass('snf-radio-unchecked snf-radio-checked');
918
    },
919
    reset : function(area) {
920
        $(area).find('.snf-checkbox-checked').not('.prechecked').toggleClass('snf-checkbox-checked snf-checkbox-unchecked');
921
        $(area).find('.snf-checkbox-unchecked.prechecked').toggleClass('snf-checkbox-checked snf-checkbox-unchecked');
922
    }
923

    
924
};
925

    
926
    $(document).ready(function(){
927

    
928
        // checkboxes binds
929

    
930
/*        $('.check').click(function(e) {
931
            e.preventDefault();
932
            e.stopPropagation();
933
            ui.checkbox.changeState(this);
934
            ui.entitiesActionsEnabled();
935
        });
936
*/
937

    
938
        $('.lt-bar .select .check').click(function(e) {
939
            $(this).siblings('em').toggle();
940
            if ( $(this).find('span').hasClass('snf-checkbox-unchecked')){
941
                ui.checkbox.uncheck($('.list-view  li:not(".not-selectable") .check'));
942
            } else {
943
                ui.checkbox.check($('.list-view  li:not(".not-selectable") .check'));
944
            }
945
        });
946

    
947
        $('.trigger-checkbox.has-more .check').click(function(e) {
948
            ui.slideHiddenArea(this, $(this).parent().next('.more'));
949
        });
950

    
951
        $('.dhcp-option .check').click(function(e) {
952
            $(this).parents('li').siblings().find('ul.subnet-options').parent('li').toggle();
953
        });
954

    
955
        // for lis that we want to change the checkbox state
956
        $('.trigger-checkbox').click(function(e){
957
            $(this).find('.check').trigger('click');
958
        });
959

    
960
        $('.trigger-checkbox').find('a').click(function(e){
961
            e.stopPropagation();
962
        });
963

    
964
         // for checkboxes created after document.ready
965
        $('.items-list').on('click','.check', function(e){
966
            e.preventDefault();
967
            e.stopPropagation();
968
            ui.changeCheckboxState(this);
969
        });
970

    
971
        // radiobuttons binds
972

    
973
        $('.radiobtn').click(function(e) {
974
            e.stopPropagation();
975
            e.preventDefault();
976
            if($(this).find('span').hasClass('snf-radio-unchecked')) {
977
                ui.radiobtn.obtainOneChecked(this);
978
                ui.radiobtn.changeState(this);
979
            }
980
        });
981

    
982
        $('.subnet-options .radiobtn').click(function(e) {
983
            if($(this).closest('li').hasClass('manual')) {
984
                $(this).siblings('.input').show();
985
            }
986
            else {
987
                $(this).closest('li').siblings('.manual').find('.input').hide();
988
            }
989
        });       
990

    
991
        $('.trigger-radiobtn').click(function(e) {
992
            $(this).find('.radiobtn').trigger('click');
993
        });
994

    
995
        $('.firewall .more  .radiobtn').click(function(e){
996
            $(this).parents('.firewall').removeAttr('data-firewall');
997
            $(this).parents('.firewall').data('firewall', $(this).parent().attr('class'));
998
            ui.firewallSetup();
999
        });
1000

    
1001
    });
1002
;/*
1003
* functions regarding all wizards
1004
*/
1005

    
1006
ui.wizard = {
1007
        domID: undefined,
1008
        currentStep: undefined,
1009
        totalStep: undefined,
1010
        btns: {
1011
                start: undefined,
1012
                close: undefined,
1013
                next: undefined,
1014
                previous: undefined,
1015
        },
1016
        areas : {
1017
                top: {
1018
                        header: undefined,
1019
                        menu: undefined
1020
                },
1021
                middle: undefined,
1022
                bottom: undefined
1023
        },
1024
        speed: 500,
1025
        onMove: 0,
1026

    
1027
        getCurrentStep: function(){
1028
                return ui.wizard.domID.find('.step').filter('.current').first();
1029
        },
1030

    
1031
        getNextStep: function() {
1032
        return ui.wizard.getCurrentStep().next();
1033
    },
1034

    
1035
    getPreviousStep: function() {
1036
        return ui.wizard.getCurrentStep().prev();
1037
    },
1038

    
1039
    getScrollOffset: function() {
1040
        return document.body.scrollTop;
1041
    },
1042

    
1043
        submitData: function() {
1044
                console.log('submit data dummy function');
1045
        },
1046

    
1047

    
1048

    
1049
        move: function(stepToDisplay, pos) {
1050
                ui.wizard.onMove = 1;
1051
                ui.wizard.focusFun();
1052
                ui.wizard.indicateStep();
1053
                ui.wizard.setMovementTags();
1054
                $('body').css('overflow','hidden');
1055
                // the current visible pane
1056
        var current = this.getCurrentStep();
1057
        // Set next pane position on the right of the current one
1058
        // Add current to the next pane, so that it will become
1059
        // visible
1060
        stepToDisplay.css({
1061
            left: pos.toString() + '%'
1062
        }).addClass("current");
1063
        // identify the current scroll position. Use it to
1064
        // set next pane top position. We assume all panes
1065
        // are within the scroll context of the main window.
1066
        stepToDisplay.css({
1067
            top: this.getScrollOffset() + 'px'
1068
        });
1069
        ui.wizard.domID.find('.step').animate({
1070
            marginLeft: (-pos).toString() + '%'
1071
        }, {
1072
                                complete: _.bind(function() {
1073
                // assuming all the following take place
1074
                // instantaneously within a single browser 
1075
                // render cycle, no flickering should occur.
1076
                current.removeClass("current");
1077
                            window.scroll(0, 0);
1078
                stepToDisplay.css({
1079
                    left: '0',
1080
                    top: '0'
1081
                });
1082
                $('.step').css({
1083
                    marginLeft: '0'
1084
                });
1085
                $('body').css('overflow','visible');
1086
                if (ui.wizard.currentStep == 3 ){
1087
                                        $('.vm-name input').first().focus();
1088
                }
1089
                $('.actions-bar').show();
1090
                ui.wizard.onMove = 0;
1091
            }, this)
1092
        });
1093

    
1094
        },
1095

    
1096
        data_next_array: ['el0', 'el2', 'el4', 'el7'],
1097

    
1098
        focusFun: function() {
1099
                var step = ui.wizard.currentStep;
1100
                var nextBtn = ui.wizard.btns.next;
1101

    
1102
                $('.firstfocus-' + step + '').first().focus();
1103
                nextBtn.removeAttr('data-next');
1104
                nextBtn.attr('data-next', ui.wizard.data_next_array[step]);
1105
        },
1106

    
1107
        goNext: function() {
1108
                var next = ui.wizard.getNextStep();
1109
                if (ui.wizard.onMove == 0) {
1110
                        ui.wizard.currentStep++;
1111
                        ui.wizard.move(next, 100);
1112
                }
1113
        },
1114

    
1115
        goPrev: function() {
1116
                var prev = ui.wizard.getPreviousStep();
1117
                if (ui.wizard.onMove == 0) {
1118
                        ui.wizard.currentStep--;
1119
                        ui.wizard.move(prev, -100);
1120
                }
1121
        },
1122

    
1123
        indicateStep: function() {
1124
                var step =ui.wizard.currentStep;
1125
                var menus = ui.wizard.areas.top.menu;
1126
                var wizardHeader = ui.wizard.areas.top.header;
1127
                
1128
                menus.find('.sub-menu').hide();
1129
                menus.find('.sub-menu[data-step='+step+']').fadeIn();
1130
                wizardHeader.children().removeClass('current');
1131
                wizardHeader.find('li:not(".current")').show().css("display", "inline");
1132
                wizardHeader.find('li:nth-child(' + step + ')').addClass('current');
1133
                wizardHeader.find('li.current').hide();
1134
                wizardHeader.find('li.current').fadeIn('slow').css("display", "inline");
1135
                wizardHeader.find('.current').prevAll('li').hide();
1136
        },
1137

    
1138
        // changes the text of next and previous buttons
1139
        setMovementTags: function() {
1140
                var step = ui.wizard.currentStep;
1141
                var totalStep = ui.wizard.totalStep;
1142
                var prevBtnLabel = ui.wizard.btns.previous.find('span');
1143
                var nextBtnLabel = ui.wizard.btns.next.find('span');
1144
                
1145
                if(totalStep == 1) {
1146
                        prevBtnLabel.html('CANCEL');
1147
                        nextBtnLabel.html('CREATE');
1148
                }
1149
                else {
1150
                        if (step == 1) {
1151
                                prevBtnLabel.html('CANCEL');
1152
                                nextBtnLabel.html('NEXT');
1153
                        } else if (step == totalStep) {
1154
                                prevBtnLabel.html('PREVIOUS');
1155
                                nextBtnLabel.html('CREATE');
1156
                        } else if (ui.wizard.vm.hideNext()){
1157
                                // ***
1158
                                ui.wizard.btns.next.hide();
1159
                        } else {
1160
                                prevBtnLabel.html('PREVIOUS');
1161
                                nextBtnLabel.html('NEXT');
1162
                        }
1163
                }
1164
        },
1165
        close: function() {
1166
                console.log('1');
1167
                $('body').removeClass('with-overlay');
1168
                $('.overlay-area-custom').fadeOut(400, function() {
1169
                        $('.overlay-div').hide();
1170
                        ui.wizard.reset();
1171
                });
1172
        },
1173

    
1174
        reset: function() {
1175
                var wizard = ui.wizard.domID;
1176
                var wizardType = wizard.attr('id');
1177

    
1178
                if(wizardType == 'vm-wizard') {
1179
                        wizard.find('.networks-area .more').show();
1180
                        wizard.find('.details').hide();
1181
                        wizard.find('.os li').hide();
1182
                        wizard.find('.advanced-conf-options').hide();
1183
                        wizard.find('.snf-color-picker').hide();
1184

    
1185
                }
1186
                else if(wizardType == 'network-wizard') {
1187
                        wizard.find('li .manual .input').hide();
1188
                wizard.find('ul.subnet-options').parent('li').show();
1189
                }
1190

    
1191
                ui.wizard.currentStep = 1;
1192
                wizard.find('.step').removeAttr('style');
1193
                wizard.find('.bottom').show();
1194
                wizard.find('input').val('');
1195
                ui.wizard.indicateStep();
1196
                ui.wizard.setMovementTags();
1197
                ui.wizard.preselectElements(wizardType);
1198
        },
1199

    
1200
        preselectElements: function(wizardType) {
1201
                var wizard = ui.wizard.domID;
1202

    
1203
                wizard.find('.current').not('.preselected').removeClass('current');
1204
                wizard.find('.preselected').not('.current').addClass('current');
1205
                wizard.find('.custom.dropdown.medium a:first').addClass('current'); // to fix
1206
                ui.radiobtn.reset(wizard);
1207
                ui.checkbox.reset(wizard);
1208
                wizard.find('.snf-arrow-up.preselected').toggleClass('snf-arrow-up snf-arrow-down');
1209
                if(wizardType == 'vm-wizard') {
1210
                        var preselectedImgCategory = wizard.find('.top .sub-menu[data-step=1] .preselected').data('img-type');
1211
                        wizard.find('.os .'+preselectedImgCategory).show();
1212
                }
1213
        },
1214

    
1215
        // use the showExplanatory and hideExplanatory functions
1216
        // when there's html structure as the following:
1217
        //         <div class="title">
1218
        //                 <p>EXPLANATORY TEXT</p>
1219
        //         </div>
1220
        //         <div class="options-bar">
1221
        //                 <div>
1222
        //                        <a href="">link</a><
1223
        //                 </div>
1224
        //         </div>
1225
        showExplanatoryText: function(link) {
1226
                var paragraph = $(link).parents('.options-bar').siblings('.title').find('p');
1227
                // var text = $(link).data('help');
1228
                // paragraph.html(text);
1229
                paragraph.css('visibility', 'visible');
1230
        },
1231

    
1232
        hideExplanatoryText: function(link) {
1233
                var paragraph = $(link).parents('.options-bar').siblings('.title').find('p');
1234
                paragraph.css('visibility', 'hidden');
1235
        },
1236

    
1237
        vm: {
1238
                hideNext: function() {
1239
                        if(ui.wizard.currentStep == 2 && $('.flavor a.disabled').hasClass('small')) {
1240
                                return true;
1241
                        }
1242
                        else {
1243
                                return false;
1244
                        }
1245
                },
1246
                getSize: function(elem) {
1247
                        if ($(elem).hasClass('small')) {
1248
                                return 'small';
1249
                        } else if ($(elem).hasClass('medium')) {
1250
                                return 'medium';
1251
                        } else if ($(elem).hasClass('large')) {
1252
                                return 'large';
1253
                        }
1254
                },
1255

    
1256

    
1257
                pickResources: function(resource) {
1258
                        var wizard = ui.wizard.domID;
1259
                        wizard.find('.flavor .with-flavor a:not(.' + resource + ')').removeClass('current');
1260
                        wizard.find('.flavor .with-flavor a.' + resource + '').addClass('current');
1261
                },
1262

    
1263
                showImageCategory: function(imagesCategory) {
1264
                        var wizard = ui.wizard.domID;
1265
                        var selectedImages = $(imagesCategory).data('img-type');
1266
                        wizard.find(imagesCategory).closest('.sub-menu').find('.current').removeClass('current');
1267
                        wizard.find(imagesCategory).addClass('current');
1268
                        wizard.find('.os li').hide();
1269
                        wizard.find('.os .details').hide();
1270
                        wizard.find('.os').find('.'+selectedImages).fadeIn();
1271
                }
1272
        },
1273
        network : { }
1274
}
1275

    
1276
$(document).ready(function() {
1277

    
1278
        if($('.wizard').length>0) {
1279
                var wizardType = $('.wizard').attr('id');
1280
                var wizard = ui.wizard.domID =$('#'+wizardType);
1281
                ui.wizard.totalStep = ui.wizard.domID.find('.step').length;
1282
                ui.wizard.currentStep = 1;
1283
                var topHeaderArea = ui.wizard.areas.top.header = wizard.find('.top .nums');
1284
                var topMenuArea = ui.wizard.areas.top.menu = wizard.find('.top .menus');
1285
                var middleArea = ui.wizard.areas.middle = wizard.find('.middle');
1286
                var bottomArea = ui.wizard.areas.bottom = wizard.find('.bottom');
1287

    
1288
                var prevBtn = ui.wizard.btns.previous = ui.wizard.areas.bottom.find('.nav.prev');
1289
                var nextBtn = ui.wizard.btns.next = ui.wizard.areas.bottom.find('.nav.next');
1290
                var closeBtn = ui.wizard.btns.close = wizard.find('.close');
1291

    
1292
                // various functions for creation wizards
1293
                closeBtn.click(function(e) {
1294
                        e.preventDefault();
1295
                        ui.wizard.close();
1296
                });
1297

    
1298
                nextBtn.click(function(e) {
1299
                        e.preventDefault();
1300
                        if (ui.wizard.currentStep == ui.wizard.totalStep ){
1301
                                ui.wizard.submitData();
1302
                                ui.wizard.close();
1303
                                return false;
1304
                        }
1305
                        ui.wizard.goNext();
1306

    
1307
                });
1308

    
1309
                prevBtn.click(function(e) {
1310
                        e.preventDefault();
1311
                        if (ui.wizard.currentStep == 1 ){
1312
                                ui.wizard.close();
1313
                                return false;
1314
                        }
1315
                        ui.wizard.goPrev();
1316
                });
1317

    
1318

    
1319
                $(document).keydown(function(e) {
1320
                        var exp1 = $('.vm-name input').is(':focus') && $('.vm-name input').val().length>0;
1321
                        var exp2 = $('.form-item input').is(':focus') && $('.form-item input').val().length>0;
1322
                        // right arrow keyCode == 39
1323
                        if (wizard.is(':visible').length != 0) {
1324
                                if (e.keyCode == 39 && ui.wizard.currentStep != (ui.wizard.totalStep) &&(!exp1) && (!exp2)) {
1325
                                        ui.wizard.goNext();
1326
                                        return false;
1327
                                }
1328
                                // left arrow keyCode == 37
1329
                                else if (e.keyCode == 37 && ui.wizard.currentStep != 1 &&(!exp1) &&(!exp2)) {
1330
                                        ui.wizard.goPrev();
1331
                                        return false;
1332
                                }
1333
                                // ESC
1334
                                else if (e.keyCode == 27 && ui.wizard.currentStep == 1) {
1335
                                        ui.wizard.close();
1336
                                }
1337
                        }
1338
                });
1339

    
1340
                // focus and tabs functionality
1341
                 wizard.find('a').keyup(function(e) {
1342
                        var self = this;
1343
                        if (e.keyCode == 9 || e.which == 9) {
1344
                                if (e.shiftKey) {
1345
                                } else {
1346
                                        //Focus next input
1347
                                        if ($(self).attr('data-next')) {
1348
                                                $(self).focusout(function(e) {
1349
                                                        var classname = $(self).data('next');
1350
                                                        wizard.find('.' + classname + '').first().focus();
1351
                                                });
1352
                                        }
1353
                                }
1354
                        }
1355
                });
1356

    
1357
                // navigation and numbers functions
1358
                wizard.find('.nav.previous').focus(function(e) {
1359
                        $(this).addClass('active');
1360
                });
1361

    
1362
                wizard.find('.nav.previous').focusout(function(e) {
1363
                        $(this).removeClass('active');
1364

    
1365
                });
1366

    
1367
                if(wizardType == 'vm-wizard') {
1368
                        
1369
                        // step-1: pick OS
1370
                        wizard.find('.os > li').keydown(function(e) {
1371
                          if(e.keyCode == 13) {
1372
                            $(this).trigger("click", true);
1373
                            e.preventDefault();
1374
                          }
1375
                        });
1376
                        wizard.find('.os .btn-col a').keydown(function(e) {
1377
                          if(e.keyCode == 13) {
1378
                            $(this).trigger("click", true);
1379
                            e.preventDefault();
1380
                            e.stopPropagation();
1381
                          }
1382
                        });
1383

    
1384
                        wizard.find('.os > li').click(function(e, wasEnterKey) {
1385
                                e.preventDefault();
1386
                                if ( $(this).hasClass('current') && wasEnterKey) {
1387
                                        ui.wizard.goNext();
1388
                                }
1389
                                wizard.find('.os >li').removeClass('current');
1390
                                $(this).addClass('current');
1391
                        });
1392

    
1393
                        wizard.find('.os .btn-col a').click(function(e) {
1394
                                e.preventDefault();
1395
                                e.stopPropagation();
1396
                                $(this).toggleClass('current');
1397
                                var self = this;
1398
                                $(this).parents('li').find('.details').stop().slideToggle();
1399
                        });
1400

    
1401
                        wizard.find('.top .sub-menu[data-step=1] a').click(function(e) {
1402
                                e.preventDefault();
1403
                                ui.wizard.vm.showImageCategory(this);
1404
                        });
1405

    
1406
                        wizard.find('.os .name-col').focus(function(e) {
1407
                                $(this).parents('li').addClass('hover');
1408
                        });
1409

    
1410
                        wizard.find('.os .name-col').focusout(function(e) {
1411
                                $(this).parents('li').removeClass('hover');
1412
                        });
1413

    
1414
                        // step-2: pick flavor
1415
                        var disabledElems = wizard.find('.flavor a.disabled');
1416
                        var disabledElemsNum = disabledElems.length;
1417
                        var size;
1418
                        if(disabledElemsNum>0) {
1419
                                for(i=0; i<disabledElemsNum; i++) {
1420
                                        size = ui.wizard.vm.getSize(disabledElems.get(i));
1421
                                        wizard.find('.sub-menu[data-step=2] a[data-size=' + size + ']').removeClass('current').addClass('disabled');
1422
                                        wizard.find('.flavor .'+size).removeClass('current preselected');
1423
                                        if(size == 'small') {
1424
                                                wizard.find('.flavor .vm-storage-selection a').removeClass('current preselected');
1425

    
1426
                                        }
1427
                                }
1428
                        }
1429
                        wizard.find('.sub-menu a[data-size]:not(.disabled)').click(function(e) {
1430
                                e.preventDefault();
1431
                                $(this).parents('.sub-menu').find('a').removeClass('current');
1432
                                $(this).addClass('current');
1433
                                ui.wizard.vm.pickResources($(this).data('size'));
1434
                        });
1435

    
1436
                        wizard.find('.flavor .options:not(.vm-storage-selection) a:not(.disabled)').click(function(e) {
1437
                                e.preventDefault();
1438
                                wizard.find('.sub-menu a[data-size]').removeClass('current');
1439
                                $(this).parents('.options').find('a').removeClass('current');
1440
                                $(this).addClass('current');
1441
                                size = ui.wizard.vm.getSize(this);
1442
                                var count = wizard.find('.options.with-flavor .' + size + '.current').length;
1443
                                if (count == 3) {
1444
                                        wizard.find('.sub-menu[data-step=2] a[data-size=' + size + ']').addClass('current');
1445
                                }
1446
                        });
1447

    
1448
                        wizard.find('.flavor .options.vm-storage-selection a').click(function(e) {
1449
                                e.preventDefault();
1450
                                $(this).parents('.options').find('a').removeClass('current');
1451
                                $(this).addClass('current');
1452
                        });
1453

    
1454
                        wizard.find('.flavor .options a').hover(
1455
                                function() {
1456
                                        ui.wizard.showExplanatoryText($(this))
1457
                                }, function() {
1458
                                        ui.wizard.hideExplanatoryText($(this))
1459
                                });
1460

    
1461
                        wizard.find('.sub-menu[data-step=2] li:last').find('a').focusout(function(e) {
1462
                                $('.step-2').find('.dropdown a:first').focus();
1463
                        });
1464

    
1465
                        // step-3: custom options
1466
                        wizard.find('.expand-arrow').click(function(e) {
1467
                                e.preventDefault();
1468
                                ui.expandDownArea(this, wizard.find('.advanced-conf-options'));
1469
                        });
1470
                }
1471

    
1472
                else if (wizardType == 'volume-wizard') {
1473
                        // step-1
1474
                        wizard.find('.volume_options .options a').hover(
1475
                                function() {
1476
                                        ui.wizard.showExplanatoryText($(this))
1477
                                }, function() {
1478
                                        ui.wizard.hideExplanatoryText($(this))
1479
                                });
1480
                        wizard.find('.volume_options .options a:not(.disabled)').click(function(e) {
1481
                                e.preventDefault();
1482
                                if(!$(this).hasClass('current')) {
1483
                                        $(this).closest('.options').find('.current').removeClass('current');
1484
                                        $(this).addClass('current');
1485
                                }
1486
                        });
1487
                }
1488

    
1489
        }
1490

    
1491
})
1492
;/*
1493
* functions that are used to the ssh0keys creation wizard
1494
*/
1495

    
1496
var wizard = $('#sshkeys-wizard');
1497
$(document).ready(function(){
1498
        generateArea = wizard.find('.generate-key-area');
1499
        generateBtn = wizard.find('.generate-key-btn');
1500
        importArea = wizard.find('.import-key-area');
1501
        importBtn = wizard.find('.import-key-btn');
1502
        editBtn = wizard.find('.edit');
1503
        importCloseBtn = importArea.find('.buttons a');
1504
        generateCloseBtn = generateArea.find('.buttons a');
1505

    
1506
        generateBtn.click(function(e) {
1507
                e.preventDefault();
1508
                if(!generateArea.is(':visible')) {
1509
                        // set the right color to the buttons
1510
                        $(this).addClass('current');
1511
                        $(this).siblings('a').removeClass('current');
1512

    
1513
                        if(importArea.is(':visible')) {
1514
                                importArea.stop().fadeOut(200, function() {
1515
                                generateArea.stop().slideDown();
1516
                                });
1517
                        }
1518
                        else {
1519
                                generateArea.stop().slideDown();
1520
                        }
1521
                }
1522
        });
1523

    
1524
        importBtn.click(function(e) {
1525
                e.preventDefault();
1526
                if(!importArea.is(':visible')) {
1527
                        // set the right color to the buttons
1528
                        $(this).addClass('current');
1529
                        $(this).siblings('a').removeClass('current');
1530

    
1531
                        if(generateArea.is(':visible')) {
1532
                                generateArea.stop().fadeOut(200, function() {
1533
                                importArea.stop().slideDown();
1534
                                });
1535
                        }
1536
                        else {
1537
                                importArea.stop().slideDown();
1538
                        }
1539
                }
1540
        });
1541

    
1542
        importCloseBtn.click(function(e) {
1543
                e.preventDefault();
1544
                e.stopPropagation();
1545
                importArea.slideUp();
1546
                importBtn.removeClass('current');
1547
        });
1548

    
1549
        generateCloseBtn.click(function(e) {
1550
                e.preventDefault();
1551
                e.stopPropagation();
1552
                generateArea.slideUp();
1553
                generateBtn.removeClass('current');
1554
        });
1555
})