Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / ui / web / ui_main_view.js @ 643fe7e3

History | View | Annotate | Download (41.7 kB)

1 00469232 Kostas Papadimitriou
// Copyright 2011 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
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
    var util = snf.util;
51 8d08f18a Kostas Papadimitriou
    
52 1e882dd7 Kostas Papadimitriou
    // generic details overlay view.
53 1e882dd7 Kostas Papadimitriou
    views.DetailsView = views.Overlay.extend({
54 1e882dd7 Kostas Papadimitriou
        view_id: "details_view",
55 1e882dd7 Kostas Papadimitriou
        
56 1e882dd7 Kostas Papadimitriou
        content_selector: "#details-overlay",
57 1e882dd7 Kostas Papadimitriou
        css_class: 'overlay-api-info overlay-info',
58 1e882dd7 Kostas Papadimitriou
        overlay_id: "overlay-details",
59 1e882dd7 Kostas Papadimitriou
60 1e882dd7 Kostas Papadimitriou
        subtitle: "",
61 1e882dd7 Kostas Papadimitriou
        title: "Details",
62 1e882dd7 Kostas Papadimitriou
        
63 1e882dd7 Kostas Papadimitriou
        show: function(title, msg, content) {
64 1e882dd7 Kostas Papadimitriou
            this.title = title;
65 1e882dd7 Kostas Papadimitriou
            this.msg = msg;
66 1e882dd7 Kostas Papadimitriou
            this.content = content;
67 1e882dd7 Kostas Papadimitriou
            views.DetailsView.__super__.show.apply(this);
68 1e882dd7 Kostas Papadimitriou
        },
69 1e882dd7 Kostas Papadimitriou
70 1e882dd7 Kostas Papadimitriou
        beforeOpen: function() {
71 1e882dd7 Kostas Papadimitriou
            this.set_title(this.title);
72 1e882dd7 Kostas Papadimitriou
            if (!this.msg) { 
73 1e882dd7 Kostas Papadimitriou
                this.$(".description.intro").hide() 
74 1e882dd7 Kostas Papadimitriou
            } else {
75 1e882dd7 Kostas Papadimitriou
                this.$(".description.intro").html(this.msg).show();
76 1e882dd7 Kostas Papadimitriou
            }
77 1e882dd7 Kostas Papadimitriou
78 1e882dd7 Kostas Papadimitriou
            if (!this.content) { 
79 1e882dd7 Kostas Papadimitriou
                this.$(".description.subinfo").hide() 
80 1e882dd7 Kostas Papadimitriou
            } else {
81 1e882dd7 Kostas Papadimitriou
                this.$(".description.subinfo").html(this.content).show(); 
82 1e882dd7 Kostas Papadimitriou
            };
83 1e882dd7 Kostas Papadimitriou
        }
84 1e882dd7 Kostas Papadimitriou
85 1e882dd7 Kostas Papadimitriou
    });
86 1e882dd7 Kostas Papadimitriou
87 a6b9836b Kostas Papadimitriou
    views.SuspendedVMView = views.FeedbackView.extend({
88 a6b9836b Kostas Papadimitriou
        view_id: "suspended_info_view",
89 a6b9836b Kostas Papadimitriou
        
90 a6b9836b Kostas Papadimitriou
        css_class: 'overlay-api-info overlay-error non-critical',
91 a6b9836b Kostas Papadimitriou
        overlay_id: "overlay-api-info",
92 a6b9836b Kostas Papadimitriou
93 a6b9836b Kostas Papadimitriou
        subtitle: "",
94 a6b9836b Kostas Papadimitriou
        title: "VM Suspended",
95 a6b9836b Kostas Papadimitriou
96 a6b9836b Kostas Papadimitriou
        beforeOpen: function() {
97 a6b9836b Kostas Papadimitriou
            views.SuspendedVMView.__super__.beforeOpen.apply(this);
98 d1892661 Kostas Papadimitriou
            $(this.$(".form-field label")[0]).html($("#suspended-vm-overlay .description").html())
99 a6b9836b Kostas Papadimitriou
        },
100 a6b9836b Kostas Papadimitriou
101 a6b9836b Kostas Papadimitriou
        show: function(vm, data, collect_data, extra_data, cb) {
102 a6b9836b Kostas Papadimitriou
            this.vm = vm;
103 a6b9836b Kostas Papadimitriou
            data = "Suspended VM Details";
104 a6b9836b Kostas Papadimitriou
            data += "\n====================";
105 a6b9836b Kostas Papadimitriou
            data += "\nID: " + vm.id;
106 a6b9836b Kostas Papadimitriou
            data += "\nName: " + vm.get('name');
107 46987d1c Kostas Papadimitriou
            var public_ips = vm.get_public_ips();
108 46987d1c Kostas Papadimitriou
            _.each(public_ips, function(ip) {
109 46987d1c Kostas Papadimitriou
              data += "\nPublic IP{0}: {1}".format(ip.get('type'), ip.get('ip_address'));
110 46987d1c Kostas Papadimitriou
            });
111 a6b9836b Kostas Papadimitriou
            data += "\n\n";
112 a6b9836b Kostas Papadimitriou
            views.SuspendedVMView.__super__.show.call(this, data, collect_data, extra_data, cb);
113 a6b9836b Kostas Papadimitriou
        }
114 a6b9836b Kostas Papadimitriou
115 a6b9836b Kostas Papadimitriou
    });
116 a6b9836b Kostas Papadimitriou
117 978648f4 Kostas Papadimitriou
    views.ApiInfoView = views.Overlay.extend({
118 978648f4 Kostas Papadimitriou
        view_id: "api_info_view",
119 978648f4 Kostas Papadimitriou
        
120 978648f4 Kostas Papadimitriou
        content_selector: "#api-info-overlay",
121 978648f4 Kostas Papadimitriou
        css_class: 'overlay-api-info overlay-info',
122 978648f4 Kostas Papadimitriou
        overlay_id: "overlay-api-info",
123 978648f4 Kostas Papadimitriou
124 978648f4 Kostas Papadimitriou
        subtitle: "",
125 978648f4 Kostas Papadimitriou
        title: "API Access",
126 978648f4 Kostas Papadimitriou
127 978648f4 Kostas Papadimitriou
        beforeOpen: function() {
128 978648f4 Kostas Papadimitriou
            var cont = this.$(".copy-content p");
129 afe9ca75 Kostas Papadimitriou
            var token = snf.user.get_token();
130 978648f4 Kostas Papadimitriou
131 978648f4 Kostas Papadimitriou
            cont.html("");
132 978648f4 Kostas Papadimitriou
            cont.text(token);
133 9cc27975 Kostas Papadimitriou
            
134 9cc27975 Kostas Papadimitriou
            this.cont = cont;
135 9cc27975 Kostas Papadimitriou
            this.token = token;
136 9cc27975 Kostas Papadimitriou
            try { delete this.clip; } catch (err) {};
137 9cc27975 Kostas Papadimitriou
        },
138 978648f4 Kostas Papadimitriou
139 9cc27975 Kostas Papadimitriou
        onOpen: function() {
140 9cc27975 Kostas Papadimitriou
            views.ApiInfoView.__super__.onOpen(this, arguments);
141 9cc27975 Kostas Papadimitriou
            this.clip = new snf.util.ClipHelper(this.cont.parent(), this.token);
142 978648f4 Kostas Papadimitriou
        },
143 978648f4 Kostas Papadimitriou
144 978648f4 Kostas Papadimitriou
        onClose: function() {
145 978648f4 Kostas Papadimitriou
            var cont = this.$(".copy-content p");
146 85f1cd1e Kostas Papadimitriou
            var token = snf.user.token;
147 978648f4 Kostas Papadimitriou
            cont.html("");
148 978648f4 Kostas Papadimitriou
        }
149 978648f4 Kostas Papadimitriou
    });
150 978648f4 Kostas Papadimitriou
151 dc020cf6 Kostas Papadimitriou
    // TODO: implement me
152 dc020cf6 Kostas Papadimitriou
    views.NoticeView = views.Overlay.extend({});
153 8d08f18a Kostas Papadimitriou
154 8d08f18a Kostas Papadimitriou
    views.MultipleActionsView = views.View.extend({
155 8d08f18a Kostas Papadimitriou
        view_id: "multiple_actions",
156 8d08f18a Kostas Papadimitriou
157 8d08f18a Kostas Papadimitriou
        _actions: {},
158 8d08f18a Kostas Papadimitriou
        el: '#multiple_actions_container',
159 8d08f18a Kostas Papadimitriou
        
160 8d08f18a Kostas Papadimitriou
        initialize: function() {
161 8d08f18a Kostas Papadimitriou
            this.actions = {};
162 101e6604 Kostas Papadimitriou
            this.ns_config = {};
163 101e6604 Kostas Papadimitriou
164 8d08f18a Kostas Papadimitriou
            views.MultipleActionsView.__super__.initialize.call(this);
165 101e6604 Kostas Papadimitriou
166 101e6604 Kostas Papadimitriou
            this.ns_tpl = this.$(".confirm_multiple_actions-template").clone()
167 122850c5 Kostas Papadimitriou
168 8d08f18a Kostas Papadimitriou
            this.init_handlers();
169 8d08f18a Kostas Papadimitriou
            this.update_layout();
170 8d08f18a Kostas Papadimitriou
            
171 8d08f18a Kostas Papadimitriou
            // for heavy resize/scroll window events
172 8d08f18a Kostas Papadimitriou
            // do it `like a boss` 
173 122850c5 Kostas Papadimitriou
            this.fix_position = _.throttle(this.fix_position, 100);
174 2506f741 Kostas Papadimitriou
            this.update_layout = _.throttle(this.update_layout, 100);
175 8d08f18a Kostas Papadimitriou
            this.show_limit = 1;
176 101e6604 Kostas Papadimitriou
177 101e6604 Kostas Papadimitriou
            this.init_ns("vms", {
178 101e6604 Kostas Papadimitriou
                msg_tpl:"Your actions will affect 1 machine",
179 101e6604 Kostas Papadimitriou
                msg_tpl_plural:"Your actions will affect {0} machines",
180 101e6604 Kostas Papadimitriou
                actions_msg: {confirm: "Confirm all", cancel: "Cancel all"},
181 101e6604 Kostas Papadimitriou
                limit: 1,
182 101e6604 Kostas Papadimitriou
                cancel_all: function() { snf.storage.vms.reset_pending_actions(); },
183 101e6604 Kostas Papadimitriou
                do_all: function() { snf.storage.vms.do_all_pending_actions(); }
184 101e6604 Kostas Papadimitriou
            });
185 101e6604 Kostas Papadimitriou
            
186 101e6604 Kostas Papadimitriou
            this.init_ns("nets", {
187 101e6604 Kostas Papadimitriou
                msg_tpl:"Your actions will affect 1 private network",
188 101e6604 Kostas Papadimitriou
                msg_tpl_plural:"Your actions will affect {0} private networks",
189 101e6604 Kostas Papadimitriou
                actions_msg: {confirm: "Confirm all", cancel: "Cancel all"},
190 101e6604 Kostas Papadimitriou
                limit: 1,
191 3c446f85 Kostas Papadimitriou
                cancel_all: function(actions, config) {
192 3c446f85 Kostas Papadimitriou
                  _.each(actions, function(action, id) {
193 3c446f85 Kostas Papadimitriou
                    action.model.actions.reset_pending();
194 3c446f85 Kostas Papadimitriou
                  });
195 3c446f85 Kostas Papadimitriou
                },
196 3c446f85 Kostas Papadimitriou
                do_all: function(actions, config) {
197 3c446f85 Kostas Papadimitriou
                  _.each(actions, function(action, id) {
198 3c446f85 Kostas Papadimitriou
                    var action_method = "do_{0}".format(action.actions[0]);
199 3c446f85 Kostas Papadimitriou
                    action.model[action_method].apply(action.model);
200 3c446f85 Kostas Papadimitriou
                  });
201 3c446f85 Kostas Papadimitriou
                }
202 101e6604 Kostas Papadimitriou
            });
203 101e6604 Kostas Papadimitriou
204 101e6604 Kostas Papadimitriou
            this.init_ns("reboots", {
205 101e6604 Kostas Papadimitriou
                msg_tpl:"1 machine needs to be rebooted for changes to apply.",
206 101e6604 Kostas Papadimitriou
                msg_tpl_plural:"{0} machines needs to be rebooted for changes to apply.",
207 101e6604 Kostas Papadimitriou
                actions_msg: {confirm: "Reboot all", cancel: "Cancel all"},
208 101e6604 Kostas Papadimitriou
                limit: 0,
209 101e6604 Kostas Papadimitriou
                cancel_all: function() { snf.storage.vms.reset_reboot_required(); },
210 101e6604 Kostas Papadimitriou
                do_all: function() { snf.storage.vms.do_all_reboots(); }
211 101e6604 Kostas Papadimitriou
            });
212 3c446f85 Kostas Papadimitriou
213 3c446f85 Kostas Papadimitriou
            this.init_ns("ips", {
214 3c446f85 Kostas Papadimitriou
                msg_tpl:"Your actions will affect 1 IP address.",
215 3c446f85 Kostas Papadimitriou
                msg_tpl_plural:"{0} actions will affect {0} IP addresses.",
216 3c446f85 Kostas Papadimitriou
                actions_msg: {confirm: "Confirm all", cancel: "Cancel all"},
217 3c446f85 Kostas Papadimitriou
                limit: 1,
218 3c446f85 Kostas Papadimitriou
                cancel_all: function(actions, config) {
219 3c446f85 Kostas Papadimitriou
                  _.each(actions, function(action, id) {
220 3c446f85 Kostas Papadimitriou
                    action.model.actions.reset_pending();
221 3c446f85 Kostas Papadimitriou
                  });
222 3c446f85 Kostas Papadimitriou
                },
223 3c446f85 Kostas Papadimitriou
                do_all: function(actions, config) {
224 3c446f85 Kostas Papadimitriou
                  _.each(actions, function(action, id) {
225 3c446f85 Kostas Papadimitriou
                    var action_method = "do_{0}".format(action.actions[0]);
226 3c446f85 Kostas Papadimitriou
                    action.model[action_method].apply(action.model);
227 3c446f85 Kostas Papadimitriou
                  });
228 3c446f85 Kostas Papadimitriou
                }
229 3c446f85 Kostas Papadimitriou
            });
230 3c446f85 Kostas Papadimitriou
231 3c446f85 Kostas Papadimitriou
232 3c446f85 Kostas Papadimitriou
            this.init_ns("keys", {
233 3c446f85 Kostas Papadimitriou
                msg_tpl:"Your actions will affect 1 public key.",
234 3c446f85 Kostas Papadimitriou
                msg_tpl_plural:"{0} actions will affect {0} public keys.",
235 3c446f85 Kostas Papadimitriou
                actions_msg: {confirm: "Confirm all", cancel: "Cancel all"},
236 3c446f85 Kostas Papadimitriou
                limit: 1,
237 3c446f85 Kostas Papadimitriou
                cancel_all: function(actions, config) {
238 3c446f85 Kostas Papadimitriou
                  _.each(actions, function(action, id) {
239 3c446f85 Kostas Papadimitriou
                    action.model.actions.reset_pending();
240 3c446f85 Kostas Papadimitriou
                  });
241 3c446f85 Kostas Papadimitriou
                },
242 3c446f85 Kostas Papadimitriou
                do_all: function(actions, config) {
243 3c446f85 Kostas Papadimitriou
                  _.each(actions, function(action, id) {
244 3c446f85 Kostas Papadimitriou
                    var action_method = "do_{0}".format(action.actions[0]);
245 3c446f85 Kostas Papadimitriou
                    action.model[action_method].apply(action.model);
246 3c446f85 Kostas Papadimitriou
                  });
247 3c446f85 Kostas Papadimitriou
                }
248 3c446f85 Kostas Papadimitriou
249 3c446f85 Kostas Papadimitriou
            });
250 101e6604 Kostas Papadimitriou
        },
251 101e6604 Kostas Papadimitriou
        
252 101e6604 Kostas Papadimitriou
        init_ns: function(ns, params) {
253 101e6604 Kostas Papadimitriou
            this.actions[ns] = {};
254 101e6604 Kostas Papadimitriou
            var nsconf = this.ns_config[ns] = params || {};
255 101e6604 Kostas Papadimitriou
            nsconf.cont = $(this.$("#conirm_multiple_cont_template").clone());
256 101e6604 Kostas Papadimitriou
            nsconf.cont.attr("id", "confirm_multiple_cont_" + ns);
257 101e6604 Kostas Papadimitriou
            $(this.el).find(".ns-confirms-cont").append(nsconf.cont).addClass(ns);
258 101e6604 Kostas Papadimitriou
            $(this.el).find(".ns-confirms-cont").append(nsconf.cont).addClass("confirm-ns");
259 101e6604 Kostas Papadimitriou
            nsconf.cont.find(".msg button.yes").text(
260 101e6604 Kostas Papadimitriou
                nsconf.actions_msg.confirm).click(_.bind(this.do_all, this, ns));
261 101e6604 Kostas Papadimitriou
            nsconf.cont.find(".msg button.no").text(
262 101e6604 Kostas Papadimitriou
                nsconf.actions_msg.cancel).click(_.bind(this.cancel_all, this, ns));
263 101e6604 Kostas Papadimitriou
        },
264 101e6604 Kostas Papadimitriou
265 101e6604 Kostas Papadimitriou
        do_all: function(ns) {
266 3c446f85 Kostas Papadimitriou
            this.ns_config[ns].do_all.apply(this, [this.actions[ns], this.ns_config[ns]]);
267 101e6604 Kostas Papadimitriou
        },
268 101e6604 Kostas Papadimitriou
269 101e6604 Kostas Papadimitriou
        cancel_all: function(ns) {
270 3c446f85 Kostas Papadimitriou
            this.ns_config[ns].cancel_all.apply(this, [this.actions[ns], this.ns_config[ns]]);
271 3c446f85 Kostas Papadimitriou
        },
272 3c446f85 Kostas Papadimitriou
        
273 3c446f85 Kostas Papadimitriou
        register_actions_ns: function(store, ns) {
274 3c446f85 Kostas Papadimitriou
          store.bind("action:set-pending", function(action, actions, model) {
275 3c446f85 Kostas Papadimitriou
            this.handle_action_add(ns, model, [action]);
276 3c446f85 Kostas Papadimitriou
          }, this);
277 3c446f85 Kostas Papadimitriou
          store.bind("action:unset-pending", function(action, actions, model) {
278 3c446f85 Kostas Papadimitriou
            this.handle_action_remove(ns, model, action);
279 3c446f85 Kostas Papadimitriou
          }, this);
280 3c446f85 Kostas Papadimitriou
          store.bind("action:reset-pending", function(actions, model) {
281 3c446f85 Kostas Papadimitriou
            _.each(actions.actions, function(action) {
282 3c446f85 Kostas Papadimitriou
              this.handle_action_remove(ns, model, action);
283 3c446f85 Kostas Papadimitriou
            }, this);
284 3c446f85 Kostas Papadimitriou
          }, this);
285 8d08f18a Kostas Papadimitriou
        },
286 8d08f18a Kostas Papadimitriou
287 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
288 122850c5 Kostas Papadimitriou
            var self = this;
289 122850c5 Kostas Papadimitriou
290 8d08f18a Kostas Papadimitriou
            $(window).resize(_.bind(function(){
291 8d08f18a Kostas Papadimitriou
                this.fix_position();
292 8d08f18a Kostas Papadimitriou
            }, this));
293 122850c5 Kostas Papadimitriou
294 8d08f18a Kostas Papadimitriou
            $(window).scroll(_.bind(function(){
295 8d08f18a Kostas Papadimitriou
                this.fix_position();
296 8d08f18a Kostas Papadimitriou
            }, this));
297 b1e6a2de Kostas Papadimitriou
298 426e1fb9 Kostas Papadimitriou
            storage.vms.bind("change:pending_action", 
299 426e1fb9 Kostas Papadimitriou
                             _.bind(this.handle_action_add, this, "vms"));
300 426e1fb9 Kostas Papadimitriou
            storage.vms.bind("change:reboot_required", 
301 426e1fb9 Kostas Papadimitriou
                             _.bind(this.handle_action_add, this, "reboots"));
302 3c446f85 Kostas Papadimitriou
            
303 3c446f85 Kostas Papadimitriou
            var ns_map = {
304 3c446f85 Kostas Papadimitriou
              'ips': storage.floating_ips,
305 3c446f85 Kostas Papadimitriou
              'keys': storage.keys,
306 3c446f85 Kostas Papadimitriou
              'nets': storage.networks
307 3c446f85 Kostas Papadimitriou
            }
308 3c446f85 Kostas Papadimitriou
            _.each(ns_map, function(store, ns) {
309 3c446f85 Kostas Papadimitriou
              this.register_actions_ns(store, ns);
310 3c446f85 Kostas Papadimitriou
            }, this);
311 3c446f85 Kostas Papadimitriou
        },
312 3c446f85 Kostas Papadimitriou
        
313 3c446f85 Kostas Papadimitriou
        handle_action_remove: function(type, model, action) {
314 3c446f85 Kostas Papadimitriou
          var actions = this.actions[type];
315 3c446f85 Kostas Papadimitriou
          var model_actions = actions[model.id] && actions[model.id].actions;
316 3c446f85 Kostas Papadimitriou
          if (!model_actions) { return }
317 3c446f85 Kostas Papadimitriou
          actions[model.id].actions = _.without(model_actions, action);
318 3c446f85 Kostas Papadimitriou
          if (actions[model.id].actions.length == 0) {
319 3c446f85 Kostas Papadimitriou
            delete actions[model.id];
320 3c446f85 Kostas Papadimitriou
          }
321 3c446f85 Kostas Papadimitriou
          this.update_layout();
322 8d08f18a Kostas Papadimitriou
        },
323 b1e6a2de Kostas Papadimitriou
324 101e6604 Kostas Papadimitriou
        handle_action_add: function(type, model, action) {
325 101e6604 Kostas Papadimitriou
            var actions = this.actions[type];
326 101e6604 Kostas Papadimitriou
            
327 3c446f85 Kostas Papadimitriou
            if (type == "keys") {
328 3c446f85 Kostas Papadimitriou
                actions[model.id] = {model: model, actions: action};
329 3c446f85 Kostas Papadimitriou
            }
330 3c446f85 Kostas Papadimitriou
331 3c446f85 Kostas Papadimitriou
            if (type == "ips") {
332 3c446f85 Kostas Papadimitriou
                actions[model.id] = {model: model, actions: action};
333 3c446f85 Kostas Papadimitriou
            }
334 3c446f85 Kostas Papadimitriou
335 101e6604 Kostas Papadimitriou
            if (type == "nets") {
336 3c446f85 Kostas Papadimitriou
                actions[model.id] = {model: model, actions: action};
337 8d08f18a Kostas Papadimitriou
            }
338 8d08f18a Kostas Papadimitriou
339 101e6604 Kostas Papadimitriou
            if (type == "vms") {
340 101e6604 Kostas Papadimitriou
                _.each(actions, function(action) {
341 101e6604 Kostas Papadimitriou
                    if (action.model.id == model.id) {
342 101e6604 Kostas Papadimitriou
                        delete actions[action]
343 101e6604 Kostas Papadimitriou
                    }
344 101e6604 Kostas Papadimitriou
                });
345 101e6604 Kostas Papadimitriou
346 101e6604 Kostas Papadimitriou
                var actobject = {};
347 101e6604 Kostas Papadimitriou
                actobject[action] = [[]];
348 101e6604 Kostas Papadimitriou
                actions[model.id] = {model: model, actions: actobject};
349 101e6604 Kostas Papadimitriou
                if (typeof action == "undefined") {
350 101e6604 Kostas Papadimitriou
                    delete actions[model.id]
351 101e6604 Kostas Papadimitriou
                }
352 101e6604 Kostas Papadimitriou
            }
353 8d08f18a Kostas Papadimitriou
354 101e6604 Kostas Papadimitriou
            if (type == "reboots") {
355 101e6604 Kostas Papadimitriou
                _.each(actions, function(action) {
356 101e6604 Kostas Papadimitriou
                    if (action.model.id == model.id) {
357 101e6604 Kostas Papadimitriou
                        delete actions[action]
358 101e6604 Kostas Papadimitriou
                    }
359 101e6604 Kostas Papadimitriou
                });
360 101e6604 Kostas Papadimitriou
                var actobject = {};
361 101e6604 Kostas Papadimitriou
                actobject['reboot'] = [[]];
362 101e6604 Kostas Papadimitriou
                actions[model.id] = {model: model, actions: actobject};
363 101e6604 Kostas Papadimitriou
                if (!action) {
364 101e6604 Kostas Papadimitriou
                    delete actions[model.id]
365 101e6604 Kostas Papadimitriou
                }
366 101e6604 Kostas Papadimitriou
            }
367 101e6604 Kostas Papadimitriou
            
368 8d08f18a Kostas Papadimitriou
            this.update_layout();
369 8d08f18a Kostas Papadimitriou
        },
370 122850c5 Kostas Papadimitriou
371 101e6604 Kostas Papadimitriou
        update_actions_content: function(ns) {
372 101e6604 Kostas Papadimitriou
            var conf = this.ns_config[ns];
373 101e6604 Kostas Papadimitriou
            conf.cont.find(".details").empty();
374 101e6604 Kostas Papadimitriou
            conf.cont.find(".msg p").text("");
375 101e6604 Kostas Papadimitriou
            
376 101e6604 Kostas Papadimitriou
            var count = 0;
377 101e6604 Kostas Papadimitriou
            var actionscount = 0;
378 101e6604 Kostas Papadimitriou
            _.each(this.actions[ns], function(actions, model_id) {
379 101e6604 Kostas Papadimitriou
                count++;
380 101e6604 Kostas Papadimitriou
                _.each(actions.actions, function(params, act_name){
381 3c446f85 Kostas Papadimitriou
                    if (_.isString(params)) {
382 3c446f85 Kostas Papadimitriou
                      actionscount++;
383 3c446f85 Kostas Papadimitriou
                      return
384 3c446f85 Kostas Papadimitriou
                    }
385 101e6604 Kostas Papadimitriou
                    if (params && params.length) {
386 101e6604 Kostas Papadimitriou
                        actionscount += params.length;
387 101e6604 Kostas Papadimitriou
                    } else {
388 101e6604 Kostas Papadimitriou
                        actionscount++;
389 101e6604 Kostas Papadimitriou
                    }
390 101e6604 Kostas Papadimitriou
                })
391 101e6604 Kostas Papadimitriou
                this.total_confirm_actions++;
392 101e6604 Kostas Papadimitriou
            });
393 101e6604 Kostas Papadimitriou
            
394 101e6604 Kostas Papadimitriou
            var limit = conf.limit;
395 101e6604 Kostas Papadimitriou
            if (ui.main.current_view.view_id == "vm_list") {
396 101e6604 Kostas Papadimitriou
                limit = 0;
397 101e6604 Kostas Papadimitriou
            }
398 8d08f18a Kostas Papadimitriou
399 101e6604 Kostas Papadimitriou
            if (actionscount > limit) {
400 101e6604 Kostas Papadimitriou
                conf.cont.show();
401 101e6604 Kostas Papadimitriou
                this.confirm_ns_open++;
402 101e6604 Kostas Papadimitriou
            } else {
403 101e6604 Kostas Papadimitriou
                conf.cont.hide();
404 101e6604 Kostas Papadimitriou
            }
405 101e6604 Kostas Papadimitriou
            
406 101e6604 Kostas Papadimitriou
            var msg = count > 1 ? conf.msg_tpl_plural : conf.msg_tpl;
407 101e6604 Kostas Papadimitriou
            conf.cont.find(".msg p").text(msg.format(count));
408 8d08f18a Kostas Papadimitriou
409 101e6604 Kostas Papadimitriou
            return conf.cont;
410 8d08f18a Kostas Papadimitriou
        },
411 8d08f18a Kostas Papadimitriou
412 8d08f18a Kostas Papadimitriou
        fix_position: function() {
413 8d08f18a Kostas Papadimitriou
            $('.confirm_multiple').removeClass('fixed');
414 8d08f18a Kostas Papadimitriou
            if (($(this.el).offset().top +$(this.el).height())> ($(window).scrollTop() + $(window).height())) {
415 8d08f18a Kostas Papadimitriou
                $('.confirm_multiple').addClass('fixed');
416 8d08f18a Kostas Papadimitriou
            }
417 8d08f18a Kostas Papadimitriou
        },
418 8d08f18a Kostas Papadimitriou
        
419 8d08f18a Kostas Papadimitriou
        update_layout: function() {
420 101e6604 Kostas Papadimitriou
            this.confirm_ns_open = 0;
421 101e6604 Kostas Papadimitriou
            this.total_confirm_actions = 0;
422 122850c5 Kostas Papadimitriou
423 101e6604 Kostas Papadimitriou
            $(this.el).show();
424 101e6604 Kostas Papadimitriou
            $(this.el).find("#conirm_multiple_cont_template").hide();
425 101e6604 Kostas Papadimitriou
            $(this.el).find(".confirm-ns").show();
426 101e6604 Kostas Papadimitriou
            
427 101e6604 Kostas Papadimitriou
            _.each(this.ns_config, _.bind(function(params, key) {
428 101e6604 Kostas Papadimitriou
                this.update_actions_content(key);
429 101e6604 Kostas Papadimitriou
            }, this));
430 101e6604 Kostas Papadimitriou
431 101e6604 Kostas Papadimitriou
            if (this.confirm_ns_open > 0) {
432 8d08f18a Kostas Papadimitriou
                $(this.el).show();
433 101e6604 Kostas Papadimitriou
                this.$(".confirm-all-cont").hide();
434 101e6604 Kostas Papadimitriou
                this.$(".ns-confirms-cont").show();
435 8d08f18a Kostas Papadimitriou
            } else {
436 8d08f18a Kostas Papadimitriou
                $(this.el).hide();
437 101e6604 Kostas Papadimitriou
                this.$(".confirm-all-cont").hide();
438 101e6604 Kostas Papadimitriou
                this.$(".ns-confirms-cont").hide();
439 8d08f18a Kostas Papadimitriou
            }
440 122850c5 Kostas Papadimitriou
441 8d08f18a Kostas Papadimitriou
            $(window).trigger("resize");
442 8d08f18a Kostas Papadimitriou
        }
443 8d08f18a Kostas Papadimitriou
    })
444 8d08f18a Kostas Papadimitriou
    
445 8d08f18a Kostas Papadimitriou
    // menu wrapper view
446 8d08f18a Kostas Papadimitriou
    views.SelectView = views.View.extend({
447 8d08f18a Kostas Papadimitriou
        
448 38dc3895 Kostas Papadimitriou
        initialize: function(view, router) {
449 8d08f18a Kostas Papadimitriou
            this.parent = view;
450 38dc3895 Kostas Papadimitriou
            this.router = router;
451 8d08f18a Kostas Papadimitriou
            this.pane_view_selector = $(".css-tabs");
452 8d08f18a Kostas Papadimitriou
            this.machine_view_selector = $("#view-select");
453 8d08f18a Kostas Papadimitriou
            this.el = $(".css-tabs");
454 8d08f18a Kostas Papadimitriou
            this.title = $(".tab-name");
455 8d08f18a Kostas Papadimitriou
456 8d08f18a Kostas Papadimitriou
            this.set_handlers();
457 8d08f18a Kostas Papadimitriou
            this.update_layout();
458 8d08f18a Kostas Papadimitriou
459 8d08f18a Kostas Papadimitriou
            views.SelectView.__super__.initialize.apply(this, arguments);
460 8d08f18a Kostas Papadimitriou
        },
461 8d08f18a Kostas Papadimitriou
        
462 8d08f18a Kostas Papadimitriou
        clear_active: function() {
463 8d08f18a Kostas Papadimitriou
            this.pane_view_selector.find("a").removeClass("active");
464 8d08f18a Kostas Papadimitriou
            this.machine_view_selector.find("a").removeClass("activelink");
465 8d08f18a Kostas Papadimitriou
        },
466 8d08f18a Kostas Papadimitriou
        
467 8d08f18a Kostas Papadimitriou
        // intercept menu links
468 8d08f18a Kostas Papadimitriou
        set_handlers: function() {
469 8d08f18a Kostas Papadimitriou
            var self = this;
470 8d08f18a Kostas Papadimitriou
            this.pane_view_selector.find("a").hover(function(){
471 4e8e2834 Kostas Papadimitriou
                self.title.text($(this).data("hover-title"));
472 8d08f18a Kostas Papadimitriou
            }, function(){
473 8d08f18a Kostas Papadimitriou
                self.title.text(self.parent.get_title());
474 8d08f18a Kostas Papadimitriou
            });
475 8d08f18a Kostas Papadimitriou
476 8d08f18a Kostas Papadimitriou
            this.pane_view_selector.find("a#machines_view_link").click(_.bind(function(ev){
477 8d08f18a Kostas Papadimitriou
                ev.preventDefault();
478 38dc3895 Kostas Papadimitriou
                this.router.vms_index();
479 8d08f18a Kostas Papadimitriou
            }, this))
480 8d08f18a Kostas Papadimitriou
            this.pane_view_selector.find("a#networks_view_link").click(_.bind(function(ev){
481 8d08f18a Kostas Papadimitriou
                ev.preventDefault();
482 38dc3895 Kostas Papadimitriou
                this.router.networks_view();
483 8d08f18a Kostas Papadimitriou
            }, this))
484 f0c38b0e Kostas Papadimitriou
            this.pane_view_selector.find("a#ips_view_link").click(_.bind(function(ev){
485 8d08f18a Kostas Papadimitriou
                ev.preventDefault();
486 f0c38b0e Kostas Papadimitriou
                this.router.ips_view();
487 f0c38b0e Kostas Papadimitriou
            }, this))
488 f0c38b0e Kostas Papadimitriou
            this.pane_view_selector.find("a#public_keys_view_link").click(_.bind(function(ev){
489 f0c38b0e Kostas Papadimitriou
                ev.preventDefault();
490 f0c38b0e Kostas Papadimitriou
                this.router.public_keys_view();
491 8d08f18a Kostas Papadimitriou
            }, this))
492 8d08f18a Kostas Papadimitriou
            
493 8d08f18a Kostas Papadimitriou
            this.machine_view_selector.find("a#machines_view_icon_link").click(_.bind(function(ev){
494 8d08f18a Kostas Papadimitriou
                ev.preventDefault();
495 8d08f18a Kostas Papadimitriou
                var d = $.now();
496 38dc3895 Kostas Papadimitriou
                this.router.vms_icon_view();
497 8d08f18a Kostas Papadimitriou
            }, this))
498 8d08f18a Kostas Papadimitriou
            this.machine_view_selector.find("a#machines_view_list_link").click(_.bind(function(ev){
499 8d08f18a Kostas Papadimitriou
                ev.preventDefault();
500 38dc3895 Kostas Papadimitriou
                this.router.vms_list_view();
501 8d08f18a Kostas Papadimitriou
            }, this))
502 8d08f18a Kostas Papadimitriou
            this.machine_view_selector.find("a#machines_view_single_link").click(_.bind(function(ev){
503 8d08f18a Kostas Papadimitriou
                ev.preventDefault();
504 38dc3895 Kostas Papadimitriou
                this.router.vms_single_view();
505 8d08f18a Kostas Papadimitriou
            }, this))
506 8d08f18a Kostas Papadimitriou
        },
507 8d08f18a Kostas Papadimitriou
508 8d08f18a Kostas Papadimitriou
        update_layout: function() {
509 8d08f18a Kostas Papadimitriou
            this.clear_active();
510 8d08f18a Kostas Papadimitriou
511 8d08f18a Kostas Papadimitriou
            var pane_index = this.parent.pane_ids[this.parent.current_view_id];
512 8d08f18a Kostas Papadimitriou
            $(this.pane_view_selector.find("a")).removeClass("active");
513 8d08f18a Kostas Papadimitriou
            $(this.pane_view_selector.find("a").get(pane_index)).addClass("active");
514 8d08f18a Kostas Papadimitriou
            
515 8d08f18a Kostas Papadimitriou
            if (this.parent.current_view && this.parent.current_view.vms_view) {
516 8d08f18a Kostas Papadimitriou
517 8d08f18a Kostas Papadimitriou
                if (storage.vms.length > 0) {
518 8d08f18a Kostas Papadimitriou
                    this.machine_view_selector.show();
519 8d08f18a Kostas Papadimitriou
                    var machine_index = this.parent.views_ids[this.parent.current_view_id];
520 8d08f18a Kostas Papadimitriou
                    $(this.machine_view_selector.find("a").get(machine_index)).addClass("activelink");
521 8d08f18a Kostas Papadimitriou
                } else {
522 8d08f18a Kostas Papadimitriou
                    this.machine_view_selector.hide();
523 8d08f18a Kostas Papadimitriou
                }
524 8d08f18a Kostas Papadimitriou
            } else {
525 8d08f18a Kostas Papadimitriou
                this.machine_view_selector.hide();
526 8d08f18a Kostas Papadimitriou
            }
527 8d08f18a Kostas Papadimitriou
528 8d08f18a Kostas Papadimitriou
        }
529 8d08f18a Kostas Papadimitriou
    });
530 8d08f18a Kostas Papadimitriou
531 8d08f18a Kostas Papadimitriou
    views.MainView = views.View.extend({
532 8d08f18a Kostas Papadimitriou
        el: 'body',
533 8d08f18a Kostas Papadimitriou
        view_id: 'main',
534 8d08f18a Kostas Papadimitriou
        
535 8d08f18a Kostas Papadimitriou
        // FIXME: titles belong to SelectView
536 8d08f18a Kostas Papadimitriou
        views_titles: {
537 8d08f18a Kostas Papadimitriou
            'icon': 'machines', 'single': 'machines', 
538 8d08f18a Kostas Papadimitriou
            'list': 'machines', 'networks': 'networks',
539 cff6b795 Vangelis Koukis
            'ips': 'IP addresses',
540 f0c38b0e Kostas Papadimitriou
            'public-keys': 'public keys'
541 8d08f18a Kostas Papadimitriou
        },
542 8d08f18a Kostas Papadimitriou
543 8d08f18a Kostas Papadimitriou
        // indexes registry
544 f0c38b0e Kostas Papadimitriou
        views_indexes: {
545 f0c38b0e Kostas Papadimitriou
          0: 'icon', 
546 f0c38b0e Kostas Papadimitriou
          2: 'single', 
547 f0c38b0e Kostas Papadimitriou
          1: 'list', 
548 f0c38b0e Kostas Papadimitriou
          3: 'networks', 
549 f0c38b0e Kostas Papadimitriou
          4: 'ips',
550 f0c38b0e Kostas Papadimitriou
          5: 'public-keys'
551 f0c38b0e Kostas Papadimitriou
        },
552 f0c38b0e Kostas Papadimitriou
553 f0c38b0e Kostas Papadimitriou
        views_pane_indexes: {
554 f0c38b0e Kostas Papadimitriou
          0: 'single', 
555 f0c38b0e Kostas Papadimitriou
          1: 'networks', 
556 f0c38b0e Kostas Papadimitriou
          2: 'ips', 
557 f0c38b0e Kostas Papadimitriou
          3: 'public-keys'
558 f0c38b0e Kostas Papadimitriou
        },
559 8d08f18a Kostas Papadimitriou
560 8d08f18a Kostas Papadimitriou
        // views classes registry
561 f0c38b0e Kostas Papadimitriou
        views_classes: {
562 f0c38b0e Kostas Papadimitriou
            'icon': views.IconView, 
563 f0c38b0e Kostas Papadimitriou
            'single': views.SingleView, 
564 f0c38b0e Kostas Papadimitriou
            'list': views.ListView, 
565 f0c38b0e Kostas Papadimitriou
            'networks': views.NetworksPaneView, 
566 f0c38b0e Kostas Papadimitriou
            'ips': views.IpsPaneView,
567 f0c38b0e Kostas Papadimitriou
            'public-keys': views.PublicKeysPaneView
568 f0c38b0e Kostas Papadimitriou
        },
569 8d08f18a Kostas Papadimitriou
570 8d08f18a Kostas Papadimitriou
        // view ids
571 f0c38b0e Kostas Papadimitriou
        views_ids: {'icon':0, 'single':2, 'list':1, 'networks':3, 'ips':4, 'public-keys': 5},
572 8d08f18a Kostas Papadimitriou
573 8d08f18a Kostas Papadimitriou
        // on which pane id each view exists
574 8d08f18a Kostas Papadimitriou
        // machine views (icon,single,list) are all on first pane
575 f0c38b0e Kostas Papadimitriou
        pane_ids: {'icon':0, 'single':0, 'list':0, 'networks':1, 'ips':2, 'public-keys': 3},
576 8d08f18a Kostas Papadimitriou
    
577 8d08f18a Kostas Papadimitriou
        initialize: function(show_view) {
578 8d08f18a Kostas Papadimitriou
            if (!show_view) { show_view = 'icon' };
579 38dc3895 Kostas Papadimitriou
            
580 38dc3895 Kostas Papadimitriou
            this.router = snf.router;
581 e673a761 Kostas Papadimitriou
            this.empty_hidden = true;
582 8d08f18a Kostas Papadimitriou
            // fallback to browser error reporting (true for debug)
583 8d08f18a Kostas Papadimitriou
            this.skip_errors = true
584 8d08f18a Kostas Papadimitriou
585 8d08f18a Kostas Papadimitriou
            // reset views
586 8d08f18a Kostas Papadimitriou
            this.views = {};
587 8d08f18a Kostas Papadimitriou
588 23a3bb8e Kostas Papadimitriou
            this.el = $("#app");
589 8d08f18a Kostas Papadimitriou
            // reset main view status
590 8d08f18a Kostas Papadimitriou
            this._loaded = false;
591 8d08f18a Kostas Papadimitriou
            this.status = "Initializing...";
592 8d08f18a Kostas Papadimitriou
593 8d08f18a Kostas Papadimitriou
            // initialize handlers
594 8d08f18a Kostas Papadimitriou
            this.init_handlers();
595 8d08f18a Kostas Papadimitriou
596 8d08f18a Kostas Papadimitriou
            // identify initial view from user cookies
597 8d08f18a Kostas Papadimitriou
            // this view will be visible after loading of
598 8d08f18a Kostas Papadimitriou
            // main view
599 8d08f18a Kostas Papadimitriou
            this.initial_view = this.session_view();
600 8d08f18a Kostas Papadimitriou
601 8d08f18a Kostas Papadimitriou
            views.MainView.__super__.initialize.call(this);
602 b1e6a2de Kostas Papadimitriou
603 b1e6a2de Kostas Papadimitriou
            $(window).focus(_.bind(this.handle_window_focus, this, "focus"));
604 b1e6a2de Kostas Papadimitriou
            $(window).blur(_.bind(this.handle_window_focus, this, "out"));
605 b1e6a2de Kostas Papadimitriou
606 b1e6a2de Kostas Papadimitriou
            this.focused = true;
607 b1e6a2de Kostas Papadimitriou
        },
608 b1e6a2de Kostas Papadimitriou
609 b1e6a2de Kostas Papadimitriou
        handle_window_focus: function(focus) {
610 b1e6a2de Kostas Papadimitriou
            if (!snf.config.delay_on_blur) { return };
611 b1e6a2de Kostas Papadimitriou
612 b1e6a2de Kostas Papadimitriou
            if (focus === "focus") {
613 b1e6a2de Kostas Papadimitriou
                this.focused = true;
614 1cc6e94f Kostas Papadimitriou
                this.set_interval_timeouts();
615 b1e6a2de Kostas Papadimitriou
            } else {
616 b1e6a2de Kostas Papadimitriou
                this.focused = false;
617 1cc6e94f Kostas Papadimitriou
                this.set_interval_timeouts();
618 b1e6a2de Kostas Papadimitriou
            }
619 b1e6a2de Kostas Papadimitriou
        },
620 b1e6a2de Kostas Papadimitriou
621 b1e6a2de Kostas Papadimitriou
        set_interval_timeouts: function(time) {
622 6db98d7c Kostas Papadimitriou
            _.each(this._fetchers, _.bind(function(fetcher){
623 b1e6a2de Kostas Papadimitriou
                if (!fetcher) { return };
624 1cc6e94f Kostas Papadimitriou
                if (this.focused) {
625 1cc6e94f Kostas Papadimitriou
                    fetcher.interval = fetcher.normal_interval;
626 792f3a20 Kostas Papadimitriou
                    fetcher.stop(false).start(true);
627 1cc6e94f Kostas Papadimitriou
                } else {
628 1cc6e94f Kostas Papadimitriou
                    fetcher.interval = fetcher.maximum_interval;
629 792f3a20 Kostas Papadimitriou
                    fetcher.stop(false).start(false);
630 1cc6e94f Kostas Papadimitriou
                }
631 1cc6e94f Kostas Papadimitriou
632 1cc6e94f Kostas Papadimitriou
            }, this));
633 8d08f18a Kostas Papadimitriou
        },
634 8d08f18a Kostas Papadimitriou
        
635 8d08f18a Kostas Papadimitriou
        vms_handlers_registered: false,
636 8d08f18a Kostas Papadimitriou
637 8d08f18a Kostas Papadimitriou
        // register event handlers
638 8d08f18a Kostas Papadimitriou
        // 
639 8d08f18a Kostas Papadimitriou
        // vms storage events to identify if vms list 
640 8d08f18a Kostas Papadimitriou
        // is empty and display empty view if user viewing
641 8d08f18a Kostas Papadimitriou
        // a machine view
642 8d08f18a Kostas Papadimitriou
        //
643 8d08f18a Kostas Papadimitriou
        // api/ui error event handlers
644 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
645 8d08f18a Kostas Papadimitriou
            // vm handlers
646 8d08f18a Kostas Papadimitriou
            storage.vms.bind("remove", _.bind(this.check_empty, this));
647 8d08f18a Kostas Papadimitriou
            storage.vms.bind("add", _.bind(this.check_empty, this));
648 e673a761 Kostas Papadimitriou
            storage.vms.bind("change:status", _.bind(this.check_empty, this));
649 8d08f18a Kostas Papadimitriou
            storage.vms.bind("reset", _.bind(this.check_empty, this));
650 426e1fb9 Kostas Papadimitriou
            storage.quotas.bind("change", _.bind(this.update_create_buttons_status, this));
651 6db98d7c Kostas Papadimitriou
            // additionally check quotas the first time they get fetched
652 ab3df8df Kostas Papadimitriou
            storage.quotas.bind("add", _.bind(this.update_create_buttons_status, this));
653 8d08f18a Kostas Papadimitriou
            
654 8d08f18a Kostas Papadimitriou
        },
655 8d08f18a Kostas Papadimitriou
        
656 edd1d565 Kostas Papadimitriou
        handle_api_error_state: function(state) {
657 9ce969a7 Kostas Papadimitriou
            if (snf.api.error_state === snf.api.STATES.ERROR) {
658 edd1d565 Kostas Papadimitriou
                this.stop_intervals();
659 edd1d565 Kostas Papadimitriou
            } else {
660 edd1d565 Kostas Papadimitriou
                if (this.intervals_stopped) {
661 edd1d565 Kostas Papadimitriou
                    this.update_intervals();
662 edd1d565 Kostas Papadimitriou
                }
663 edd1d565 Kostas Papadimitriou
            }
664 8d08f18a Kostas Papadimitriou
        },
665 6a3a5bf7 Kostas Papadimitriou
        
666 9ce969a7 Kostas Papadimitriou
        handle_api_error: function(args) {
667 9ce969a7 Kostas Papadimitriou
            if (arguments.length == 1) { arguments = _.toArray(arguments[0])};
668 9ce969a7 Kostas Papadimitriou
669 9ce969a7 Kostas Papadimitriou
            if (!_.last(arguments).display) {
670 9ce969a7 Kostas Papadimitriou
                return;
671 9ce969a7 Kostas Papadimitriou
            }
672 9ce969a7 Kostas Papadimitriou
673 8d08f18a Kostas Papadimitriou
            this.error_state = true;
674 8d08f18a Kostas Papadimitriou
            
675 8d08f18a Kostas Papadimitriou
            var xhr = arguments[0];
676 9ce969a7 Kostas Papadimitriou
            var args = util.parse_api_error.apply(util, arguments);
677 8d08f18a Kostas Papadimitriou
            
678 108dd5bd Kostas Papadimitriou
            // force logout if UNAUTHORIZED request arrives
679 3a7e5b0f Kostas Papadimitriou
            if (args.code == 401) { snf.auth_client.redirect_to_login(); return };
680 108dd5bd Kostas Papadimitriou
681 0b416fc7 Kostas Papadimitriou
            var error_entry = [args.ns, args.code, args.message, 
682 0b416fc7 Kostas Papadimitriou
                               args.api_message, args.type, 
683 0b416fc7 Kostas Papadimitriou
                               args.details, args];
684 dc020cf6 Kostas Papadimitriou
            this.error_view.show_error.apply(this.error_view, error_entry);
685 8d08f18a Kostas Papadimitriou
        },
686 8d08f18a Kostas Papadimitriou
687 9ffd10ce Kostas Papadimitriou
        handle_ui_error: function(data) {
688 9ffd10ce Kostas Papadimitriou
            var msg = data.msg, code = data.code, err_obj = data.error;
689 9ffd10ce Kostas Papadimitriou
            error = msg + "<br /><br />" + snf.util.stacktrace().replace("at", "<br /><br />at");
690 9ffd10ce Kostas Papadimitriou
            params = { title: "UI error", extra_details: data.extra };
691 52a432c7 Kostas Papadimitriou
            delete data.extra.allow_close;
692 9ffd10ce Kostas Papadimitriou
            params.allow_close = data.extra.allow_close === undefined ? true : data.extra.allow_close;
693 0b416fc7 Kostas Papadimitriou
            this.error_view.show_error("UI", -1, msg, undefined, 
694 0b416fc7 Kostas Papadimitriou
                                       "JS Exception", error, params);
695 8d08f18a Kostas Papadimitriou
        },
696 8d08f18a Kostas Papadimitriou
697 8d08f18a Kostas Papadimitriou
        init_overlays: function() {
698 8d08f18a Kostas Papadimitriou
            this.create_vm_view = new views.CreateVMView();
699 978648f4 Kostas Papadimitriou
            this.api_info_view = new views.ApiInfoView();
700 1e882dd7 Kostas Papadimitriou
            this.details_view = new views.DetailsView();
701 a6b9836b Kostas Papadimitriou
            this.suspended_view = new views.SuspendedVMView();
702 8d08f18a Kostas Papadimitriou
            //this.notice_view = new views.NoticeView();
703 8d08f18a Kostas Papadimitriou
        },
704 8d08f18a Kostas Papadimitriou
        
705 8d08f18a Kostas Papadimitriou
        show_loading_view: function() {
706 8d08f18a Kostas Papadimitriou
            $("#container #content").hide();
707 8d08f18a Kostas Papadimitriou
            $("#loading-view").show();
708 8d08f18a Kostas Papadimitriou
        },
709 8d08f18a Kostas Papadimitriou
710 8d08f18a Kostas Papadimitriou
        hide_loading_view: function() {
711 8d08f18a Kostas Papadimitriou
            $("#container #content").show();
712 8d08f18a Kostas Papadimitriou
            $("#loading-view").hide();
713 8d08f18a Kostas Papadimitriou
            $(".css-panes").show();
714 8d08f18a Kostas Papadimitriou
        },
715 8d08f18a Kostas Papadimitriou
        
716 426e1fb9 Kostas Papadimitriou
        items_to_load: 6,
717 8d08f18a Kostas Papadimitriou
        completed_items: 0,
718 8d08f18a Kostas Papadimitriou
        check_status: function(loaded) {
719 8d08f18a Kostas Papadimitriou
            this.completed_items++;
720 8d08f18a Kostas Papadimitriou
            // images, flavors loaded
721 8d08f18a Kostas Papadimitriou
            if (this.completed_items == this.items_to_load) {
722 336ddd59 Kostas Papadimitriou
                this.update_status("layout", 1);
723 75331d54 Kostas Papadimitriou
                var self = this;
724 75331d54 Kostas Papadimitriou
                window.setTimeout(function(){
725 75331d54 Kostas Papadimitriou
                    self.after_load();
726 60491a38 Kostas Papadimitriou
                }, 10)
727 8d08f18a Kostas Papadimitriou
            }
728 8d08f18a Kostas Papadimitriou
        },
729 336ddd59 Kostas Papadimitriou
            
730 336ddd59 Kostas Papadimitriou
        load_missing_images: function(cb) {
731 336ddd59 Kostas Papadimitriou
            synnefo.storage.vms.load_missing_images(cb);
732 336ddd59 Kostas Papadimitriou
        },
733 8d08f18a Kostas Papadimitriou
734 8d08f18a Kostas Papadimitriou
        load_nets_and_vms: function() {
735 8d08f18a Kostas Papadimitriou
            var self = this;
736 336ddd59 Kostas Papadimitriou
            this.update_status("vms", 0);
737 8d08f18a Kostas Papadimitriou
            storage.vms.fetch({refresh:true, update:false, success: function(){
738 336ddd59 Kostas Papadimitriou
                self.load_missing_images(function(){
739 336ddd59 Kostas Papadimitriou
                    self.update_status("vms", 1);
740 336ddd59 Kostas Papadimitriou
                    self.update_status("layout", 0);
741 336ddd59 Kostas Papadimitriou
                    self.check_status();
742 336ddd59 Kostas Papadimitriou
                });
743 8d08f18a Kostas Papadimitriou
            }});
744 9ce969a7 Kostas Papadimitriou
745 336ddd59 Kostas Papadimitriou
            this.update_status("networks", 0);
746 7dff818c Kostas Papadimitriou
            $.when([
747 7dff818c Kostas Papadimitriou
                   storage.networks.fetch({refresh: true}), 
748 7dff818c Kostas Papadimitriou
                   storage.floating_ips.fetch({refresh: true}),
749 7dff818c Kostas Papadimitriou
                   storage.subnets.fetch({refresh: true}),
750 7dff818c Kostas Papadimitriou
                   storage.ports.fetch({refresh: true})
751 7dff818c Kostas Papadimitriou
            ]).done(function() {
752 7dff818c Kostas Papadimitriou
              self.update_status("networks", 1);
753 7dff818c Kostas Papadimitriou
              self.check_status();
754 7dff818c Kostas Papadimitriou
            })
755 8d08f18a Kostas Papadimitriou
        },  
756 6db98d7c Kostas Papadimitriou
        
757 6db98d7c Kostas Papadimitriou
        _fetchers: {},
758 6db98d7c Kostas Papadimitriou
        init_interval: function(key, collection) {
759 6db98d7c Kostas Papadimitriou
            if (this._fetchers[key]) { return }
760 1cc6e94f Kostas Papadimitriou
            var fetcher_params = [snf.config.update_interval, 
761 1cc6e94f Kostas Papadimitriou
                                  snf.config.update_interval_increase || 500,
762 1cc6e94f Kostas Papadimitriou
                                  snf.config.fast_interval || snf.config.update_interval/2, 
763 1cc6e94f Kostas Papadimitriou
                                  snf.config.update_interval_increase_after_calls || 4,
764 1cc6e94f Kostas Papadimitriou
                                  snf.config.update_interval_max || 20000,
765 1cc6e94f Kostas Papadimitriou
                                  true, 
766 a2b39c54 Kostas Papadimitriou
                                  {is_recurrent: true},
767 a2b39c54 Kostas Papadimitriou
                                  key];
768 6db98d7c Kostas Papadimitriou
            var fetcher = collection.get_fetcher.apply(collection, _.clone(fetcher_params));
769 6db98d7c Kostas Papadimitriou
            this._fetchers[key] = fetcher;
770 6db98d7c Kostas Papadimitriou
            collection.fetch();
771 6db98d7c Kostas Papadimitriou
772 6db98d7c Kostas Papadimitriou
        },
773 6db98d7c Kostas Papadimitriou
774 6db98d7c Kostas Papadimitriou
        init_intervals: function() {
775 6db98d7c Kostas Papadimitriou
            _.each({
776 6db98d7c Kostas Papadimitriou
              'networks': storage.networks,
777 6db98d7c Kostas Papadimitriou
              'vms': storage.vms,
778 6db98d7c Kostas Papadimitriou
              'quotas': storage.quotas,
779 6db98d7c Kostas Papadimitriou
              'ips': storage.floating_ips,
780 6db98d7c Kostas Papadimitriou
              'subnets': storage.subnets,
781 6db98d7c Kostas Papadimitriou
              'ports': storage.ports,
782 6db98d7c Kostas Papadimitriou
              'keys': storage.keys
783 6db98d7c Kostas Papadimitriou
            }, function(col, name) {
784 6db98d7c Kostas Papadimitriou
              this.init_interval(name, col)
785 6db98d7c Kostas Papadimitriou
            }, this);
786 8d08f18a Kostas Papadimitriou
        },
787 8d08f18a Kostas Papadimitriou
788 8d08f18a Kostas Papadimitriou
        stop_intervals: function() {
789 6db98d7c Kostas Papadimitriou
            _.each(this._fetchers, function(fetcher) {
790 6db98d7c Kostas Papadimitriou
                fetcher.stop();
791 6db98d7c Kostas Papadimitriou
            });
792 edd1d565 Kostas Papadimitriou
            this.intervals_stopped = true;
793 8d08f18a Kostas Papadimitriou
        },
794 8d08f18a Kostas Papadimitriou
795 8d08f18a Kostas Papadimitriou
        update_intervals: function() {
796 6db98d7c Kostas Papadimitriou
            _.each(this._fetchers, function(fetcher) {
797 6db98d7c Kostas Papadimitriou
                fetcher.stop();
798 6db98d7c Kostas Papadimitriou
                fetcher.start();
799 6db98d7c Kostas Papadimitriou
            })
800 edd1d565 Kostas Papadimitriou
            this.intervals_stopped = false;
801 8d08f18a Kostas Papadimitriou
        },
802 8d08f18a Kostas Papadimitriou
803 8d08f18a Kostas Papadimitriou
        after_load: function() {
804 60491a38 Kostas Papadimitriou
            var self = this;
805 8d08f18a Kostas Papadimitriou
            this.init_intervals();
806 8d08f18a Kostas Papadimitriou
            this.update_intervals();
807 336ddd59 Kostas Papadimitriou
            this.update_status("layout", 0);
808 75331d54 Kostas Papadimitriou
            
809 75331d54 Kostas Papadimitriou
            // bypass update_hidden_views in initial view
810 75331d54 Kostas Papadimitriou
            // rendering to force all views to get render
811 75331d54 Kostas Papadimitriou
            // on their creation
812 75331d54 Kostas Papadimitriou
            var uhv = snf.config.update_hidden_views;
813 75331d54 Kostas Papadimitriou
            snf.config.update_hidden_views = true;
814 38dc3895 Kostas Papadimitriou
            this.initialize_views();
815 60491a38 Kostas Papadimitriou
            snf.config.update_hidden_views = uhv;
816 75331d54 Kostas Papadimitriou
817 60491a38 Kostas Papadimitriou
            window.setTimeout(function() {
818 60491a38 Kostas Papadimitriou
                self.load_initialize_overlays();
819 60491a38 Kostas Papadimitriou
            }, 20);
820 60491a38 Kostas Papadimitriou
        },
821 60491a38 Kostas Papadimitriou
822 60491a38 Kostas Papadimitriou
        load_initialize_overlays: function() {
823 8d08f18a Kostas Papadimitriou
            this.init_overlays();
824 8d08f18a Kostas Papadimitriou
            // display initial view
825 8d08f18a Kostas Papadimitriou
            this.loaded = true;
826 38dc3895 Kostas Papadimitriou
            
827 38dc3895 Kostas Papadimitriou
            // application start point
828 38dc3895 Kostas Papadimitriou
829 122850c5 Kostas Papadimitriou
            this.check_empty();
830 9fd7a7a8 Kostas Papadimitriou
            this.show_initial_view();
831 8d08f18a Kostas Papadimitriou
        },
832 8d08f18a Kostas Papadimitriou
833 8d08f18a Kostas Papadimitriou
        load: function() {
834 30b6f316 Kostas Papadimitriou
            if (synnefo.config.use_glance) {
835 30b6f316 Kostas Papadimitriou
                synnefo.glance.register();
836 30b6f316 Kostas Papadimitriou
            }
837 8d08f18a Kostas Papadimitriou
            this.error_view = new views.ErrorView();
838 ab3df8df Kostas Papadimitriou
            this.vm_resize_view = new views.VmResizeView();
839 f0c38b0e Kostas Papadimitriou
840 1516800a Kostas Papadimitriou
            // api request error handling
841 1516800a Kostas Papadimitriou
            synnefo.api.bind("error", _.bind(this.handle_api_error, this));
842 1516800a Kostas Papadimitriou
            synnefo.api.bind("change:error_state", _.bind(this.handle_api_error_state, this));
843 1516800a Kostas Papadimitriou
            synnefo.ui.bind("error", _.bind(this.handle_ui_error, this));
844 1516800a Kostas Papadimitriou
845 81cfb7ee Kostas Papadimitriou
            this.feedback_view = new views.FeedbackView();
846 0228bc47 Kostas Papadimitriou
            
847 30b6f316 Kostas Papadimitriou
            if (synnefo.config.use_glance) {
848 0228bc47 Kostas Papadimitriou
                this.custom_images_view = new views.CustomImagesOverlay();
849 0228bc47 Kostas Papadimitriou
            }
850 8b71ea92 Kostas Papadimitriou
851 8d08f18a Kostas Papadimitriou
            var self = this;
852 8d08f18a Kostas Papadimitriou
            // initialize overlay views
853 8d08f18a Kostas Papadimitriou
            
854 8d08f18a Kostas Papadimitriou
            // display loading message
855 8d08f18a Kostas Papadimitriou
            this.show_loading_view();
856 8d08f18a Kostas Papadimitriou
            // sync load initial data
857 336ddd59 Kostas Papadimitriou
            this.update_status("images", 0);
858 8d08f18a Kostas Papadimitriou
            storage.images.fetch({refresh:true, update:false, success: function(){
859 336ddd59 Kostas Papadimitriou
                self.update_status("images", 1);
860 614fb66b Kostas Papadimitriou
                self.check_status();
861 614fb66b Kostas Papadimitriou
                self.load_nets_and_vms();
862 8d08f18a Kostas Papadimitriou
            }});
863 336ddd59 Kostas Papadimitriou
            this.update_status("flavors", 0);
864 8d08f18a Kostas Papadimitriou
            storage.flavors.fetch({refresh:true, update:false, success:function(){
865 336ddd59 Kostas Papadimitriou
                self.update_status("flavors", 1);
866 8d08f18a Kostas Papadimitriou
                self.check_status()
867 8d08f18a Kostas Papadimitriou
            }});
868 426e1fb9 Kostas Papadimitriou
869 426e1fb9 Kostas Papadimitriou
            this.update_status("resources", 0);
870 426e1fb9 Kostas Papadimitriou
            storage.resources.fetch({refresh:true, update:false, success: function(){
871 426e1fb9 Kostas Papadimitriou
                self.update_status("resources", 1);
872 426e1fb9 Kostas Papadimitriou
                self.update_status("quotas", 0);
873 426e1fb9 Kostas Papadimitriou
                self.check_status();
874 426e1fb9 Kostas Papadimitriou
                storage.quotas.fetch({refresh:true, update:true, success: function() {
875 426e1fb9 Kostas Papadimitriou
                  self.update_status("quotas", 1);
876 426e1fb9 Kostas Papadimitriou
                  self.update_status("layout", 1);
877 426e1fb9 Kostas Papadimitriou
                  self.check_status()
878 426e1fb9 Kostas Papadimitriou
                }})
879 426e1fb9 Kostas Papadimitriou
            }})
880 8d08f18a Kostas Papadimitriou
        },
881 8d08f18a Kostas Papadimitriou
882 336ddd59 Kostas Papadimitriou
        update_status: function(ns, state) {
883 336ddd59 Kostas Papadimitriou
            var el = $("#loading-view .header."+ns);
884 336ddd59 Kostas Papadimitriou
            if (state == 0) {
885 336ddd59 Kostas Papadimitriou
                el.removeClass("off").addClass("on");
886 336ddd59 Kostas Papadimitriou
            }
887 336ddd59 Kostas Papadimitriou
            if (state == 1) {
888 336ddd59 Kostas Papadimitriou
                el.removeClass("on").addClass("done");
889 336ddd59 Kostas Papadimitriou
            }
890 8d08f18a Kostas Papadimitriou
        },
891 8d08f18a Kostas Papadimitriou
892 8d08f18a Kostas Papadimitriou
        initialize_views: function() {
893 38dc3895 Kostas Papadimitriou
            this.select_view = new views.SelectView(this, this.router);
894 8d08f18a Kostas Papadimitriou
            this.empty_view = new views.EmptyView();
895 8d08f18a Kostas Papadimitriou
            this.metadata_view = new views.MetadataView();
896 8d08f18a Kostas Papadimitriou
            this.multiple_actions_view = new views.MultipleActionsView();
897 8d08f18a Kostas Papadimitriou
            
898 8d08f18a Kostas Papadimitriou
            this.add_view("icon");
899 8d08f18a Kostas Papadimitriou
            this.add_view("list");
900 8d08f18a Kostas Papadimitriou
            this.add_view("single");
901 8d08f18a Kostas Papadimitriou
            this.add_view("networks");
902 f0c38b0e Kostas Papadimitriou
            this.add_view("ips");
903 f0c38b0e Kostas Papadimitriou
            this.add_view("public-keys");
904 8d08f18a Kostas Papadimitriou
905 8d08f18a Kostas Papadimitriou
            this.init_menu();
906 8d08f18a Kostas Papadimitriou
        },
907 8d08f18a Kostas Papadimitriou
908 8d08f18a Kostas Papadimitriou
        init_menu: function() {
909 8b71ea92 Kostas Papadimitriou
            $(".usermenu .feedback").click(_.bind(function(e){
910 8b71ea92 Kostas Papadimitriou
                e.preventDefault();
911 8d08f18a Kostas Papadimitriou
                this.feedback_view.show();
912 8d08f18a Kostas Papadimitriou
            }, this));
913 8d08f18a Kostas Papadimitriou
        },
914 8d08f18a Kostas Papadimitriou
        
915 8d08f18a Kostas Papadimitriou
        // initial view based on user cookie
916 8d08f18a Kostas Papadimitriou
        show_initial_view: function() {
917 8d08f18a Kostas Papadimitriou
          this.set_vm_view_handlers();
918 8d08f18a Kostas Papadimitriou
          this.hide_loading_view();
919 38dc3895 Kostas Papadimitriou
          bb.history.start();
920 85f1cd1e Kostas Papadimitriou
          this.trigger("ready");
921 8d08f18a Kostas Papadimitriou
        },
922 8d08f18a Kostas Papadimitriou
923 8d08f18a Kostas Papadimitriou
        show_vm_details: function(vm) {
924 cbf7b384 Kostas Papadimitriou
            if (vm) {
925 cbf7b384 Kostas Papadimitriou
              this.router.vm_details_view(vm.id);
926 cbf7b384 Kostas Papadimitriou
            }
927 8d08f18a Kostas Papadimitriou
        },
928 426e1fb9 Kostas Papadimitriou
        
929 426e1fb9 Kostas Papadimitriou
        update_create_buttons_status: function() {
930 426e1fb9 Kostas Papadimitriou
            var nets = storage.quotas.get('cyclades.network.private');
931 426e1fb9 Kostas Papadimitriou
            var vms = storage.quotas.get('cyclades.vm');
932 426e1fb9 Kostas Papadimitriou
            
933 426e1fb9 Kostas Papadimitriou
            if (!nets || !vms) { return }
934 426e1fb9 Kostas Papadimitriou
935 426e1fb9 Kostas Papadimitriou
            if (!nets.can_consume()) {
936 426e1fb9 Kostas Papadimitriou
                $("#networks-pane a.createbutton").addClass("disabled");
937 426e1fb9 Kostas Papadimitriou
            } else {
938 426e1fb9 Kostas Papadimitriou
                $("#networks-pane a.createbutton").removeClass("disabled");
939 426e1fb9 Kostas Papadimitriou
            }
940 426e1fb9 Kostas Papadimitriou
941 426e1fb9 Kostas Papadimitriou
            if (!vms.can_consume()) {
942 426e1fb9 Kostas Papadimitriou
                $("#createcontainer #create").addClass("disabled");
943 426e1fb9 Kostas Papadimitriou
            } else {
944 426e1fb9 Kostas Papadimitriou
                $("#createcontainer #create").removeClass("disabled");
945 426e1fb9 Kostas Papadimitriou
            }
946 426e1fb9 Kostas Papadimitriou
        },
947 8d08f18a Kostas Papadimitriou
948 8d08f18a Kostas Papadimitriou
        set_vm_view_handlers: function() {
949 38dc3895 Kostas Papadimitriou
            var self = this;
950 38dc3895 Kostas Papadimitriou
            $("#createcontainer #create").click(function(e){
951 38dc3895 Kostas Papadimitriou
                e.preventDefault();
952 cbf7b384 Kostas Papadimitriou
                if ($(this).hasClass("disabled")) { return }
953 38dc3895 Kostas Papadimitriou
                self.router.vm_create_view();
954 cbf7b384 Kostas Papadimitriou
            });
955 8d08f18a Kostas Papadimitriou
        },
956 8d08f18a Kostas Papadimitriou
957 8d08f18a Kostas Papadimitriou
        check_empty: function() {
958 8d08f18a Kostas Papadimitriou
            if (!this.loaded) { return }
959 8d08f18a Kostas Papadimitriou
            if (storage.vms.length == 0) {
960 df8fe961 Kostas Papadimitriou
                this.show_view("machines");
961 38dc3895 Kostas Papadimitriou
                this.router.show_welcome();
962 e673a761 Kostas Papadimitriou
                this.empty_hidden = false;
963 8d08f18a Kostas Papadimitriou
            } else {
964 8d08f18a Kostas Papadimitriou
                this.hide_empty();
965 8d08f18a Kostas Papadimitriou
            }
966 8d08f18a Kostas Papadimitriou
        },
967 8d08f18a Kostas Papadimitriou
968 8d08f18a Kostas Papadimitriou
        show_empty: function() {
969 e673a761 Kostas Papadimitriou
            if (!this.empty_hidden) { return };
970 8d08f18a Kostas Papadimitriou
            $("#machines-pane-top").addClass("empty");
971 8d08f18a Kostas Papadimitriou
972 8d08f18a Kostas Papadimitriou
            this.$(".panes").hide();
973 8d08f18a Kostas Papadimitriou
            this.$("#machines-pane").show();
974 8d08f18a Kostas Papadimitriou
975 8d08f18a Kostas Papadimitriou
            this.hide_views([]);
976 e673a761 Kostas Papadimitriou
            this.empty_hidden = false;
977 8d08f18a Kostas Papadimitriou
            this.empty_view.show();
978 e673a761 Kostas Papadimitriou
            this.select_view.update_layout();
979 e673a761 Kostas Papadimitriou
            this.empty_hidden = false;
980 8d08f18a Kostas Papadimitriou
        },
981 8d08f18a Kostas Papadimitriou
982 8d08f18a Kostas Papadimitriou
        hide_empty: function() {
983 e673a761 Kostas Papadimitriou
            if (this.empty_hidden) { return };
984 8d08f18a Kostas Papadimitriou
            $("#machines-pane-top").removeClass("empty");
985 8d08f18a Kostas Papadimitriou
986 e673a761 Kostas Papadimitriou
            this.empty_view.hide(true);
987 38dc3895 Kostas Papadimitriou
            this.router.vms_index();
988 e673a761 Kostas Papadimitriou
            this.empty_hidden = true;
989 e673a761 Kostas Papadimitriou
            this.select_view.update_layout();
990 8d08f18a Kostas Papadimitriou
        },
991 8d08f18a Kostas Papadimitriou
        
992 8d08f18a Kostas Papadimitriou
        get_title: function(view_id) {
993 8d08f18a Kostas Papadimitriou
            var view_id = view_id || this.current_view_id;
994 8d08f18a Kostas Papadimitriou
            return this.views_titles[view_id];
995 8d08f18a Kostas Papadimitriou
        },
996 8d08f18a Kostas Papadimitriou
997 8d08f18a Kostas Papadimitriou
        // return class object for the given view or false if
998 8d08f18a Kostas Papadimitriou
        // the view is not registered
999 8d08f18a Kostas Papadimitriou
        get_class_for_view: function (view_id) {
1000 8d08f18a Kostas Papadimitriou
            if (!this.views_classes[view_id]) {
1001 8d08f18a Kostas Papadimitriou
                return false;
1002 8d08f18a Kostas Papadimitriou
            }
1003 8d08f18a Kostas Papadimitriou
            return this.views_classes[view_id];
1004 8d08f18a Kostas Papadimitriou
        },
1005 8d08f18a Kostas Papadimitriou
1006 8d08f18a Kostas Papadimitriou
        view: function(view_id) {
1007 8d08f18a Kostas Papadimitriou
            return this.views[view_id];
1008 8d08f18a Kostas Papadimitriou
        },
1009 8d08f18a Kostas Papadimitriou
1010 8d08f18a Kostas Papadimitriou
        add_view: function(view_id) {
1011 8d08f18a Kostas Papadimitriou
            if (!this.views[view_id]) {
1012 8d08f18a Kostas Papadimitriou
                var cls = this.get_class_for_view(view_id);
1013 8d08f18a Kostas Papadimitriou
                if (this.skip_errors) {
1014 8d08f18a Kostas Papadimitriou
                    this.views[view_id] = new cls();
1015 8d08f18a Kostas Papadimitriou
                    $(this.views[view_id]).bind("resize", _.bind(function() {
1016 d1a7ce9c Kostas Papadimitriou
                        window.forcePositionFooter();
1017 8d08f18a Kostas Papadimitriou
                        this.multiple_actions_view.fix_position();
1018 8d08f18a Kostas Papadimitriou
                    }, this));
1019 8d08f18a Kostas Papadimitriou
                } else {
1020 8d08f18a Kostas Papadimitriou
                    // catch ui errors
1021 8d08f18a Kostas Papadimitriou
                    try {
1022 8d08f18a Kostas Papadimitriou
                        this.views[view_id] = new cls();
1023 8d08f18a Kostas Papadimitriou
                        $(this.views[view_id]).bind("resize", _.bind(function() {
1024 8d08f18a Kostas Papadimitriou
                            window.positionFooter();
1025 8d08f18a Kostas Papadimitriou
                            this.multiple_actions_view.fix_position();
1026 8d08f18a Kostas Papadimitriou
                        }, this));
1027 9ffd10ce Kostas Papadimitriou
                    } catch (err) {snf.ui.trigger_error(-1, "Cannot add view", err)}
1028 8d08f18a Kostas Papadimitriou
                }
1029 8d08f18a Kostas Papadimitriou
            } else {
1030 8d08f18a Kostas Papadimitriou
            }
1031 8d08f18a Kostas Papadimitriou
1032 8d08f18a Kostas Papadimitriou
            if (this.views[view_id].vms_view) {
1033 8d08f18a Kostas Papadimitriou
                this.views[view_id].metadata_view = this.metadata_view;
1034 8d08f18a Kostas Papadimitriou
            }
1035 8d08f18a Kostas Papadimitriou
            return this.views[view_id];
1036 8d08f18a Kostas Papadimitriou
        },
1037 8d08f18a Kostas Papadimitriou
            
1038 8d08f18a Kostas Papadimitriou
        hide_views: function(skip) {
1039 8d08f18a Kostas Papadimitriou
            _.each(this.views, function(view) {
1040 8d08f18a Kostas Papadimitriou
                if (skip.indexOf(view) === -1) {
1041 f0c38b0e Kostas Papadimitriou
                    view.hide();
1042 8d08f18a Kostas Papadimitriou
                }
1043 8d08f18a Kostas Papadimitriou
            }, this)
1044 8d08f18a Kostas Papadimitriou
        },
1045 8d08f18a Kostas Papadimitriou
        
1046 8d08f18a Kostas Papadimitriou
        get: function(view_id) {
1047 8d08f18a Kostas Papadimitriou
            return this.views[view_id];
1048 8d08f18a Kostas Papadimitriou
        },
1049 8d08f18a Kostas Papadimitriou
        
1050 8d08f18a Kostas Papadimitriou
        session_view: function() {
1051 8d08f18a Kostas Papadimitriou
            if (this.pane_view_from_session() > 0) {
1052 8d08f18a Kostas Papadimitriou
                return this.views_pane_indexes[this.pane_view_from_session()];
1053 8d08f18a Kostas Papadimitriou
            } else {
1054 8d08f18a Kostas Papadimitriou
                return this.views_indexes[this.machine_view_from_session()];
1055 8d08f18a Kostas Papadimitriou
            }
1056 8d08f18a Kostas Papadimitriou
        },
1057 8d08f18a Kostas Papadimitriou
1058 8d08f18a Kostas Papadimitriou
        pane_view_from_session: function() {
1059 8d08f18a Kostas Papadimitriou
            return $.cookie("pane_view") || 0;
1060 8d08f18a Kostas Papadimitriou
        },
1061 8d08f18a Kostas Papadimitriou
1062 8d08f18a Kostas Papadimitriou
        machine_view_from_session: function() {
1063 8d08f18a Kostas Papadimitriou
            return $.cookie("machine_view") || 0;
1064 8d08f18a Kostas Papadimitriou
        },
1065 8d08f18a Kostas Papadimitriou
1066 8d08f18a Kostas Papadimitriou
        update_session: function() {
1067 8d08f18a Kostas Papadimitriou
            $.cookie("pane_view", this.pane_ids[this.current_view_id]);
1068 8d08f18a Kostas Papadimitriou
            if (this.current_view.vms_view) {
1069 8d08f18a Kostas Papadimitriou
                $.cookie("machine_view", this.views_ids[this.current_view_id]);
1070 8d08f18a Kostas Papadimitriou
            }
1071 8d08f18a Kostas Papadimitriou
        },
1072 8d08f18a Kostas Papadimitriou
1073 8d08f18a Kostas Papadimitriou
        identify_view: function(view_id) {
1074 8d08f18a Kostas Papadimitriou
            // machines view_id is an alias to
1075 8d08f18a Kostas Papadimitriou
            // one of the 3 machines view
1076 8d08f18a Kostas Papadimitriou
            // identify which one (if no cookie set defaults to icon)
1077 8d08f18a Kostas Papadimitriou
            if (view_id == "machines") {
1078 8d08f18a Kostas Papadimitriou
                var index = this.machine_view_from_session();
1079 8d08f18a Kostas Papadimitriou
                view_id = this.views_indexes[index];
1080 8d08f18a Kostas Papadimitriou
            }
1081 8d08f18a Kostas Papadimitriou
            return view_id;
1082 8d08f18a Kostas Papadimitriou
        },
1083 8d08f18a Kostas Papadimitriou
        
1084 8d08f18a Kostas Papadimitriou
        // switch to current view pane
1085 8d08f18a Kostas Papadimitriou
        // if differs from the visible one
1086 8d08f18a Kostas Papadimitriou
        show_view_pane: function() {
1087 8d08f18a Kostas Papadimitriou
            if (this.current_view.pane != this.current_pane) {
1088 8d08f18a Kostas Papadimitriou
                $(this.current_view.pane).show();
1089 8d08f18a Kostas Papadimitriou
                $(this.current_pane).hide();
1090 8d08f18a Kostas Papadimitriou
                this.current_pane = this.current_view.pane;
1091 8d08f18a Kostas Papadimitriou
            }
1092 8d08f18a Kostas Papadimitriou
        },
1093 75331d54 Kostas Papadimitriou
        
1094 8d08f18a Kostas Papadimitriou
        show_view: function(view_id) {
1095 75331d54 Kostas Papadimitriou
            //var d = new Date;
1096 75331d54 Kostas Papadimitriou
            var ret = this._show_view(view_id);
1097 75331d54 Kostas Papadimitriou
            //console.log((new Date)-d)
1098 75331d54 Kostas Papadimitriou
            return ret;
1099 75331d54 Kostas Papadimitriou
        },
1100 75331d54 Kostas Papadimitriou
1101 75331d54 Kostas Papadimitriou
        _show_view: function(view_id) {
1102 9ffd10ce Kostas Papadimitriou
                // same view, visible
1103 9ffd10ce Kostas Papadimitriou
                // get out of here asap
1104 9ffd10ce Kostas Papadimitriou
                if (this.current_view && 
1105 9ffd10ce Kostas Papadimitriou
                    this.current_view.id == view_id && 
1106 9ffd10ce Kostas Papadimitriou
                    this.current_view.visible()) {
1107 9ffd10ce Kostas Papadimitriou
                    return;
1108 9ffd10ce Kostas Papadimitriou
                }
1109 9ffd10ce Kostas Papadimitriou
                
1110 9ffd10ce Kostas Papadimitriou
                // choose proper view_id
1111 9ffd10ce Kostas Papadimitriou
                view_id = this.identify_view(view_id);
1112 9ffd10ce Kostas Papadimitriou
1113 9ffd10ce Kostas Papadimitriou
                // add/create view and update current view
1114 9ffd10ce Kostas Papadimitriou
                var view = this.add_view(view_id);
1115 9ffd10ce Kostas Papadimitriou
                
1116 9ffd10ce Kostas Papadimitriou
                // set current view
1117 9ffd10ce Kostas Papadimitriou
                this.current_view = view;
1118 9ffd10ce Kostas Papadimitriou
                this.current_view_id = view_id;
1119 9ffd10ce Kostas Papadimitriou
1120 9ffd10ce Kostas Papadimitriou
                // hide all other views
1121 9ffd10ce Kostas Papadimitriou
                this.hide_views([this.current_view]);
1122 9ffd10ce Kostas Papadimitriou
                
1123 9ffd10ce Kostas Papadimitriou
                // FIXME: depricated
1124 9ffd10ce Kostas Papadimitriou
                $(".large-spinner").remove();
1125 9ffd10ce Kostas Papadimitriou
1126 9ffd10ce Kostas Papadimitriou
                storage.vms.reset_pending_actions();
1127 f0c38b0e Kostas Papadimitriou
                //storage.networks.reset_pending_actions();
1128 9ffd10ce Kostas Papadimitriou
                storage.vms.stop_stats_update();
1129 9ffd10ce Kostas Papadimitriou
1130 9ffd10ce Kostas Papadimitriou
                // show current view
1131 9ffd10ce Kostas Papadimitriou
                this.show_view_pane();
1132 f0c38b0e Kostas Papadimitriou
                view.show(true);
1133 9ffd10ce Kostas Papadimitriou
                
1134 9ffd10ce Kostas Papadimitriou
                // update menus
1135 9ffd10ce Kostas Papadimitriou
                if (this.select_view) {
1136 9ffd10ce Kostas Papadimitriou
                    this.select_view.update_layout();
1137 9ffd10ce Kostas Papadimitriou
                }
1138 f0c38b0e Kostas Papadimitriou
1139 f0c38b0e Kostas Papadimitriou
                var update_layout = this.current_view.__update_layout;
1140 f0c38b0e Kostas Papadimitriou
                update_layout && update_layout.call(this.current_view);
1141 9ffd10ce Kostas Papadimitriou
1142 9ffd10ce Kostas Papadimitriou
                // update cookies
1143 9ffd10ce Kostas Papadimitriou
                this.update_session();
1144 9ffd10ce Kostas Papadimitriou
                
1145 9ffd10ce Kostas Papadimitriou
                // machines view subnav
1146 9ffd10ce Kostas Papadimitriou
                if (this.current_view.vms_view) {
1147 9ffd10ce Kostas Papadimitriou
                    $("#machines-pane").show();
1148 9ffd10ce Kostas Papadimitriou
                } else {
1149 9ffd10ce Kostas Papadimitriou
                    $("#machines-pane").hide();
1150 9ffd10ce Kostas Papadimitriou
                }
1151 9ffd10ce Kostas Papadimitriou
                
1152 9ffd10ce Kostas Papadimitriou
                // fix footer position
1153 9ffd10ce Kostas Papadimitriou
                // TODO: move footer handlers in
1154 9ffd10ce Kostas Papadimitriou
                // main view (from home.html)
1155 9ffd10ce Kostas Papadimitriou
                if (window.positionFooter) {
1156 9ffd10ce Kostas Papadimitriou
                    window.positionFooter();
1157 9ffd10ce Kostas Papadimitriou
                }
1158 8d08f18a Kostas Papadimitriou
1159 9ffd10ce Kostas Papadimitriou
                // trigger view change event
1160 9ffd10ce Kostas Papadimitriou
                this.trigger("view:change", this.current_view.view_id);
1161 2c5adb8a Kostas Papadimitriou
                this.select_view.title.text(this.get_title());
1162 9ffd10ce Kostas Papadimitriou
                $(window).trigger("view:change");
1163 9ffd10ce Kostas Papadimitriou
                return view;
1164 8d08f18a Kostas Papadimitriou
        },
1165 8d08f18a Kostas Papadimitriou
1166 8d08f18a Kostas Papadimitriou
        reset_vm_actions: function() {
1167 8d08f18a Kostas Papadimitriou
        
1168 8d08f18a Kostas Papadimitriou
        },
1169 8d08f18a Kostas Papadimitriou
        
1170 8d08f18a Kostas Papadimitriou
        // identify current view
1171 8d08f18a Kostas Papadimitriou
        // based on views element visibility
1172 8d08f18a Kostas Papadimitriou
        current_view_id: function() {
1173 8d08f18a Kostas Papadimitriou
            var found = false;
1174 8d08f18a Kostas Papadimitriou
            _.each(this.views, function(key, value) {
1175 8d08f18a Kostas Papadimitriou
                if (value.visible()) {
1176 8d08f18a Kostas Papadimitriou
                    found = value;
1177 8d08f18a Kostas Papadimitriou
                }
1178 8d08f18a Kostas Papadimitriou
            })
1179 8d08f18a Kostas Papadimitriou
            return found;
1180 8d08f18a Kostas Papadimitriou
        }
1181 8d08f18a Kostas Papadimitriou
1182 8d08f18a Kostas Papadimitriou
    });
1183 8d08f18a Kostas Papadimitriou
1184 8d08f18a Kostas Papadimitriou
    snf.ui.main = new views.MainView();
1185 b61dc01f Kostas Papadimitriou
    
1186 92a063bf Kostas Papadimitriou
    snf.ui.init = function() {
1187 66be390b Kostas Papadimitriou
        if (snf.config.handle_window_exceptions) {
1188 66be390b Kostas Papadimitriou
            window.onerror = function(msg, file, line) {
1189 52a432c7 Kostas Papadimitriou
                snf.ui.trigger_error("CRITICAL", msg, {}, { file:file + ":" + line, allow_close: true });
1190 66be390b Kostas Papadimitriou
            };
1191 66be390b Kostas Papadimitriou
        }
1192 92a063bf Kostas Papadimitriou
        snf.ui.main.load();
1193 92a063bf Kostas Papadimitriou
    }
1194 92a063bf Kostas Papadimitriou
1195 8d08f18a Kostas Papadimitriou
})(this);