Statistics
| Branch: | Tag: | Revision:

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

History | View | Annotate | Download (35.2 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
      show_connect_vms_overlay: function() {
386 664f05f0 Kostas Papadimitriou
        this.parent_view.show_connect_vms_overlay();
387 664f05f0 Kostas Papadimitriou
      }
388 664f05f0 Kostas Papadimitriou
    });
389 8d08f18a Kostas Papadimitriou
390 664f05f0 Kostas Papadimitriou
    views.NetworkView = views.ext.ModelView.extend({
391 664f05f0 Kostas Papadimitriou
      tpl: '#network-view-tpl',
392 664f05f0 Kostas Papadimitriou
      auto_bind: ['connect_vm'],
393 664f05f0 Kostas Papadimitriou
      post_init_element: function() {
394 664f05f0 Kostas Papadimitriou
        this.ports = this.$(".ports.nested-model-list");
395 664f05f0 Kostas Papadimitriou
        this.ports.hide();
396 664f05f0 Kostas Papadimitriou
        this.ports_toggler = this.$(".network-ports-toggler");
397 664f05f0 Kostas Papadimitriou
        this.ports_toggler.click(this.toggle_ports);
398 664f05f0 Kostas Papadimitriou
        this.ports_visible = false;
399 664f05f0 Kostas Papadimitriou
      },
400 664f05f0 Kostas Papadimitriou
401 664f05f0 Kostas Papadimitriou
      toggle_ports: function(e, hide) {
402 664f05f0 Kostas Papadimitriou
        hide = hide === undefined ? false : hide;
403 664f05f0 Kostas Papadimitriou
        if (hide) {
404 664f05f0 Kostas Papadimitriou
          this.ports.stop().hide();
405 664f05f0 Kostas Papadimitriou
        } else {
406 664f05f0 Kostas Papadimitriou
          this.ports.stop().slideToggle();
407 664f05f0 Kostas Papadimitriou
        }
408 664f05f0 Kostas Papadimitriou
        this.ports_toggler.find(".cont-toggler").toggleClass("open");
409 664f05f0 Kostas Papadimitriou
        this.ports_visible = this.ports_toggler.find(".cont-toggler").hasClass("open");
410 9c8f31ad Kostas Papadimitriou
        if (this.ports_visible) {
411 9c8f31ad Kostas Papadimitriou
          $(this.el).addClass("hovered");
412 9c8f31ad Kostas Papadimitriou
        } else {
413 9c8f31ad Kostas Papadimitriou
          $(this.el).removeClass("hovered");
414 9c8f31ad Kostas Papadimitriou
        }
415 664f05f0 Kostas Papadimitriou
      },
416 365af933 Kostas Papadimitriou
      
417 365af933 Kostas Papadimitriou
      get_network_icon: function() {
418 365af933 Kostas Papadimitriou
        var ico = this.model.get('is_public') ? 'internet.png' : 'network.png';
419 365af933 Kostas Papadimitriou
        return synnefo.config.media_url + 'images/' + ico;
420 365af933 Kostas Papadimitriou
      },
421 664f05f0 Kostas Papadimitriou
422 664f05f0 Kostas Papadimitriou
      post_hide: function() {
423 664f05f0 Kostas Papadimitriou
        views.NetworkView.__super__.post_hide.apply(this);
424 664f05f0 Kostas Papadimitriou
        if (this.ports_visible) {
425 664f05f0 Kostas Papadimitriou
          this.toggle_ports({}, true);
426 664f05f0 Kostas Papadimitriou
        }
427 664f05f0 Kostas Papadimitriou
      },
428 664f05f0 Kostas Papadimitriou
      
429 664f05f0 Kostas Papadimitriou
      status_map: {
430 664f05f0 Kostas Papadimitriou
        'ACTIVE': 'Active',
431 664f05f0 Kostas Papadimitriou
        'CONNECTING': 'Connecting',
432 664f05f0 Kostas Papadimitriou
        'DISCONNECTING': 'Disconnecting',
433 b51b21db Kostas Papadimitriou
        'REMOVING': 'Destroying'
434 664f05f0 Kostas Papadimitriou
      },
435 664f05f0 Kostas Papadimitriou
436 664f05f0 Kostas Papadimitriou
      status_cls_map: {
437 664f05f0 Kostas Papadimitriou
        'ACTIVE': 'status-active',
438 664f05f0 Kostas Papadimitriou
        'DISCONNECTING': 'status-progress',
439 664f05f0 Kostas Papadimitriou
        'CONNECTING': 'status-progress',
440 664f05f0 Kostas Papadimitriou
        'REMOVING': 'status-progress'
441 664f05f0 Kostas Papadimitriou
      },
442 664f05f0 Kostas Papadimitriou
      
443 664f05f0 Kostas Papadimitriou
      status_cls: function(status) {    
444 664f05f0 Kostas Papadimitriou
        return this.status_cls_map[this.model.get('ext_status')]
445 664f05f0 Kostas Papadimitriou
      },
446 664f05f0 Kostas Papadimitriou
447 664f05f0 Kostas Papadimitriou
      status_display: function(status) {
448 664f05f0 Kostas Papadimitriou
        var status;
449 664f05f0 Kostas Papadimitriou
        if (this.model.id == "snf-combined-public-network") {
450 664f05f0 Kostas Papadimitriou
          return "Internet"
451 664f05f0 Kostas Papadimitriou
        }
452 8d08f18a Kostas Papadimitriou
453 d233867a Kostas Papadimitriou
        var cidr = this.model.get('cidr');
454 d233867a Kostas Papadimitriou
        var status = this.model.get('ext_status');
455 d233867a Kostas Papadimitriou
        if (status != 'REMOVING' && cidr) {
456 d233867a Kostas Papadimitriou
          return cidr
457 d233867a Kostas Papadimitriou
        }
458 d233867a Kostas Papadimitriou
        return this.status_map[status];
459 664f05f0 Kostas Papadimitriou
      },
460 664f05f0 Kostas Papadimitriou
      
461 664f05f0 Kostas Papadimitriou
      connect_vms: function(vms, cb) {
462 664f05f0 Kostas Papadimitriou
        var finished = 0;
463 664f05f0 Kostas Papadimitriou
        var completed = function() {
464 664f05f0 Kostas Papadimitriou
          finished++;
465 664f05f0 Kostas Papadimitriou
          if (finished == vms.length) {
466 664f05f0 Kostas Papadimitriou
            cb();
467 664f05f0 Kostas Papadimitriou
          }
468 664f05f0 Kostas Papadimitriou
        }
469 664f05f0 Kostas Papadimitriou
        _.each(vms, function(vm) {
470 664f05f0 Kostas Papadimitriou
          this.model.connect_vm(vm, completed);
471 664f05f0 Kostas Papadimitriou
        }, this);
472 664f05f0 Kostas Papadimitriou
      },
473 664f05f0 Kostas Papadimitriou
      
474 a681ab44 Kostas Papadimitriou
      remove: function(model, e) {
475 a681ab44 Kostas Papadimitriou
        e && e.stopPropagation();
476 664f05f0 Kostas Papadimitriou
        this.model.actions.reset_pending();
477 664f05f0 Kostas Papadimitriou
        this.model.destroy({
478 d233867a Kostas Papadimitriou
          success: _.bind(function() {
479 d233867a Kostas Papadimitriou
            this.model.set({status: 'REMOVING'});
480 d233867a Kostas Papadimitriou
            this.model.set({ext_status: 'REMOVING'});
481 d233867a Kostas Papadimitriou
            // force status display update
482 d233867a Kostas Papadimitriou
            this.model.set({cidr: 'REMOVING'});
483 664f05f0 Kostas Papadimitriou
          }, this),
484 664f05f0 Kostas Papadimitriou
          silent: true
485 664f05f0 Kostas Papadimitriou
        });
486 664f05f0 Kostas Papadimitriou
      },
487 664f05f0 Kostas Papadimitriou
488 664f05f0 Kostas Papadimitriou
      show_connect_vms_overlay: function() {
489 664f05f0 Kostas Papadimitriou
        var view = new views.NetworkConnectVMsOverlay();
490 664f05f0 Kostas Papadimitriou
        vms = this.model.pluggable_vms();
491 664f05f0 Kostas Papadimitriou
        var cb = _.bind(function(vms) {
492 664f05f0 Kostas Papadimitriou
          view.set_in_progress();
493 664f05f0 Kostas Papadimitriou
          var cbinner = function() {
494 664f05f0 Kostas Papadimitriou
            view.hide();
495 664f05f0 Kostas Papadimitriou
            delete view;
496 664f05f0 Kostas Papadimitriou
          }
497 664f05f0 Kostas Papadimitriou
          this.connect_vms(vms, cbinner);
498 664f05f0 Kostas Papadimitriou
        }, this);
499 664f05f0 Kostas Papadimitriou
        view.show_vms(this.model, vms, [], cb, "subtitle");
500 664f05f0 Kostas Papadimitriou
      }
501 8d08f18a Kostas Papadimitriou
502 664f05f0 Kostas Papadimitriou
    });
503 664f05f0 Kostas Papadimitriou
    
504 664f05f0 Kostas Papadimitriou
    views.NetworksCollectionView = views.ext.CollectionView.extend({
505 664f05f0 Kostas Papadimitriou
      collection: storage.networks,
506 664f05f0 Kostas Papadimitriou
      collection_name: 'networks',
507 664f05f0 Kostas Papadimitriou
      model_view_cls: views.NetworkView,
508 664f05f0 Kostas Papadimitriou
      create_view_cls: views.NetworkCreateView,
509 664f05f0 Kostas Papadimitriou
      
510 664f05f0 Kostas Papadimitriou
      init: function() {
511 664f05f0 Kostas Papadimitriou
        this.public_added = false;
512 664f05f0 Kostas Papadimitriou
        views.NetworksCollectionView.__super__.init.apply(this, arguments);
513 664f05f0 Kostas Papadimitriou
      },
514 664f05f0 Kostas Papadimitriou
      
515 664f05f0 Kostas Papadimitriou
      check_empty: function() {
516 664f05f0 Kostas Papadimitriou
        views.NetworksCollectionView.__super__.check_empty.apply(this, arguments);
517 664f05f0 Kostas Papadimitriou
        //if (this.$(".private").children().length == 0) {
518 664f05f0 Kostas Papadimitriou
          //this.$(".private").hide();
519 664f05f0 Kostas Papadimitriou
        //} else {
520 664f05f0 Kostas Papadimitriou
          //this.$(".private").show();
521 664f05f0 Kostas Papadimitriou
        //}
522 664f05f0 Kostas Papadimitriou
      },
523 664f05f0 Kostas Papadimitriou
524 664f05f0 Kostas Papadimitriou
      add_model: function(m) {
525 664f05f0 Kostas Papadimitriou
        if (m.get('is_public') && !this.public_added) {
526 664f05f0 Kostas Papadimitriou
          this.combined_public = new models.networks.CombinedPublicNetwork();
527 664f05f0 Kostas Papadimitriou
          this.combined_public_view = new views.NetworkView({
528 664f05f0 Kostas Papadimitriou
            model: this.combined_public
529 664f05f0 Kostas Papadimitriou
          });
530 664f05f0 Kostas Papadimitriou
          this.add_model_view(this.combined_public_view, this.combined_public, 0);
531 664f05f0 Kostas Papadimitriou
          this.combined_public_view.$("i").hide();
532 664f05f0 Kostas Papadimitriou
          this.public_added = true;
533 664f05f0 Kostas Papadimitriou
        }
534 664f05f0 Kostas Papadimitriou
        return views.NetworksCollectionView.__super__.add_model.call(this, m);
535 664f05f0 Kostas Papadimitriou
      },
536 664f05f0 Kostas Papadimitriou
537 664f05f0 Kostas Papadimitriou
      remove_model: function(m) {
538 664f05f0 Kostas Papadimitriou
        if (m.id == 'snf-combined-public-network') {
539 664f05f0 Kostas Papadimitriou
          return;
540 664f05f0 Kostas Papadimitriou
        } else {
541 664f05f0 Kostas Papadimitriou
          return views.NetworksCollectionView.__super__.remove_model.call(this, m);
542 664f05f0 Kostas Papadimitriou
        }
543 664f05f0 Kostas Papadimitriou
      },
544 664f05f0 Kostas Papadimitriou
545 664f05f0 Kostas Papadimitriou
      get_model_view_cls: function(m) {
546 664f05f0 Kostas Papadimitriou
        if (!this.public_added) {
547 664f05f0 Kostas Papadimitriou
        }
548 664f05f0 Kostas Papadimitriou
        if (m.get('is_public')) {
549 664f05f0 Kostas Papadimitriou
          return false;
550 664f05f0 Kostas Papadimitriou
        }
551 664f05f0 Kostas Papadimitriou
        return views.NetworksCollectionView.__super__.get_model_view_cls.apply(this, [m]);
552 664f05f0 Kostas Papadimitriou
      },
553 664f05f0 Kostas Papadimitriou
      
554 664f05f0 Kostas Papadimitriou
      parent_for_model: function(m) {
555 664f05f0 Kostas Papadimitriou
        if (m.get('is_public')) {
556 664f05f0 Kostas Papadimitriou
          return this.list_el.find(".public");
557 664f05f0 Kostas Papadimitriou
        } else {
558 664f05f0 Kostas Papadimitriou
          return this.list_el.find(".private");
559 664f05f0 Kostas Papadimitriou
        }
560 664f05f0 Kostas Papadimitriou
      }
561 664f05f0 Kostas Papadimitriou
    });
562 664f05f0 Kostas Papadimitriou
563 664f05f0 Kostas Papadimitriou
    views.NetworksPaneView = views.ext.PaneView.extend({
564 664f05f0 Kostas Papadimitriou
      id: "pane",
565 664f05f0 Kostas Papadimitriou
      el: '#networks-pane',
566 664f05f0 Kostas Papadimitriou
      collection_view_cls: views.NetworksCollectionView,
567 664f05f0 Kostas Papadimitriou
      collection_view_selector: '#networks-list-view'
568 664f05f0 Kostas Papadimitriou
    });
569 664f05f0 Kostas Papadimitriou
570 664f05f0 Kostas Papadimitriou
    views.NetworkConnectVMsOverlay = views.Overlay.extend({
571 664f05f0 Kostas Papadimitriou
        title: "Connect machine",
572 664f05f0 Kostas Papadimitriou
        overlay_id: "overlay-select-vms",
573 664f05f0 Kostas Papadimitriou
        content_selector: "#network-vms-select-content",
574 664f05f0 Kostas Papadimitriou
        css_class: "overlay-info",
575 664f05f0 Kostas Papadimitriou
        allow_multiple: true,
576 8d08f18a Kostas Papadimitriou
577 664f05f0 Kostas Papadimitriou
        initialize: function() {
578 664f05f0 Kostas Papadimitriou
            views.NetworkConnectVMsOverlay.__super__.initialize.apply(this);
579 664f05f0 Kostas Papadimitriou
            this.list = this.$(".vms-list ul");
580 664f05f0 Kostas Papadimitriou
            this.empty_message = this.$(".empty-message");
581 664f05f0 Kostas Papadimitriou
            // flag for submit handler to avoid duplicate bindings
582 664f05f0 Kostas Papadimitriou
            this.submit_handler_set = false;
583 664f05f0 Kostas Papadimitriou
            this.in_progress = false;
584 8d08f18a Kostas Papadimitriou
        },
585 8d08f18a Kostas Papadimitriou
        
586 664f05f0 Kostas Papadimitriou
        handle_vm_click: function(el) {
587 664f05f0 Kostas Papadimitriou
            if (!this.allow_multiple) {
588 664f05f0 Kostas Papadimitriou
              $(el).closest("ul").find(".selected").removeClass("selected");
589 664f05f0 Kostas Papadimitriou
              $(el).addClass("selected");
590 664f05f0 Kostas Papadimitriou
            } else {
591 664f05f0 Kostas Papadimitriou
              $(el).toggleClass("selected");
592 664f05f0 Kostas Papadimitriou
            }
593 126a01f2 Kostas Papadimitriou
        },
594 126a01f2 Kostas Papadimitriou
595 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
596 664f05f0 Kostas Papadimitriou
            var self = this;
597 664f05f0 Kostas Papadimitriou
            this.list.find("li").click(function() {
598 664f05f0 Kostas Papadimitriou
                self.handle_vm_click($(this));
599 664f05f0 Kostas Papadimitriou
            });
600 664f05f0 Kostas Papadimitriou
            
601 664f05f0 Kostas Papadimitriou
            if (!this.submit_handler_set) {
602 664f05f0 Kostas Papadimitriou
                // avoid duplicate submits
603 664f05f0 Kostas Papadimitriou
                this.el.find(".create, .assign").click(_.bind(function() {
604 664f05f0 Kostas Papadimitriou
                  if (!this.in_progress) {
605 664f05f0 Kostas Papadimitriou
                    this.submit();
606 664f05f0 Kostas Papadimitriou
                  }
607 101e6604 Kostas Papadimitriou
                }, this));
608 664f05f0 Kostas Papadimitriou
                this.submit_handler_set = true;
609 8d08f18a Kostas Papadimitriou
            }
610 101e6604 Kostas Papadimitriou
        },
611 8d08f18a Kostas Papadimitriou
612 664f05f0 Kostas Papadimitriou
        reset: function() {
613 664f05f0 Kostas Papadimitriou
            this.list.find("li").remove();
614 8d08f18a Kostas Papadimitriou
        },
615 8d08f18a Kostas Papadimitriou
616 664f05f0 Kostas Papadimitriou
        beforeOpen: function() {
617 664f05f0 Kostas Papadimitriou
            this.reset();
618 664f05f0 Kostas Papadimitriou
            this.update_layout();
619 664f05f0 Kostas Papadimitriou
        },
620 664f05f0 Kostas Papadimitriou
        
621 664f05f0 Kostas Papadimitriou
        vm: function(vm) {
622 664f05f0 Kostas Papadimitriou
            if (vm.id) { var id = vm.id } else {var id = vm}
623 664f05f0 Kostas Papadimitriou
            return this.list.find(".vm-" + id);
624 8d08f18a Kostas Papadimitriou
        },
625 8d08f18a Kostas Papadimitriou
626 664f05f0 Kostas Papadimitriou
        get_selected: function() {
627 664f05f0 Kostas Papadimitriou
            return this.list.find(".selected").map(function() {return $(this).data('vm')})
628 8d08f18a Kostas Papadimitriou
        },
629 8d08f18a Kostas Papadimitriou
630 8d08f18a Kostas Papadimitriou
        update_layout: function() {
631 664f05f0 Kostas Papadimitriou
            this.unset_in_progress();
632 664f05f0 Kostas Papadimitriou
            this.in_progress = false;
633 126a01f2 Kostas Papadimitriou
634 664f05f0 Kostas Papadimitriou
            if (this.vms.length == 0) {
635 664f05f0 Kostas Papadimitriou
                this.empty_message.show();
636 126a01f2 Kostas Papadimitriou
            } else {
637 664f05f0 Kostas Papadimitriou
                this.empty_message.hide();
638 126a01f2 Kostas Papadimitriou
            }
639 8d08f18a Kostas Papadimitriou
640 664f05f0 Kostas Papadimitriou
            _.each(this.vms, _.bind(function(vm){
641 664f05f0 Kostas Papadimitriou
                var html = '<li class="vm option options-object vm-{0}">' +
642 664f05f0 Kostas Papadimitriou
                           '<div class="options-object-cont">' +
643 664f05f0 Kostas Papadimitriou
                           '{2}' + 
644 664f05f0 Kostas Papadimitriou
                           '<span class="title">{1}</span>' + 
645 664f05f0 Kostas Papadimitriou
                           '<span class="value">{3}</span></div>' + 
646 664f05f0 Kostas Papadimitriou
                           '</li>';
647 664f05f0 Kostas Papadimitriou
                var el = $(html.format(vm.id, 
648 664f05f0 Kostas Papadimitriou
                       util.truncate(_.escape(vm.get("name")), 23), 
649 664f05f0 Kostas Papadimitriou
                       snf.ui.helpers.vm_icon_tag(vm, "small", {'class':'os'}),
650 664f05f0 Kostas Papadimitriou
                       _.escape(vm.get_os())
651 664f05f0 Kostas Papadimitriou
                ));
652 664f05f0 Kostas Papadimitriou
                el.data({vm:vm, vm_id:vm.id});
653 664f05f0 Kostas Papadimitriou
                this.list.append(el);
654 8d08f18a Kostas Papadimitriou
655 664f05f0 Kostas Papadimitriou
                vm.bind("remove", function(){ el.remove()})
656 664f05f0 Kostas Papadimitriou
                vm.bind("change:name", function(i,v){el.find(".title").text(v)})
657 664f05f0 Kostas Papadimitriou
            }, this));
658 664f05f0 Kostas Papadimitriou
            
659 8d08f18a Kostas Papadimitriou
            this.init_handlers();
660 664f05f0 Kostas Papadimitriou
            this.set_selected();
661 8d08f18a Kostas Papadimitriou
        },
662 8d08f18a Kostas Papadimitriou
663 664f05f0 Kostas Papadimitriou
        set_selected: function() {
664 664f05f0 Kostas Papadimitriou
            _.each(this.selected, _.bind(function(el){
665 664f05f0 Kostas Papadimitriou
                this.vm(el).addClass("selected");
666 8d08f18a Kostas Papadimitriou
            }, this));
667 8d08f18a Kostas Papadimitriou
        },
668 8d08f18a Kostas Papadimitriou
        
669 664f05f0 Kostas Papadimitriou
        set_in_progress: function() {
670 664f05f0 Kostas Papadimitriou
          this.$(".form-action").addClass("in-progress");
671 664f05f0 Kostas Papadimitriou
          this.in_progress = true;
672 8d08f18a Kostas Papadimitriou
        },
673 8d08f18a Kostas Papadimitriou
674 664f05f0 Kostas Papadimitriou
        unset_in_progress: function() {
675 664f05f0 Kostas Papadimitriou
          this.$(".form-action").removeClass("in-progress");
676 664f05f0 Kostas Papadimitriou
          this.in_progress = false;
677 8d08f18a Kostas Papadimitriou
        },
678 8d08f18a Kostas Papadimitriou
679 664f05f0 Kostas Papadimitriou
        show_vms: function(network, vms, selected, callback, subtitle) {
680 664f05f0 Kostas Papadimitriou
            this.network = network;
681 664f05f0 Kostas Papadimitriou
            this.reset();
682 664f05f0 Kostas Papadimitriou
            if (network) {
683 664f05f0 Kostas Papadimitriou
              this.set_subtitle(network.escape("name"));
684 8d08f18a Kostas Papadimitriou
            } else {
685 664f05f0 Kostas Papadimitriou
              this.set_subtitle(subtitle);
686 8d08f18a Kostas Papadimitriou
            }
687 664f05f0 Kostas Papadimitriou
            this.vms = vms;
688 664f05f0 Kostas Papadimitriou
            this.selected = selected;
689 664f05f0 Kostas Papadimitriou
            this.cb = callback;
690 664f05f0 Kostas Papadimitriou
            this.unset_in_progress();
691 664f05f0 Kostas Papadimitriou
            this.show(true);
692 664f05f0 Kostas Papadimitriou
        },
693 8d08f18a Kostas Papadimitriou
694 8d08f18a Kostas Papadimitriou
        submit: function() {
695 664f05f0 Kostas Papadimitriou
            if (!this.get_selected().length) { return }
696 664f05f0 Kostas Papadimitriou
            this.cb(this.get_selected());
697 8d08f18a Kostas Papadimitriou
        }
698 8d08f18a Kostas Papadimitriou
    });
699 c68ad72e Kostas Papadimitriou
    
700 c68ad72e Kostas Papadimitriou
    views.NetworkSelectModelView = views.ext.ModelView.extend({
701 c68ad72e Kostas Papadimitriou
      select: function() {
702 9c8f31ad Kostas Papadimitriou
        if (!this.delegate_checked) {
703 c68ad72e Kostas Papadimitriou
          this.input.attr("checked", true);
704 c68ad72e Kostas Papadimitriou
          this.item.addClass("selected");
705 c68ad72e Kostas Papadimitriou
        }
706 c68ad72e Kostas Papadimitriou
        this.selected = true;
707 c68ad72e Kostas Papadimitriou
        this.trigger("change:select", this, this.selected);
708 c68ad72e Kostas Papadimitriou
      },
709 c68ad72e Kostas Papadimitriou
710 c68ad72e Kostas Papadimitriou
      deselect: function() {
711 9c8f31ad Kostas Papadimitriou
        if (!this.delegate_checked) {
712 c68ad72e Kostas Papadimitriou
          this.input.attr("checked", false);
713 c68ad72e Kostas Papadimitriou
          this.item.removeClass("selected");
714 c68ad72e Kostas Papadimitriou
        }
715 c68ad72e Kostas Papadimitriou
        this.selected = false;
716 c68ad72e Kostas Papadimitriou
        this.trigger("change:select", this, this.selected);
717 c68ad72e Kostas Papadimitriou
      },
718 c68ad72e Kostas Papadimitriou
      
719 c68ad72e Kostas Papadimitriou
      toggle_select: function() {
720 c68ad72e Kostas Papadimitriou
        if (this.selected) { 
721 c68ad72e Kostas Papadimitriou
          this.deselect();
722 c68ad72e Kostas Papadimitriou
        } else {
723 c68ad72e Kostas Papadimitriou
          this.select();
724 c68ad72e Kostas Papadimitriou
        }
725 c68ad72e Kostas Papadimitriou
      },
726 c68ad72e Kostas Papadimitriou
727 c68ad72e Kostas Papadimitriou
      post_init_element: function() {
728 c68ad72e Kostas Papadimitriou
        this.input = $(this.$("input").get(0));
729 c68ad72e Kostas Papadimitriou
        this.item = $(this.$(".select-item").get(0));
730 9c8f31ad Kostas Papadimitriou
        this.delegate_checked = this.model.get('noselect');
731 c68ad72e Kostas Papadimitriou
        this.deselect();
732 c68ad72e Kostas Papadimitriou
733 c68ad72e Kostas Papadimitriou
        var self = this;
734 c68ad72e Kostas Papadimitriou
        if (self.model.get('forced')) {
735 c68ad72e Kostas Papadimitriou
          this.select();
736 c68ad72e Kostas Papadimitriou
          this.input.attr("disabled", true);
737 c68ad72e Kostas Papadimitriou
          $(this.el).attr('title', this.forced_title);
738 c68ad72e Kostas Papadimitriou
          $(this.el).tooltip({
739 c68ad72e Kostas Papadimitriou
            'tipClass': 'tooltip', 
740 c68ad72e Kostas Papadimitriou
            'position': 'top center',
741 9c8f31ad Kostas Papadimitriou
            'offset': [29, 0]
742 c68ad72e Kostas Papadimitriou
          });
743 c68ad72e Kostas Papadimitriou
        }
744 9c8f31ad Kostas Papadimitriou
        
745 c68ad72e Kostas Papadimitriou
        $(this.item).click(function(e) {
746 c68ad72e Kostas Papadimitriou
          if (self.model.get('forced')) { return }
747 c68ad72e Kostas Papadimitriou
          e.stopPropagation();
748 c68ad72e Kostas Papadimitriou
          self.toggle_select();
749 c68ad72e Kostas Papadimitriou
        });
750 c68ad72e Kostas Papadimitriou
        
751 c68ad72e Kostas Papadimitriou
        views.NetworkSelectModelView.__super__.post_init_element.apply(this,
752 c68ad72e Kostas Papadimitriou
                                                                       arguments);
753 c68ad72e Kostas Papadimitriou
      }
754 c68ad72e Kostas Papadimitriou
    });
755 c68ad72e Kostas Papadimitriou
756 c68ad72e Kostas Papadimitriou
    views.NetworkSelectNetworkTypeModelView = views.NetworkSelectModelView.extend({
757 c68ad72e Kostas Papadimitriou
      get_network_icon: function() {
758 c68ad72e Kostas Papadimitriou
        var ico = this.model.get('is_public') ? 'internet-small.png' : 'network-small.png';
759 c68ad72e Kostas Papadimitriou
        return synnefo.config.media_url + 'images/' + ico;
760 c68ad72e Kostas Papadimitriou
      },
761 c68ad72e Kostas Papadimitriou
      forced_title: 'You machine will be automatically connected ' +
762 c68ad72e Kostas Papadimitriou
                    'to this network.'
763 c68ad72e Kostas Papadimitriou
    });
764 c68ad72e Kostas Papadimitriou
765 c68ad72e Kostas Papadimitriou
    views.NetworkSelectPublicNetwork = views.NetworkSelectNetworkTypeModelView.extend({
766 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-public-item-tpl',
767 c68ad72e Kostas Papadimitriou
      classes: 'public-network',
768 c68ad72e Kostas Papadimitriou
      post_init_element: function() {
769 c68ad72e Kostas Papadimitriou
        views.NetworkSelectPublicNetwork.__super__.post_init_element.apply(this);
770 c68ad72e Kostas Papadimitriou
        //$(this.el).attr('title', 'Public network tooltip');
771 c68ad72e Kostas Papadimitriou
        //$(this.el).tooltip({
772 c68ad72e Kostas Papadimitriou
          //'tipClass': 'tooltip', 
773 c68ad72e Kostas Papadimitriou
          //'position': 'top center',
774 c68ad72e Kostas Papadimitriou
          //'offset': [-5, 0]
775 c68ad72e Kostas Papadimitriou
        //});
776 c68ad72e Kostas Papadimitriou
777 c68ad72e Kostas Papadimitriou
      }
778 c68ad72e Kostas Papadimitriou
    });
779 c68ad72e Kostas Papadimitriou
780 c68ad72e Kostas Papadimitriou
    views.NetworkSelectPrivateNetwork = views.NetworkSelectNetworkTypeModelView.extend({
781 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-private-item-tpl',
782 c68ad72e Kostas Papadimitriou
      classes: 'private-network'
783 c68ad72e Kostas Papadimitriou
    });
784 c68ad72e Kostas Papadimitriou
    
785 c68ad72e Kostas Papadimitriou
    views.NetworkSelectTypeView = views.ext.CollectionView.extend({});
786 c68ad72e Kostas Papadimitriou
    views.NetworkSelectPublicNetworks = views.NetworkSelectTypeView.extend({
787 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-public-tpl',
788 c68ad72e Kostas Papadimitriou
      model_view_cls: views.NetworkSelectPublicNetwork,
789 c68ad72e Kostas Papadimitriou
      get_floating_ips: function() {
790 4bf6778f Kostas Papadimitriou
        var ips = [];
791 4bf6778f Kostas Papadimitriou
        _.each(this._subviews, function(view) {
792 4bf6778f Kostas Papadimitriou
          _.each(view._subviews, function(view) {
793 4bf6778f Kostas Papadimitriou
            if (view.selected_ips) {
794 4bf6778f Kostas Papadimitriou
              _.each(view.selected_ips, function(m) {
795 4bf6778f Kostas Papadimitriou
                ips.push(m.id);
796 4bf6778f Kostas Papadimitriou
              }, this);
797 4bf6778f Kostas Papadimitriou
            }
798 4bf6778f Kostas Papadimitriou
          }, this);
799 4bf6778f Kostas Papadimitriou
        }, this);
800 4bf6778f Kostas Papadimitriou
        return ips;
801 c68ad72e Kostas Papadimitriou
      }
802 c68ad72e Kostas Papadimitriou
    });
803 c68ad72e Kostas Papadimitriou
    
804 c68ad72e Kostas Papadimitriou
    views.NetworkSelectFloatingIpView = views.NetworkSelectModelView.extend({
805 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-floating-ip-tpl'
806 c68ad72e Kostas Papadimitriou
    });
807 c68ad72e Kostas Papadimitriou
808 c68ad72e Kostas Papadimitriou
    views.NetworkSelectFloatingIpsView = views.ext.CollectionView.extend({
809 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-floating-ips-tpl',
810 c68ad72e Kostas Papadimitriou
      model_view_cls: views.NetworkSelectFloatingIpView,
811 c68ad72e Kostas Papadimitriou
812 9c8f31ad Kostas Papadimitriou
      select_if_available: function() {
813 c68ad72e Kostas Papadimitriou
        var selected = false;
814 9c8f31ad Kostas Papadimitriou
        if (this._subviews[0]) {
815 9c8f31ad Kostas Papadimitriou
          this._subviews[0].select();
816 9c8f31ad Kostas Papadimitriou
        }
817 c68ad72e Kostas Papadimitriou
      },
818 c68ad72e Kostas Papadimitriou
819 c68ad72e Kostas Papadimitriou
      deselect_all: function() {
820 c68ad72e Kostas Papadimitriou
        this.each_ip_view(function(v) { v.deselect() });
821 c68ad72e Kostas Papadimitriou
      },
822 c68ad72e Kostas Papadimitriou
823 c68ad72e Kostas Papadimitriou
      each_ip_view: function(cb) {
824 c68ad72e Kostas Papadimitriou
        _.each(this._subviews, function(view) {
825 c68ad72e Kostas Papadimitriou
          if (view instanceof views.NetworkSelectFloatingIpView) {
826 c68ad72e Kostas Papadimitriou
            cb(view);
827 c68ad72e Kostas Papadimitriou
          }
828 c68ad72e Kostas Papadimitriou
        })
829 c68ad72e Kostas Papadimitriou
      },
830 c68ad72e Kostas Papadimitriou
831 c68ad72e Kostas Papadimitriou
      post_init: function() {
832 c68ad72e Kostas Papadimitriou
        var parent = this.parent_view;
833 c68ad72e Kostas Papadimitriou
        var self = this;
834 9c8f31ad Kostas Papadimitriou
835 9c8f31ad Kostas Papadimitriou
        this.quota = synnefo.storage.quotas.get("cyclades.floating_ip");
836 9c8f31ad Kostas Papadimitriou
        this.selected_ips = [];
837 c68ad72e Kostas Papadimitriou
        this.handle_ip_select = _.bind(this.handle_ip_select, this);
838 c68ad72e Kostas Papadimitriou
        this.create = this.$(".floating-ip.create");
839 9c8f31ad Kostas Papadimitriou
        
840 9c8f31ad Kostas Papadimitriou
        this.quota.bind("change", _.bind(this.update_available, this));
841 9c8f31ad Kostas Papadimitriou
        this.collection.bind("change", _.bind(this.update_available, this))
842 9c8f31ad Kostas Papadimitriou
        this.collection.bind("add", _.bind(this.update_available, this))
843 9c8f31ad Kostas Papadimitriou
        this.collection.bind("remove", _.bind(this.update_available, this))
844 c68ad72e Kostas Papadimitriou
845 9c8f31ad Kostas Papadimitriou
        parent.bind("change:select", function(view, selected) {
846 9c8f31ad Kostas Papadimitriou
          if (selected) { this.show_parent() } else { this.hide_parent() }
847 9c8f31ad Kostas Papadimitriou
        }, this);
848 9c8f31ad Kostas Papadimitriou
849 9c8f31ad Kostas Papadimitriou
        this.create.click(function(e) {
850 9c8f31ad Kostas Papadimitriou
          e.preventDefault();
851 c68ad72e Kostas Papadimitriou
          self.create_ip();
852 9c8f31ad Kostas Papadimitriou
        });
853 9c8f31ad Kostas Papadimitriou
        this.update_available();
854 c68ad72e Kostas Papadimitriou
      },
855 c68ad72e Kostas Papadimitriou
      
856 9c8f31ad Kostas Papadimitriou
      hide_parent: function() {
857 9c8f31ad Kostas Papadimitriou
        this.parent_view.item.removeClass("selected");
858 9c8f31ad Kostas Papadimitriou
        this.parent_view.input.attr("checked", false);
859 9c8f31ad Kostas Papadimitriou
        this.parent_view.selected = false;
860 9c8f31ad Kostas Papadimitriou
        this.deselect_all();
861 9c8f31ad Kostas Papadimitriou
        this.hide(true);
862 9c8f31ad Kostas Papadimitriou
      },
863 9c8f31ad Kostas Papadimitriou
864 9c8f31ad Kostas Papadimitriou
      show_parent: function() {
865 9c8f31ad Kostas Papadimitriou
        var left = this.quota.get_available();
866 9c8f31ad Kostas Papadimitriou
        var available = this.collection.length || left;
867 9c8f31ad Kostas Papadimitriou
        if (!available) { 
868 9c8f31ad Kostas Papadimitriou
          this.hide_parent();
869 9c8f31ad Kostas Papadimitriou
          return;
870 9c8f31ad Kostas Papadimitriou
        }
871 9c8f31ad Kostas Papadimitriou
        this.parent_view.item.addClass("selected");
872 9c8f31ad Kostas Papadimitriou
        this.parent_view.input.attr("checked", true);
873 9c8f31ad Kostas Papadimitriou
        this.parent_view.selected = true;
874 9c8f31ad Kostas Papadimitriou
        this.show(true);
875 9c8f31ad Kostas Papadimitriou
        this.select_if_available();
876 9c8f31ad Kostas Papadimitriou
      },
877 9c8f31ad Kostas Papadimitriou
878 9c8f31ad Kostas Papadimitriou
      update_available: function() {
879 9c8f31ad Kostas Papadimitriou
        var left = this.quota.get_available();
880 9c8f31ad Kostas Papadimitriou
        var available = this.collection.length || left;
881 9c8f31ad Kostas Papadimitriou
        var available_el = this.parent_view.$(".available");
882 9c8f31ad Kostas Papadimitriou
        var no_available_el = this.parent_view.$(".no-available");
883 9c8f31ad Kostas Papadimitriou
        var create = this.$(".create.model-item");
884 9c8f31ad Kostas Papadimitriou
        var create_link = this.$(".create a");
885 9c8f31ad Kostas Papadimitriou
        var create_no_available = this.$(".create .no-available");
886 9c8f31ad Kostas Papadimitriou
887 9c8f31ad Kostas Papadimitriou
        if (!available) {
888 9c8f31ad Kostas Papadimitriou
          // no ip's available to select
889 9c8f31ad Kostas Papadimitriou
          this.hide_parent();
890 9c8f31ad Kostas Papadimitriou
          available_el.hide();
891 9c8f31ad Kostas Papadimitriou
          no_available_el.show();
892 9c8f31ad Kostas Papadimitriou
        } else {
893 9c8f31ad Kostas Papadimitriou
          // available floating ip
894 9c8f31ad Kostas Papadimitriou
          var available_text = "{0} IP's available.".format(
895 9c8f31ad Kostas Papadimitriou
            this.collection.length + this.quota.get_available());
896 9c8f31ad Kostas Papadimitriou
          available_el.removeClass("hidden").text(available_text).show();
897 9c8f31ad Kostas Papadimitriou
          available_el.show();
898 9c8f31ad Kostas Papadimitriou
          no_available_el.hide();
899 9c8f31ad Kostas Papadimitriou
        }
900 9c8f31ad Kostas Papadimitriou
901 9c8f31ad Kostas Papadimitriou
        if (left) {
902 9c8f31ad Kostas Papadimitriou
          // available quota
903 9c8f31ad Kostas Papadimitriou
          create.removeClass("no-available");
904 9c8f31ad Kostas Papadimitriou
          create.show();
905 9c8f31ad Kostas Papadimitriou
          //create_link.show();
906 9c8f31ad Kostas Papadimitriou
          create_no_available.hide();
907 9c8f31ad Kostas Papadimitriou
        } else {
908 9c8f31ad Kostas Papadimitriou
          // no available quota
909 9c8f31ad Kostas Papadimitriou
          create.addClass("no-available");
910 9c8f31ad Kostas Papadimitriou
          create.show();
911 9c8f31ad Kostas Papadimitriou
          //create_link.hide();
912 9c8f31ad Kostas Papadimitriou
          create_no_available.show();
913 9c8f31ad Kostas Papadimitriou
        }
914 9c8f31ad Kostas Papadimitriou
        //
915 9c8f31ad Kostas Papadimitriou
        this.update_selected();
916 9c8f31ad Kostas Papadimitriou
      },
917 9c8f31ad Kostas Papadimitriou
      
918 9c8f31ad Kostas Papadimitriou
      update_selected: function() {
919 9c8f31ad Kostas Papadimitriou
        if (this.selected_ips.length) {
920 9c8f31ad Kostas Papadimitriou
          this.parent_view.input.attr("checked", true);
921 9c8f31ad Kostas Papadimitriou
          this.parent_view.item.addClass("selected");
922 9c8f31ad Kostas Papadimitriou
          this.parent_view.item.selected = true;
923 9c8f31ad Kostas Papadimitriou
        } else {
924 9c8f31ad Kostas Papadimitriou
          this.parent_view.input.attr("checked", false);
925 9c8f31ad Kostas Papadimitriou
          this.parent_view.item.removeClass("selected");
926 9c8f31ad Kostas Papadimitriou
          this.parent_view.item.selected = false;
927 9c8f31ad Kostas Papadimitriou
        }
928 c68ad72e Kostas Papadimitriou
      },
929 c68ad72e Kostas Papadimitriou
930 c68ad72e Kostas Papadimitriou
      post_remove_model_view: function(view) {
931 9c8f31ad Kostas Papadimitriou
        view.deselect();
932 c68ad72e Kostas Papadimitriou
        view.unbind("change:select", this.handle_ip_select)
933 c68ad72e Kostas Papadimitriou
      },
934 c68ad72e Kostas Papadimitriou
935 c68ad72e Kostas Papadimitriou
      handle_create_error: function() {},
936 c68ad72e Kostas Papadimitriou
937 c68ad72e Kostas Papadimitriou
      create_ip: function() {
938 9c8f31ad Kostas Papadimitriou
        if (!this.quota.get_available()) { return }
939 c68ad72e Kostas Papadimitriou
        synnefo.storage.floating_ips.create({floatingip:{}}, {
940 c68ad72e Kostas Papadimitriou
          error: _.bind(this.handle_create_error, this),
941 c68ad72e Kostas Papadimitriou
          skip_api_error: true
942 c68ad72e Kostas Papadimitriou
        });
943 c68ad72e Kostas Papadimitriou
      },
944 c68ad72e Kostas Papadimitriou
945 9c8f31ad Kostas Papadimitriou
      post_add_model_view: function(view, model) {
946 9c8f31ad Kostas Papadimitriou
        view.bind("change:select", this.handle_ip_select)
947 9c8f31ad Kostas Papadimitriou
        if (!this.selected_ips.length && this._subviews.length == 1) {
948 9c8f31ad Kostas Papadimitriou
          this._subviews[0].select();
949 9c8f31ad Kostas Papadimitriou
          if (!_.contains(this.selected_ips, model)) {
950 9c8f31ad Kostas Papadimitriou
            this.selected_ips.push(model);
951 9c8f31ad Kostas Papadimitriou
          }
952 9c8f31ad Kostas Papadimitriou
        }
953 9c8f31ad Kostas Papadimitriou
      },
954 9c8f31ad Kostas Papadimitriou
955 c68ad72e Kostas Papadimitriou
      handle_ip_select: function(view) {
956 c68ad72e Kostas Papadimitriou
        if (view.selected) {
957 9c8f31ad Kostas Papadimitriou
          if (!_.contains(this.selected_ips, view.model)) {
958 9c8f31ad Kostas Papadimitriou
            this.selected_ips.push(view.model);
959 9c8f31ad Kostas Papadimitriou
          }
960 c68ad72e Kostas Papadimitriou
        } else {
961 9c8f31ad Kostas Papadimitriou
          this.selected_ips = _.without(this.selected_ips, view.model);
962 c68ad72e Kostas Papadimitriou
        }
963 c68ad72e Kostas Papadimitriou
        this.update_selected();
964 c68ad72e Kostas Papadimitriou
      },
965 c68ad72e Kostas Papadimitriou
      
966 c68ad72e Kostas Papadimitriou
      post_show: function() {
967 9c8f31ad Kostas Papadimitriou
        this.update_available();
968 c68ad72e Kostas Papadimitriou
      },
969 c68ad72e Kostas Papadimitriou
970 c68ad72e Kostas Papadimitriou
      get_floating_ips: function() {
971 9c8f31ad Kostas Papadimitriou
        return this.selected_ips;
972 c68ad72e Kostas Papadimitriou
      }
973 c68ad72e Kostas Papadimitriou
    });
974 c68ad72e Kostas Papadimitriou
975 c68ad72e Kostas Papadimitriou
    views.NetworkSelectPrivateNetworks = views.NetworkSelectTypeView.extend({
976 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-private-tpl',
977 c68ad72e Kostas Papadimitriou
      model_view_cls: views.NetworkSelectPrivateNetwork,
978 c68ad72e Kostas Papadimitriou
      get_networks: function() {
979 c68ad72e Kostas Papadimitriou
        return _.filter(_.map(this._subviews, function(view) {
980 c68ad72e Kostas Papadimitriou
          if (view.selected) { return view.model.id }
981 c68ad72e Kostas Papadimitriou
        }), function(id) { return id });
982 c68ad72e Kostas Papadimitriou
      }
983 c68ad72e Kostas Papadimitriou
984 c68ad72e Kostas Papadimitriou
    });
985 c68ad72e Kostas Papadimitriou
986 c68ad72e Kostas Papadimitriou
    views.NetworkSelectView = views.ext.ModelView.extend({
987 c68ad72e Kostas Papadimitriou
      rivets_view: true,
988 c68ad72e Kostas Papadimitriou
      tpl: '#networks-select-view-tpl',
989 c68ad72e Kostas Papadimitriou
      select_public: true,
990 4bf6778f Kostas Papadimitriou
      
991 4bf6778f Kostas Papadimitriou
      forced_values_title_map: {
992 4bf6778f Kostas Papadimitriou
        "SNF:ANY_PUBLIC_IPV6": "Public IPv6 Network",
993 4bf6778f Kostas Papadimitriou
        "SNF:ANY_PUBLIC_IPV4": "Public IPv4 Network"
994 4bf6778f Kostas Papadimitriou
      },
995 c68ad72e Kostas Papadimitriou
996 c68ad72e Kostas Papadimitriou
      initialize: function(options) {
997 c68ad72e Kostas Papadimitriou
        this.quotas = synnefo.storage.quotas.get('cyclades.private_network');
998 c68ad72e Kostas Papadimitriou
        options = options || {};
999 c68ad72e Kostas Papadimitriou
        options.model = options.model || new models.Model();
1000 c68ad72e Kostas Papadimitriou
        this.private_networks = new Backbone.FilteredCollection(undefined, {
1001 c68ad72e Kostas Papadimitriou
          collection: synnefo.storage.networks,
1002 c68ad72e Kostas Papadimitriou
          collectionFilter: function(m) {
1003 c68ad72e Kostas Papadimitriou
            return !m.get('is_public')
1004 c68ad72e Kostas Papadimitriou
        }});
1005 c68ad72e Kostas Papadimitriou
1006 c68ad72e Kostas Papadimitriou
        this.public_networks = new Backbone.Collection();
1007 4bf6778f Kostas Papadimitriou
        this.public_networks.comparator = function(m) {
1008 4bf6778f Kostas Papadimitriou
          if (m.get('forced')) {
1009 4bf6778f Kostas Papadimitriou
            return -1
1010 4bf6778f Kostas Papadimitriou
          }  
1011 4bf6778f Kostas Papadimitriou
          return 100;
1012 4bf6778f Kostas Papadimitriou
        }
1013 4bf6778f Kostas Papadimitriou
        
1014 4bf6778f Kostas Papadimitriou
        if (synnefo.config.forced_server_networks.length) {
1015 4bf6778f Kostas Papadimitriou
          _.each(synnefo.config.forced_server_networks, function(network) {
1016 4bf6778f Kostas Papadimitriou
            var forced = synnefo.storage.networks.get(network);
1017 4bf6778f Kostas Papadimitriou
            if (!forced) {
1018 4bf6778f Kostas Papadimitriou
              var name = this.forced_values_title_map[network];
1019 4bf6778f Kostas Papadimitriou
              if (!name) { name = "Forced network ({0})".format(network)}
1020 4bf6778f Kostas Papadimitriou
              forced = new models.networks.Network({
1021 4bf6778f Kostas Papadimitriou
                id: network,
1022 4bf6778f Kostas Papadimitriou
                name: name, 
1023 4bf6778f Kostas Papadimitriou
                subnets: [],
1024 4bf6778f Kostas Papadimitriou
                is_public: true,
1025 4bf6778f Kostas Papadimitriou
                forced: true
1026 4bf6778f Kostas Papadimitriou
              });
1027 4bf6778f Kostas Papadimitriou
            } else {
1028 4bf6778f Kostas Papadimitriou
              forced.set({'forced': true});
1029 4bf6778f Kostas Papadimitriou
            }
1030 4bf6778f Kostas Papadimitriou
            this.public_networks.add(forced);
1031 4bf6778f Kostas Papadimitriou
          }, this);
1032 4bf6778f Kostas Papadimitriou
        }
1033 c68ad72e Kostas Papadimitriou
1034 c68ad72e Kostas Papadimitriou
        // combined public
1035 c68ad72e Kostas Papadimitriou
        this.combined_public = new models.networks.CombinedPublicNetwork();
1036 4bf6778f Kostas Papadimitriou
        this.combined_public.set({noselect: true, name: 'Internet', forced: false});
1037 c68ad72e Kostas Papadimitriou
        this.public_networks.add(this.combined_public);
1038 c68ad72e Kostas Papadimitriou
1039 c68ad72e Kostas Papadimitriou
        model_attrs = {
1040 c68ad72e Kostas Papadimitriou
          public_collection: this.public_networks,
1041 c68ad72e Kostas Papadimitriou
          private_collection: this.private_networks,
1042 c68ad72e Kostas Papadimitriou
          floating_selected: true
1043 c68ad72e Kostas Papadimitriou
        }
1044 c68ad72e Kostas Papadimitriou
1045 c68ad72e Kostas Papadimitriou
        options.model.set(model_attrs);
1046 c68ad72e Kostas Papadimitriou
        this._configure(options);
1047 c68ad72e Kostas Papadimitriou
        return views.NetworkSelectView.__super__.initialize.call(this, options);
1048 c68ad72e Kostas Papadimitriou
      },
1049 c68ad72e Kostas Papadimitriou
1050 c68ad72e Kostas Papadimitriou
      get_selected_floating_ips: function() {
1051 c68ad72e Kostas Papadimitriou
        var ips = [];
1052 c68ad72e Kostas Papadimitriou
        _.each(this._subviews, function(view) {
1053 c68ad72e Kostas Papadimitriou
          if (view.get_floating_ips) {
1054 c68ad72e Kostas Papadimitriou
            ips = _.union(ips, view.get_floating_ips());
1055 c68ad72e Kostas Papadimitriou
          }
1056 c68ad72e Kostas Papadimitriou
        }, this);
1057 c68ad72e Kostas Papadimitriou
        return _.filter(
1058 c68ad72e Kostas Papadimitriou
          _.map(ips, function(ipid) { 
1059 c68ad72e Kostas Papadimitriou
          return synnefo.storage.floating_ips.get(parseInt(ipid))
1060 c68ad72e Kostas Papadimitriou
        }), function(ip) { console.log("IP", ip); return ip });
1061 c68ad72e Kostas Papadimitriou
      },
1062 c68ad72e Kostas Papadimitriou
1063 c68ad72e Kostas Papadimitriou
      get_selected_networks: function() {
1064 c68ad72e Kostas Papadimitriou
        var networks = [];
1065 c68ad72e Kostas Papadimitriou
        _.each(this._subviews, function(view) {
1066 c68ad72e Kostas Papadimitriou
          if (view.get_networks) {
1067 c68ad72e Kostas Papadimitriou
            networks = _.union(networks, view.get_networks());
1068 c68ad72e Kostas Papadimitriou
          }
1069 c68ad72e Kostas Papadimitriou
        }, this);
1070 c68ad72e Kostas Papadimitriou
        return _.filter(
1071 c68ad72e Kostas Papadimitriou
          _.map(networks, function(netid) { 
1072 c68ad72e Kostas Papadimitriou
          return synnefo.storage.networks.get(netid)
1073 c68ad72e Kostas Papadimitriou
        }), function(net) { return net });
1074 c68ad72e Kostas Papadimitriou
      }
1075 c68ad72e Kostas Papadimitriou
    });
1076 664f05f0 Kostas Papadimitriou
 
1077 8d08f18a Kostas Papadimitriou
})(this);