Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / ui / web / ui_main_view.js @ 1fc7640d

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