Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / new_ui / ui / javascripts / common.js @ 83506b33

History | View | Annotate | Download (24.4 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

    
425

    
426

    
427
ui.setCustomScrollBar = function() {
428
}
429

    
430
function bytesToSize(bytes) {
431
    var sizes = [ 'n/a', 'bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
432
    var i = +Math.floor(Math.log(bytes) / Math.log(1024));
433
    return  (bytes / Math.pow(1024, i)).toFixed( 0 ) + sizes[ isNaN( bytes ) ? 0 : i+1 ];
434
}
435
function date_ddmmmyytime(date)
436
{
437
  var d = date.getDate();
438
  var m = date.getMonth();
439
  var y = date.getYear();
440
  if(y >= 100)
441
  {
442
    y -= 100;
443
    y += 2000;
444
  }
445

    
446
    var curr_hour = date.getHours();
447

    
448
    if (curr_hour < 12){
449
        a_p = "am";
450
    } else {
451
       a_p = "pm";
452
    }
453

    
454
    if (curr_hour == 0) {
455
       curr_hour = 12;
456
    }
457
    if (curr_hour > 12){
458
       curr_hour = curr_hour - 12;
459
    }
460

    
461
    var curr_min = date.getMinutes();
462

    
463
  return "" +
464
    (d<10?"0"+d:d) + "/" +m + "/" + y + ' '+curr_hour + ":" + curr_min + a_p;
465
}
466

    
467
 // returns the file class/extension of a file
468
ui.mimeToExt = function( mimetype) {
469
  var mimeExt = {
470
    'image/jpeg': 'jpg',
471
    'image/png': 'png',
472
    'application/pdf': 'pdf',
473
    'text/plain': 'txt',
474
  };
475
  console.log(mimetype);
476
  return mimeExt[mimetype] || 'unknown';
477
}
478

    
479
$(document).ready(function(){
480

    
481
    $('html').click(function(e) {
482
        // not sure if we want to hide the error window after every click in the ui
483
        if($('.communication-error').css('bottom') == '0px') {
484
            $('.communication-error').animate({bottom: "-151px"});
485
        }
486
    });
487

    
488
    if($('.vms.entities').length!=0){
489
        ui.inactiveActions();
490
    };
491
    ui.setElminHeight($('.main > .details'));
492
    ui.setElminHeight($('.lt-bar'));
493
    ui.setElmaxHeight($('.storage-progress'));
494
    $('#hd-search .hd-icon-search').click(function(e){
495
        var that = this;
496
        $(this).parents('.hd-search').toggleClass('hd-open');
497
        if ($(this).parents('.hd-search').hasClass('hd-open')) {
498
            $(that).parents('.hd-search').find('input[type="search"]').focus();
499
        } else {
500
            $(that).parents('.hd-search').find('input[type="search"]').val('');
501
        }
502
    })
503

    
504
    $('.header .login').mouseenter(function(e){
505
        $(this).find('ul').stop(true, true).slideDown(200);
506
    });
507
    $('.header .login').mouseleave(function(e){
508
        $(this).find('ul').stop(true, true).slideUp(200);
509
    });
510

    
511
    $('.entities a').click(function(){
512
        if ($(this).attr('data-reveal-id') && !($(this).hasClass('inactive'))) {
513
            $('.entities li .more').hide();
514
        }
515
    });
516

    
517
    $('.inactive').click(function(e){
518
        e.stopPropagation();
519
        e.preventDefault();
520
     });
521

    
522
    $('.arrows').on('click','.inactive', function(e){
523
        e.preventDefault();
524
        e.stopPropagation();
525
    });
526

    
527

    
528
    $('.lt-actions a:not(.active)').click(function(e){
529
        e.preventDefault();
530
    })
531

    
532
    if ($('.entities .items-list >li').length == 1) {
533
        $('.body-wrapper').addClass('no-vm');
534
    };
535
    $('.entities li .more').each(function(){
536
        var width = $(this).parent('li').outerWidth()  + 20;
537
        $(this).css('width', width);
538
    });
539

    
540
    $('.items-list li .img-wrap').on("mouseenter", function(e) {
541
        var that = this;
542
        if ($(this).parents('.entities').hasClass('grid-view')) {
543
            if ($(that).parent('.container').siblings('.more').length>0) {
544
                $(that).parent('.container').fadeOut(50,'easeInCirc');
545
                $(that).parent('.container').siblings('.more').fadeIn(150,'easeInCirc');
546
            }
547
        }
548
    });
549
    $('.entities li .more').mouseleave(function(e) {
550
        $(this).fadeOut(50, function() {
551
            $(this).siblings('.container').fadeIn(50);
552
        });
553
    });
554
    $('.grid-view .items-list > li').mouseleave(function(e){
555
        var that = this;
556
        setTimeout(function(){
557
            $(that).find('.more').fadeOut(200, function() {
558
                $(this).siblings('.container').fadeIn('fast');
559
            });
560
        },50)
561
    });
562

    
563
    ui.closeDiv($('.info .close'), '.info');
564
    ui.editable();
565
    ui.overlay();
566
    ui.colorPickerVisible = 0;
567

    
568
    $("a.disabled").each(function() {
569
        $(this).removeAttr('href');
570
    });
571
    
572
    $("a.disabled").click(function(e) {
573
        e.preventDefault();
574
    });
575

    
576
    $('.main-actions li a').click(function(e){
577
        if (!($(this).hasClass('active'))) {
578
            e.preventDefault();
579
        }
580
    });
581

    
582
    $('.main-actions li a').click(function(e){
583
        if (!($(this).hasClass('active'))) {
584
            e.preventDefault();
585
        }
586
    });
587
    $('.overlay-area-custom').children('.close').click(function(e){
588
        e.preventDefault();
589
        e.stopPropagation();
590
        $(this).parents('.overlay-area-custom').hide();
591
        $(this).parents('.overlay-area-custom').find($('.overlay-div')).hide();
592
        $('body').removeClass('with-overlay');
593
    })
594

    
595
    $('.browse-files').click(function(e){
596
        e.preventDefault();
597
    });
598

    
599
    if($('#picker-1').length>0) {
600
        $('#picker-1').farbtastic('#color-1');
601
    };
602
    if($('#picker-2').length>0) {
603
        $('#picker-2').farbtastic('#color-2');
604
    };
605
    if($('#sb-search').length>0) {
606
        new UISearch( document.getElementById( 'sb-search' ) );
607
    }
608

    
609
    if ($('.toggle-lt-bar').length>0) {
610
        ui.ltBarToggle(400);
611
    }
612

    
613
    /* grid/list view for items-list */
614

    
615
    $('.actions-bar .list, .actions-bar .grid').click(function(e){
616
        //e.preventDefault();
617
        /*if (!($(this).find('span').hasClass('current'))) {
618
            $('.actions-bar .grid span, .actions-bar .list span').removeClass('current');
619
            $(this).find('span').addClass('current');
620
            $('.entities').toggleClass('grid-view list-view');
621
        }*/
622
    });
623

    
624

    
625

    
626
    // set filter visible
627
    $('.filter-menu .filter').click(function(e) {
628
        e.preventDefault();
629
        $(this).parents('.filter-menu').toggleClass('current');
630
    });
631

    
632
    // temp function used to demonstrate the visual effect of the building state of vm
633
    $('[data-status="building"] .btn5.temp').click(function(e) {
634
        e.preventDefault();
635
        $(this).siblings('.container').find('.complete').toggleClass('build-progress');
636
    });
637

    
638
    $('[data-status="rebooting"] .btn5.temp').click(function(e) {
639
        e.preventDefault();
640
        $(this).siblings('.container').find('.snf-pc-full').toggleClass('reboot-progress');
641
    })
642

    
643
    // //temp function to preventDefault of links in modal
644
    // $('.reveal-modal a:not(".close-reveal-modal, .generate-key-btn, .import-key-btn")').click(function(e){
645
    //     e.preventDefault();
646
    //     $('a.close-reveal-modal').trigger('click');
647
    // });
648

    
649
     // temp btn to show communication error message
650
    $('.temp-for-btns .communication-error-btn').click(function(e) {
651
         e.preventDefault();
652
         e.stopPropagation();
653
         $('.communication-error').animate({bottom: "0px"});
654
     });
655

    
656
    $('.communication-error a').click(function(e) {
657
        e.preventDefault();
658
        e.stopPropagation();
659
        $('.communication-error').animate({bottom: "-151px"});
660

    
661
    });
662
    $('.communication-error').click(function(e) {
663
        e.stopPropagation();
664
    });
665

    
666
    $('.show-add-tag').click(function(e) {
667
    e.preventDefault();
668
    $(this).parents('.tags-area, .tags').find('.snf-color-picker').slideDown('slow', function() {
669
        $('#hide-add-tag-dummy').scrollintoview({
670
            'duration': 'slow'
671
        });
672
    });
673
    ui.colorPickerVisible = 1;
674
    });
675

    
676
    $('.hide-add-tag').click(function(e) {
677
    e.preventDefault();
678
    $(this).parents('.tags-area, .tags').find('.snf-color-picker').slideUp(400, function() {
679
        $('.show-add-tag').first().scrollintoview({
680
            'duration': 'slow'
681
        });
682
        ui.colorPickerVisible = 0;
683
    });
684
    });
685

    
686
    // connected details js
687
    ui.detailsCustom($('#disk-connected'));
688
    ui.detailsCustom($('#network-connected'));
689
    ui.detailsCustom($('#vm-connected'));
690
    ui.firewallSetup();
691

    
692
    $('.firewall').mouseenter(function(e){
693
        $(this).css('z-index',2);
694
        $(this).find('.more').stop(true, true).slideDown(200);
695
    });
696
    $('.firewall').mouseleave(function(e){
697
        $(this).css('z-index',1);
698
        $(this).find('.more').stop(true, true).slideUp(200);
699
    });
700
    //ui.tabs($('.tabs'), $('.content'));
701
    ui.hashTabs($('.tabs'), $('.content'));
702
    ui.hashViews($('.actions-bar .rt-actions'), $('.entities'));
703

    
704
    $('.act').click(function(e) {
705
        $(this).addClass('pending last');
706
    });
707

    
708
    $('.remove .cancel').click(function(e) {
709
        e.preventDefault();
710
        $('a.close-reveal-modal').trigger('click');
711
        $('.last').removeClass('pending last');
712
    });
713

    
714
    $('.remove .ok').click(function(e) {
715
        e.preventDefault();
716
        $('a.close-reveal-modal').trigger('click');
717
        var connection_img = $('.connections').find('.last');
718
        connection_img.addClass('open', 0);
719
        connection_img.removeClass('last');
720
        var img = connection_img.closest('.item').find('.img-wrap .snf-font');
721
        img.addClass('reboot-progress');
722
        setTimeout(function() {
723
            var connections_list = connection_img.closest('.connections').children('li:not(".hidden")');
724
            if(connections_list.length>1) {
725
                connection_img.closest('li').slideUp(function(){
726
                    connection_img.closest('li').addClass('hidden');
727
                    if(connections_list.find('.pending').length == 0) {
728
                      img.removeClass('reboot-progress');
729
                    }
730
                });
731
            }
732
            else {
733
                connection_img.closest('.item').slideUp(function(){
734
                    img.closest('li').addClass('hidden');
735
                    img.removeClass('reboot-progress');
736
                    img.removeClass('reboot-progress');
737
                });
738
            }
739
            connection_img.removeClass('pending');
740
        }, 3000)
741
    });
742
    // end of connected details js
743

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

    
746
    $('.tag-data').mouseover(function() {
747
        $(this).find('.delete').css({visibility: 'visible'})
748
    });
749
    $('.tag-data').mouseleave(function(){
750
        $(this).find('.delete').css({visibility: 'hidden'})
751
    });
752
    $('.tag-data .delete').click(function(e) {
753
        e.preventDefault();
754
        $(this).closest('div').fadeOut('slow');
755
    });
756

    
757
    $('.storage-progress').hover(
758
        function(e){
759
            $(this).find('.details').stop(false,true).slideDown();
760
        },
761
        function(e){
762
            $(this).find('.details').stop(false,true).slideUp();
763
        }
764
    );
765

    
766
    $('.btn-more').mouseenter(function(e) {
767
        $(this).find('.explain').stop(true, true).show('slow');
768
    });
769

    
770
    $('.btn-more').click(function(e) {
771
        e.preventDefault();
772
        e.stopPropagation();
773
        $('.btn-more').removeClass('clicked');
774
        $('.btn-more').siblings('ul').hide();
775
        $(this).addClass('clicked');
776
        $(this).siblings('ul').stop(true, true).slideDown('slow');
777
    });
778
    $('.containers .project').mouseleave(function(e){
779
        $(this).find('ul').fadeOut();
780
        $(this).find('.btn-more').removeClass('clicked');
781
    })
782

    
783
    if ($('.containers .btn-more').length>0) {
784
        $('body').click(function(e){
785
            $('.btn-more').removeClass('clicked');
786
            $('.btn-more').siblings('ul').fadeOut();
787
        })
788
    }
789

    
790
    // add a <span> element inside the content of each a.wrap-a element
791
    $('a.wrap-a').wrapInner('<span></span>');
792

    
793

    
794
    $('.side-actions .bottom .reassign').click(function(e){
795
        e.preventDefault();
796
        $(this).parents('.bottom').find('ul').hide();
797
        $(this).parents('.bottom').find('ul.options').show();
798
    });
799

    
800
    $('.side-actions ul.options').mouseleave(function(e){
801
        $(this).hide();
802
        $(this).siblings('ul').removeAttr('style');
803
    })
804

    
805
})
806

    
807

    
808
$(window).resize(function(e){
809
    ui.setElminHeight($('.main > .details'));
810
    ui.setElminHeight($('.lt-bar'));
811
    ui.setElHeight($('.scroll-wrap'));
812
    ui.setCustomScrollBar();
813
    ui.setElmaxHeight($('.storage-progress'));
814

    
815
})