Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / ui / web / ui_create_view.js @ 6201f0e3

History | View | Annotate | Download (65.6 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
    var util = snf.util = snf.util || {};
46 8d08f18a Kostas Papadimitriou
47 8d08f18a Kostas Papadimitriou
    var views = snf.views = snf.views || {}
48 8d08f18a Kostas Papadimitriou
49 8d08f18a Kostas Papadimitriou
    // shortcuts
50 8d08f18a Kostas Papadimitriou
    var bb = root.Backbone;
51 8d08f18a Kostas Papadimitriou
52 8d08f18a Kostas Papadimitriou
53 8d08f18a Kostas Papadimitriou
    views.VMCreationPasswordView = views.Overlay.extend({
54 8d08f18a Kostas Papadimitriou
        view_id: "creation_password_view",
55 8d08f18a Kostas Papadimitriou
        content_selector: "#creation-password-overlay",
56 8d08f18a Kostas Papadimitriou
        css_class: 'overlay-password overlay-info',
57 8d08f18a Kostas Papadimitriou
        overlay_id: "creation-password-overlay",
58 8d08f18a Kostas Papadimitriou
59 8d08f18a Kostas Papadimitriou
        subtitle: "",
60 8d08f18a Kostas Papadimitriou
        title: "Machine password",
61 8d08f18a Kostas Papadimitriou
62 8d08f18a Kostas Papadimitriou
        initialize: function(options) {
63 8d08f18a Kostas Papadimitriou
            views.FeedbackView.__super__.initialize.apply(this, arguments);
64 8d08f18a Kostas Papadimitriou
            _.bindAll(this, 'show_password');
65 8d08f18a Kostas Papadimitriou
66 8d08f18a Kostas Papadimitriou
            this.password = this.$("#new-machine-password");
67 35584d80 Kostas Papadimitriou
            this.copy = this.$(".clipboard");
68 60599850 Kostas Papadimitriou
69 60599850 Kostas Papadimitriou
            this.$(".show-machine").click(_.bind(function(){
70 c6e9caec Kostas Papadimitriou
                if (this.$(".show-machine").hasClass("in-progress")) {
71 c6e9caec Kostas Papadimitriou
                    return;
72 c6e9caec Kostas Papadimitriou
                }
73 60599850 Kostas Papadimitriou
                this.hide();
74 60599850 Kostas Papadimitriou
            }, this));
75 c6e9caec Kostas Papadimitriou
76 c6e9caec Kostas Papadimitriou
            _.bindAll(this, "handle_vm_added");
77 c6e9caec Kostas Papadimitriou
            storage.vms.bind("add", this.handle_vm_added);
78 35584d80 Kostas Papadimitriou
            this.password.text("");
79 c6e9caec Kostas Papadimitriou
        },
80 c6e9caec Kostas Papadimitriou
81 c6e9caec Kostas Papadimitriou
        handle_vm_added: function() {
82 c6e9caec Kostas Papadimitriou
            this.$(".show-machine").removeClass("in-progress");
83 8d08f18a Kostas Papadimitriou
        },
84 8d08f18a Kostas Papadimitriou
        
85 8d08f18a Kostas Papadimitriou
        show_password: function() {
86 c6e9caec Kostas Papadimitriou
            this.$(".show-machine").addClass("in-progress");
87 8d08f18a Kostas Papadimitriou
            this.password.text(this.pass);
88 a08a37d2 Kostas Papadimitriou
            if (storage.vms.get(this.vm_id)) {
89 2b2afade Kostas Papadimitriou
                this.$(".show-machine").removeClass("in-progress");
90 2b2afade Kostas Papadimitriou
            }
91 35584d80 Kostas Papadimitriou
            
92 35584d80 Kostas Papadimitriou
            this.clip = new snf.util.ClipHelper(this.copy, this.pass);
93 8d08f18a Kostas Papadimitriou
        },
94 8d08f18a Kostas Papadimitriou
95 8d08f18a Kostas Papadimitriou
        onClose: function() {
96 8d08f18a Kostas Papadimitriou
            this.password.text("");
97 c6e9caec Kostas Papadimitriou
            this.vm_id = undefined;
98 35584d80 Kostas Papadimitriou
            try { delete this.clip; } catch (err) {};
99 8d08f18a Kostas Papadimitriou
        },
100 bd8fa10c Kostas Papadimitriou
        
101 bd8fa10c Kostas Papadimitriou
        beforeOpen: function() {
102 35584d80 Kostas Papadimitriou
            this.copy.empty();
103 bd8fa10c Kostas Papadimitriou
        },
104 bd8fa10c Kostas Papadimitriou
        
105 bd8fa10c Kostas Papadimitriou
        onOpen: function() {
106 35584d80 Kostas Papadimitriou
            this.show_password();
107 bd8fa10c Kostas Papadimitriou
        },
108 bd8fa10c Kostas Papadimitriou
109 8d08f18a Kostas Papadimitriou
        show: function(pass, vm_id) {
110 8d08f18a Kostas Papadimitriou
            this.pass = pass;
111 8d08f18a Kostas Papadimitriou
            this.vm_id = vm_id;
112 c6e9caec Kostas Papadimitriou
            
113 8d08f18a Kostas Papadimitriou
            views.VMCreationPasswordView.__super__.show.apply(this, arguments);
114 8d08f18a Kostas Papadimitriou
        }
115 8d08f18a Kostas Papadimitriou
    })
116 8d08f18a Kostas Papadimitriou
117 8d08f18a Kostas Papadimitriou
118 8d08f18a Kostas Papadimitriou
    
119 8d08f18a Kostas Papadimitriou
    views.CreateVMStepView = views.View.extend({
120 8d08f18a Kostas Papadimitriou
        step: "1",
121 8d08f18a Kostas Papadimitriou
        title: "Image",
122 8d08f18a Kostas Papadimitriou
        submit: false,
123 8d08f18a Kostas Papadimitriou
124 8d08f18a Kostas Papadimitriou
        initialize: function(view) {
125 8d08f18a Kostas Papadimitriou
            this.parent = view;
126 8d08f18a Kostas Papadimitriou
            this.el = view.$("div.create-step-cont.step-" + this.step);
127 820ef2f0 Kostas Papadimitriou
            this.header = this.$(".step-header .step-" + this.step);
128 8d08f18a Kostas Papadimitriou
            this.view_id = "create_step_" + this.step;
129 8d08f18a Kostas Papadimitriou
130 8d08f18a Kostas Papadimitriou
            views.CreateVMStepView.__super__.initialize.apply(this);
131 8d08f18a Kostas Papadimitriou
        },
132 8d08f18a Kostas Papadimitriou
133 8d08f18a Kostas Papadimitriou
        show: function() {
134 8d08f18a Kostas Papadimitriou
            // show current
135 8d08f18a Kostas Papadimitriou
            this.el.show();
136 8d08f18a Kostas Papadimitriou
            this.header.addClass("current");
137 820ef2f0 Kostas Papadimitriou
            this.header.show();
138 8d08f18a Kostas Papadimitriou
            this.update_layout();
139 8d08f18a Kostas Papadimitriou
        },
140 8d08f18a Kostas Papadimitriou
141 8d08f18a Kostas Papadimitriou
        reset: function() {
142 8d08f18a Kostas Papadimitriou
        }
143 8d08f18a Kostas Papadimitriou
    })
144 8d08f18a Kostas Papadimitriou
145 8d08f18a Kostas Papadimitriou
    views.CreateImageSelectView = views.CreateVMStepView.extend({
146 8d08f18a Kostas Papadimitriou
147 8d08f18a Kostas Papadimitriou
        initialize: function() {
148 8d08f18a Kostas Papadimitriou
            views.CreateImageSelectView.__super__.initialize.apply(this, arguments);
149 8d08f18a Kostas Papadimitriou
150 820ef2f0 Kostas Papadimitriou
            // elements
151 73e25ce2 Kostas Papadimitriou
            this.images_list_cont = this.$(".images-list-cont");
152 820ef2f0 Kostas Papadimitriou
            this.images_list = this.$(".images-list-cont ul");
153 820ef2f0 Kostas Papadimitriou
            this.image_details = this.$(".images-info-cont");
154 820ef2f0 Kostas Papadimitriou
            this.image_details_desc = this.$(".images-info-cont .description p");
155 820ef2f0 Kostas Papadimitriou
            this.image_details_title = this.$(".images-info-cont h4");
156 820ef2f0 Kostas Papadimitriou
            this.image_details_size = this.$(".images-info-cont .size p");
157 820ef2f0 Kostas Papadimitriou
            this.image_details_os = this.$(".images-info-cont .os p");
158 820ef2f0 Kostas Papadimitriou
            this.image_details_kernel = this.$(".images-info-cont .kernel p");
159 820ef2f0 Kostas Papadimitriou
            this.image_details_gui = this.$(".images-info-cont .gui p");
160 2cee7cb0 Kostas Papadimitriou
            this.image_details_vm = this.$(".images-info-cont .vm-name p");
161 820ef2f0 Kostas Papadimitriou
162 820ef2f0 Kostas Papadimitriou
            this.categories_list = this.$(".category-filters");
163 2cee7cb0 Kostas Papadimitriou
            
164 820ef2f0 Kostas Papadimitriou
            // params initialization
165 4cff0386 Kostas Papadimitriou
            this.type_selections = {"system": "System"};
166 4cff0386 Kostas Papadimitriou
            this.type_selections_order = ['system'];
167 4cff0386 Kostas Papadimitriou
            
168 4cff0386 Kostas Papadimitriou
            this.images_storage = snf.storage.images;
169 4cff0386 Kostas Papadimitriou
170 4cff0386 Kostas Papadimitriou
            // apply image service specific image types
171 4cff0386 Kostas Papadimitriou
            if (this.images_storage.type_selections) {
172 4cff0386 Kostas Papadimitriou
                this.type_selections = _.extend(
173 4cff0386 Kostas Papadimitriou
                    this.images_storage.type_selections,
174 4cff0386 Kostas Papadimitriou
                    this.type_selections)
175 2cee7cb0 Kostas Papadimitriou
176 4cff0386 Kostas Papadimitriou
                this.type_selections_order = this.images_storage.type_selections_order;
177 4cff0386 Kostas Papadimitriou
            }
178 4cff0386 Kostas Papadimitriou
179 4cff0386 Kostas Papadimitriou
            this.selected_type = undefined;
180 820ef2f0 Kostas Papadimitriou
            this.selected_categories = [];
181 4cff0386 Kostas Papadimitriou
182 820ef2f0 Kostas Papadimitriou
            this.images = [];
183 2cee7cb0 Kostas Papadimitriou
            this.images_ids = [];
184 54235b2e Kostas Papadimitriou
            this.custom_images = [];
185 820ef2f0 Kostas Papadimitriou
186 820ef2f0 Kostas Papadimitriou
            // handlers initialization
187 4cff0386 Kostas Papadimitriou
            this.create_types_selection_options();
188 820ef2f0 Kostas Papadimitriou
            this.init_handlers();
189 820ef2f0 Kostas Papadimitriou
            this.init_position();
190 820ef2f0 Kostas Papadimitriou
        },
191 4cff0386 Kostas Papadimitriou
        
192 820ef2f0 Kostas Papadimitriou
        init_position: function() {
193 820ef2f0 Kostas Papadimitriou
            //this.el.css({position: "absolute"});
194 820ef2f0 Kostas Papadimitriou
            //this.el.css({top:"10px"})
195 820ef2f0 Kostas Papadimitriou
        },
196 820ef2f0 Kostas Papadimitriou
        
197 820ef2f0 Kostas Papadimitriou
        init_handlers: function() {
198 820ef2f0 Kostas Papadimitriou
            var self = this;
199 820ef2f0 Kostas Papadimitriou
            this.types.live("click", function() {
200 820ef2f0 Kostas Papadimitriou
                self.select_type($(this).attr("id").replace("type-select-",""));
201 61d7787c Kostas Papadimitriou
            });
202 4cff0386 Kostas Papadimitriou
            
203 4cff0386 Kostas Papadimitriou
            this.image_details.find(".hide").click(_.bind(function(){
204 4cff0386 Kostas Papadimitriou
                this.hide_image_details();
205 4cff0386 Kostas Papadimitriou
            }, this));
206 61d7787c Kostas Papadimitriou
207 61d7787c Kostas Papadimitriou
            this.$(".register-custom-image").live("click", function(){
208 61d7787c Kostas Papadimitriou
                var confirm_close = true;
209 61d7787c Kostas Papadimitriou
                if (confirm_close) {
210 61d7787c Kostas Papadimitriou
                    snf.ui.main.custom_images_view.show(self.parent);
211 61d7787c Kostas Papadimitriou
                } else {
212 61d7787c Kostas Papadimitriou
                }
213 820ef2f0 Kostas Papadimitriou
            })
214 a020e99e Kostas Papadimitriou
215 a020e99e Kostas Papadimitriou
            $(".image-warning .confirm").bind('click', function(){
216 a020e99e Kostas Papadimitriou
                $(".image-warning").hide();
217 a020e99e Kostas Papadimitriou
                $(".create-controls").show();
218 a020e99e Kostas Papadimitriou
            })
219 820ef2f0 Kostas Papadimitriou
        },
220 820ef2f0 Kostas Papadimitriou
221 4cff0386 Kostas Papadimitriou
        update_images: function(images) {
222 4cff0386 Kostas Papadimitriou
            this.images = images;
223 2cee7cb0 Kostas Papadimitriou
            this.images_ids = _.map(this.images, function(img){return img.id});
224 4cff0386 Kostas Papadimitriou
            return this.images;
225 2cee7cb0 Kostas Papadimitriou
        },
226 2cee7cb0 Kostas Papadimitriou
227 4cff0386 Kostas Papadimitriou
        create_types_selection_options: function() {
228 4cff0386 Kostas Papadimitriou
            var list = this.$("ul.type-filter");
229 4cff0386 Kostas Papadimitriou
            _.each(this.type_selections_order, _.bind(function(key) {
230 4cff0386 Kostas Papadimitriou
                list.append('<li id="type-select-{0}">{1}</li>'.format(key, this.type_selections[key]));
231 4cff0386 Kostas Papadimitriou
            }, this));
232 4cff0386 Kostas Papadimitriou
            this.types = this.$(".type-filter li");
233 54235b2e Kostas Papadimitriou
        },
234 54235b2e Kostas Papadimitriou
235 8d08f18a Kostas Papadimitriou
        update_layout: function() {
236 4cff0386 Kostas Papadimitriou
            if (!this.selected_type) {
237 4cff0386 Kostas Papadimitriou
                this.selected_type = _.keys(this.type_selections)[0];
238 2cee7cb0 Kostas Papadimitriou
            }
239 4cff0386 Kostas Papadimitriou
            this.select_type(this.selected_type);
240 820ef2f0 Kostas Papadimitriou
        },
241 820ef2f0 Kostas Papadimitriou
        
242 820ef2f0 Kostas Papadimitriou
        get_categories: function(images) {
243 820ef2f0 Kostas Papadimitriou
            return [];
244 820ef2f0 Kostas Papadimitriou
            return ["Desktop", "Server", "Linux", "Windows"];
245 820ef2f0 Kostas Papadimitriou
        },
246 820ef2f0 Kostas Papadimitriou
247 820ef2f0 Kostas Papadimitriou
        reset_categories: function() {
248 820ef2f0 Kostas Papadimitriou
            var categories = this.get_categories(this.images);
249 820ef2f0 Kostas Papadimitriou
            this.categories_list.find("li").remove();
250 820ef2f0 Kostas Papadimitriou
251 820ef2f0 Kostas Papadimitriou
            _.each(categories, _.bind(function(cat) {
252 820ef2f0 Kostas Papadimitriou
                var el = $("<li />");
253 820ef2f0 Kostas Papadimitriou
                el.text(cat);
254 820ef2f0 Kostas Papadimitriou
                this.categories_list.append(el);
255 820ef2f0 Kostas Papadimitriou
            }, this));
256 820ef2f0 Kostas Papadimitriou
257 820ef2f0 Kostas Papadimitriou
            if (!categories.length) { 
258 820ef2f0 Kostas Papadimitriou
                this.categories_list.parent().find(".clear").hide();
259 820ef2f0 Kostas Papadimitriou
                this.categories_list.parent().find(".empty").show();
260 820ef2f0 Kostas Papadimitriou
            } else {
261 820ef2f0 Kostas Papadimitriou
                this.categories_list.parent().find(".clear").show();
262 820ef2f0 Kostas Papadimitriou
                this.categories_list.parent().find(".empty").hide();
263 820ef2f0 Kostas Papadimitriou
            }
264 820ef2f0 Kostas Papadimitriou
        },
265 820ef2f0 Kostas Papadimitriou
        
266 4cff0386 Kostas Papadimitriou
        show_loading_view: function() {
267 4cff0386 Kostas Papadimitriou
            this.$(".images-list-cont .empty").hide();
268 4cff0386 Kostas Papadimitriou
            this.images_list.hide();
269 4cff0386 Kostas Papadimitriou
            this.$(".images-list-cont .loading").show();
270 4cff0386 Kostas Papadimitriou
            this.$(".images-list-cont .images-list").hide();
271 4cff0386 Kostas Papadimitriou
            this.reset_categories();
272 4cff0386 Kostas Papadimitriou
            this.update_images([]);
273 4cff0386 Kostas Papadimitriou
            this.reset_images();
274 4cff0386 Kostas Papadimitriou
            this.hide_list_loading();
275 4cff0386 Kostas Papadimitriou
        },
276 4cff0386 Kostas Papadimitriou
277 4cff0386 Kostas Papadimitriou
        hide_loading_view: function(images) {
278 4cff0386 Kostas Papadimitriou
            this.$(".images-list-cont .loading").hide();
279 4cff0386 Kostas Papadimitriou
            this.$(".images-list-cont .images-list").show();
280 4cff0386 Kostas Papadimitriou
            this.reset_categories();
281 4cff0386 Kostas Papadimitriou
            this.update_images(images);
282 4cff0386 Kostas Papadimitriou
            this.reset_images();
283 4cff0386 Kostas Papadimitriou
            this.select_image(this.selected_image);
284 4cff0386 Kostas Papadimitriou
            this.hide_list_loading();
285 2ee94f4c Kostas Papadimitriou
            $(".custom-image-help").hide();
286 2ee94f4c Kostas Papadimitriou
            if (this.selected_type == 'personal' && !images.length) {
287 2ee94f4c Kostas Papadimitriou
                $(".custom-image-help").show();
288 2ee94f4c Kostas Papadimitriou
            }
289 2ee94f4c Kostas Papadimitriou
290 4cff0386 Kostas Papadimitriou
        },
291 4cff0386 Kostas Papadimitriou
292 820ef2f0 Kostas Papadimitriou
        select_type: function(type) {
293 820ef2f0 Kostas Papadimitriou
            this.selected_type = type;
294 820ef2f0 Kostas Papadimitriou
            this.types.removeClass("selected");
295 820ef2f0 Kostas Papadimitriou
            this.types.filter("#type-select-" + this.selected_type).addClass("selected");
296 e472ed67 Kostas Papadimitriou
            this.images_storage.update_images_for_type(
297 4cff0386 Kostas Papadimitriou
                this.selected_type, 
298 4cff0386 Kostas Papadimitriou
                _.bind(this.show_loading_view, this), 
299 4cff0386 Kostas Papadimitriou
                _.bind(this.hide_loading_view, this)
300 4cff0386 Kostas Papadimitriou
            );
301 28958b8e Kostas Papadimitriou
302 61d7787c Kostas Papadimitriou
            this.update_layout_for_type(type);
303 61d7787c Kostas Papadimitriou
        },
304 61d7787c Kostas Papadimitriou
305 61d7787c Kostas Papadimitriou
        update_layout_for_type: function(type) {
306 4cff0386 Kostas Papadimitriou
            if (type != "system") {
307 4cff0386 Kostas Papadimitriou
                this.$(".custom-action").hide();
308 61d7787c Kostas Papadimitriou
            } else {
309 61d7787c Kostas Papadimitriou
                this.$(".custom-action").hide();
310 61d7787c Kostas Papadimitriou
            }
311 4cff0386 Kostas Papadimitriou
312 54235b2e Kostas Papadimitriou
        },
313 54235b2e Kostas Papadimitriou
314 54235b2e Kostas Papadimitriou
        show_list_loading: function() {
315 54235b2e Kostas Papadimitriou
            this.$(".images-list-cont").addClass("loading");
316 54235b2e Kostas Papadimitriou
        },
317 54235b2e Kostas Papadimitriou
318 54235b2e Kostas Papadimitriou
        hide_list_loading: function() {
319 54235b2e Kostas Papadimitriou
            this.$(".images-list-cont").removeClass("loading");
320 8d08f18a Kostas Papadimitriou
        },
321 fc6f43c3 Kostas Papadimitriou
        
322 fc6f43c3 Kostas Papadimitriou
        display_warning_for_image: function(image) {
323 580c3b9b Kostas Papadimitriou
          if (image && !image.is_system_image() && !image.owned_by(synnefo.user)) {
324 fc6f43c3 Kostas Papadimitriou
            $(".create-vm .image-warning").show();
325 a020e99e Kostas Papadimitriou
            $(".create-controls").hide();
326 fc6f43c3 Kostas Papadimitriou
          } else {
327 fc6f43c3 Kostas Papadimitriou
            $(".create-vm .image-warning").hide();
328 a020e99e Kostas Papadimitriou
            $(".create-controls").show();
329 fc6f43c3 Kostas Papadimitriou
          }
330 fc6f43c3 Kostas Papadimitriou
        },
331 8d08f18a Kostas Papadimitriou
332 8d08f18a Kostas Papadimitriou
        select_image: function(image) {
333 e472ed67 Kostas Papadimitriou
            if (image && image.get('id') && !_.include(this.images_ids, image.get('id'))) {
334 e472ed67 Kostas Papadimitriou
                image = undefined;
335 e472ed67 Kostas Papadimitriou
            }
336 820ef2f0 Kostas Papadimitriou
            if (!image && this.images_ids.length) {
337 820ef2f0 Kostas Papadimitriou
                if (this.selected_image && this.images_ids.indexOf(this.selected_image.id) > -1) {
338 820ef2f0 Kostas Papadimitriou
                    image = this.selected_image;
339 820ef2f0 Kostas Papadimitriou
                } else {
340 4cff0386 Kostas Papadimitriou
                    image = this.images_storage.get(this.images_ids[0]);
341 820ef2f0 Kostas Papadimitriou
                }
342 8d08f18a Kostas Papadimitriou
            }
343 e472ed67 Kostas Papadimitriou
             
344 e472ed67 Kostas Papadimitriou
            // no images select null image so that next button gets hidden
345 e472ed67 Kostas Papadimitriou
            if (!this.images_ids.length) { image = undefined };
346 820ef2f0 Kostas Papadimitriou
            
347 2cee7cb0 Kostas Papadimitriou
            if ((!this.selected_image && image) || (this.selected_image != image))
348 2cee7cb0 Kostas Papadimitriou
                this.trigger("change", image);
349 fc6f43c3 Kostas Papadimitriou
                this.display_warning_for_image(image);
350 2cee7cb0 Kostas Papadimitriou
351 8d08f18a Kostas Papadimitriou
            this.selected_image = image;
352 2cee7cb0 Kostas Papadimitriou
                
353 820ef2f0 Kostas Papadimitriou
            if (image) {
354 820ef2f0 Kostas Papadimitriou
                this.images_list.find(".image-details").removeClass("selected");
355 820ef2f0 Kostas Papadimitriou
                this.images_list.find(".image-details#create-vm-image-" + this.selected_image.id).addClass("selected");
356 4cff0386 Kostas Papadimitriou
                this.update_image_details(image);
357 820ef2f0 Kostas Papadimitriou
358 820ef2f0 Kostas Papadimitriou
            } else {
359 820ef2f0 Kostas Papadimitriou
            }
360 cd4d5c5f Kostas Papadimitriou
361 4cff0386 Kostas Papadimitriou
            this.image_details.hide();
362 cd4d5c5f Kostas Papadimitriou
            this.validate();
363 8d08f18a Kostas Papadimitriou
        },
364 8d08f18a Kostas Papadimitriou
365 4cff0386 Kostas Papadimitriou
        update_image_details: function(image) {
366 4cff0386 Kostas Papadimitriou
            this.image_details_desc.hide().parent().hide();
367 1d356257 Kostas Papadimitriou
            if (image.get_description()) {
368 fcd31170 Kostas Papadimitriou
                this.image_details_desc.html(image.get_description(false)).show().parent().show();
369 df251d55 Kostas Papadimitriou
            }
370 df251d55 Kostas Papadimitriou
            var img = snf.ui.helpers.os_icon_tag(image.escape("OS"))
371 df251d55 Kostas Papadimitriou
            if (image.get("name")) {
372 df251d55 Kostas Papadimitriou
                this.image_details_title.html(img + image.escape("name")).show().parent().show();
373 df251d55 Kostas Papadimitriou
            }
374 4cff0386 Kostas Papadimitriou
            
375 4cff0386 Kostas Papadimitriou
            var extra_details = this.image_details.find(".extra-details");
376 4cff0386 Kostas Papadimitriou
            // clean prevously added extra details
377 4cff0386 Kostas Papadimitriou
            extra_details.find(".image-detail").remove();
378 1d356257 Kostas Papadimitriou
            
379 1d356257 Kostas Papadimitriou
            var skip_keys = ['description', 'sortorder']
380 4cff0386 Kostas Papadimitriou
            var meta_keys = ['owner', 'OS', 'kernel', 'GUI'];
381 4cff0386 Kostas Papadimitriou
            var detail_tpl = ('<div class="clearfix image-detail {2}">' +
382 1d356257 Kostas Papadimitriou
                             '<span class="title clearfix">{0}' +
383 1d356257 Kostas Papadimitriou
                             '<span class="custom">custom</span></span>' +
384 4cff0386 Kostas Papadimitriou
                             '<p class="value">{1}</p>' + 
385 4cff0386 Kostas Papadimitriou
                             '</div>');
386 4cff0386 Kostas Papadimitriou
            meta_keys = _.union(meta_keys, this.images_storage.display_metadata || []);
387 1d356257 Kostas Papadimitriou
            
388 1d356257 Kostas Papadimitriou
            var append_metadata_row = function(key, is_extra) {
389 4cff0386 Kostas Papadimitriou
                var value;
390 4cff0386 Kostas Papadimitriou
                var method = 'get_' + key.toLowerCase();
391 30b6f316 Kostas Papadimitriou
                var display_method = 'display_' + key.toLowerCase();
392 1faf0b9c Kostas Papadimitriou
                 
393 30b6f316 Kostas Papadimitriou
                if (image[display_method]) {
394 30b6f316 Kostas Papadimitriou
                    value = image[display_method]();
395 30b6f316 Kostas Papadimitriou
                } else if (image[method]) {
396 4cff0386 Kostas Papadimitriou
                    value = image[method]();
397 4cff0386 Kostas Papadimitriou
                } else {
398 4cff0386 Kostas Papadimitriou
                    value = image.get(key);
399 4cff0386 Kostas Papadimitriou
400 4cff0386 Kostas Papadimitriou
                    if (!value) {
401 4cff0386 Kostas Papadimitriou
                        value = image.get_meta(key);
402 4cff0386 Kostas Papadimitriou
                    }
403 4cff0386 Kostas Papadimitriou
                }
404 1d356257 Kostas Papadimitriou
                    
405 4cff0386 Kostas Papadimitriou
                if (!value) { return; }
406 1d356257 Kostas Papadimitriou
                 
407 1d356257 Kostas Papadimitriou
                var label = this.images_storage.meta_labels[key];
408 1d356257 Kostas Papadimitriou
                if (!label) {
409 1d356257 Kostas Papadimitriou
                    var label = _(key.replace(/_/g," ")).capitalize();
410 1d356257 Kostas Papadimitriou
                }
411 1d356257 Kostas Papadimitriou
                var row_cls = key.toLowerCase();
412 1d356257 Kostas Papadimitriou
                if (is_extra) { row_cls += " extra-meta" };
413 fcd31170 Kostas Papadimitriou
                extra_details.append(detail_tpl.format(_.escape(label), value, row_cls));
414 1d356257 Kostas Papadimitriou
            }
415 1d356257 Kostas Papadimitriou
416 1d356257 Kostas Papadimitriou
            _.each(meta_keys, function(key) {
417 1d356257 Kostas Papadimitriou
                append_metadata_row.apply(this, [key]);
418 1d356257 Kostas Papadimitriou
            }, this);
419 1d356257 Kostas Papadimitriou
            
420 1d356257 Kostas Papadimitriou
            if (synnefo.storage.images.display_extra_metadata) {
421 0dee4086 Kostas Papadimitriou
                _.each(image.get('metadata'), function(value, key) {
422 1d356257 Kostas Papadimitriou
                    if (!_.contains(meta_keys, key) && 
423 1d356257 Kostas Papadimitriou
                        !_.contains(meta_keys, key.toLowerCase()) &&
424 1d356257 Kostas Papadimitriou
                        !_.contains(meta_keys, key.toUpperCase()) &&
425 1d356257 Kostas Papadimitriou
                        !_.contains(skip_keys, key)) {
426 1d356257 Kostas Papadimitriou
                            append_metadata_row.apply(this, [key, true]);
427 1d356257 Kostas Papadimitriou
                    }
428 1d356257 Kostas Papadimitriou
                }, this);
429 1d356257 Kostas Papadimitriou
            }
430 4cff0386 Kostas Papadimitriou
        },
431 4cff0386 Kostas Papadimitriou
432 8d08f18a Kostas Papadimitriou
        reset_images: function() {
433 820ef2f0 Kostas Papadimitriou
            this.images_list.find("li").remove();
434 820ef2f0 Kostas Papadimitriou
            _.each(this.images, _.bind(function(img){
435 8d08f18a Kostas Papadimitriou
                this.add_image(img);
436 8d08f18a Kostas Papadimitriou
            }, this))
437 820ef2f0 Kostas Papadimitriou
            
438 820ef2f0 Kostas Papadimitriou
            if (this.images.length) {
439 820ef2f0 Kostas Papadimitriou
                this.images_list.parent().find(".empty").hide();
440 4cff0386 Kostas Papadimitriou
                this.images_list.show();
441 820ef2f0 Kostas Papadimitriou
            } else {
442 820ef2f0 Kostas Papadimitriou
                this.images_list.parent().find(".empty").show();
443 4cff0386 Kostas Papadimitriou
                this.images_list.hide();
444 820ef2f0 Kostas Papadimitriou
            }
445 8d08f18a Kostas Papadimitriou
446 8d08f18a Kostas Papadimitriou
            var self = this;
447 820ef2f0 Kostas Papadimitriou
            this.images_list.find(".image-details").click(function(){
448 8d08f18a Kostas Papadimitriou
                self.select_image($(this).data("image"));
449 820ef2f0 Kostas Papadimitriou
            });
450 820ef2f0 Kostas Papadimitriou
            
451 820ef2f0 Kostas Papadimitriou
        },
452 820ef2f0 Kostas Papadimitriou
453 820ef2f0 Kostas Papadimitriou
        show: function() {
454 4cff0386 Kostas Papadimitriou
            this.image_details.hide();
455 259d30d8 Kostas Papadimitriou
            this.parent.$(".create-controls").show();
456 259d30d8 Kostas Papadimitriou
457 259d30d8 Kostas Papadimitriou
            views.CreateImageSelectView.__super__.show.apply(this, arguments);
458 8d08f18a Kostas Papadimitriou
        },
459 8d08f18a Kostas Papadimitriou
460 8d08f18a Kostas Papadimitriou
        add_image: function(img) {
461 820ef2f0 Kostas Papadimitriou
            var image = $(('<li id="create-vm-image-{1}"' +
462 4cff0386 Kostas Papadimitriou
                           'class="image-details clearfix">{2}{0}'+
463 4cff0386 Kostas Papadimitriou
                           '<span class="show-details">details</span>'+
464 4cff0386 Kostas Papadimitriou
                           '<span class="size"><span class="prepend">by </span>{5}</span>' + 
465 4cff0386 Kostas Papadimitriou
                           '<span class="owner">' +
466 4cff0386 Kostas Papadimitriou
                           '<span class="prepend"></span>' +
467 4cff0386 Kostas Papadimitriou
                           '{3}</span>' + 
468 4cff0386 Kostas Papadimitriou
                           '<p>{4}</p>' +
469 df251d55 Kostas Papadimitriou
                           '</li>').format(img.escape("name"), 
470 820ef2f0 Kostas Papadimitriou
                                                  img.id, 
471 df251d55 Kostas Papadimitriou
                                                  snf.ui.helpers.os_icon_tag(img.escape("OS")),
472 df251d55 Kostas Papadimitriou
                                                  _.escape(img.get_readable_size()),
473 fcd31170 Kostas Papadimitriou
                                                  util.truncate(img.get_description(false), 35),
474 1faf0b9c Kostas Papadimitriou
                                                  _.escape(img.display_owner())));
475 8d08f18a Kostas Papadimitriou
            image.data("image", img);
476 8d08f18a Kostas Papadimitriou
            image.data("image_id", img.id);
477 820ef2f0 Kostas Papadimitriou
            this.images_list.append(image);
478 4cff0386 Kostas Papadimitriou
            image.find(".show-details").click(_.bind(function(e){
479 4cff0386 Kostas Papadimitriou
                e.preventDefault();
480 4cff0386 Kostas Papadimitriou
                e.stopPropagation();
481 4cff0386 Kostas Papadimitriou
                this.show_image_details(img);
482 4cff0386 Kostas Papadimitriou
            }, this))
483 4cff0386 Kostas Papadimitriou
        },
484 4cff0386 Kostas Papadimitriou
            
485 4cff0386 Kostas Papadimitriou
        hide_image_details: function() {
486 4cff0386 Kostas Papadimitriou
            this.image_details.fadeOut(200);
487 4cff0386 Kostas Papadimitriou
            this.parent.$(".create-controls").show();
488 4cff0386 Kostas Papadimitriou
        },
489 4cff0386 Kostas Papadimitriou
490 4cff0386 Kostas Papadimitriou
        show_image_details: function(img) {
491 4cff0386 Kostas Papadimitriou
            this.parent.$(".create-controls").hide();
492 4cff0386 Kostas Papadimitriou
            this.update_image_details(img);
493 38521f1e Kostas Papadimitriou
            this.image_details.fadeIn(100);
494 8d08f18a Kostas Papadimitriou
        },
495 8d08f18a Kostas Papadimitriou
496 8d08f18a Kostas Papadimitriou
        reset: function() {
497 c9074a14 Kostas Papadimitriou
            this.selected_image = false;
498 2cee7cb0 Kostas Papadimitriou
            this.select_type("system");
499 8d08f18a Kostas Papadimitriou
        },
500 8d08f18a Kostas Papadimitriou
501 8d08f18a Kostas Papadimitriou
        get: function() {
502 8d08f18a Kostas Papadimitriou
            return {'image': this.selected_image};
503 cd4d5c5f Kostas Papadimitriou
        },
504 cd4d5c5f Kostas Papadimitriou
505 cd4d5c5f Kostas Papadimitriou
        validate: function() {
506 cd4d5c5f Kostas Papadimitriou
            if (!this.selected_image) {
507 cd4d5c5f Kostas Papadimitriou
                this.parent.$(".form-action.next").hide();
508 cd4d5c5f Kostas Papadimitriou
            } else {
509 cd4d5c5f Kostas Papadimitriou
                this.parent.$(".form-action.next").show();
510 cd4d5c5f Kostas Papadimitriou
            }
511 8d08f18a Kostas Papadimitriou
        }
512 8d08f18a Kostas Papadimitriou
    });
513 8d08f18a Kostas Papadimitriou
514 8d08f18a Kostas Papadimitriou
    views.CreateFlavorSelectView = views.CreateVMStepView.extend({
515 8d08f18a Kostas Papadimitriou
        step: 2,
516 8d08f18a Kostas Papadimitriou
        initialize: function() {
517 8d08f18a Kostas Papadimitriou
            views.CreateFlavorSelectView.__super__.initialize.apply(this, arguments);
518 8d08f18a Kostas Papadimitriou
            this.parent.bind("image:change", _.bind(this.handle_image_change, this));
519 8d08f18a Kostas Papadimitriou
520 820ef2f0 Kostas Papadimitriou
            this.cpus = this.$(".flavors-cpu-list");
521 820ef2f0 Kostas Papadimitriou
            this.disks = this.$(".flavors-disk-list");
522 d965e6dc Kostas Papadimitriou
            this.disk_templates = this.$(".flavors-disk-template-list");
523 820ef2f0 Kostas Papadimitriou
            this.mems = this.$(".flavors-mem-list");
524 8d08f18a Kostas Papadimitriou
525 820ef2f0 Kostas Papadimitriou
            this.predefined_flavors = SUGGESTED_FLAVORS;
526 2ecab6a2 Kostas Papadimitriou
            this.predefined_flavors_keys = _.keys(SUGGESTED_FLAVORS);
527 2ecab6a2 Kostas Papadimitriou
            this.predefined_flavors_keys = _.sortBy(this.predefined_flavors_keys, _.bind(function(k){
528 2ecab6a2 Kostas Papadimitriou
                var flv = this.predefined_flavors[k];
529 59f43586 Kostas Papadimitriou
                return (flv.ram * flv.cpu * flv.disk);
530 2ecab6a2 Kostas Papadimitriou
            }, this));
531 2ecab6a2 Kostas Papadimitriou
532 820ef2f0 Kostas Papadimitriou
            this.predefined = this.$(".predefined-list");
533 8d08f18a Kostas Papadimitriou
        },
534 8d08f18a Kostas Papadimitriou
535 8d08f18a Kostas Papadimitriou
        handle_image_change: function(data) {
536 8d08f18a Kostas Papadimitriou
            this.current_image = data;
537 820ef2f0 Kostas Papadimitriou
            this.update_valid_predefined();
538 dbddee9c Kostas Papadimitriou
            this.current_flavor = undefined;
539 8d08f18a Kostas Papadimitriou
            this.update_flavors_data();
540 3b463c5a Kostas Papadimitriou
            this.update_predefined_flavors();
541 8d08f18a Kostas Papadimitriou
            this.reset_flavors();
542 8d08f18a Kostas Papadimitriou
            this.update_layout();
543 8d08f18a Kostas Papadimitriou
        },
544 8d08f18a Kostas Papadimitriou
545 283bb7de Kostas Papadimitriou
        validate_selected_flavor: function() {
546 283bb7de Kostas Papadimitriou
            if (!this.flavor_is_valid(this.current_flavor)) {
547 283bb7de Kostas Papadimitriou
                this.select_valid_flavor();
548 283bb7de Kostas Papadimitriou
            }
549 283bb7de Kostas Papadimitriou
        },
550 283bb7de Kostas Papadimitriou
551 8d08f18a Kostas Papadimitriou
        reset_flavors: function() {
552 8d08f18a Kostas Papadimitriou
            this.$(".flavor-opts-list .option").remove();
553 8d08f18a Kostas Papadimitriou
            this.create_flavors();
554 8d08f18a Kostas Papadimitriou
        },
555 8d08f18a Kostas Papadimitriou
556 820ef2f0 Kostas Papadimitriou
        update_predefined_flavors: function() {
557 820ef2f0 Kostas Papadimitriou
            this.predefined.find("li").remove();
558 2ecab6a2 Kostas Papadimitriou
            _.each(this.predefined_flavors_keys, _.bind(function(key) {
559 2ecab6a2 Kostas Papadimitriou
                var val = this.predefined_flavors[key];
560 820ef2f0 Kostas Papadimitriou
                var el = $(('<li class="predefined-selection" id="predefined-flavor-{0}">' +
561 df251d55 Kostas Papadimitriou
                           '{1}</li>').format(key, _.escape(_(key).capitalize())));
562 820ef2f0 Kostas Papadimitriou
563 820ef2f0 Kostas Papadimitriou
                this.predefined.append(el);
564 d965e6dc Kostas Papadimitriou
                el.data({flavor: storage.flavors.get_flavor(val.cpu, val.ram, val.disk, val.disk_template, this.flavors)});
565 820ef2f0 Kostas Papadimitriou
                el.click(_.bind(function() {
566 820ef2f0 Kostas Papadimitriou
                    this.handle_predefined_click(el);
567 820ef2f0 Kostas Papadimitriou
                }, this))
568 820ef2f0 Kostas Papadimitriou
            }, this));
569 820ef2f0 Kostas Papadimitriou
            this.update_valid_predefined();
570 820ef2f0 Kostas Papadimitriou
        },
571 820ef2f0 Kostas Papadimitriou
572 820ef2f0 Kostas Papadimitriou
        handle_predefined_click: function(el) {
573 820ef2f0 Kostas Papadimitriou
            if (el.hasClass("disabled")) { return };
574 16c860f4 Kostas Papadimitriou
            this.set_current(el.data("flavor"));
575 820ef2f0 Kostas Papadimitriou
        },
576 820ef2f0 Kostas Papadimitriou
577 283bb7de Kostas Papadimitriou
        select_valid_flavor: function() {
578 283bb7de Kostas Papadimitriou
            var found = false;
579 283bb7de Kostas Papadimitriou
            var self = this;
580 3b463c5a Kostas Papadimitriou
581 3b463c5a Kostas Papadimitriou
            _.each(["cpu", "mem", "disk"], function(t) {
582 3b463c5a Kostas Papadimitriou
              var el = $(".flavor-options."+t);
583 3b463c5a Kostas Papadimitriou
              var all = el.find(".flavor-opts-list li").length;
584 3b463c5a Kostas Papadimitriou
              var disabled = el.find(".flavor-opts-list li.disabled").length;
585 3b463c5a Kostas Papadimitriou
              if (disabled >= all) {
586 3b463c5a Kostas Papadimitriou
                el.find("h4").addClass("error");
587 3b463c5a Kostas Papadimitriou
              } else {
588 3b463c5a Kostas Papadimitriou
                el.find("h4").removeClass("error");
589 3b463c5a Kostas Papadimitriou
              }
590 3b463c5a Kostas Papadimitriou
            })
591 3b463c5a Kostas Papadimitriou
592 283bb7de Kostas Papadimitriou
            _.each(this.flavors, function(flv) {
593 283bb7de Kostas Papadimitriou
                if (self.flavor_is_valid(flv)) {
594 283bb7de Kostas Papadimitriou
                    found = flv;
595 283bb7de Kostas Papadimitriou
                    return false;
596 283bb7de Kostas Papadimitriou
                }
597 283bb7de Kostas Papadimitriou
            });
598 283bb7de Kostas Papadimitriou
            
599 283bb7de Kostas Papadimitriou
            if (found) {
600 283bb7de Kostas Papadimitriou
                this.set_current(found);
601 283bb7de Kostas Papadimitriou
            } else {
602 283bb7de Kostas Papadimitriou
                this.current_flavor = undefined;
603 283bb7de Kostas Papadimitriou
                this.validate();
604 283bb7de Kostas Papadimitriou
                this.$("li.predefined-selection").addClass("disabled");
605 283bb7de Kostas Papadimitriou
                this.$(".flavor-opts-list li").removeClass("selected");
606 283bb7de Kostas Papadimitriou
            }
607 283bb7de Kostas Papadimitriou
        },
608 283bb7de Kostas Papadimitriou
609 820ef2f0 Kostas Papadimitriou
        update_valid_predefined: function() {
610 820ef2f0 Kostas Papadimitriou
            this.update_unavailable_values();
611 820ef2f0 Kostas Papadimitriou
            var self = this;
612 820ef2f0 Kostas Papadimitriou
            this.valid_predefined = _.select(_.map(this.predefined_flavors, function(flv, key){
613 d965e6dc Kostas Papadimitriou
                var existing = storage.flavors.get_flavor(flv.cpu, flv.ram, flv.disk, flv.disk_template, self.flavors);
614 820ef2f0 Kostas Papadimitriou
                // non existing
615 820ef2f0 Kostas Papadimitriou
                if (!existing) {
616 820ef2f0 Kostas Papadimitriou
                    return false;
617 820ef2f0 Kostas Papadimitriou
                }
618 820ef2f0 Kostas Papadimitriou
                
619 820ef2f0 Kostas Papadimitriou
                // not available for image
620 820ef2f0 Kostas Papadimitriou
                if (self.unavailable_values && self.unavailable_values.disk.indexOf(existing.get_disk_size()) > -1) {
621 820ef2f0 Kostas Papadimitriou
                    return false
622 820ef2f0 Kostas Papadimitriou
                }
623 820ef2f0 Kostas Papadimitriou
624 820ef2f0 Kostas Papadimitriou
                return key;
625 820ef2f0 Kostas Papadimitriou
            }), function(ret) { return ret });
626 820ef2f0 Kostas Papadimitriou
            
627 820ef2f0 Kostas Papadimitriou
            $("li.predefined-selection").addClass("disabled");
628 820ef2f0 Kostas Papadimitriou
            _.each(this.valid_predefined, function(key) {
629 820ef2f0 Kostas Papadimitriou
                $("#predefined-flavor-" + key).removeClass("disabled");
630 820ef2f0 Kostas Papadimitriou
            })
631 820ef2f0 Kostas Papadimitriou
        },
632 820ef2f0 Kostas Papadimitriou
633 820ef2f0 Kostas Papadimitriou
        update_selected_predefined: function() {
634 820ef2f0 Kostas Papadimitriou
            var self = this;
635 820ef2f0 Kostas Papadimitriou
            this.predefined.find("li").removeClass("selected");
636 820ef2f0 Kostas Papadimitriou
637 820ef2f0 Kostas Papadimitriou
            _.each(this.valid_predefined, function(key){
638 820ef2f0 Kostas Papadimitriou
                var flv = self.predefined_flavors[key];
639 d965e6dc Kostas Papadimitriou
                var exists = storage.flavors.get_flavor(flv.cpu, flv.ram, flv.disk, flv.disk_template, self.flavors);
640 820ef2f0 Kostas Papadimitriou
641 820ef2f0 Kostas Papadimitriou
                if (exists && (exists.id == self.current_flavor.id)) {
642 820ef2f0 Kostas Papadimitriou
                    $("#predefined-flavor-" + key).addClass("selected");
643 820ef2f0 Kostas Papadimitriou
                }
644 820ef2f0 Kostas Papadimitriou
            })
645 820ef2f0 Kostas Papadimitriou
        },
646 820ef2f0 Kostas Papadimitriou
        
647 8d08f18a Kostas Papadimitriou
        update_flavors_data: function() {
648 820ef2f0 Kostas Papadimitriou
            this.flavors = storage.flavors.active();
649 8d08f18a Kostas Papadimitriou
            this.flavors_data = storage.flavors.get_data(this.flavors);
650 820ef2f0 Kostas Papadimitriou
            
651 820ef2f0 Kostas Papadimitriou
            var self = this;
652 820ef2f0 Kostas Papadimitriou
            var set = false;
653 820ef2f0 Kostas Papadimitriou
            
654 820ef2f0 Kostas Papadimitriou
            // FIXME: validate current flavor
655 820ef2f0 Kostas Papadimitriou
            
656 820ef2f0 Kostas Papadimitriou
            if (!this.current_flavor) {
657 820ef2f0 Kostas Papadimitriou
                _.each(this.valid_predefined, function(key) {
658 820ef2f0 Kostas Papadimitriou
                    var flv = self.predefined_flavors[key];
659 d965e6dc Kostas Papadimitriou
                    var exists = storage.flavors.get_flavor(flv.cpu, flv.ram, flv.disk, flv.disk_template, self.flavors);
660 820ef2f0 Kostas Papadimitriou
                    if (exists && !set) {
661 820ef2f0 Kostas Papadimitriou
                        self.set_current(exists);
662 820ef2f0 Kostas Papadimitriou
                        set = true;
663 820ef2f0 Kostas Papadimitriou
                    }
664 820ef2f0 Kostas Papadimitriou
                })
665 8d08f18a Kostas Papadimitriou
            }
666 820ef2f0 Kostas Papadimitriou
667 820ef2f0 Kostas Papadimitriou
            this.update_unavailable_values();
668 8d08f18a Kostas Papadimitriou
        },
669 8d08f18a Kostas Papadimitriou
670 820ef2f0 Kostas Papadimitriou
        update_unavailable_values: function() {
671 7ac49c2e Kostas Papadimitriou
            
672 7ac49c2e Kostas Papadimitriou
            var unavailable = {disk:[], ram:[], cpu:[]}
673 7ac49c2e Kostas Papadimitriou
            var user_excluded = {disk:[], ram:[], cpu:[]}
674 7ac49c2e Kostas Papadimitriou
            var image_excluded = {disk:[], ram:[], cpu:[]}
675 7ac49c2e Kostas Papadimitriou
676 7ac49c2e Kostas Papadimitriou
            if (this.current_image) {
677 7ac49c2e Kostas Papadimitriou
              image_excluded = storage.flavors.unavailable_values_for_image(this.current_image);
678 7ac49c2e Kostas Papadimitriou
            }
679 7ac49c2e Kostas Papadimitriou
680 ab3df8df Kostas Papadimitriou
            var quotas = synnefo.storage.quotas.get_available_for_vm({active: true});
681 ab3df8df Kostas Papadimitriou
            var user_excluded = storage.flavors.unavailable_values_for_quotas(quotas);
682 7ac49c2e Kostas Papadimitriou
683 7ac49c2e Kostas Papadimitriou
            unavailable.disk = user_excluded.disk.concat(image_excluded.disk);
684 7ac49c2e Kostas Papadimitriou
            unavailable.ram = user_excluded.ram.concat(image_excluded.ram);
685 7ac49c2e Kostas Papadimitriou
            unavailable.cpu = user_excluded.cpu.concat(image_excluded.cpu);
686 7ac49c2e Kostas Papadimitriou
            
687 7ac49c2e Kostas Papadimitriou
            this.unavailable_values = unavailable;
688 820ef2f0 Kostas Papadimitriou
        },
689 820ef2f0 Kostas Papadimitriou
        
690 820ef2f0 Kostas Papadimitriou
        flavor_is_valid: function(flv) {
691 820ef2f0 Kostas Papadimitriou
            if (!flv) { return false };
692 283bb7de Kostas Papadimitriou
693 d965e6dc Kostas Papadimitriou
            var existing = storage.flavors.get_flavor(flv.get("cpu"), flv.get("ram"), flv.get("disk"), flv.get("disk_template"), this.flavors);
694 820ef2f0 Kostas Papadimitriou
            if (!existing) { return false };
695 283bb7de Kostas Papadimitriou
            
696 283bb7de Kostas Papadimitriou
            if (this.unavailable_values && (this.unavailable_values.disk.indexOf(parseInt(flv.get("disk")) * 1000) > -1)) {
697 283bb7de Kostas Papadimitriou
                return false;
698 820ef2f0 Kostas Papadimitriou
            }
699 7ac49c2e Kostas Papadimitriou
            if (this.unavailable_values && (this.unavailable_values.ram.indexOf(parseInt(flv.get("ram"))) > -1)) {
700 7ac49c2e Kostas Papadimitriou
                return false;
701 7ac49c2e Kostas Papadimitriou
            }
702 7ac49c2e Kostas Papadimitriou
            if (this.unavailable_values && (this.unavailable_values.cpu.indexOf(parseInt(flv.get("cpu"))) > -1)) {
703 7ac49c2e Kostas Papadimitriou
                return false;
704 7ac49c2e Kostas Papadimitriou
            }
705 820ef2f0 Kostas Papadimitriou
            return true;
706 820ef2f0 Kostas Papadimitriou
        },
707 820ef2f0 Kostas Papadimitriou
            
708 885a592b Kostas Papadimitriou
        set_valid_current_for: function(t, val) {
709 885a592b Kostas Papadimitriou
            var found = this.flavors[0];
710 885a592b Kostas Papadimitriou
            _.each(this.flavors, function(flv) {
711 885a592b Kostas Papadimitriou
                if (flv.get(t) == val) {
712 885a592b Kostas Papadimitriou
                    found = flv;
713 885a592b Kostas Papadimitriou
                }
714 885a592b Kostas Papadimitriou
            });
715 885a592b Kostas Papadimitriou
716 885a592b Kostas Papadimitriou
            this.set_current(found);
717 283bb7de Kostas Papadimitriou
            this.validate_selected_flavor();
718 885a592b Kostas Papadimitriou
        },
719 885a592b Kostas Papadimitriou
720 8d08f18a Kostas Papadimitriou
        set_current: function(flv) {
721 885a592b Kostas Papadimitriou
722 885a592b Kostas Papadimitriou
            if (!flv) {
723 885a592b Kostas Papadimitriou
                // user clicked on invalid combination
724 885a592b Kostas Papadimitriou
                // force the first available choice for the
725 885a592b Kostas Papadimitriou
                // type of option he last clicked
726 885a592b Kostas Papadimitriou
                this.set_valid_current_for.apply(this, this.last_choice);
727 885a592b Kostas Papadimitriou
                return;
728 885a592b Kostas Papadimitriou
            }
729 885a592b Kostas Papadimitriou
730 8d08f18a Kostas Papadimitriou
            this.current_flavor = flv;
731 8d08f18a Kostas Papadimitriou
            this.trigger("change");
732 cd4d5c5f Kostas Papadimitriou
            if (this.current_flavor) {
733 cd4d5c5f Kostas Papadimitriou
                this.update_selected_flavor();
734 cd4d5c5f Kostas Papadimitriou
                this.update_selected_predefined();
735 cd4d5c5f Kostas Papadimitriou
            }
736 cd4d5c5f Kostas Papadimitriou
            
737 cd4d5c5f Kostas Papadimitriou
            this.validate();
738 820ef2f0 Kostas Papadimitriou
        },
739 820ef2f0 Kostas Papadimitriou
        
740 820ef2f0 Kostas Papadimitriou
        select_default_flavor: function() {
741 820ef2f0 Kostas Papadimitriou
               
742 820ef2f0 Kostas Papadimitriou
        },
743 820ef2f0 Kostas Papadimitriou
744 820ef2f0 Kostas Papadimitriou
        update_selected_from_ui: function() {
745 820ef2f0 Kostas Papadimitriou
            this.set_current(this.ui_selected());
746 820ef2f0 Kostas Papadimitriou
        },
747 820ef2f0 Kostas Papadimitriou
        
748 820ef2f0 Kostas Papadimitriou
        update_disabled_flavors: function() {
749 820ef2f0 Kostas Papadimitriou
            this.$(".flavor-options.disk li").removeClass("disabled");
750 820ef2f0 Kostas Papadimitriou
            if (!this.unavailable_values) { return }
751 885a592b Kostas Papadimitriou
            
752 885a592b Kostas Papadimitriou
            this.$("#create-vm-flavor-options .flavor-options.disk li").each(_.bind(function(i, el){
753 885a592b Kostas Papadimitriou
                var el_value = $(el).data("value") * 1000;
754 820ef2f0 Kostas Papadimitriou
                if (this.unavailable_values.disk.indexOf(el_value) > -1) {
755 820ef2f0 Kostas Papadimitriou
                    $(el).addClass("disabled");
756 7ac49c2e Kostas Papadimitriou
                    $(el).removeClass("selected");
757 7ac49c2e Kostas Papadimitriou
                };
758 7ac49c2e Kostas Papadimitriou
            }, this));
759 7ac49c2e Kostas Papadimitriou
760 426e1fb9 Kostas Papadimitriou
            this.$("#create-vm-flavor-options .flavor-options.mem li").each(_.bind(function(i, el){
761 7ac49c2e Kostas Papadimitriou
                var el_value = $(el).data("value");
762 7ac49c2e Kostas Papadimitriou
                if (this.unavailable_values.ram.indexOf(el_value) > -1) {
763 7ac49c2e Kostas Papadimitriou
                    $(el).addClass("disabled");
764 7ac49c2e Kostas Papadimitriou
                    $(el).removeClass("selected");
765 7ac49c2e Kostas Papadimitriou
                };
766 7ac49c2e Kostas Papadimitriou
            }, this));
767 7ac49c2e Kostas Papadimitriou
768 7ac49c2e Kostas Papadimitriou
            this.$("#create-vm-flavor-options .flavor-options.cpu li").each(_.bind(function(i, el){
769 7ac49c2e Kostas Papadimitriou
                var el_value = $(el).data("value");
770 7ac49c2e Kostas Papadimitriou
                if (this.unavailable_values.cpu.indexOf(el_value) > -1) {
771 7ac49c2e Kostas Papadimitriou
                    $(el).addClass("disabled");
772 7ac49c2e Kostas Papadimitriou
                    $(el).removeClass("selected");
773 820ef2f0 Kostas Papadimitriou
                };
774 820ef2f0 Kostas Papadimitriou
            }, this));
775 8d08f18a Kostas Papadimitriou
        },
776 8d08f18a Kostas Papadimitriou
777 8d08f18a Kostas Papadimitriou
        create_flavors: function() {
778 820ef2f0 Kostas Papadimitriou
            var flavors = this.get_active_flavors();
779 820ef2f0 Kostas Papadimitriou
            var valid_flavors = this.get_valid_flavors();
780 d965e6dc Kostas Papadimitriou
            this.__added_flavors = {'cpu':[], 'ram':[], 'disk':[], 'disk_template':[] };
781 820ef2f0 Kostas Papadimitriou
782 8d08f18a Kostas Papadimitriou
            _.each(flavors, _.bind(function(flv){
783 8d08f18a Kostas Papadimitriou
                this.add_flavor(flv);
784 8d08f18a Kostas Papadimitriou
            }, this));
785 8d08f18a Kostas Papadimitriou
            
786 5f26e13f Kostas Papadimitriou
            this.sort_flavors(this.disks);
787 5f26e13f Kostas Papadimitriou
            this.sort_flavors(this.cpus);
788 5f26e13f Kostas Papadimitriou
            this.sort_flavors(this.mems);
789 d965e6dc Kostas Papadimitriou
            this.sort_flavors(this.disk_templates);
790 5f26e13f Kostas Papadimitriou
791 8d08f18a Kostas Papadimitriou
            var self = this;
792 8d08f18a Kostas Papadimitriou
            this.$(".flavor-options li.option").click(function(){
793 8d08f18a Kostas Papadimitriou
                var el = $(this);
794 820ef2f0 Kostas Papadimitriou
795 820ef2f0 Kostas Papadimitriou
                if (el.hasClass("disabled")) { return }
796 820ef2f0 Kostas Papadimitriou
797 8d08f18a Kostas Papadimitriou
                el.parent().find(".option").removeClass("selected");
798 8d08f18a Kostas Papadimitriou
                el.addClass("selected");
799 7ac49c2e Kostas Papadimitriou
800 885a592b Kostas Papadimitriou
                if (el.hasClass("mem")) { self.last_choice = ["ram", $(this).data("value")] }
801 885a592b Kostas Papadimitriou
                if (el.hasClass("cpu")) { self.last_choice = ["cpu", $(this).data("value")] }
802 885a592b Kostas Papadimitriou
                if (el.hasClass("disk")) { self.last_choice = ["disk", $(this).data("value")] }
803 d965e6dc Kostas Papadimitriou
                if (el.hasClass("disk_template")) { self.last_choice = ["disk_template", $(this).data("value")] }
804 820ef2f0 Kostas Papadimitriou
805 8d08f18a Kostas Papadimitriou
                self.update_selected_from_ui();
806 fb7e2d64 Kostas Papadimitriou
            });
807 d965e6dc Kostas Papadimitriou
808 fb7e2d64 Kostas Papadimitriou
            $(".flavor-opts-list").each(function(){
809 fb7e2d64 Kostas Papadimitriou
              var el = $(this);
810 fb7e2d64 Kostas Papadimitriou
              if (el.find(".option").length > 6) {
811 fb7e2d64 Kostas Papadimitriou
                el.addClass("compact");
812 fb7e2d64 Kostas Papadimitriou
              }
813 fb7e2d64 Kostas Papadimitriou
            });
814 8d08f18a Kostas Papadimitriou
        },
815 5f26e13f Kostas Papadimitriou
816 5f26e13f Kostas Papadimitriou
        sort_flavors: function(els) {
817 5f26e13f Kostas Papadimitriou
            var prev = undefined;
818 5f26e13f Kostas Papadimitriou
            els.find("li").each(function(i,el){
819 5f26e13f Kostas Papadimitriou
                el = $(el);
820 5f26e13f Kostas Papadimitriou
                if (!prev) { prev = el; return true };
821 5f26e13f Kostas Papadimitriou
                if (el.data("value") < prev.data("value")) {
822 5f26e13f Kostas Papadimitriou
                    prev.before(el);
823 5f26e13f Kostas Papadimitriou
                }
824 5f26e13f Kostas Papadimitriou
                prev = el;
825 5f26e13f Kostas Papadimitriou
            })
826 5f26e13f Kostas Papadimitriou
        },
827 8d08f18a Kostas Papadimitriou
        
828 8d08f18a Kostas Papadimitriou
        ui_selected: function() {
829 820ef2f0 Kostas Papadimitriou
            var args = [this.$(".option.cpu.selected").data("value"), 
830 8d08f18a Kostas Papadimitriou
                this.$(".option.mem.selected").data("value"), 
831 8d08f18a Kostas Papadimitriou
                this.$(".option.disk.selected").data("value"),
832 d965e6dc Kostas Papadimitriou
                this.$(".option.disk_template.selected").data("value"),
833 8d08f18a Kostas Papadimitriou
            this.flavors];
834 7ac49c2e Kostas Papadimitriou
            
835 820ef2f0 Kostas Papadimitriou
            var flv = storage.flavors.get_flavor.apply(storage.flavors, args);
836 820ef2f0 Kostas Papadimitriou
            return flv;
837 8d08f18a Kostas Papadimitriou
        },
838 8d08f18a Kostas Papadimitriou
839 8d08f18a Kostas Papadimitriou
        update_selected_flavor: function() {
840 820ef2f0 Kostas Papadimitriou
            var flv = this.current_flavor;
841 cd4d5c5f Kostas Papadimitriou
            if (!flv) { return }
842 820ef2f0 Kostas Papadimitriou
            this.$(".option").removeClass("selected");
843 8d08f18a Kostas Papadimitriou
844 820ef2f0 Kostas Papadimitriou
            this.$(".option.cpu.value-" + flv.get("cpu")).addClass("selected");
845 820ef2f0 Kostas Papadimitriou
            this.$(".option.mem.value-" + flv.get("ram")).addClass("selected");
846 820ef2f0 Kostas Papadimitriou
            this.$(".option.disk.value-" + flv.get("disk")).addClass("selected");
847 d965e6dc Kostas Papadimitriou
            this.$(".option.disk_template.value-" + flv.get("disk_template")).addClass("selected");
848 5afdfc72 Kostas Papadimitriou
            
849 5afdfc72 Kostas Papadimitriou
            var disk_el = this.$(".option.disk_template.value-" + flv.get("disk_template"));
850 5afdfc72 Kostas Papadimitriou
            var basebgpos = 470;
851 5afdfc72 Kostas Papadimitriou
                
852 5afdfc72 Kostas Papadimitriou
            var append_to_bg_pos = 40 + (disk_el.index() * 91);
853 5afdfc72 Kostas Papadimitriou
            var bg_pos = basebgpos - append_to_bg_pos;
854 5afdfc72 Kostas Papadimitriou
855 5afdfc72 Kostas Papadimitriou
            this.$(".disk-template-description").css({backgroundPosition:'-' + bg_pos + 'px top'})
856 5afdfc72 Kostas Papadimitriou
            this.$(".disk-template-description p").html(flv.get_disk_template_info().description || "");
857 8d08f18a Kostas Papadimitriou
        },
858 885a592b Kostas Papadimitriou
        
859 d965e6dc Kostas Papadimitriou
        __added_flavors: {'cpu':[], 'ram':[], 'disk':[], 'disk_template':[]},
860 8d08f18a Kostas Papadimitriou
        add_flavor: function(flv) {
861 d965e6dc Kostas Papadimitriou
            var values = {'cpu': flv.get('cpu'), 
862 d965e6dc Kostas Papadimitriou
                          'mem': flv.get('ram'), 
863 d965e6dc Kostas Papadimitriou
                          'disk': flv.get('disk'), 
864 d965e6dc Kostas Papadimitriou
                          'disk_template': flv.get('disk_template')};
865 820ef2f0 Kostas Papadimitriou
866 820ef2f0 Kostas Papadimitriou
            disabled = "";
867 885a592b Kostas Papadimitriou
            
868 885a592b Kostas Papadimitriou
            if (this.__added_flavors.cpu.indexOf(values.cpu) == -1) {
869 820ef2f0 Kostas Papadimitriou
                var cpu = $(('<li class="option cpu value-{0} {1}">' + 
870 820ef2f0 Kostas Papadimitriou
                             '<span class="value">{0}</span>' + 
871 df251d55 Kostas Papadimitriou
                             '<span class="metric">x</span></li>').format(
872 df251d55 Kostas Papadimitriou
                            _.escape(values.cpu), disabled)).data('value', values.cpu);
873 8d08f18a Kostas Papadimitriou
                this.cpus.append(cpu);
874 885a592b Kostas Papadimitriou
                this.__added_flavors.cpu.push(values.cpu);
875 8d08f18a Kostas Papadimitriou
            }
876 885a592b Kostas Papadimitriou
877 885a592b Kostas Papadimitriou
            if (this.__added_flavors.ram.indexOf(values.mem) == -1) {
878 6653db48 Kostas Papadimitriou
                var mem_value = parseInt(_.escape(values.mem))*1024*1024;
879 6653db48 Kostas Papadimitriou
                var displayvalue = synnefo.util.readablizeBytes(mem_value, 
880 6653db48 Kostas Papadimitriou
                                                               0).split(" ");
881 6653db48 Kostas Papadimitriou
                var mem = $(('<li class="option mem value-{2}">' + 
882 820ef2f0 Kostas Papadimitriou
                             '<span class="value">{0}</span>' + 
883 6653db48 Kostas Papadimitriou
                             '<span class="metric">{1}</span></li>').format(
884 6653db48 Kostas Papadimitriou
                          displayvalue[0], displayvalue[1], values.mem)).data(
885 6653db48 Kostas Papadimitriou
                          'value', values.mem);
886 8d08f18a Kostas Papadimitriou
                this.mems.append(mem);
887 885a592b Kostas Papadimitriou
                this.__added_flavors.ram.push(values.mem);
888 8d08f18a Kostas Papadimitriou
            }
889 885a592b Kostas Papadimitriou
890 885a592b Kostas Papadimitriou
            if (this.__added_flavors.disk.indexOf(values.disk) == -1) {
891 820ef2f0 Kostas Papadimitriou
                var disk = $(('<li class="option disk value-{0}">' + 
892 820ef2f0 Kostas Papadimitriou
                              '<span class="value">{0}</span>' + 
893 df251d55 Kostas Papadimitriou
                              '<span class="metric">GB</span></li>').format(
894 df251d55 Kostas Papadimitriou
                            _.escape(values.disk))).data('value', values.disk);
895 8d08f18a Kostas Papadimitriou
                this.disks.append(disk);
896 885a592b Kostas Papadimitriou
                this.__added_flavors.disk.push(values.disk)
897 8d08f18a Kostas Papadimitriou
            }
898 d965e6dc Kostas Papadimitriou
            
899 d965e6dc Kostas Papadimitriou
            if (this.__added_flavors.disk_template.indexOf(values.disk_template) == -1) {
900 d965e6dc Kostas Papadimitriou
                var template_info = flv.get_disk_template_info();
901 5afdfc72 Kostas Papadimitriou
                var disk_template = $(('<li title="{2}" class="option disk_template value-{0}">' + 
902 5afdfc72 Kostas Papadimitriou
                                       '<span class="value name">{1}</span>' +
903 d965e6dc Kostas Papadimitriou
                                       '</li>').format(values.disk_template, 
904 df251d55 Kostas Papadimitriou
                                            _.escape(template_info.name), 
905 d965e6dc Kostas Papadimitriou
                                            template_info.description)).data('value', 
906 d965e6dc Kostas Papadimitriou
                                                                values.disk_template);
907 d965e6dc Kostas Papadimitriou
908 d965e6dc Kostas Papadimitriou
                this.disk_templates.append(disk_template);
909 5afdfc72 Kostas Papadimitriou
                //disk_template.tooltip({position:'top center', offset:[-5,0], delay:100, tipClass:'tooltip disktip'});
910 d965e6dc Kostas Papadimitriou
                this.__added_flavors.disk_template.push(values.disk_template)
911 d965e6dc Kostas Papadimitriou
            }
912 8d08f18a Kostas Papadimitriou
            
913 8d08f18a Kostas Papadimitriou
        },
914 820ef2f0 Kostas Papadimitriou
        
915 820ef2f0 Kostas Papadimitriou
        get_active_flavors: function() {
916 820ef2f0 Kostas Papadimitriou
            return storage.flavors.active();
917 820ef2f0 Kostas Papadimitriou
        },
918 8d08f18a Kostas Papadimitriou
919 820ef2f0 Kostas Papadimitriou
        get_valid_flavors: function() {
920 8d08f18a Kostas Papadimitriou
            return this.flavors;
921 8d08f18a Kostas Papadimitriou
        },
922 8d08f18a Kostas Papadimitriou
923 8d08f18a Kostas Papadimitriou
        update_layout: function() {
924 820ef2f0 Kostas Papadimitriou
            this.update_selected_flavor();
925 820ef2f0 Kostas Papadimitriou
            this.update_disabled_flavors();
926 cd4d5c5f Kostas Papadimitriou
            this.validate();
927 283bb7de Kostas Papadimitriou
            this.validate_selected_flavor();
928 3b463c5a Kostas Papadimitriou
            this.update_quota_display();
929 3b463c5a Kostas Papadimitriou
        },
930 3b463c5a Kostas Papadimitriou
        
931 3b463c5a Kostas Papadimitriou
        update_quota_display: function() {
932 3b463c5a Kostas Papadimitriou
933 426e1fb9 Kostas Papadimitriou
          var quotas = synnefo.storage.quotas;
934 3b463c5a Kostas Papadimitriou
          _.each(["disk", "ram", "cpu"], function(type) {
935 ab3df8df Kostas Papadimitriou
            var active = true;
936 ab3df8df Kostas Papadimitriou
            var key = 'available';
937 ab3df8df Kostas Papadimitriou
            var available_dsp = quotas.get('cyclades.'+type).get_readable(key, active);
938 b76769ef Kostas Papadimitriou
            var available = quotas.get('cyclades.'+type).get_available(key);
939 3b463c5a Kostas Papadimitriou
            var content = "({0} left)".format(available_dsp);
940 3b463c5a Kostas Papadimitriou
            if (available <= 0) { content = "(None left)" }
941 3b463c5a Kostas Papadimitriou
            
942 3b463c5a Kostas Papadimitriou
            if (type == "ram") { type = "mem" }
943 3b463c5a Kostas Papadimitriou
            $(".flavor-options."+type+" h4 .available").text(content);
944 3b463c5a Kostas Papadimitriou
            if (available <= 0) {
945 3b463c5a Kostas Papadimitriou
              $(".flavor-options."+type+" h4 .available").addClass("error");
946 3b463c5a Kostas Papadimitriou
            } else {
947 3b463c5a Kostas Papadimitriou
              $(".flavor-options."+type+" h4 .available").removeClass("error");
948 3b463c5a Kostas Papadimitriou
            }
949 3b463c5a Kostas Papadimitriou
          })
950 8d08f18a Kostas Papadimitriou
        },
951 8d08f18a Kostas Papadimitriou
952 8d08f18a Kostas Papadimitriou
        reset: function() {
953 8d08f18a Kostas Papadimitriou
            this.current_image = storage.images.at(0);
954 8d08f18a Kostas Papadimitriou
            this.flavors = [];
955 8d08f18a Kostas Papadimitriou
            this.flavors_data = {'cpu':[], 'mem':[], 'disk':[]};
956 8d08f18a Kostas Papadimitriou
            this.update_flavors_data();
957 8d08f18a Kostas Papadimitriou
        },
958 8d08f18a Kostas Papadimitriou
959 cd4d5c5f Kostas Papadimitriou
        validate: function() {
960 cd4d5c5f Kostas Papadimitriou
            if (!this.current_flavor) {
961 cd4d5c5f Kostas Papadimitriou
                this.parent.$(".form-action.next").hide();
962 cd4d5c5f Kostas Papadimitriou
            } else {
963 cd4d5c5f Kostas Papadimitriou
                this.parent.$(".form-action.next").show();
964 cd4d5c5f Kostas Papadimitriou
            }
965 cd4d5c5f Kostas Papadimitriou
        },
966 cd4d5c5f Kostas Papadimitriou
967 8d08f18a Kostas Papadimitriou
        get: function() {
968 d965e6dc Kostas Papadimitriou
            return {'flavor': this.current_flavor}
969 8d08f18a Kostas Papadimitriou
        }
970 c566f369 Kostas Papadimitriou
    });
971 c566f369 Kostas Papadimitriou
    
972 c566f369 Kostas Papadimitriou
973 c566f369 Kostas Papadimitriou
    views.CreateColumnSelectOptionView = bb.View.extend({
974 c566f369 Kostas Papadimitriou
        tagName: 'li',
975 c566f369 Kostas Papadimitriou
        el: undefined,
976 c566f369 Kostas Papadimitriou
        model: undefined,
977 c566f369 Kostas Papadimitriou
        id_prefix: 'model-',
978 c566f369 Kostas Papadimitriou
        tpl: '<input type="checkbox" class="check"/><span class="title"></span>',
979 c566f369 Kostas Papadimitriou
        className: 'list-item-option clearfix',
980 c566f369 Kostas Papadimitriou
        events: {
981 c566f369 Kostas Papadimitriou
          'click': 'handle_click'
982 c566f369 Kostas Papadimitriou
        },
983 8d08f18a Kostas Papadimitriou
984 c566f369 Kostas Papadimitriou
        initialize: function(options) {
985 c566f369 Kostas Papadimitriou
          _.bindAll(this);
986 c566f369 Kostas Papadimitriou
          this.model.bind("change", this.render);
987 c566f369 Kostas Papadimitriou
          this.model.bind("remove", this.remove);
988 c566f369 Kostas Papadimitriou
          this.selected = false;
989 c566f369 Kostas Papadimitriou
          if (options.get_model_title) {
990 c566f369 Kostas Papadimitriou
            this.get_model_title = _.bind(options.get_model_title, this);
991 c566f369 Kostas Papadimitriou
          }
992 c566f369 Kostas Papadimitriou
          this.model_title_attr = options.model_title_attr;
993 c566f369 Kostas Papadimitriou
          $(this.el).append($(this.tpl));
994 c566f369 Kostas Papadimitriou
        },
995 c566f369 Kostas Papadimitriou
        
996 c566f369 Kostas Papadimitriou
        id: function() {
997 c566f369 Kostas Papadimitriou
          return this.id_prefix + this.model && this.model.id || '';
998 c566f369 Kostas Papadimitriou
        },
999 c566f369 Kostas Papadimitriou
        
1000 c566f369 Kostas Papadimitriou
        handle_click: function() {
1001 c566f369 Kostas Papadimitriou
          this.selected = !this.selected;
1002 c566f369 Kostas Papadimitriou
          this.render();
1003 c566f369 Kostas Papadimitriou
        },
1004 c566f369 Kostas Papadimitriou
1005 c566f369 Kostas Papadimitriou
        remove: function() {
1006 c566f369 Kostas Papadimitriou
          this.model.unbind("change", this.render);
1007 c566f369 Kostas Papadimitriou
          this.model.unbind("remove", this.remove);
1008 c566f369 Kostas Papadimitriou
        },
1009 c566f369 Kostas Papadimitriou
        
1010 c566f369 Kostas Papadimitriou
        get_model_title: function() {
1011 c566f369 Kostas Papadimitriou
          return this.model.get(this.model_title_attr || 'id');
1012 c566f369 Kostas Papadimitriou
        },
1013 c566f369 Kostas Papadimitriou
1014 c566f369 Kostas Papadimitriou
        render: function() {
1015 c566f369 Kostas Papadimitriou
          $(this.el).find(".title").text(this.get_model_title());
1016 c566f369 Kostas Papadimitriou
          $(this.el).toggleClass('selected', this.selected);
1017 c566f369 Kostas Papadimitriou
          if (this.selected) {
1018 c566f369 Kostas Papadimitriou
            $(this.el).find("input").attr("checked", true);
1019 c566f369 Kostas Papadimitriou
          } else {
1020 c566f369 Kostas Papadimitriou
            $(this.el).find("input").attr("checked", false);
1021 c566f369 Kostas Papadimitriou
          }
1022 c566f369 Kostas Papadimitriou
        }
1023 c566f369 Kostas Papadimitriou
    });
1024 c566f369 Kostas Papadimitriou
    
1025 c566f369 Kostas Papadimitriou
    views.CreateColumnIPOptionView = views.CreateColumnSelectOptionView.extend({
1026 c566f369 Kostas Papadimitriou
      get_model_title: function() {
1027 c566f369 Kostas Papadimitriou
        return this.model.get('ip');
1028 c566f369 Kostas Papadimitriou
      }
1029 8d08f18a Kostas Papadimitriou
    });
1030 8d08f18a Kostas Papadimitriou
1031 c566f369 Kostas Papadimitriou
    views.CreateColumnPrivateNetworkOptionView = views.CreateColumnSelectOptionView.extend({
1032 c566f369 Kostas Papadimitriou
      get_model_title: function() {
1033 c566f369 Kostas Papadimitriou
        return this.model.get('name');
1034 c566f369 Kostas Papadimitriou
      }
1035 c566f369 Kostas Papadimitriou
    });
1036 c566f369 Kostas Papadimitriou
1037 c566f369 Kostas Papadimitriou
    views.CreateColumnSelectListView = bb.View.extend({
1038 c566f369 Kostas Papadimitriou
        collection: undefined,
1039 c566f369 Kostas Papadimitriou
        header: undefined,
1040 c566f369 Kostas Papadimitriou
        tagName: 'div',
1041 c566f369 Kostas Papadimitriou
        extra_class: '',
1042 c566f369 Kostas Papadimitriou
        el: undefined,
1043 c566f369 Kostas Papadimitriou
        title_tpl: undefined,
1044 c566f369 Kostas Papadimitriou
        title: 'List view',
1045 c566f369 Kostas Papadimitriou
        description: 'List view description.',
1046 c566f369 Kostas Papadimitriou
        empty_msg: 'No entries.',
1047 c566f369 Kostas Papadimitriou
        item_cls: views.CreateColumnSelectOptionView,
1048 c566f369 Kostas Papadimitriou
        className: 'list-cont create-column-select personalize-cont',
1049 c566f369 Kostas Papadimitriou
1050 c566f369 Kostas Papadimitriou
        initialize: function(options) {
1051 c566f369 Kostas Papadimitriou
          _.bindAll(this);
1052 c566f369 Kostas Papadimitriou
          if (options.extra_class) {
1053 c566f369 Kostas Papadimitriou
            $(this.el).addClass(options.extra_class);
1054 c566f369 Kostas Papadimitriou
          }
1055 c566f369 Kostas Papadimitriou
          this.update_collection = options.update_collection;
1056 c566f369 Kostas Papadimitriou
          this.title = options.title || this.title;
1057 c566f369 Kostas Papadimitriou
          this.titple_tpl = options.title_tpl || this.title_tpl;
1058 c566f369 Kostas Papadimitriou
          this.description = options.description || this.description;
1059 c566f369 Kostas Papadimitriou
          this.empty_msg = options.empty_msg || this.empty_msg;
1060 c566f369 Kostas Papadimitriou
          this.item_cls = options.item_cls || this.item_cls;
1061 c566f369 Kostas Papadimitriou
          this.select_first_as_default = options.select_first_as_default;
1062 c566f369 Kostas Papadimitriou
          this.filter_items = options.filter_items;
1063 c566f369 Kostas Papadimitriou
          this.post_render_entries = options.post_render_entries || function() {};
1064 c566f369 Kostas Papadimitriou
          this.init_events = options.init_events || function() {};
1065 c566f369 Kostas Papadimitriou
1066 c566f369 Kostas Papadimitriou
          this.init_events = _.bind(this.init_events, this);
1067 c566f369 Kostas Papadimitriou
          this.post_render_entries = _.bind(this.post_render_entries, this);
1068 c566f369 Kostas Papadimitriou
1069 c566f369 Kostas Papadimitriou
          this._ul = $('<ul class="confirm-params">');
1070 c566f369 Kostas Papadimitriou
          this._title = $("<h4>");
1071 c566f369 Kostas Papadimitriou
          this._description = $("<p class='desc'>");
1072 c566f369 Kostas Papadimitriou
          this._empty = $("<p class='empty hidden desc'>");
1073 c566f369 Kostas Papadimitriou
          this._empty.html(this.empty_msg);
1074 c566f369 Kostas Papadimitriou
        
1075 c566f369 Kostas Papadimitriou
          this.item_views = [];
1076 c566f369 Kostas Papadimitriou
1077 c566f369 Kostas Papadimitriou
          $(this.el).append(this._title);
1078 c566f369 Kostas Papadimitriou
          $(this.el).append(this._description);
1079 c566f369 Kostas Papadimitriou
          $(this.el).append(this._empty);
1080 c566f369 Kostas Papadimitriou
          $(this.el).append(this._ul);
1081 c566f369 Kostas Papadimitriou
1082 c566f369 Kostas Papadimitriou
          this['$el'] = $(this.el);
1083 c566f369 Kostas Papadimitriou
1084 c566f369 Kostas Papadimitriou
          if (!this.title_tpl) { this.title_tpl = this.title };
1085 c566f369 Kostas Papadimitriou
1086 c566f369 Kostas Papadimitriou
          this.collection.bind("change", this.render_entries);
1087 c566f369 Kostas Papadimitriou
          this.collection.bind("reset", this.render_entries);
1088 c566f369 Kostas Papadimitriou
          this.collection.bind("add", this.render_entries);
1089 c566f369 Kostas Papadimitriou
          this.collection.bind("remove", this.remove_entry);
1090 c566f369 Kostas Papadimitriou
          
1091 c566f369 Kostas Papadimitriou
          this.fetcher = undefined;
1092 c566f369 Kostas Papadimitriou
          if (this.update_collection) {
1093 c68ad72e Kostas Papadimitriou
              this.fetcher_params = [snf.config.update_interval, 
1094 c68ad72e Kostas Papadimitriou
                    snf.config.update_interval_increase || 500,
1095 c68ad72e Kostas Papadimitriou
                    snf.config.fast_interval || snf.config.update_interval/2, 
1096 c68ad72e Kostas Papadimitriou
                    snf.config.update_interval_increase_after_calls || 4,
1097 c68ad72e Kostas Papadimitriou
                    snf.config.update_interval_max || 20000,
1098 c68ad72e Kostas Papadimitriou
                    true, 
1099 c68ad72e Kostas Papadimitriou
                    {is_recurrent: true, update: true}];
1100 c566f369 Kostas Papadimitriou
              this.fetcher = this.collection.get_fetcher.apply(this.collection, 
1101 c566f369 Kostas Papadimitriou
                                                _.clone(this.fetcher_params));
1102 c566f369 Kostas Papadimitriou
              this.fetcher.start();
1103 c566f369 Kostas Papadimitriou
          }
1104 c566f369 Kostas Papadimitriou
          this.render();
1105 c566f369 Kostas Papadimitriou
          this.init_events();
1106 c566f369 Kostas Papadimitriou
        },
1107 c566f369 Kostas Papadimitriou
        
1108 c566f369 Kostas Papadimitriou
        render: function() {
1109 c566f369 Kostas Papadimitriou
          this._title.html(this.title_tpl);
1110 c566f369 Kostas Papadimitriou
          this._description.html(this.description);
1111 c566f369 Kostas Papadimitriou
          this.render_entries();
1112 c566f369 Kostas Papadimitriou
        },
1113 c566f369 Kostas Papadimitriou
        
1114 c566f369 Kostas Papadimitriou
        remove_entry: function(model) {
1115 c566f369 Kostas Papadimitriou
          if (!this.item_views[model.id]) { return }
1116 c566f369 Kostas Papadimitriou
          this.item_views[model.id].remove();
1117 c566f369 Kostas Papadimitriou
          delete this.item_views[model.pk]
1118 c566f369 Kostas Papadimitriou
        },
1119 c566f369 Kostas Papadimitriou
        
1120 c566f369 Kostas Papadimitriou
        get_selected: function() {
1121 c566f369 Kostas Papadimitriou
          return _.map(_.filter(this.item_views, function(v) { 
1122 c566f369 Kostas Papadimitriou
            return v.selected
1123 c566f369 Kostas Papadimitriou
          }), function(v) {
1124 c566f369 Kostas Papadimitriou
            return v.model
1125 c566f369 Kostas Papadimitriou
          });
1126 c566f369 Kostas Papadimitriou
        },
1127 c566f369 Kostas Papadimitriou
        
1128 c566f369 Kostas Papadimitriou
        check_empty: function() {
1129 c566f369 Kostas Papadimitriou
          if (this.item_views.length == 0) {
1130 c566f369 Kostas Papadimitriou
            this._empty.show();
1131 c566f369 Kostas Papadimitriou
          } else {
1132 c566f369 Kostas Papadimitriou
            this._empty.hide();
1133 c566f369 Kostas Papadimitriou
          }
1134 c566f369 Kostas Papadimitriou
        },
1135 c566f369 Kostas Papadimitriou
1136 c566f369 Kostas Papadimitriou
        render_entries: function() {
1137 c566f369 Kostas Papadimitriou
          var entries;
1138 c566f369 Kostas Papadimitriou
          if (this.filter_items) {
1139 c566f369 Kostas Papadimitriou
            entries = this.collection.filter(this.filter_items);
1140 c566f369 Kostas Papadimitriou
          } else {
1141 c566f369 Kostas Papadimitriou
            entries = this.collection.models;
1142 c566f369 Kostas Papadimitriou
          }
1143 c566f369 Kostas Papadimitriou
          
1144 c566f369 Kostas Papadimitriou
          var selected = this.get_selected();
1145 c566f369 Kostas Papadimitriou
          
1146 c566f369 Kostas Papadimitriou
          _.each(entries, _.bind(function(model) {
1147 c566f369 Kostas Papadimitriou
            if (this.item_views[model.id]) {
1148 c566f369 Kostas Papadimitriou
              this.item_views[model.id].render();
1149 c566f369 Kostas Papadimitriou
            } else {
1150 c566f369 Kostas Papadimitriou
              var view = new this.item_cls({model:model});
1151 c566f369 Kostas Papadimitriou
              if (!selected.length && this.select_first_as_default) { 
1152 c566f369 Kostas Papadimitriou
                view.selected = true; selected = [1] 
1153 c566f369 Kostas Papadimitriou
              }
1154 c566f369 Kostas Papadimitriou
              view.render();
1155 c566f369 Kostas Papadimitriou
              this.item_views[model.id] = view;
1156 c566f369 Kostas Papadimitriou
              this._ul.append($(view.el));
1157 c566f369 Kostas Papadimitriou
            }
1158 c566f369 Kostas Papadimitriou
          }, this));
1159 c566f369 Kostas Papadimitriou
          this.check_empty();
1160 c566f369 Kostas Papadimitriou
          this.post_render_entries();
1161 c566f369 Kostas Papadimitriou
        },
1162 c566f369 Kostas Papadimitriou
1163 c566f369 Kostas Papadimitriou
        remove: function() {
1164 c566f369 Kostas Papadimitriou
          _.each(this.item_views, function(v){
1165 c566f369 Kostas Papadimitriou
            v.remove();
1166 c566f369 Kostas Papadimitriou
          });
1167 c566f369 Kostas Papadimitriou
          if (this.update_collection) { this.fetcher.stop() }
1168 c566f369 Kostas Papadimitriou
          this.unbind();
1169 c566f369 Kostas Papadimitriou
          this.collection.unbind("change", this.render_entries);
1170 c566f369 Kostas Papadimitriou
          this.collection.unbind("reset", this.render_entries);
1171 c566f369 Kostas Papadimitriou
          this.collection.unbind("add", this.render_entries);
1172 c566f369 Kostas Papadimitriou
          this.collection.unbind("remove", this.remove_entry);
1173 c566f369 Kostas Papadimitriou
          views.CreateColumnSelectListView.__super__.remove.apply(this, arguments);
1174 c566f369 Kostas Papadimitriou
        }
1175 c566f369 Kostas Papadimitriou
    });
1176 c566f369 Kostas Papadimitriou
1177 c566f369 Kostas Papadimitriou
    views.CreateNetworkingView = views.CreateVMStepView.extend({
1178 8d08f18a Kostas Papadimitriou
        step: 3,
1179 8d08f18a Kostas Papadimitriou
        initialize: function() {
1180 c566f369 Kostas Papadimitriou
            views.CreateNetworkingView.__super__.initialize.apply(this, arguments);
1181 c566f369 Kostas Papadimitriou
            this.init_handlers();
1182 c566f369 Kostas Papadimitriou
            this.selected_keys = [];
1183 c68ad72e Kostas Papadimitriou
            this.cont = this.$(".step-cont");
1184 c566f369 Kostas Papadimitriou
        },
1185 c566f369 Kostas Papadimitriou
        
1186 c566f369 Kostas Papadimitriou
        init_subviews: function() {
1187 c566f369 Kostas Papadimitriou
            var create_view = this.parent;
1188 c566f369 Kostas Papadimitriou
            if (!this.networks_view) {
1189 c68ad72e Kostas Papadimitriou
              this.networks_view = new views.NetworkSelectView({
1190 c68ad72e Kostas Papadimitriou
                container: this.cont
1191 c566f369 Kostas Papadimitriou
              });
1192 c68ad72e Kostas Papadimitriou
              this.networks_view.hide(true);
1193 c566f369 Kostas Papadimitriou
            }
1194 c566f369 Kostas Papadimitriou
        },
1195 c566f369 Kostas Papadimitriou
1196 c566f369 Kostas Papadimitriou
        init_handlers: function() {
1197 c566f369 Kostas Papadimitriou
        },
1198 c566f369 Kostas Papadimitriou
1199 c566f369 Kostas Papadimitriou
        show: function() {
1200 c566f369 Kostas Papadimitriou
            views.CreateNetworkingView.__super__.show.apply(this, arguments);
1201 c566f369 Kostas Papadimitriou
            this.init_subviews();
1202 c566f369 Kostas Papadimitriou
            this.update_layout();
1203 c68ad72e Kostas Papadimitriou
            this.networks_view.show(true);
1204 c566f369 Kostas Papadimitriou
        },
1205 c566f369 Kostas Papadimitriou
        
1206 c68ad72e Kostas Papadimitriou
        hide_step: function() {
1207 c68ad72e Kostas Papadimitriou
            this.networks_view && this.networks_view.hide(true);
1208 c68ad72e Kostas Papadimitriou
        },
1209 c68ad72e Kostas Papadimitriou
1210 c566f369 Kostas Papadimitriou
        update_layout: function() {
1211 c566f369 Kostas Papadimitriou
        },
1212 c566f369 Kostas Papadimitriou
1213 c566f369 Kostas Papadimitriou
        reset: function() {
1214 c566f369 Kostas Papadimitriou
            this.selected_keys = [];
1215 c566f369 Kostas Papadimitriou
            this.update_layout();
1216 c566f369 Kostas Papadimitriou
        },
1217 c566f369 Kostas Papadimitriou
        
1218 c566f369 Kostas Papadimitriou
        get_selected_networks: function() {
1219 c68ad72e Kostas Papadimitriou
            if (!this.networks_view) { return [] }
1220 c68ad72e Kostas Papadimitriou
            return this.networks_view.get_selected_networks();
1221 c566f369 Kostas Papadimitriou
        },
1222 c566f369 Kostas Papadimitriou
        
1223 c566f369 Kostas Papadimitriou
        get_selected_addresses: function() {
1224 c68ad72e Kostas Papadimitriou
            if (!this.networks_view) { return [] }
1225 c68ad72e Kostas Papadimitriou
            return this.networks_view.get_selected_floating_ips();
1226 c566f369 Kostas Papadimitriou
        },
1227 c566f369 Kostas Papadimitriou
1228 c566f369 Kostas Papadimitriou
        get: function() {
1229 c566f369 Kostas Papadimitriou
            return {
1230 c566f369 Kostas Papadimitriou
              'addresses': this.get_selected_addresses(),
1231 c566f369 Kostas Papadimitriou
              'networks': this.get_selected_networks()
1232 c566f369 Kostas Papadimitriou
            }
1233 c566f369 Kostas Papadimitriou
        },
1234 c566f369 Kostas Papadimitriou
1235 c566f369 Kostas Papadimitriou
        remove: function() {
1236 c566f369 Kostas Papadimitriou
          if (this.networks_view) {
1237 c566f369 Kostas Papadimitriou
            this.networks_view.remove();
1238 c566f369 Kostas Papadimitriou
            delete this.networks_view;
1239 c566f369 Kostas Papadimitriou
          }
1240 c566f369 Kostas Papadimitriou
        }
1241 c566f369 Kostas Papadimitriou
    });
1242 c566f369 Kostas Papadimitriou
1243 c566f369 Kostas Papadimitriou
    views.CreatePersonalizeView = views.CreateVMStepView.extend({
1244 c566f369 Kostas Papadimitriou
        step: 4,
1245 c566f369 Kostas Papadimitriou
        initialize: function() {
1246 8d08f18a Kostas Papadimitriou
            views.CreateSubmitView.__super__.initialize.apply(this, arguments);
1247 73e25ce2 Kostas Papadimitriou
            this.roles = this.$("li.predefined-meta.role .values");
1248 73e25ce2 Kostas Papadimitriou
            this.name = this.$("input.rename-field");
1249 8d08f18a Kostas Papadimitriou
            this.name_changed = false;
1250 73e25ce2 Kostas Papadimitriou
            this.init_suggested_roles();
1251 8d08f18a Kostas Papadimitriou
            this.init_handlers();
1252 47276ec2 Kostas Papadimitriou
            this.ssh_list = this.$(".ssh ul");
1253 47276ec2 Kostas Papadimitriou
            this.selected_keys = [];
1254 47276ec2 Kostas Papadimitriou
1255 47276ec2 Kostas Papadimitriou
            var self = this;
1256 47276ec2 Kostas Papadimitriou
            this.$(".create-ssh-key").click(function() {
1257 61d7787c Kostas Papadimitriou
                var confirm_close = true;
1258 47276ec2 Kostas Papadimitriou
                if (confirm_close) {
1259 47276ec2 Kostas Papadimitriou
                    snf.ui.main.public_keys_view.show(self.parent);
1260 47276ec2 Kostas Papadimitriou
                } else {
1261 47276ec2 Kostas Papadimitriou
                }
1262 47276ec2 Kostas Papadimitriou
            });
1263 8d08f18a Kostas Papadimitriou
        },
1264 8d08f18a Kostas Papadimitriou
1265 73e25ce2 Kostas Papadimitriou
        init_suggested_roles: function() {
1266 73e25ce2 Kostas Papadimitriou
            var cont = this.roles;
1267 73e25ce2 Kostas Papadimitriou
            cont.empty();
1268 73e25ce2 Kostas Papadimitriou
            
1269 73e25ce2 Kostas Papadimitriou
            // TODO: get suggested from snf.api.conf
1270 73e25ce2 Kostas Papadimitriou
            _.each(window.SUGGESTED_ROLES, function(r){
1271 df251d55 Kostas Papadimitriou
                var el = $('<span class="val">{0}</span>'.format(_.escape(r)));
1272 73e25ce2 Kostas Papadimitriou
                el.data("value", r);
1273 73e25ce2 Kostas Papadimitriou
                cont.append(el);
1274 73e25ce2 Kostas Papadimitriou
                el.click(function() {
1275 73e25ce2 Kostas Papadimitriou
                    $(this).parent().find(".val").removeClass("selected");
1276 73e25ce2 Kostas Papadimitriou
                    $(this).toggleClass("selected");
1277 73e25ce2 Kostas Papadimitriou
                })
1278 47276ec2 Kostas Papadimitriou
            });
1279 47276ec2 Kostas Papadimitriou
            
1280 47276ec2 Kostas Papadimitriou
            var self = this;
1281 47276ec2 Kostas Papadimitriou
            $(".ssh li.ssh-key-option").live("click", function(e) {
1282 47276ec2 Kostas Papadimitriou
                var key = $(this).data("model");
1283 47276ec2 Kostas Papadimitriou
                self.select_key(key);
1284 47276ec2 Kostas Papadimitriou
            });
1285 47276ec2 Kostas Papadimitriou
        },
1286 47276ec2 Kostas Papadimitriou
1287 47276ec2 Kostas Papadimitriou
        select_key: function(key) {
1288 47276ec2 Kostas Papadimitriou
            var exists = this.selected_keys.indexOf(key.id);
1289 47276ec2 Kostas Papadimitriou
            if (exists > -1) {
1290 47276ec2 Kostas Papadimitriou
                this.selected_keys.splice(exists, 1);
1291 47276ec2 Kostas Papadimitriou
            } else {
1292 47276ec2 Kostas Papadimitriou
                this.selected_keys.push(key.id);
1293 47276ec2 Kostas Papadimitriou
            }
1294 47276ec2 Kostas Papadimitriou
            this.update_ui_keys_selections(this.selected_keys);
1295 47276ec2 Kostas Papadimitriou
        },
1296 47276ec2 Kostas Papadimitriou
1297 47276ec2 Kostas Papadimitriou
        update_ui_keys_selections: function(keys) {
1298 47276ec2 Kostas Papadimitriou
            var self = this;
1299 47276ec2 Kostas Papadimitriou
            self.$(".ssh-key-option").removeClass("selected");
1300 47276ec2 Kostas Papadimitriou
            self.$(".ssh-key-option .check").attr("checked", false);
1301 47276ec2 Kostas Papadimitriou
            _.each(keys, function(kid) {
1302 47276ec2 Kostas Papadimitriou
                $("#ssh-key-option-" + kid).addClass("selected");
1303 47276ec2 Kostas Papadimitriou
                $("#ssh-key-option-" + kid).find(".check").attr("checked", true);
1304 47276ec2 Kostas Papadimitriou
            });
1305 47276ec2 Kostas Papadimitriou
        },
1306 47276ec2 Kostas Papadimitriou
1307 47276ec2 Kostas Papadimitriou
        update_ssh_keys: function() {
1308 47276ec2 Kostas Papadimitriou
            this.ssh_list.empty();
1309 47276ec2 Kostas Papadimitriou
            var keys = snf.storage.keys.models;
1310 47276ec2 Kostas Papadimitriou
            if (keys.length == 0) { 
1311 47276ec2 Kostas Papadimitriou
                this.$(".ssh .empty").show();
1312 47276ec2 Kostas Papadimitriou
            } else {
1313 47276ec2 Kostas Papadimitriou
                this.$(".ssh .empty").hide();
1314 47276ec2 Kostas Papadimitriou
            }
1315 47276ec2 Kostas Papadimitriou
            _.each(keys, _.bind(function(key){
1316 df251d55 Kostas Papadimitriou
                var el = $('<li id="ssh-key-option-{1}" class="ssh-key-option">{0}</li>'.format(_.escape(key.get("name")), key.id));
1317 47276ec2 Kostas Papadimitriou
                var check = $('<input class="check" type="checkbox"></input>')
1318 47276ec2 Kostas Papadimitriou
                el.append(check);
1319 47276ec2 Kostas Papadimitriou
                el.data("model", key);
1320 47276ec2 Kostas Papadimitriou
                this.ssh_list.append(el);
1321 47276ec2 Kostas Papadimitriou
            }, this));
1322 73e25ce2 Kostas Papadimitriou
        },
1323 73e25ce2 Kostas Papadimitriou
1324 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
1325 820ef2f0 Kostas Papadimitriou
            this.name.bind("keypress", _.bind(function(e) {
1326 8d08f18a Kostas Papadimitriou
                this.name_changed = true;
1327 c566f369 Kostas Papadimitriou
                if (e.keyCode == 13) { this.parent.set_step(5); this.parent.update_layout() };    
1328 8d08f18a Kostas Papadimitriou
            }, this));
1329 8d08f18a Kostas Papadimitriou
1330 8d08f18a Kostas Papadimitriou
            this.name.bind("click", _.bind(function() {
1331 8d08f18a Kostas Papadimitriou
                if (!this.name_changed) {
1332 8d08f18a Kostas Papadimitriou
                    this.name.val("");
1333 8d08f18a Kostas Papadimitriou
                }
1334 8d08f18a Kostas Papadimitriou
            }, this))
1335 8d08f18a Kostas Papadimitriou
        },
1336 8d08f18a Kostas Papadimitriou
1337 8d08f18a Kostas Papadimitriou
        show: function() {
1338 47276ec2 Kostas Papadimitriou
            views.CreatePersonalizeView.__super__.show.apply(this, arguments);
1339 8d08f18a Kostas Papadimitriou
            this.update_layout();
1340 8d08f18a Kostas Papadimitriou
        },
1341 820ef2f0 Kostas Papadimitriou
        
1342 8d08f18a Kostas Papadimitriou
        update_layout: function() {
1343 8d08f18a Kostas Papadimitriou
            var params = this.parent.get_params();
1344 47276ec2 Kostas Papadimitriou
1345 cd4d5c5f Kostas Papadimitriou
            if (!params.image || !params.flavor) { return }
1346 820ef2f0 Kostas Papadimitriou
1347 820ef2f0 Kostas Papadimitriou
            if (!params.image) { return }
1348 c130b56e Kostas Papadimitriou
            var vm_name_tpl = snf.config.vm_name_template || "My {0} server";
1349 df251d55 Kostas Papadimitriou
            var vm_name = vm_name_tpl.format(_.escape(params.image.get("name")));
1350 8d08f18a Kostas Papadimitriou
            var orig_name = vm_name;
1351 8d08f18a Kostas Papadimitriou
            
1352 8d08f18a Kostas Papadimitriou
            var existing = true;
1353 8d08f18a Kostas Papadimitriou
            var j = 0;
1354 b128dc09 Kostas Papadimitriou
1355 820ef2f0 Kostas Papadimitriou
            while (existing && !this.name_changed) {
1356 c566f369 Kostas Papadimitriou
                var existing = storage.vms.select(function(vm){
1357 c566f369 Kostas Papadimitriou
                  return vm.get("name") == vm_name
1358 c566f369 Kostas Papadimitriou
                }).length;
1359 8d08f18a Kostas Papadimitriou
                if (existing) {
1360 8d08f18a Kostas Papadimitriou
                    j++;
1361 8d08f18a Kostas Papadimitriou
                    vm_name = orig_name + " " + j;
1362 8d08f18a Kostas Papadimitriou
                }
1363 8d08f18a Kostas Papadimitriou
            }
1364 47276ec2 Kostas Papadimitriou
1365 8d08f18a Kostas Papadimitriou
            if (!_(this.name.val()).trim() || !this.name_changed) {
1366 8d08f18a Kostas Papadimitriou
                this.name.val(vm_name);
1367 8d08f18a Kostas Papadimitriou
            }
1368 8d08f18a Kostas Papadimitriou
1369 4f1968db Kostas Papadimitriou
            if (!this.name_changed && this.parent.visible()) {
1370 1325fc64 Kostas Papadimitriou
                if (!$.browser.msie && !$.browser.opera) {
1371 4f1968db Kostas Papadimitriou
                    this.$("#create-vm-name").select();
1372 4f1968db Kostas Papadimitriou
                } else {
1373 4f1968db Kostas Papadimitriou
                    window.setTimeout(_.bind(function(){
1374 4f1968db Kostas Papadimitriou
                        this.$("#create-vm-name").select();
1375 1325fc64 Kostas Papadimitriou
                    }, this), 400)
1376 4f1968db Kostas Papadimitriou
                }
1377 820ef2f0 Kostas Papadimitriou
            }
1378 820ef2f0 Kostas Papadimitriou
            
1379 820ef2f0 Kostas Papadimitriou
            var img = snf.ui.helpers.os_icon_path(params.image.get("OS"))
1380 820ef2f0 Kostas Papadimitriou
            this.name.css({backgroundImage:"url({0})".format(img)})
1381 47276ec2 Kostas Papadimitriou
            
1382 47276ec2 Kostas Papadimitriou
            if (!params.image.supports('ssh')) {
1383 47276ec2 Kostas Papadimitriou
                this.disable_ssh_keys();
1384 47276ec2 Kostas Papadimitriou
            } else {
1385 47276ec2 Kostas Papadimitriou
                this.enable_ssh_keys();
1386 47276ec2 Kostas Papadimitriou
                this.update_ssh_keys();
1387 47276ec2 Kostas Papadimitriou
            }
1388 820ef2f0 Kostas Papadimitriou
1389 47276ec2 Kostas Papadimitriou
            this.update_ui_keys_selections(this.selected_keys);
1390 47276ec2 Kostas Papadimitriou
        },
1391 47276ec2 Kostas Papadimitriou
1392 47276ec2 Kostas Papadimitriou
        disable_ssh_keys: function() {
1393 47276ec2 Kostas Papadimitriou
            this.$(".disabled.desc").show();
1394 47276ec2 Kostas Papadimitriou
            this.$(".empty.desc").hide();
1395 47276ec2 Kostas Papadimitriou
            this.$(".ssh .confirm-params").hide();
1396 47276ec2 Kostas Papadimitriou
            this.selected_keys = [];
1397 47276ec2 Kostas Papadimitriou
        },
1398 47276ec2 Kostas Papadimitriou
1399 47276ec2 Kostas Papadimitriou
        enable_ssh_keys: function() {
1400 47276ec2 Kostas Papadimitriou
            this.$(".ssh .confirm-params").show();
1401 47276ec2 Kostas Papadimitriou
            this.$(".disabled.desc").hide();
1402 8d08f18a Kostas Papadimitriou
        },
1403 8d08f18a Kostas Papadimitriou
1404 8d08f18a Kostas Papadimitriou
        reset: function() {
1405 73e25ce2 Kostas Papadimitriou
            this.roles.find(".val").removeClass("selected");
1406 820ef2f0 Kostas Papadimitriou
            this.name_changed = false;
1407 47276ec2 Kostas Papadimitriou
            this.selected_keys = [];
1408 8d08f18a Kostas Papadimitriou
            this.update_layout();
1409 8d08f18a Kostas Papadimitriou
        },
1410 8d08f18a Kostas Papadimitriou
1411 73e25ce2 Kostas Papadimitriou
        get_meta: function() {
1412 73e25ce2 Kostas Papadimitriou
            if (this.roles.find(".selected").length == 0) {
1413 73e25ce2 Kostas Papadimitriou
                return false;
1414 73e25ce2 Kostas Papadimitriou
            }
1415 73e25ce2 Kostas Papadimitriou
1416 73e25ce2 Kostas Papadimitriou
            var role = $(this.roles.find(".selected").get(0)).data("value");
1417 73e25ce2 Kostas Papadimitriou
            return {'Role': role }
1418 73e25ce2 Kostas Papadimitriou
        },
1419 73e25ce2 Kostas Papadimitriou
1420 8d08f18a Kostas Papadimitriou
        get: function() {
1421 73e25ce2 Kostas Papadimitriou
            var val = {'name': this.name.val() };
1422 73e25ce2 Kostas Papadimitriou
            if (this.get_meta()) {
1423 73e25ce2 Kostas Papadimitriou
                val.metadata = this.get_meta();
1424 73e25ce2 Kostas Papadimitriou
            }
1425 47276ec2 Kostas Papadimitriou
1426 47276ec2 Kostas Papadimitriou
            val.keys = _.map(this.selected_keys, function(k){ return snf.storage.keys.get(k)});
1427 73e25ce2 Kostas Papadimitriou
            
1428 73e25ce2 Kostas Papadimitriou
            return val;
1429 8d08f18a Kostas Papadimitriou
        }
1430 8d08f18a Kostas Papadimitriou
    });
1431 8d08f18a Kostas Papadimitriou
1432 47276ec2 Kostas Papadimitriou
    views.CreateSubmitView = views.CreateVMStepView.extend({
1433 c566f369 Kostas Papadimitriou
        step: 5,
1434 47276ec2 Kostas Papadimitriou
        initialize: function() {
1435 47276ec2 Kostas Papadimitriou
            views.CreateSubmitView.__super__.initialize.apply(this, arguments);
1436 47276ec2 Kostas Papadimitriou
            this.roles = this.$("li.predefined-meta.role .values");
1437 47276ec2 Kostas Papadimitriou
            this.confirm = this.$(".confirm-params ul");
1438 47276ec2 Kostas Papadimitriou
            this.name = this.$("h3.vm-name");
1439 47276ec2 Kostas Papadimitriou
            this.keys = this.$(".confirm-params.ssh");
1440 47276ec2 Kostas Papadimitriou
            this.meta = this.$(".confirm-params.meta");
1441 c566f369 Kostas Papadimitriou
            this.ip_addresses = this.$(".confirm-params.ip-addresses");
1442 c566f369 Kostas Papadimitriou
            this.private_networks = this.$(".confirm-params.private-networks");
1443 47276ec2 Kostas Papadimitriou
            this.init_handlers();
1444 47276ec2 Kostas Papadimitriou
        },
1445 47276ec2 Kostas Papadimitriou
1446 47276ec2 Kostas Papadimitriou
        init_handlers: function() {
1447 47276ec2 Kostas Papadimitriou
        },
1448 47276ec2 Kostas Papadimitriou
1449 47276ec2 Kostas Papadimitriou
        show: function() {
1450 47276ec2 Kostas Papadimitriou
            views.CreateSubmitView.__super__.show.apply(this, arguments);
1451 47276ec2 Kostas Papadimitriou
            this.update_layout();
1452 47276ec2 Kostas Papadimitriou
        },
1453 47276ec2 Kostas Papadimitriou
        
1454 c566f369 Kostas Papadimitriou
        update_network_details: function() {
1455 c566f369 Kostas Papadimitriou
            var data = this.parent.get_params();
1456 c566f369 Kostas Papadimitriou
            var ips = data.addresses;
1457 c566f369 Kostas Papadimitriou
            var networks = data.networks;
1458 c566f369 Kostas Papadimitriou
1459 c566f369 Kostas Papadimitriou
            this.ip_addresses.empty();
1460 c566f369 Kostas Papadimitriou
            if (!ips|| ips.length == 0) {
1461 c566f369 Kostas Papadimitriou
                this.ip_addresses.append(this.make("li", {'class':'empty'}, 
1462 c566f369 Kostas Papadimitriou
                                           'No ip addresses selected'))
1463 c566f369 Kostas Papadimitriou
            }
1464 c566f369 Kostas Papadimitriou
            _.each(ips, _.bind(function(ip) {
1465 c566f369 Kostas Papadimitriou
                var el = this.make("li", {'class':'selected-ip-address'}, 
1466 c68ad72e Kostas Papadimitriou
                                  ip.get('floating_ip_address'));
1467 c566f369 Kostas Papadimitriou
                this.ip_addresses.append(el);
1468 c566f369 Kostas Papadimitriou
            }, this))
1469 c566f369 Kostas Papadimitriou
1470 c566f369 Kostas Papadimitriou
            this.private_networks.empty();
1471 c566f369 Kostas Papadimitriou
            if (!networks || networks.length == 0) {
1472 c566f369 Kostas Papadimitriou
                this.private_networks.append(this.make("li", {'class':'empty'}, 
1473 c566f369 Kostas Papadimitriou
                                             'No private networks selected'))
1474 c566f369 Kostas Papadimitriou
            }
1475 c566f369 Kostas Papadimitriou
            _.each(networks, _.bind(function(network) {
1476 c566f369 Kostas Papadimitriou
                var el = this.make("li", {'class':'selected-private-network'}, 
1477 c566f369 Kostas Papadimitriou
                                  network.get('name'));
1478 c566f369 Kostas Papadimitriou
                this.private_networks.append(el);
1479 c566f369 Kostas Papadimitriou
            }, this))
1480 c566f369 Kostas Papadimitriou
1481 c566f369 Kostas Papadimitriou
        },
1482 c566f369 Kostas Papadimitriou
1483 47276ec2 Kostas Papadimitriou
        update_flavor_details: function() {
1484 47276ec2 Kostas Papadimitriou
            var flavor = this.parent.get_params().flavor;
1485 47276ec2 Kostas Papadimitriou
1486 47276ec2 Kostas Papadimitriou
            function set_detail(sel, key) {
1487 47276ec2 Kostas Papadimitriou
                var val = key;
1488 47276ec2 Kostas Papadimitriou
                if (key == undefined) { val = flavor.get(sel) };
1489 47276ec2 Kostas Papadimitriou
                this.$(".confirm-cont.flavor .flavor-" + sel + " .value").text(val)
1490 47276ec2 Kostas Papadimitriou
            }
1491 47276ec2 Kostas Papadimitriou
            
1492 47276ec2 Kostas Papadimitriou
            set_detail("cpu", flavor.get("cpu") + "x");
1493 47276ec2 Kostas Papadimitriou
            set_detail("ram", flavor.get("ram") + " MB");
1494 47276ec2 Kostas Papadimitriou
            set_detail("disk", util.readablizeBytes(flavor.get("disk") * 1024 * 1024 * 1024));
1495 d965e6dc Kostas Papadimitriou
            set_detail("disktype", flavor.get_disk_template_info().name);
1496 47276ec2 Kostas Papadimitriou
        },
1497 47276ec2 Kostas Papadimitriou
1498 47276ec2 Kostas Papadimitriou
        update_image_details: function() {
1499 47276ec2 Kostas Papadimitriou
            var image = this.parent.get_params().image;
1500 47276ec2 Kostas Papadimitriou
1501 47276ec2 Kostas Papadimitriou
            function set_detail(sel, key) {
1502 47276ec2 Kostas Papadimitriou
                var val = key;
1503 47276ec2 Kostas Papadimitriou
                if (key == undefined) { val = image.get(sel) };
1504 47276ec2 Kostas Papadimitriou
                this.$(".confirm-cont.image .image-" + sel + " .value").text(val)
1505 47276ec2 Kostas Papadimitriou
            }
1506 47276ec2 Kostas Papadimitriou
            
1507 1d356257 Kostas Papadimitriou
            set_detail("description", image.get_description());
1508 47276ec2 Kostas Papadimitriou
            set_detail("name");
1509 43ec1206 Kostas Papadimitriou
            set_detail("os", _(image.get_os()).capitalize());
1510 43ec1206 Kostas Papadimitriou
            set_detail("gui", image.get_gui());
1511 df251d55 Kostas Papadimitriou
            set_detail("size", _.escape(image.get_readable_size()));
1512 47276ec2 Kostas Papadimitriou
            set_detail("kernel");
1513 47276ec2 Kostas Papadimitriou
        },
1514 47276ec2 Kostas Papadimitriou
1515 47276ec2 Kostas Papadimitriou
        update_selected_keys: function(keys) {
1516 47276ec2 Kostas Papadimitriou
            this.keys.empty();
1517 47276ec2 Kostas Papadimitriou
            if (!keys || keys.length == 0) {
1518 47276ec2 Kostas Papadimitriou
                this.keys.append(this.make("li", {'class':'empty'}, 'No keys selected'))
1519 47276ec2 Kostas Papadimitriou
            }
1520 47276ec2 Kostas Papadimitriou
            _.each(keys, _.bind(function(key) {
1521 47276ec2 Kostas Papadimitriou
                var el = this.make("li", {'class':'selected-ssh-key'}, key.get('name'));
1522 47276ec2 Kostas Papadimitriou
                this.keys.append(el);
1523 47276ec2 Kostas Papadimitriou
            }, this))
1524 47276ec2 Kostas Papadimitriou
        },
1525 47276ec2 Kostas Papadimitriou
1526 47276ec2 Kostas Papadimitriou
        update_selected_meta: function(meta) {
1527 47276ec2 Kostas Papadimitriou
            this.meta.empty();
1528 47276ec2 Kostas Papadimitriou
            if (!meta || meta.length == 0) {
1529 47276ec2 Kostas Papadimitriou
                this.meta.append(this.make("li", {'class':'empty'}, 'No tags selected'))
1530 47276ec2 Kostas Papadimitriou
            }
1531 47276ec2 Kostas Papadimitriou
            _.each(meta, _.bind(function(value, key) {
1532 c566f369 Kostas Papadimitriou
                var el = this.make("li", {'class':'confirm-value'});
1533 c566f369 Kostas Papadimitriou
                var name = this.make("span", {'class':'ckey'}, key);
1534 c566f369 Kostas Papadimitriou
                var value = this.make("span", {'class':'cval'}, value);
1535 47276ec2 Kostas Papadimitriou
1536 47276ec2 Kostas Papadimitriou
                $(el).append(name)
1537 47276ec2 Kostas Papadimitriou
                $(el).append(value);
1538 47276ec2 Kostas Papadimitriou
                this.meta.append(el);
1539 47276ec2 Kostas Papadimitriou
            }, this));
1540 47276ec2 Kostas Papadimitriou
        },
1541 47276ec2 Kostas Papadimitriou
1542 47276ec2 Kostas Papadimitriou
        update_layout: function() {
1543 47276ec2 Kostas Papadimitriou
            var params = this.parent.get_params();
1544 47276ec2 Kostas Papadimitriou
            if (!params.image || !params.flavor) { return }
1545 47276ec2 Kostas Papadimitriou
1546 47276ec2 Kostas Papadimitriou
            if (!params.image) { return }
1547 47276ec2 Kostas Papadimitriou
1548 47276ec2 Kostas Papadimitriou
            this.name.text(params.name);
1549 47276ec2 Kostas Papadimitriou
1550 47276ec2 Kostas Papadimitriou
            this.confirm.find("li.image .value").text(params.flavor.get("image"));
1551 47276ec2 Kostas Papadimitriou
            this.confirm.find("li.cpu .value").text(params.flavor.get("cpu") + "x");
1552 47276ec2 Kostas Papadimitriou
            this.confirm.find("li.mem .value").text(params.flavor.get("ram"));
1553 47276ec2 Kostas Papadimitriou
            this.confirm.find("li.disk .value").text(params.flavor.get("disk"));
1554 47276ec2 Kostas Papadimitriou
1555 47276ec2 Kostas Papadimitriou
            var img = snf.ui.helpers.os_icon_path(params.image.get("OS"))
1556 47276ec2 Kostas Papadimitriou
            this.name.css({backgroundImage:"url({0})".format(img)})
1557 47276ec2 Kostas Papadimitriou
1558 47276ec2 Kostas Papadimitriou
            this.update_image_details();
1559 47276ec2 Kostas Papadimitriou
            this.update_flavor_details();
1560 c566f369 Kostas Papadimitriou
            this.update_network_details();
1561 47276ec2 Kostas Papadimitriou
1562 47276ec2 Kostas Papadimitriou
            if (!params.image.supports('ssh')) {
1563 47276ec2 Kostas Papadimitriou
                this.keys.hide();
1564 47276ec2 Kostas Papadimitriou
                this.keys.prev().hide();
1565 47276ec2 Kostas Papadimitriou
            } else {
1566 47276ec2 Kostas Papadimitriou
                this.keys.show();
1567 47276ec2 Kostas Papadimitriou
                this.keys.prev().show();
1568 47276ec2 Kostas Papadimitriou
                this.update_selected_keys(params.keys);
1569 47276ec2 Kostas Papadimitriou
            }
1570 47276ec2 Kostas Papadimitriou
            
1571 47276ec2 Kostas Papadimitriou
            this.update_selected_meta(params.metadata);
1572 47276ec2 Kostas Papadimitriou
        },
1573 47276ec2 Kostas Papadimitriou
1574 47276ec2 Kostas Papadimitriou
        reset: function() {
1575 47276ec2 Kostas Papadimitriou
            this.update_layout();
1576 47276ec2 Kostas Papadimitriou
        },
1577 47276ec2 Kostas Papadimitriou
1578 47276ec2 Kostas Papadimitriou
        get_meta: function() {
1579 47276ec2 Kostas Papadimitriou
        },
1580 47276ec2 Kostas Papadimitriou
1581 47276ec2 Kostas Papadimitriou
        get: function() {
1582 47276ec2 Kostas Papadimitriou
            return {};
1583 47276ec2 Kostas Papadimitriou
        }
1584 47276ec2 Kostas Papadimitriou
    });
1585 47276ec2 Kostas Papadimitriou
1586 8d08f18a Kostas Papadimitriou
    views.CreateVMView = views.Overlay.extend({
1587 8d08f18a Kostas Papadimitriou
        
1588 8d08f18a Kostas Papadimitriou
        view_id: "create_vm_view",
1589 8d08f18a Kostas Papadimitriou
        content_selector: "#createvm-overlay-content",
1590 8d08f18a Kostas Papadimitriou
        css_class: 'overlay-createvm overlay-info',
1591 8d08f18a Kostas Papadimitriou
        overlay_id: "metadata-overlay",
1592 8d08f18a Kostas Papadimitriou
1593 8d08f18a Kostas Papadimitriou
        subtitle: false,
1594 8d08f18a Kostas Papadimitriou
        title: "Create new machine",
1595 8d08f18a Kostas Papadimitriou
1596 8d08f18a Kostas Papadimitriou
        initialize: function(options) {
1597 8d08f18a Kostas Papadimitriou
            views.CreateVMView.__super__.initialize.apply(this);
1598 8d08f18a Kostas Papadimitriou
            this.current_step = 1;
1599 8d08f18a Kostas Papadimitriou
1600 8d08f18a Kostas Papadimitriou
            this.password_view = new views.VMCreationPasswordView();
1601 8d08f18a Kostas Papadimitriou
1602 8d08f18a Kostas Papadimitriou
            this.steps = [];
1603 8d08f18a Kostas Papadimitriou
            this.steps[1] = new views.CreateImageSelectView(this);
1604 8d08f18a Kostas Papadimitriou
            this.steps[1].bind("change", _.bind(function(data) {this.trigger("image:change", data)}, this));
1605 8d08f18a Kostas Papadimitriou
1606 8d08f18a Kostas Papadimitriou
            this.steps[2] = new views.CreateFlavorSelectView(this);
1607 c566f369 Kostas Papadimitriou
            this.steps[3] = new views.CreateNetworkingView(this);
1608 c566f369 Kostas Papadimitriou
            this.steps[4] = new views.CreatePersonalizeView(this);
1609 c566f369 Kostas Papadimitriou
            this.steps[5] = new views.CreateSubmitView(this);
1610 8d08f18a Kostas Papadimitriou
1611 1325fc64 Kostas Papadimitriou
            this.cancel_btn = this.$(".create-controls .cancel");
1612 1325fc64 Kostas Papadimitriou
            this.next_btn = this.$(".create-controls .next");
1613 1325fc64 Kostas Papadimitriou
            this.prev_btn = this.$(".create-controls .prev");
1614 1325fc64 Kostas Papadimitriou
            this.submit_btn = this.$(".create-controls .submit");
1615 1325fc64 Kostas Papadimitriou
1616 1325fc64 Kostas Papadimitriou
            this.history = this.$(".steps-history");
1617 1325fc64 Kostas Papadimitriou
            this.history_steps = this.$(".steps-history .steps-history-step");
1618 8d08f18a Kostas Papadimitriou
            
1619 8d08f18a Kostas Papadimitriou
            this.init_handlers();
1620 8d08f18a Kostas Papadimitriou
        },
1621 8d08f18a Kostas Papadimitriou
1622 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
1623 1325fc64 Kostas Papadimitriou
            var self = this;
1624 8d08f18a Kostas Papadimitriou
            this.next_btn.click(_.bind(function(){
1625 b128dc09 Kostas Papadimitriou
                this.set_step(this.current_step + 1);
1626 8d08f18a Kostas Papadimitriou
                this.update_layout();
1627 8d08f18a Kostas Papadimitriou
            }, this))
1628 8d08f18a Kostas Papadimitriou
            this.prev_btn.click(_.bind(function(){
1629 b128dc09 Kostas Papadimitriou
                this.set_step(this.current_step - 1);
1630 8d08f18a Kostas Papadimitriou
                this.update_layout();
1631 8d08f18a Kostas Papadimitriou
            }, this))
1632 8d08f18a Kostas Papadimitriou
            this.cancel_btn.click(_.bind(function(){
1633 8d08f18a Kostas Papadimitriou
                this.close_all();
1634 8d08f18a Kostas Papadimitriou
            }, this))
1635 8d08f18a Kostas Papadimitriou
            this.submit_btn.click(_.bind(function(){
1636 8d08f18a Kostas Papadimitriou
                this.submit();
1637 8d08f18a Kostas Papadimitriou
            }, this))
1638 1325fc64 Kostas Papadimitriou
            
1639 1325fc64 Kostas Papadimitriou
            this.history.find(".completed").live("click", function() {
1640 1325fc64 Kostas Papadimitriou
                var step = parseInt($(this).attr("id").replace("vm-create-step-history-", ""));
1641 1325fc64 Kostas Papadimitriou
                self.set_step(step);
1642 1325fc64 Kostas Papadimitriou
                self.update_layout();
1643 1325fc64 Kostas Papadimitriou
            })
1644 8d08f18a Kostas Papadimitriou
        },
1645 8d08f18a Kostas Papadimitriou
1646 8d08f18a Kostas Papadimitriou
        set_step: function(st) {
1647 8d08f18a Kostas Papadimitriou
        },
1648 8d08f18a Kostas Papadimitriou
        
1649 8d08f18a Kostas Papadimitriou
        validate: function(data) {
1650 8d08f18a Kostas Papadimitriou
            if (_(data.name).trim() == "") {
1651 8d08f18a Kostas Papadimitriou
                this.$(".form-field").addClass("error");
1652 8d08f18a Kostas Papadimitriou
                return false;
1653 8d08f18a Kostas Papadimitriou
            } else {
1654 8d08f18a Kostas Papadimitriou
                return true;
1655 8d08f18a Kostas Papadimitriou
            }
1656 8d08f18a Kostas Papadimitriou
        },
1657 8d08f18a Kostas Papadimitriou
1658 8d08f18a Kostas Papadimitriou
        submit: function() {
1659 820ef2f0 Kostas Papadimitriou
            if (this.submiting) { return };
1660 8d08f18a Kostas Papadimitriou
            var data = this.get_params();
1661 73e25ce2 Kostas Papadimitriou
            var meta = {};
1662 47276ec2 Kostas Papadimitriou
            var extra = {};
1663 47276ec2 Kostas Papadimitriou
            var personality = [];
1664 47276ec2 Kostas Papadimitriou
1665 8d08f18a Kostas Papadimitriou
            if (this.validate(data)) {
1666 8d08f18a Kostas Papadimitriou
                this.submit_btn.addClass("in-progress");
1667 820ef2f0 Kostas Papadimitriou
                this.submiting = true;
1668 73e25ce2 Kostas Papadimitriou
                if (data.metadata) { meta = data.metadata; }
1669 47276ec2 Kostas Papadimitriou
                if (data.keys && data.keys.length > 0) {
1670 c566f369 Kostas Papadimitriou
                    personality.push(
1671 c566f369 Kostas Papadimitriou
                      data.image.personality_data_for_keys(data.keys))
1672 47276ec2 Kostas Papadimitriou
                }
1673 47276ec2 Kostas Papadimitriou
1674 2221a5a0 Kostas Papadimitriou
                if (personality.length) {
1675 bdfb089f Kostas Papadimitriou
                    extra['personality'] = _.flatten(personality);
1676 2221a5a0 Kostas Papadimitriou
                }
1677 c566f369 Kostas Papadimitriou
                
1678 c68ad72e Kostas Papadimitriou
                extra['networks'] = [];
1679 c68ad72e Kostas Papadimitriou
                _.each(data.networks, function(n) {
1680 c68ad72e Kostas Papadimitriou
                  extra.networks.push({'uuid': n.get('id')})
1681 c68ad72e Kostas Papadimitriou
                });
1682 c68ad72e Kostas Papadimitriou
                _.each(data.ips, function(ip) {
1683 c68ad72e Kostas Papadimitriou
                  extra.networks.push({
1684 c68ad72e Kostas Papadimitriou
                    'uuid': ip.get('network').get('id'),
1685 c68ad72e Kostas Papadimitriou
                    'fixed_ip': ip.get('floating_ip_address')
1686 c68ad72e Kostas Papadimitriou
                  });
1687 c68ad72e Kostas Papadimitriou
                });
1688 c68ad72e Kostas Papadimitriou
1689 c68ad72e Kostas Papadimitriou
                _.map(data.networks, function(n) { return n.get('id') });
1690 c566f369 Kostas Papadimitriou
                storage.vms.create(data.name, data.image, data.flavor, 
1691 c566f369 Kostas Papadimitriou
                                   meta, extra, _.bind(function(data){
1692 1610b2da Kostas Papadimitriou
                    _.each(data.addresses, function(ip) {
1693 1610b2da Kostas Papadimitriou
                      ip.set({'status': 'connecting'});
1694 1610b2da Kostas Papadimitriou
                    });
1695 8d08f18a Kostas Papadimitriou
                    this.close_all();
1696 c566f369 Kostas Papadimitriou
                    this.password_view.show(data.server.adminPass, 
1697 c566f369 Kostas Papadimitriou
                                            data.server.id);
1698 820ef2f0 Kostas Papadimitriou
                    this.submiting = false;
1699 8d08f18a Kostas Papadimitriou
                }, this));
1700 8d08f18a Kostas Papadimitriou
            }
1701 8d08f18a Kostas Papadimitriou
        },
1702 8d08f18a Kostas Papadimitriou
1703 8d08f18a Kostas Papadimitriou
        close_all: function() {
1704 c566f369 Kostas Papadimitriou
          this.hide();
1705 c566f369 Kostas Papadimitriou
        },
1706 c566f369 Kostas Papadimitriou
1707 c566f369 Kostas Papadimitriou
        onClose: function() {
1708 c566f369 Kostas Papadimitriou
          this.steps[3].remove();
1709 8d08f18a Kostas Papadimitriou
        },
1710 8d08f18a Kostas Papadimitriou
1711 8d08f18a Kostas Papadimitriou
        reset: function() {
1712 c566f369 Kostas Papadimitriou
          this.current_step = 1;
1713 b128dc09 Kostas Papadimitriou
1714 c566f369 Kostas Papadimitriou
          this.steps[1].reset();
1715 c566f369 Kostas Papadimitriou
          this.steps[2].reset();
1716 c566f369 Kostas Papadimitriou
          this.steps[3].reset();
1717 c566f369 Kostas Papadimitriou
          this.steps[4].reset();
1718 8d08f18a Kostas Papadimitriou
1719 c566f369 Kostas Papadimitriou
          //this.steps[1].show();
1720 c566f369 Kostas Papadimitriou
          //this.steps[2].show();
1721 c566f369 Kostas Papadimitriou
          //this.steps[3].show();
1722 c566f369 Kostas Papadimitriou
          //this.steps[4].show();
1723 b128dc09 Kostas Papadimitriou
1724 c566f369 Kostas Papadimitriou
          this.submit_btn.removeClass("in-progress");
1725 8d08f18a Kostas Papadimitriou
        },
1726 8d08f18a Kostas Papadimitriou
1727 8d08f18a Kostas Papadimitriou
        onShow: function() {
1728 8d08f18a Kostas Papadimitriou
        },
1729 8d08f18a Kostas Papadimitriou
1730 8d08f18a Kostas Papadimitriou
        update_layout: function() {
1731 8d08f18a Kostas Papadimitriou
            this.show_step(this.current_step);
1732 8d08f18a Kostas Papadimitriou
            this.current_view.update_layout();
1733 8d08f18a Kostas Papadimitriou
        },
1734 8d08f18a Kostas Papadimitriou
1735 8d08f18a Kostas Papadimitriou
        beforeOpen: function() {
1736 47276ec2 Kostas Papadimitriou
            if (!this.skip_reset_on_next_open) {
1737 47276ec2 Kostas Papadimitriou
                this.submiting = false;
1738 47276ec2 Kostas Papadimitriou
                this.reset();
1739 47276ec2 Kostas Papadimitriou
                this.current_step = 1;
1740 47276ec2 Kostas Papadimitriou
                this.$(".steps-container").css({"margin-left":0 + "px"});
1741 47276ec2 Kostas Papadimitriou
                this.show_step(1);
1742 47276ec2 Kostas Papadimitriou
            }
1743 47276ec2 Kostas Papadimitriou
            
1744 47276ec2 Kostas Papadimitriou
            this.skip_reset_on_next_open = false;
1745 47276ec2 Kostas Papadimitriou
            this.update_layout();
1746 8d08f18a Kostas Papadimitriou
        },
1747 b128dc09 Kostas Papadimitriou
        
1748 b128dc09 Kostas Papadimitriou
        set_step: function(step) {
1749 8d08f18a Kostas Papadimitriou
            if (step <= 1) {
1750 8d08f18a Kostas Papadimitriou
                step = 1
1751 8d08f18a Kostas Papadimitriou
            }
1752 8d08f18a Kostas Papadimitriou
            if (step > this.steps.length - 1) {
1753 8d08f18a Kostas Papadimitriou
                step = this.steps.length - 1;
1754 8d08f18a Kostas Papadimitriou
            }
1755 bd8fa10c Kostas Papadimitriou
            this.current_step = step;
1756 b128dc09 Kostas Papadimitriou
        },
1757 b128dc09 Kostas Papadimitriou
1758 b128dc09 Kostas Papadimitriou
        show_step: function(step) {
1759 4cff0386 Kostas Papadimitriou
            // FIXME: this shouldn't be here
1760 4cff0386 Kostas Papadimitriou
            // but since we are not calling step.hide this should work
1761 4cff0386 Kostas Papadimitriou
            this.steps[1].image_details.hide();
1762 c68ad72e Kostas Papadimitriou
            
1763 c68ad72e Kostas Papadimitriou
            this.current_view && this.current_view.hide_step && this.current_view.hide_step();
1764 bd8fa10c Kostas Papadimitriou
            this.current_view = this.steps[step];
1765 bd8fa10c Kostas Papadimitriou
            this.update_controls();
1766 bd8fa10c Kostas Papadimitriou
1767 b128dc09 Kostas Papadimitriou
            this.steps[step].show();
1768 820ef2f0 Kostas Papadimitriou
            var width = this.el.find('.container').width();
1769 820ef2f0 Kostas Papadimitriou
            var left = (step -1) * width * -1;
1770 1325fc64 Kostas Papadimitriou
            this.$(".steps-container").animate({"margin-left": left + "px"}, 300);
1771 1325fc64 Kostas Papadimitriou
1772 1325fc64 Kostas Papadimitriou
            this.update_steps_history();
1773 1325fc64 Kostas Papadimitriou
        },
1774 1325fc64 Kostas Papadimitriou
1775 1325fc64 Kostas Papadimitriou
        update_steps_history: function() {
1776 1325fc64 Kostas Papadimitriou
            var self = this;
1777 1325fc64 Kostas Papadimitriou
            function get_step(s) {
1778 1325fc64 Kostas Papadimitriou
                return self.history.find(".step" + s + "h");
1779 1325fc64 Kostas Papadimitriou
            }
1780 1325fc64 Kostas Papadimitriou
            
1781 1325fc64 Kostas Papadimitriou
            var current_step = parseInt(this.current_view.step);
1782 1325fc64 Kostas Papadimitriou
            _.each(this.steps, function(stepv) {
1783 1325fc64 Kostas Papadimitriou
                var step = parseInt(stepv.step);
1784 1325fc64 Kostas Papadimitriou
                get_step(step).removeClass("completed").removeClass("current");
1785 1325fc64 Kostas Papadimitriou
                if (step == current_step) {
1786 1325fc64 Kostas Papadimitriou
                    get_step(step).removeClass("completed").addClass("current");
1787 1325fc64 Kostas Papadimitriou
                }
1788 1325fc64 Kostas Papadimitriou
                if (step < current_step) {
1789 1325fc64 Kostas Papadimitriou
                    get_step(step).removeClass("current").addClass("completed");
1790 1325fc64 Kostas Papadimitriou
                }
1791 1325fc64 Kostas Papadimitriou
            });
1792 8d08f18a Kostas Papadimitriou
        },
1793 8d08f18a Kostas Papadimitriou
1794 8d08f18a Kostas Papadimitriou
        update_controls: function() {
1795 8d08f18a Kostas Papadimitriou
            var step = this.current_step;
1796 8d08f18a Kostas Papadimitriou
            if (step == 1) {
1797 8d08f18a Kostas Papadimitriou
                this.prev_btn.hide();
1798 8d08f18a Kostas Papadimitriou
                this.cancel_btn.show();
1799 8d08f18a Kostas Papadimitriou
            } else {
1800 8d08f18a Kostas Papadimitriou
                this.prev_btn.show();
1801 8d08f18a Kostas Papadimitriou
                this.cancel_btn.hide();
1802 8d08f18a Kostas Papadimitriou
            }
1803 8d08f18a Kostas Papadimitriou
            
1804 8d08f18a Kostas Papadimitriou
            if (step == this.steps.length - 1) {
1805 8d08f18a Kostas Papadimitriou
                this.next_btn.hide();
1806 8d08f18a Kostas Papadimitriou
                this.submit_btn.show();
1807 8d08f18a Kostas Papadimitriou
            } else {
1808 8d08f18a Kostas Papadimitriou
                this.next_btn.show();
1809 8d08f18a Kostas Papadimitriou
                this.submit_btn.hide();
1810 8d08f18a Kostas Papadimitriou
            }
1811 8d08f18a Kostas Papadimitriou
        },
1812 8d08f18a Kostas Papadimitriou
1813 8d08f18a Kostas Papadimitriou
        get_params: function() {
1814 c566f369 Kostas Papadimitriou
            return _.extend({}, this.steps[1].get(), this.steps[2].get(), this.steps[3].get(), this.steps[4].get());
1815 8d08f18a Kostas Papadimitriou
        }
1816 8d08f18a Kostas Papadimitriou
    });
1817 8d08f18a Kostas Papadimitriou
    
1818 8d08f18a Kostas Papadimitriou
})(this);