Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / ui / web / ui_networks_view.js @ d233867a

History | View | Annotate | Download (22.7 kB)

1 664f05f0 Kostas Papadimitriou
// Copyright 2013 GRNET S.A. All rights reserved.
2 00469232 Kostas Papadimitriou
// 
3 00469232 Kostas Papadimitriou
// Redistribution and use in source and binary forms, with or
4 00469232 Kostas Papadimitriou
// without modification, are permitted provided that the following
5 00469232 Kostas Papadimitriou
// conditions are met:
6 00469232 Kostas Papadimitriou
// 
7 00469232 Kostas Papadimitriou
//   1. Redistributions of source code must retain the above
8 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
9 00469232 Kostas Papadimitriou
//      disclaimer.
10 00469232 Kostas Papadimitriou
// 
11 00469232 Kostas Papadimitriou
//   2. Redistributions in binary form must reproduce the above
12 00469232 Kostas Papadimitriou
//      copyright notice, this list of conditions and the following
13 00469232 Kostas Papadimitriou
//      disclaimer in the documentation and/or other materials
14 00469232 Kostas Papadimitriou
//      provided with the distribution.
15 00469232 Kostas Papadimitriou
// 
16 00469232 Kostas Papadimitriou
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
17 00469232 Kostas Papadimitriou
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 00469232 Kostas Papadimitriou
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
19 00469232 Kostas Papadimitriou
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
20 00469232 Kostas Papadimitriou
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 00469232 Kostas Papadimitriou
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 00469232 Kostas Papadimitriou
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
23 00469232 Kostas Papadimitriou
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
24 00469232 Kostas Papadimitriou
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 00469232 Kostas Papadimitriou
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
26 00469232 Kostas Papadimitriou
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27 00469232 Kostas Papadimitriou
// POSSIBILITY OF SUCH DAMAGE.
28 00469232 Kostas Papadimitriou
// 
29 00469232 Kostas Papadimitriou
// The views and conclusions contained in the software and
30 00469232 Kostas Papadimitriou
// documentation are those of the authors and should not be
31 00469232 Kostas Papadimitriou
// interpreted as representing official policies, either expressed
32 00469232 Kostas Papadimitriou
// or implied, of GRNET S.A.
33 00469232 Kostas Papadimitriou
// 
34 00469232 Kostas Papadimitriou
35 8d08f18a Kostas Papadimitriou
;(function(root){
36 8d08f18a Kostas Papadimitriou
    
37 8d08f18a Kostas Papadimitriou
    // root
38 8d08f18a Kostas Papadimitriou
    var root = root;
39 8d08f18a Kostas Papadimitriou
    
40 8d08f18a Kostas Papadimitriou
    // setup namepsaces
41 8d08f18a Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
42 8d08f18a Kostas Papadimitriou
    var models = snf.models = snf.models || {}
43 8d08f18a Kostas Papadimitriou
    var storage = snf.storage = snf.storage || {};
44 8d08f18a Kostas Papadimitriou
    var ui = snf.ui = snf.ui || {};
45 8d08f18a Kostas Papadimitriou
    var util = snf.util || {};
46 8d08f18a Kostas Papadimitriou
    var views = snf.views = snf.views || {}
47 8d08f18a Kostas Papadimitriou
48 8d08f18a Kostas Papadimitriou
    // shortcuts
49 8d08f18a Kostas Papadimitriou
    var bb = root.Backbone;
50 8d08f18a Kostas Papadimitriou
    
51 8d08f18a Kostas Papadimitriou
    // logging
52 8d08f18a Kostas Papadimitriou
    var logger = new snf.logging.logger("SNF-VIEWS");
53 8d08f18a Kostas Papadimitriou
    var debug = _.bind(logger.debug, logger);
54 8d08f18a Kostas Papadimitriou
    
55 8d08f18a Kostas Papadimitriou
    views.NetworkCreateView = views.Overlay.extend({
56 8d08f18a Kostas Papadimitriou
        view_id: "network_create_view",
57 8d08f18a Kostas Papadimitriou
        content_selector: "#networks-create-content",
58 8d08f18a Kostas Papadimitriou
        css_class: 'overlay-networks-create overlay-info',
59 8d08f18a Kostas Papadimitriou
        overlay_id: "network-create-overlay",
60 8d08f18a Kostas Papadimitriou
61 8d08f18a Kostas Papadimitriou
        title: "Create new private network",
62 8d08f18a Kostas Papadimitriou
        subtitle: "Networks",
63 8d08f18a Kostas Papadimitriou
64 8d08f18a Kostas Papadimitriou
        initialize: function(options) {
65 8d08f18a Kostas Papadimitriou
            views.NetworkCreateView.__super__.initialize.apply(this);
66 8d08f18a Kostas Papadimitriou
67 8d08f18a Kostas Papadimitriou
            this.create_button = this.$("form .form-action.create");
68 8d08f18a Kostas Papadimitriou
            this.text = this.$(".network-create-name");
69 8d08f18a Kostas Papadimitriou
            this.form = this.$("form");
70 126a01f2 Kostas Papadimitriou
71 126a01f2 Kostas Papadimitriou
            this.dhcp_select = this.$("#network-create-dhcp");
72 126a01f2 Kostas Papadimitriou
            this.type_select = this.$("#network-create-type");
73 126a01f2 Kostas Papadimitriou
            this.subnet_select = this.$("#network-create-subnet");
74 126a01f2 Kostas Papadimitriou
            this.subnet_custom = this.$("#network-create-subnet-custom");
75 126a01f2 Kostas Papadimitriou
                
76 126a01f2 Kostas Papadimitriou
            this.dhcp_form = this.$("#network-create-dhcp-fields");
77 126a01f2 Kostas Papadimitriou
            
78 126a01f2 Kostas Papadimitriou
            this.subnet_select.find(".subnet").remove();
79 126a01f2 Kostas Papadimitriou
            _.each(synnefo.config.network_suggested_subnets, function(subnet){
80 126a01f2 Kostas Papadimitriou
                this.subnet_select.append($('<option value='+subnet+' class="subnet">'+subnet+'</option>'));
81 126a01f2 Kostas Papadimitriou
            }, this);
82 126a01f2 Kostas Papadimitriou
83 126a01f2 Kostas Papadimitriou
            this.type_select.find(".subnet").remove();
84 126a01f2 Kostas Papadimitriou
            _.each(synnefo.config.network_available_types, function(name, value){
85 126a01f2 Kostas Papadimitriou
                this.type_select.append($('<option value='+value+' class="subnet">'+name+'</option>'));
86 126a01f2 Kostas Papadimitriou
            }, this);
87 126a01f2 Kostas Papadimitriou
            
88 126a01f2 Kostas Papadimitriou
            if (_.keys(synnefo.config.network_available_types).length <= 1) {
89 126a01f2 Kostas Papadimitriou
                this.type_select.closest(".form-field").hide();
90 126a01f2 Kostas Papadimitriou
            }
91 126a01f2 Kostas Papadimitriou
92 126a01f2 Kostas Papadimitriou
            this.check_dhcp_form();
93 8d08f18a Kostas Papadimitriou
            this.init_handlers();
94 8d08f18a Kostas Papadimitriou
        },
95 8d08f18a Kostas Papadimitriou
96 02ff6391 Kostas Papadimitriou
        reset_dhcp_form: function() {
97 02ff6391 Kostas Papadimitriou
          this.subnet_select.find("option")[0].selected = 1;
98 02ff6391 Kostas Papadimitriou
          this.subnet_custom.val("");
99 02ff6391 Kostas Papadimitriou
        },
100 02ff6391 Kostas Papadimitriou
101 126a01f2 Kostas Papadimitriou
        check_dhcp_form: function() {
102 126a01f2 Kostas Papadimitriou
            if (this.dhcp_select.is(":checked")) {
103 126a01f2 Kostas Papadimitriou
                this.dhcp_form.show();
104 126a01f2 Kostas Papadimitriou
            } else {
105 126a01f2 Kostas Papadimitriou
                this.dhcp_form.hide();
106 126a01f2 Kostas Papadimitriou
            }
107 126a01f2 Kostas Papadimitriou
            
108 126a01f2 Kostas Papadimitriou
            if (this.subnet_select.val() == "custom") {
109 126a01f2 Kostas Papadimitriou
                this.subnet_custom.show();
110 126a01f2 Kostas Papadimitriou
            } else {
111 126a01f2 Kostas Papadimitriou
                this.subnet_custom.hide();
112 126a01f2 Kostas Papadimitriou
            }
113 126a01f2 Kostas Papadimitriou
        },
114 126a01f2 Kostas Papadimitriou
115 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
116 126a01f2 Kostas Papadimitriou
117 126a01f2 Kostas Papadimitriou
            this.dhcp_select.click(_.bind(function(e){
118 126a01f2 Kostas Papadimitriou
                this.check_dhcp_form();
119 02ff6391 Kostas Papadimitriou
                this.reset_dhcp_form();
120 126a01f2 Kostas Papadimitriou
            }, this));
121 126a01f2 Kostas Papadimitriou
122 126a01f2 Kostas Papadimitriou
            this.subnet_select.change(_.bind(function(e){
123 126a01f2 Kostas Papadimitriou
                this.check_dhcp_form();
124 126a01f2 Kostas Papadimitriou
                if (this.subnet_custom.is(":visible")) {
125 126a01f2 Kostas Papadimitriou
                    this.subnet_custom.focus();
126 126a01f2 Kostas Papadimitriou
                }
127 126a01f2 Kostas Papadimitriou
            }, this));
128 126a01f2 Kostas Papadimitriou
129 8d08f18a Kostas Papadimitriou
            this.create_button.click(_.bind(function(e){
130 8d08f18a Kostas Papadimitriou
                this.submit();
131 8d08f18a Kostas Papadimitriou
            }, this));
132 8d08f18a Kostas Papadimitriou
133 8d08f18a Kostas Papadimitriou
            this.form.submit(_.bind(function(e){
134 8d08f18a Kostas Papadimitriou
                e.preventDefault();
135 8d08f18a Kostas Papadimitriou
                this.submit;
136 8d08f18a Kostas Papadimitriou
                return false;
137 8d08f18a Kostas Papadimitriou
            }, this))
138 8d08f18a Kostas Papadimitriou
139 8d08f18a Kostas Papadimitriou
            this.text.keypress(_.bind(function(e){
140 8d08f18a Kostas Papadimitriou
                if (e.which == 13) {this.submit()};
141 8d08f18a Kostas Papadimitriou
            },this))
142 8d08f18a Kostas Papadimitriou
        },
143 8d08f18a Kostas Papadimitriou
144 8d08f18a Kostas Papadimitriou
        submit: function() {
145 8d08f18a Kostas Papadimitriou
            if (this.validate()) {
146 8d08f18a Kostas Papadimitriou
                this.create();
147 8d08f18a Kostas Papadimitriou
            };
148 8d08f18a Kostas Papadimitriou
        },
149 8d08f18a Kostas Papadimitriou
        
150 8d08f18a Kostas Papadimitriou
        validate: function() {
151 8d08f18a Kostas Papadimitriou
            // sanitazie
152 8d08f18a Kostas Papadimitriou
            var t = this.text.val();
153 8d08f18a Kostas Papadimitriou
            t = t.replace(/^\s+|\s+$/g,"");
154 8d08f18a Kostas Papadimitriou
            this.text.val(t);
155 8d08f18a Kostas Papadimitriou
156 8d08f18a Kostas Papadimitriou
            if (this.text.val() == "") {
157 8d08f18a Kostas Papadimitriou
                this.text.closest(".form-field").addClass("error");
158 8d08f18a Kostas Papadimitriou
                this.text.focus();
159 8d08f18a Kostas Papadimitriou
                return false;
160 8d08f18a Kostas Papadimitriou
            } else {
161 126a01f2 Kostas Papadimitriou
                this.text.closest(".form-field").removeClass("error");
162 8d08f18a Kostas Papadimitriou
            }
163 126a01f2 Kostas Papadimitriou
            
164 126a01f2 Kostas Papadimitriou
            if (this.dhcp_select.is(":checked")) {
165 126a01f2 Kostas Papadimitriou
                if (this.subnet_select.val() == "custom") {
166 126a01f2 Kostas Papadimitriou
                    var sub = this.subnet_custom.val();
167 126a01f2 Kostas Papadimitriou
                    sub = sub.replace(/^\s+|\s+$/g,"");
168 126a01f2 Kostas Papadimitriou
                    this.subnet_custom.val(sub);
169 126a01f2 Kostas Papadimitriou
                        
170 126a01f2 Kostas Papadimitriou
                    if (!synnefo.util.IP_REGEX.exec(this.subnet_custom.val())) {
171 126a01f2 Kostas Papadimitriou
                        this.subnet_custom.closest(".form-field").prev().addClass("error");
172 126a01f2 Kostas Papadimitriou
                        return false;
173 126a01f2 Kostas Papadimitriou
                    } else {
174 126a01f2 Kostas Papadimitriou
                        this.subnet_custom.closest(".form-field").prev().removeClass("error");
175 126a01f2 Kostas Papadimitriou
                    }
176 126a01f2 Kostas Papadimitriou
                };
177 126a01f2 Kostas Papadimitriou
            }
178 126a01f2 Kostas Papadimitriou
179 126a01f2 Kostas Papadimitriou
            return true;
180 8d08f18a Kostas Papadimitriou
        },
181 29cf98c9 Kostas Papadimitriou
        
182 29cf98c9 Kostas Papadimitriou
        get_next_available_subnet: function() {
183 29cf98c9 Kostas Papadimitriou
            var auto_tpl = synnefo.config.automatic_network_range_format;
184 29cf98c9 Kostas Papadimitriou
            if (!auto_tpl) {
185 29cf98c9 Kostas Papadimitriou
                return null
186 29cf98c9 Kostas Papadimitriou
            }
187 29cf98c9 Kostas Papadimitriou
            var index = 0;
188 29cf98c9 Kostas Papadimitriou
            var subnet = auto_tpl.format(index);
189 29cf98c9 Kostas Papadimitriou
            var networks = synnefo.storage.networks;
190 29cf98c9 Kostas Papadimitriou
            var check_existing = function(n) { return n.get('cidr') == subnet }
191 29cf98c9 Kostas Papadimitriou
            while (networks.filter(check_existing).length > 0 && index <= 255) {
192 29cf98c9 Kostas Papadimitriou
                index++;
193 29cf98c9 Kostas Papadimitriou
                subnet = auto_tpl.format(index); 
194 29cf98c9 Kostas Papadimitriou
            }
195 29cf98c9 Kostas Papadimitriou
            return subnet;
196 29cf98c9 Kostas Papadimitriou
        },
197 8d08f18a Kostas Papadimitriou
198 8d08f18a Kostas Papadimitriou
        create: function() {
199 8d08f18a Kostas Papadimitriou
            this.create_button.addClass("in-progress");
200 126a01f2 Kostas Papadimitriou
201 126a01f2 Kostas Papadimitriou
            var name = this.text.val();
202 126a01f2 Kostas Papadimitriou
            var dhcp = this.dhcp_select.is(":checked");
203 126a01f2 Kostas Papadimitriou
            var subnet = null;
204 126a01f2 Kostas Papadimitriou
            var type = this.type_select.val();
205 126a01f2 Kostas Papadimitriou
206 126a01f2 Kostas Papadimitriou
            if (dhcp) {
207 126a01f2 Kostas Papadimitriou
                if (this.subnet_select.val() == "custom") {
208 126a01f2 Kostas Papadimitriou
                    subnet = this.subnet_custom.val();
209 126a01f2 Kostas Papadimitriou
                } else if (this.subnet_select.val() == "auto") {
210 29cf98c9 Kostas Papadimitriou
                    subnet = this.get_next_available_subnet()
211 126a01f2 Kostas Papadimitriou
                } else {
212 126a01f2 Kostas Papadimitriou
                    subnet = this.subnet_select.val();
213 126a01f2 Kostas Papadimitriou
                }
214 126a01f2 Kostas Papadimitriou
                
215 126a01f2 Kostas Papadimitriou
            }
216 126a01f2 Kostas Papadimitriou
217 126a01f2 Kostas Papadimitriou
            snf.storage.networks.create(name, type, subnet, dhcp, _.bind(function(){
218 8d08f18a Kostas Papadimitriou
                this.hide();
219 8d08f18a Kostas Papadimitriou
            }, this));
220 8d08f18a Kostas Papadimitriou
        },
221 8d08f18a Kostas Papadimitriou
222 8d08f18a Kostas Papadimitriou
        beforeOpen: function() {
223 8d08f18a Kostas Papadimitriou
            this.create_button.removeClass("in-progress")
224 95072bf0 Kostas Papadimitriou
            this.text.closest(".form-field").removeClass("error");
225 8d08f18a Kostas Papadimitriou
            this.text.val("");
226 8d08f18a Kostas Papadimitriou
            this.text.show();
227 8d08f18a Kostas Papadimitriou
            this.text.focus();
228 126a01f2 Kostas Papadimitriou
            this.subnet_custom.val("");
229 126a01f2 Kostas Papadimitriou
            this.subnet_select.val("auto");
230 126a01f2 Kostas Papadimitriou
            this.dhcp_select.attr("checked", true);
231 126a01f2 Kostas Papadimitriou
            this.type_select.val(_.keys(synnefo.config.network_available_types)[0]);
232 126a01f2 Kostas Papadimitriou
            this.check_dhcp_form();
233 8d08f18a Kostas Papadimitriou
        },
234 8d08f18a Kostas Papadimitriou
235 8d08f18a Kostas Papadimitriou
        onOpen: function() {
236 8d08f18a Kostas Papadimitriou
            this.text.focus();
237 8d08f18a Kostas Papadimitriou
        }
238 8d08f18a Kostas Papadimitriou
    });
239 8d08f18a Kostas Papadimitriou
240 664f05f0 Kostas Papadimitriou
    views.NetworkPortView = views.ext.ModelView.extend({
241 664f05f0 Kostas Papadimitriou
      tpl: '#network-port-view-tpl',
242 664f05f0 Kostas Papadimitriou
      
243 664f05f0 Kostas Papadimitriou
      vm_logo_url: function(vm) {
244 664f05f0 Kostas Papadimitriou
        if (!this.model.get('vm')) { return '' }
245 664f05f0 Kostas Papadimitriou
        return synnefo.ui.helpers.vm_icon_path(this.model.get('vm'), 'medium');
246 664f05f0 Kostas Papadimitriou
      },
247 664f05f0 Kostas Papadimitriou
      
248 664f05f0 Kostas Papadimitriou
      set_confirm: function() {
249 664f05f0 Kostas Papadimitriou
        var parent = this.parent_view.parent_view.el;
250 664f05f0 Kostas Papadimitriou
        parent.addClass("subactionpending");
251 664f05f0 Kostas Papadimitriou
      },
252 664f05f0 Kostas Papadimitriou
253 664f05f0 Kostas Papadimitriou
      unset_confirm: function() {
254 664f05f0 Kostas Papadimitriou
        var parent = this.parent_view.parent_view.el;
255 664f05f0 Kostas Papadimitriou
        parent.removeClass("subactionpending");
256 664f05f0 Kostas Papadimitriou
      },
257 664f05f0 Kostas Papadimitriou
258 664f05f0 Kostas Papadimitriou
      post_init_element: function() {
259 664f05f0 Kostas Papadimitriou
        this.in_progress = false;
260 664f05f0 Kostas Papadimitriou
        this.firewall = this.$(".firewall-content").hide();
261 664f05f0 Kostas Papadimitriou
        this.firewall_toggler = this.$(".firewall-toggle");
262 664f05f0 Kostas Papadimitriou
        this.firewall_apply = this.$(".firewall-apply");
263 664f05f0 Kostas Papadimitriou
        this.firewall_legends = this.firewall.find(".checkbox-legends");
264 664f05f0 Kostas Papadimitriou
        this.firewall_inputs = this.firewall.find("input");
265 664f05f0 Kostas Papadimitriou
        this.firewall_apply = this.firewall.find("button");
266 664f05f0 Kostas Papadimitriou
        this.firewall_visible = false;
267 664f05f0 Kostas Papadimitriou
268 664f05f0 Kostas Papadimitriou
        this.firewall_toggler.click(_.bind(function() {
269 664f05f0 Kostas Papadimitriou
          this.toggle_firewall();
270 664f05f0 Kostas Papadimitriou
        }, this));
271 664f05f0 Kostas Papadimitriou
272 664f05f0 Kostas Papadimitriou
        this.firewall.find(".checkbox-legends, input").click(
273 664f05f0 Kostas Papadimitriou
          _.bind(this.handle_firewall_choice_click, this));
274 664f05f0 Kostas Papadimitriou
        this.update_firewall();
275 664f05f0 Kostas Papadimitriou
      },
276 664f05f0 Kostas Papadimitriou
      
277 664f05f0 Kostas Papadimitriou
      toggle_firewall: function(e, hide, cb) {
278 664f05f0 Kostas Papadimitriou
          hide = hide === undefined ? false : hide;
279 664f05f0 Kostas Papadimitriou
          if (hide) {
280 664f05f0 Kostas Papadimitriou
            this.firewall.stop().hide();
281 664f05f0 Kostas Papadimitriou
          } else {
282 664f05f0 Kostas Papadimitriou
            if (!cb) { cb = function() {}}
283 664f05f0 Kostas Papadimitriou
            this.firewall.slideToggle(cb);
284 664f05f0 Kostas Papadimitriou
          }
285 664f05f0 Kostas Papadimitriou
          this.firewall_toggler.toggleClass("open");
286 664f05f0 Kostas Papadimitriou
          this.firewall_visible = this.firewall_toggler.hasClass("open");
287 664f05f0 Kostas Papadimitriou
          if (!this.firewall_visible) {
288 664f05f0 Kostas Papadimitriou
            this.firewall_apply.fadeOut(50);
289 664f05f0 Kostas Papadimitriou
          }
290 664f05f0 Kostas Papadimitriou
          this.update_firewall();
291 664f05f0 Kostas Papadimitriou
      },
292 664f05f0 Kostas Papadimitriou
    
293 664f05f0 Kostas Papadimitriou
      post_hide: function() {
294 664f05f0 Kostas Papadimitriou
        views.NetworkPortView.__super__.post_hide.apply(this);
295 664f05f0 Kostas Papadimitriou
        if (this.firewall_visible) {
296 664f05f0 Kostas Papadimitriou
          this.toggle_firewall({}, true);
297 664f05f0 Kostas Papadimitriou
        }
298 664f05f0 Kostas Papadimitriou
      },
299 664f05f0 Kostas Papadimitriou
300 664f05f0 Kostas Papadimitriou
      handle_firewall_choice_click: function(e) {
301 664f05f0 Kostas Papadimitriou
          var el = $(e.currentTarget);
302 664f05f0 Kostas Papadimitriou
          if (el.get(0).tagName == "INPUT") {
303 664f05f0 Kostas Papadimitriou
            el = el.next();
304 664f05f0 Kostas Papadimitriou
          }
305 664f05f0 Kostas Papadimitriou
          var current = this.model.get("firewall_status");
306 664f05f0 Kostas Papadimitriou
          var selected = el.prev().val();
307 664f05f0 Kostas Papadimitriou
308 664f05f0 Kostas Papadimitriou
          el.parent().find("input").attr("checked", false);
309 664f05f0 Kostas Papadimitriou
          el.prev().attr("checked", true);
310 664f05f0 Kostas Papadimitriou
311 664f05f0 Kostas Papadimitriou
          if (selected != current) {
312 664f05f0 Kostas Papadimitriou
            this.firewall_apply.show();
313 664f05f0 Kostas Papadimitriou
          } else {
314 664f05f0 Kostas Papadimitriou
            this.firewall_apply.hide();
315 664f05f0 Kostas Papadimitriou
          }
316 664f05f0 Kostas Papadimitriou
      },
317 664f05f0 Kostas Papadimitriou
      
318 664f05f0 Kostas Papadimitriou
      disconnect_port: function(model, e) {
319 664f05f0 Kostas Papadimitriou
        e && e.stopPropagation();
320 664f05f0 Kostas Papadimitriou
        this.model.actions.reset_pending();
321 664f05f0 Kostas Papadimitriou
        this.model.disconnect(_.bind(this.disconnect_port_complete, this));
322 664f05f0 Kostas Papadimitriou
      },
323 664f05f0 Kostas Papadimitriou
324 664f05f0 Kostas Papadimitriou
      disconnect_port_complete: function() {
325 664f05f0 Kostas Papadimitriou
      },
326 664f05f0 Kostas Papadimitriou
327 664f05f0 Kostas Papadimitriou
      set_firewall: function() {
328 664f05f0 Kostas Papadimitriou
        var value = this.get_selected_value();
329 664f05f0 Kostas Papadimitriou
        this.firewall_apply.addClass("in-progress");
330 664f05f0 Kostas Papadimitriou
        this.model.set({'pending_firewall': value});
331 664f05f0 Kostas Papadimitriou
        this.model.set_firewall(value, this.set_firewall_complete, 
332 664f05f0 Kostas Papadimitriou
                                       this.set_firewall_complete);
333 664f05f0 Kostas Papadimitriou
        this.in_progress = true;
334 664f05f0 Kostas Papadimitriou
      },
335 664f05f0 Kostas Papadimitriou
      
336 664f05f0 Kostas Papadimitriou
      set_firewall_complete: function() {
337 664f05f0 Kostas Papadimitriou
        this.in_progress = false;
338 664f05f0 Kostas Papadimitriou
        this.toggle_firewall({}, false, _.bind(function() {
339 664f05f0 Kostas Papadimitriou
          this.firewall_apply.removeClass("in-progress").show();
340 664f05f0 Kostas Papadimitriou
        }, this));
341 664f05f0 Kostas Papadimitriou
      },
342 664f05f0 Kostas Papadimitriou
343 664f05f0 Kostas Papadimitriou
      get_selected_value: function() {
344 664f05f0 Kostas Papadimitriou
        return this.firewall_inputs.filter(":checked").val();
345 664f05f0 Kostas Papadimitriou
      },
346 664f05f0 Kostas Papadimitriou
347 664f05f0 Kostas Papadimitriou
      update_firewall: function() {
348 664f05f0 Kostas Papadimitriou
        var value = this.model.get("firewall_status");
349 664f05f0 Kostas Papadimitriou
        var value_selector = "[value=" + value + "]"
350 664f05f0 Kostas Papadimitriou
        var status_span = this.firewall_toggler.find("span span");
351 664f05f0 Kostas Papadimitriou
        var current_choice = this.firewall_inputs.filter(value_selector);
352 664f05f0 Kostas Papadimitriou
353 664f05f0 Kostas Papadimitriou
        if (_.contains(["PROTECTED", "ENABLED"], value)) {
354 664f05f0 Kostas Papadimitriou
          status_span.removeClass("firewall-off").addClass("firewall-on");
355 664f05f0 Kostas Papadimitriou
          status_span.text("On");
356 664f05f0 Kostas Papadimitriou
        } else {
357 664f05f0 Kostas Papadimitriou
          status_span.removeClass("firewall-on").addClass("firewall-off");
358 664f05f0 Kostas Papadimitriou
          status_span.text("Off");
359 664f05f0 Kostas Papadimitriou
        }
360 664f05f0 Kostas Papadimitriou
        
361 664f05f0 Kostas Papadimitriou
        this.firewall_inputs.attr("checked", false);
362 664f05f0 Kostas Papadimitriou
        this.firewall_legends.removeClass("current");
363 664f05f0 Kostas Papadimitriou
        current_choice.attr("checked", true)
364 664f05f0 Kostas Papadimitriou
        current_choice.next().addClass("current");
365 664f05f0 Kostas Papadimitriou
      },
366 664f05f0 Kostas Papadimitriou
367 664f05f0 Kostas Papadimitriou
      show_vm_details: function() {
368 664f05f0 Kostas Papadimitriou
        var vm = this.model.get('vm');
369 664f05f0 Kostas Papadimitriou
        if (vm) { snf.ui.main.show_vm_details(vm) }
370 664f05f0 Kostas Papadimitriou
      }
371 664f05f0 Kostas Papadimitriou
    });
372 8d08f18a Kostas Papadimitriou
373 664f05f0 Kostas Papadimitriou
    views.NetworkPortCollectionView = views.ext.CollectionView.extend({
374 664f05f0 Kostas Papadimitriou
      tpl: '#network-port-collection-view-tpl',
375 664f05f0 Kostas Papadimitriou
      model_view_cls: views.NetworkPortView,
376 664f05f0 Kostas Papadimitriou
      rivets_view: true,
377 664f05f0 Kostas Papadimitriou
      get_rivet_object: function() {
378 664f05f0 Kostas Papadimitriou
        return {
379 664f05f0 Kostas Papadimitriou
          model: this.collection.network
380 664f05f0 Kostas Papadimitriou
        }
381 664f05f0 Kostas Papadimitriou
      },
382 664f05f0 Kostas Papadimitriou
      resolve_storage_object: function() {
383 664f05f0 Kostas Papadimitriou
        return this.collection
384 664f05f0 Kostas Papadimitriou
      },
385 664f05f0 Kostas Papadimitriou
386 664f05f0 Kostas Papadimitriou
      show_connect_vms_overlay: function() {
387 664f05f0 Kostas Papadimitriou
        this.parent_view.show_connect_vms_overlay();
388 664f05f0 Kostas Papadimitriou
      }
389 664f05f0 Kostas Papadimitriou
    });
390 8d08f18a Kostas Papadimitriou
391 664f05f0 Kostas Papadimitriou
    views.NetworkView = views.ext.ModelView.extend({
392 664f05f0 Kostas Papadimitriou
      tpl: '#network-view-tpl',
393 664f05f0 Kostas Papadimitriou
      auto_bind: ['connect_vm'],
394 664f05f0 Kostas Papadimitriou
      post_init_element: function() {
395 664f05f0 Kostas Papadimitriou
        this.ports = this.$(".ports.nested-model-list");
396 664f05f0 Kostas Papadimitriou
        this.ports.hide();
397 664f05f0 Kostas Papadimitriou
        this.ports_toggler = this.$(".network-ports-toggler");
398 664f05f0 Kostas Papadimitriou
        this.ports_toggler.click(this.toggle_ports);
399 664f05f0 Kostas Papadimitriou
        this.ports_visible = false;
400 664f05f0 Kostas Papadimitriou
      },
401 664f05f0 Kostas Papadimitriou
402 664f05f0 Kostas Papadimitriou
      toggle_ports: function(e, hide) {
403 664f05f0 Kostas Papadimitriou
        hide = hide === undefined ? false : hide;
404 664f05f0 Kostas Papadimitriou
        if (hide) {
405 664f05f0 Kostas Papadimitriou
          this.ports.stop().hide();
406 664f05f0 Kostas Papadimitriou
        } else {
407 664f05f0 Kostas Papadimitriou
          this.ports.stop().slideToggle();
408 664f05f0 Kostas Papadimitriou
        }
409 664f05f0 Kostas Papadimitriou
        this.ports_toggler.find(".cont-toggler").toggleClass("open");
410 664f05f0 Kostas Papadimitriou
        this.ports_visible = this.ports_toggler.find(".cont-toggler").hasClass("open");
411 664f05f0 Kostas Papadimitriou
      },
412 664f05f0 Kostas Papadimitriou
413 664f05f0 Kostas Papadimitriou
      post_hide: function() {
414 664f05f0 Kostas Papadimitriou
        views.NetworkView.__super__.post_hide.apply(this);
415 664f05f0 Kostas Papadimitriou
        if (this.ports_visible) {
416 664f05f0 Kostas Papadimitriou
          this.toggle_ports({}, true);
417 664f05f0 Kostas Papadimitriou
        }
418 664f05f0 Kostas Papadimitriou
      },
419 664f05f0 Kostas Papadimitriou
      
420 664f05f0 Kostas Papadimitriou
      status_map: {
421 664f05f0 Kostas Papadimitriou
        'ACTIVE': 'Active',
422 664f05f0 Kostas Papadimitriou
        'CONNECTING': 'Connecting',
423 664f05f0 Kostas Papadimitriou
        'DISCONNECTING': 'Disconnecting',
424 b51b21db Kostas Papadimitriou
        'REMOVING': 'Destroying'
425 664f05f0 Kostas Papadimitriou
      },
426 664f05f0 Kostas Papadimitriou
427 664f05f0 Kostas Papadimitriou
      status_cls_map: {
428 664f05f0 Kostas Papadimitriou
        'ACTIVE': 'status-active',
429 664f05f0 Kostas Papadimitriou
        'DISCONNECTING': 'status-progress',
430 664f05f0 Kostas Papadimitriou
        'CONNECTING': 'status-progress',
431 664f05f0 Kostas Papadimitriou
        'REMOVING': 'status-progress'
432 664f05f0 Kostas Papadimitriou
      },
433 664f05f0 Kostas Papadimitriou
      
434 664f05f0 Kostas Papadimitriou
      status_cls: function(status) {    
435 664f05f0 Kostas Papadimitriou
        return this.status_cls_map[this.model.get('ext_status')]
436 664f05f0 Kostas Papadimitriou
      },
437 664f05f0 Kostas Papadimitriou
438 664f05f0 Kostas Papadimitriou
      status_display: function(status) {
439 664f05f0 Kostas Papadimitriou
        var status;
440 664f05f0 Kostas Papadimitriou
        if (this.model.id == "snf-combined-public-network") {
441 664f05f0 Kostas Papadimitriou
          return "Internet"
442 664f05f0 Kostas Papadimitriou
        }
443 8d08f18a Kostas Papadimitriou
444 d233867a Kostas Papadimitriou
        var cidr = this.model.get('cidr');
445 d233867a Kostas Papadimitriou
        var status = this.model.get('ext_status');
446 d233867a Kostas Papadimitriou
        if (status != 'REMOVING' && cidr) {
447 d233867a Kostas Papadimitriou
          return cidr
448 d233867a Kostas Papadimitriou
        }
449 d233867a Kostas Papadimitriou
        return this.status_map[status];
450 664f05f0 Kostas Papadimitriou
      },
451 664f05f0 Kostas Papadimitriou
      
452 664f05f0 Kostas Papadimitriou
      connect_vms: function(vms, cb) {
453 664f05f0 Kostas Papadimitriou
        var finished = 0;
454 664f05f0 Kostas Papadimitriou
        var completed = function() {
455 664f05f0 Kostas Papadimitriou
          finished++;
456 664f05f0 Kostas Papadimitriou
          if (finished == vms.length) {
457 664f05f0 Kostas Papadimitriou
            cb();
458 664f05f0 Kostas Papadimitriou
          }
459 664f05f0 Kostas Papadimitriou
        }
460 664f05f0 Kostas Papadimitriou
        _.each(vms, function(vm) {
461 664f05f0 Kostas Papadimitriou
          this.model.connect_vm(vm, completed);
462 664f05f0 Kostas Papadimitriou
        }, this);
463 664f05f0 Kostas Papadimitriou
      },
464 664f05f0 Kostas Papadimitriou
      
465 a681ab44 Kostas Papadimitriou
      remove: function(model, e) {
466 a681ab44 Kostas Papadimitriou
        e && e.stopPropagation();
467 664f05f0 Kostas Papadimitriou
        this.model.actions.reset_pending();
468 664f05f0 Kostas Papadimitriou
        this.model.destroy({
469 d233867a Kostas Papadimitriou
          success: _.bind(function() {
470 d233867a Kostas Papadimitriou
            this.model.set({status: 'REMOVING'});
471 d233867a Kostas Papadimitriou
            this.model.set({ext_status: 'REMOVING'});
472 d233867a Kostas Papadimitriou
            // force status display update
473 d233867a Kostas Papadimitriou
            this.model.set({cidr: 'REMOVING'});
474 664f05f0 Kostas Papadimitriou
          }, this),
475 664f05f0 Kostas Papadimitriou
          silent: true
476 664f05f0 Kostas Papadimitriou
        });
477 664f05f0 Kostas Papadimitriou
      },
478 664f05f0 Kostas Papadimitriou
479 664f05f0 Kostas Papadimitriou
      show_connect_vms_overlay: function() {
480 664f05f0 Kostas Papadimitriou
        var view = new views.NetworkConnectVMsOverlay();
481 664f05f0 Kostas Papadimitriou
        vms = this.model.pluggable_vms();
482 664f05f0 Kostas Papadimitriou
        var cb = _.bind(function(vms) {
483 664f05f0 Kostas Papadimitriou
          view.set_in_progress();
484 664f05f0 Kostas Papadimitriou
          var cbinner = function() {
485 664f05f0 Kostas Papadimitriou
            view.hide();
486 664f05f0 Kostas Papadimitriou
            delete view;
487 664f05f0 Kostas Papadimitriou
          }
488 664f05f0 Kostas Papadimitriou
          this.connect_vms(vms, cbinner);
489 664f05f0 Kostas Papadimitriou
        }, this);
490 664f05f0 Kostas Papadimitriou
        view.show_vms(this.model, vms, [], cb, "subtitle");
491 664f05f0 Kostas Papadimitriou
      }
492 8d08f18a Kostas Papadimitriou
493 664f05f0 Kostas Papadimitriou
    });
494 664f05f0 Kostas Papadimitriou
    
495 664f05f0 Kostas Papadimitriou
    views.NetworksCollectionView = views.ext.CollectionView.extend({
496 664f05f0 Kostas Papadimitriou
      collection: storage.networks,
497 664f05f0 Kostas Papadimitriou
      collection_name: 'networks',
498 664f05f0 Kostas Papadimitriou
      model_view_cls: views.NetworkView,
499 664f05f0 Kostas Papadimitriou
      create_view_cls: views.NetworkCreateView,
500 664f05f0 Kostas Papadimitriou
      
501 664f05f0 Kostas Papadimitriou
      init: function() {
502 664f05f0 Kostas Papadimitriou
        this.public_added = false;
503 664f05f0 Kostas Papadimitriou
        views.NetworksCollectionView.__super__.init.apply(this, arguments);
504 664f05f0 Kostas Papadimitriou
      },
505 664f05f0 Kostas Papadimitriou
      
506 664f05f0 Kostas Papadimitriou
      check_empty: function() {
507 664f05f0 Kostas Papadimitriou
        views.NetworksCollectionView.__super__.check_empty.apply(this, arguments);
508 664f05f0 Kostas Papadimitriou
        //if (this.$(".private").children().length == 0) {
509 664f05f0 Kostas Papadimitriou
          //this.$(".private").hide();
510 664f05f0 Kostas Papadimitriou
        //} else {
511 664f05f0 Kostas Papadimitriou
          //this.$(".private").show();
512 664f05f0 Kostas Papadimitriou
        //}
513 664f05f0 Kostas Papadimitriou
      },
514 664f05f0 Kostas Papadimitriou
515 664f05f0 Kostas Papadimitriou
      add_model: function(m) {
516 664f05f0 Kostas Papadimitriou
        if (m.get('is_public') && !this.public_added) {
517 664f05f0 Kostas Papadimitriou
          this.combined_public = new models.networks.CombinedPublicNetwork();
518 664f05f0 Kostas Papadimitriou
          this.combined_public_view = new views.NetworkView({
519 664f05f0 Kostas Papadimitriou
            model: this.combined_public
520 664f05f0 Kostas Papadimitriou
          });
521 664f05f0 Kostas Papadimitriou
          this.add_model_view(this.combined_public_view, this.combined_public, 0);
522 664f05f0 Kostas Papadimitriou
          this.combined_public_view.$("i").hide();
523 664f05f0 Kostas Papadimitriou
          this.public_added = true;
524 664f05f0 Kostas Papadimitriou
        }
525 664f05f0 Kostas Papadimitriou
        return views.NetworksCollectionView.__super__.add_model.call(this, m);
526 664f05f0 Kostas Papadimitriou
      },
527 664f05f0 Kostas Papadimitriou
528 664f05f0 Kostas Papadimitriou
      remove_model: function(m) {
529 664f05f0 Kostas Papadimitriou
        if (m.id == 'snf-combined-public-network') {
530 664f05f0 Kostas Papadimitriou
          return;
531 664f05f0 Kostas Papadimitriou
        } else {
532 664f05f0 Kostas Papadimitriou
          return views.NetworksCollectionView.__super__.remove_model.call(this, m);
533 664f05f0 Kostas Papadimitriou
        }
534 664f05f0 Kostas Papadimitriou
      },
535 664f05f0 Kostas Papadimitriou
536 664f05f0 Kostas Papadimitriou
      get_model_view_cls: function(m) {
537 664f05f0 Kostas Papadimitriou
        if (!this.public_added) {
538 664f05f0 Kostas Papadimitriou
        }
539 664f05f0 Kostas Papadimitriou
        if (m.get('is_public')) {
540 664f05f0 Kostas Papadimitriou
          return false;
541 664f05f0 Kostas Papadimitriou
        }
542 664f05f0 Kostas Papadimitriou
        return views.NetworksCollectionView.__super__.get_model_view_cls.apply(this, [m]);
543 664f05f0 Kostas Papadimitriou
      },
544 664f05f0 Kostas Papadimitriou
      
545 664f05f0 Kostas Papadimitriou
      parent_for_model: function(m) {
546 664f05f0 Kostas Papadimitriou
        if (m.get('is_public')) {
547 664f05f0 Kostas Papadimitriou
          return this.list_el.find(".public");
548 664f05f0 Kostas Papadimitriou
        } else {
549 664f05f0 Kostas Papadimitriou
          return this.list_el.find(".private");
550 664f05f0 Kostas Papadimitriou
        }
551 664f05f0 Kostas Papadimitriou
      }
552 664f05f0 Kostas Papadimitriou
    });
553 664f05f0 Kostas Papadimitriou
554 664f05f0 Kostas Papadimitriou
    views.NetworksPaneView = views.ext.PaneView.extend({
555 664f05f0 Kostas Papadimitriou
      id: "pane",
556 664f05f0 Kostas Papadimitriou
      el: '#networks-pane',
557 664f05f0 Kostas Papadimitriou
      collection_view_cls: views.NetworksCollectionView,
558 664f05f0 Kostas Papadimitriou
      collection_view_selector: '#networks-list-view'
559 664f05f0 Kostas Papadimitriou
    });
560 664f05f0 Kostas Papadimitriou
561 664f05f0 Kostas Papadimitriou
    views.NetworkConnectVMsOverlay = views.Overlay.extend({
562 664f05f0 Kostas Papadimitriou
        title: "Connect machine",
563 664f05f0 Kostas Papadimitriou
        overlay_id: "overlay-select-vms",
564 664f05f0 Kostas Papadimitriou
        content_selector: "#network-vms-select-content",
565 664f05f0 Kostas Papadimitriou
        css_class: "overlay-info",
566 664f05f0 Kostas Papadimitriou
        allow_multiple: true,
567 8d08f18a Kostas Papadimitriou
568 664f05f0 Kostas Papadimitriou
        initialize: function() {
569 664f05f0 Kostas Papadimitriou
            views.NetworkConnectVMsOverlay.__super__.initialize.apply(this);
570 664f05f0 Kostas Papadimitriou
            this.list = this.$(".vms-list ul");
571 664f05f0 Kostas Papadimitriou
            this.empty_message = this.$(".empty-message");
572 664f05f0 Kostas Papadimitriou
            // flag for submit handler to avoid duplicate bindings
573 664f05f0 Kostas Papadimitriou
            this.submit_handler_set = false;
574 664f05f0 Kostas Papadimitriou
            this.in_progress = false;
575 8d08f18a Kostas Papadimitriou
        },
576 8d08f18a Kostas Papadimitriou
        
577 664f05f0 Kostas Papadimitriou
        handle_vm_click: function(el) {
578 664f05f0 Kostas Papadimitriou
            if (!this.allow_multiple) {
579 664f05f0 Kostas Papadimitriou
              $(el).closest("ul").find(".selected").removeClass("selected");
580 664f05f0 Kostas Papadimitriou
              $(el).addClass("selected");
581 664f05f0 Kostas Papadimitriou
            } else {
582 664f05f0 Kostas Papadimitriou
              $(el).toggleClass("selected");
583 664f05f0 Kostas Papadimitriou
            }
584 126a01f2 Kostas Papadimitriou
        },
585 126a01f2 Kostas Papadimitriou
586 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
587 664f05f0 Kostas Papadimitriou
            var self = this;
588 664f05f0 Kostas Papadimitriou
            this.list.find("li").click(function() {
589 664f05f0 Kostas Papadimitriou
                self.handle_vm_click($(this));
590 664f05f0 Kostas Papadimitriou
            });
591 664f05f0 Kostas Papadimitriou
            
592 664f05f0 Kostas Papadimitriou
            if (!this.submit_handler_set) {
593 664f05f0 Kostas Papadimitriou
                // avoid duplicate submits
594 664f05f0 Kostas Papadimitriou
                this.el.find(".create, .assign").click(_.bind(function() {
595 664f05f0 Kostas Papadimitriou
                  if (!this.in_progress) {
596 664f05f0 Kostas Papadimitriou
                    this.submit();
597 664f05f0 Kostas Papadimitriou
                  }
598 101e6604 Kostas Papadimitriou
                }, this));
599 664f05f0 Kostas Papadimitriou
                this.submit_handler_set = true;
600 8d08f18a Kostas Papadimitriou
            }
601 101e6604 Kostas Papadimitriou
        },
602 8d08f18a Kostas Papadimitriou
603 664f05f0 Kostas Papadimitriou
        reset: function() {
604 664f05f0 Kostas Papadimitriou
            this.list.find("li").remove();
605 8d08f18a Kostas Papadimitriou
        },
606 8d08f18a Kostas Papadimitriou
607 664f05f0 Kostas Papadimitriou
        beforeOpen: function() {
608 664f05f0 Kostas Papadimitriou
            this.reset();
609 664f05f0 Kostas Papadimitriou
            this.update_layout();
610 664f05f0 Kostas Papadimitriou
        },
611 664f05f0 Kostas Papadimitriou
        
612 664f05f0 Kostas Papadimitriou
        vm: function(vm) {
613 664f05f0 Kostas Papadimitriou
            if (vm.id) { var id = vm.id } else {var id = vm}
614 664f05f0 Kostas Papadimitriou
            return this.list.find(".vm-" + id);
615 8d08f18a Kostas Papadimitriou
        },
616 8d08f18a Kostas Papadimitriou
617 664f05f0 Kostas Papadimitriou
        get_selected: function() {
618 664f05f0 Kostas Papadimitriou
            return this.list.find(".selected").map(function() {return $(this).data('vm')})
619 8d08f18a Kostas Papadimitriou
        },
620 8d08f18a Kostas Papadimitriou
621 8d08f18a Kostas Papadimitriou
        update_layout: function() {
622 664f05f0 Kostas Papadimitriou
            this.unset_in_progress();
623 664f05f0 Kostas Papadimitriou
            this.in_progress = false;
624 126a01f2 Kostas Papadimitriou
625 664f05f0 Kostas Papadimitriou
            if (this.vms.length == 0) {
626 664f05f0 Kostas Papadimitriou
                this.empty_message.show();
627 126a01f2 Kostas Papadimitriou
            } else {
628 664f05f0 Kostas Papadimitriou
                this.empty_message.hide();
629 126a01f2 Kostas Papadimitriou
            }
630 8d08f18a Kostas Papadimitriou
631 664f05f0 Kostas Papadimitriou
            _.each(this.vms, _.bind(function(vm){
632 664f05f0 Kostas Papadimitriou
                var html = '<li class="vm option options-object vm-{0}">' +
633 664f05f0 Kostas Papadimitriou
                           '<div class="options-object-cont">' +
634 664f05f0 Kostas Papadimitriou
                           '{2}' + 
635 664f05f0 Kostas Papadimitriou
                           '<span class="title">{1}</span>' + 
636 664f05f0 Kostas Papadimitriou
                           '<span class="value">{3}</span></div>' + 
637 664f05f0 Kostas Papadimitriou
                           '</li>';
638 664f05f0 Kostas Papadimitriou
                var el = $(html.format(vm.id, 
639 664f05f0 Kostas Papadimitriou
                       util.truncate(_.escape(vm.get("name")), 23), 
640 664f05f0 Kostas Papadimitriou
                       snf.ui.helpers.vm_icon_tag(vm, "small", {'class':'os'}),
641 664f05f0 Kostas Papadimitriou
                       _.escape(vm.get_os())
642 664f05f0 Kostas Papadimitriou
                ));
643 664f05f0 Kostas Papadimitriou
                el.data({vm:vm, vm_id:vm.id});
644 664f05f0 Kostas Papadimitriou
                this.list.append(el);
645 8d08f18a Kostas Papadimitriou
646 664f05f0 Kostas Papadimitriou
                vm.bind("remove", function(){ el.remove()})
647 664f05f0 Kostas Papadimitriou
                vm.bind("change:name", function(i,v){el.find(".title").text(v)})
648 664f05f0 Kostas Papadimitriou
            }, this));
649 664f05f0 Kostas Papadimitriou
            
650 8d08f18a Kostas Papadimitriou
            this.init_handlers();
651 664f05f0 Kostas Papadimitriou
            this.set_selected();
652 8d08f18a Kostas Papadimitriou
        },
653 8d08f18a Kostas Papadimitriou
654 664f05f0 Kostas Papadimitriou
        set_selected: function() {
655 664f05f0 Kostas Papadimitriou
            _.each(this.selected, _.bind(function(el){
656 664f05f0 Kostas Papadimitriou
                this.vm(el).addClass("selected");
657 8d08f18a Kostas Papadimitriou
            }, this));
658 8d08f18a Kostas Papadimitriou
        },
659 8d08f18a Kostas Papadimitriou
        
660 664f05f0 Kostas Papadimitriou
        set_in_progress: function() {
661 664f05f0 Kostas Papadimitriou
          this.$(".form-action").addClass("in-progress");
662 664f05f0 Kostas Papadimitriou
          this.in_progress = true;
663 8d08f18a Kostas Papadimitriou
        },
664 8d08f18a Kostas Papadimitriou
665 664f05f0 Kostas Papadimitriou
        unset_in_progress: function() {
666 664f05f0 Kostas Papadimitriou
          this.$(".form-action").removeClass("in-progress");
667 664f05f0 Kostas Papadimitriou
          this.in_progress = false;
668 8d08f18a Kostas Papadimitriou
        },
669 8d08f18a Kostas Papadimitriou
670 664f05f0 Kostas Papadimitriou
        show_vms: function(network, vms, selected, callback, subtitle) {
671 664f05f0 Kostas Papadimitriou
            this.network = network;
672 664f05f0 Kostas Papadimitriou
            this.reset();
673 664f05f0 Kostas Papadimitriou
            if (network) {
674 664f05f0 Kostas Papadimitriou
              this.set_subtitle(network.escape("name"));
675 8d08f18a Kostas Papadimitriou
            } else {
676 664f05f0 Kostas Papadimitriou
              this.set_subtitle(subtitle);
677 8d08f18a Kostas Papadimitriou
            }
678 8d08f18a Kostas Papadimitriou
679 664f05f0 Kostas Papadimitriou
            this.vms = vms;
680 664f05f0 Kostas Papadimitriou
            this.selected = selected;
681 664f05f0 Kostas Papadimitriou
            this.cb = callback;
682 664f05f0 Kostas Papadimitriou
            this.unset_in_progress();
683 664f05f0 Kostas Papadimitriou
            this.show(true);
684 664f05f0 Kostas Papadimitriou
        },
685 8d08f18a Kostas Papadimitriou
686 8d08f18a Kostas Papadimitriou
        submit: function() {
687 664f05f0 Kostas Papadimitriou
            if (!this.get_selected().length) { return }
688 664f05f0 Kostas Papadimitriou
            this.cb(this.get_selected());
689 8d08f18a Kostas Papadimitriou
        }
690 8d08f18a Kostas Papadimitriou
    });
691 664f05f0 Kostas Papadimitriou
 
692 8d08f18a Kostas Papadimitriou
})(this);