Statistics
| Branch: | Tag: | Revision:

root / synnefo / ui / static / snf / js / ui / web / ui_create_view.js @ c64333b6

History | View | Annotate | Download (42.2 kB)

1 8d08f18a Kostas Papadimitriou
;(function(root){
2 8d08f18a Kostas Papadimitriou
3 8d08f18a Kostas Papadimitriou
    // root
4 8d08f18a Kostas Papadimitriou
    var root = root;
5 8d08f18a Kostas Papadimitriou
    
6 8d08f18a Kostas Papadimitriou
    // setup namepsaces
7 8d08f18a Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
8 8d08f18a Kostas Papadimitriou
    var models = snf.models = snf.models || {}
9 8d08f18a Kostas Papadimitriou
    var storage = snf.storage = snf.storage || {};
10 8d08f18a Kostas Papadimitriou
    var ui = snf.ui = snf.ui || {};
11 8d08f18a Kostas Papadimitriou
    var util = snf.util = snf.util || {};
12 8d08f18a Kostas Papadimitriou
13 8d08f18a Kostas Papadimitriou
    var views = snf.views = snf.views || {}
14 8d08f18a Kostas Papadimitriou
15 8d08f18a Kostas Papadimitriou
    // shortcuts
16 8d08f18a Kostas Papadimitriou
    var bb = root.Backbone;
17 8d08f18a Kostas Papadimitriou
18 8d08f18a Kostas Papadimitriou
19 8d08f18a Kostas Papadimitriou
    views.VMCreationPasswordView = views.Overlay.extend({
20 8d08f18a Kostas Papadimitriou
        view_id: "creation_password_view",
21 8d08f18a Kostas Papadimitriou
        content_selector: "#creation-password-overlay",
22 8d08f18a Kostas Papadimitriou
        css_class: 'overlay-password overlay-info',
23 8d08f18a Kostas Papadimitriou
        overlay_id: "creation-password-overlay",
24 8d08f18a Kostas Papadimitriou
25 8d08f18a Kostas Papadimitriou
        subtitle: "",
26 8d08f18a Kostas Papadimitriou
        title: "Machine password",
27 8d08f18a Kostas Papadimitriou
28 8d08f18a Kostas Papadimitriou
        initialize: function(options) {
29 8d08f18a Kostas Papadimitriou
            views.FeedbackView.__super__.initialize.apply(this, arguments);
30 8d08f18a Kostas Papadimitriou
            _.bindAll(this, 'show_password');
31 8d08f18a Kostas Papadimitriou
32 8d08f18a Kostas Papadimitriou
            this.password = this.$("#new-machine-password");
33 35584d80 Kostas Papadimitriou
            this.copy = this.$(".clipboard");
34 60599850 Kostas Papadimitriou
35 60599850 Kostas Papadimitriou
            this.$(".show-machine").click(_.bind(function(){
36 c6e9caec Kostas Papadimitriou
                if (this.$(".show-machine").hasClass("in-progress")) {
37 c6e9caec Kostas Papadimitriou
                    return;
38 c6e9caec Kostas Papadimitriou
                }
39 60599850 Kostas Papadimitriou
                this.hide();
40 60599850 Kostas Papadimitriou
                snf.ui.main.show_vm_details(storage.vms.get(this.vm_id));
41 60599850 Kostas Papadimitriou
            }, this));
42 c6e9caec Kostas Papadimitriou
43 c6e9caec Kostas Papadimitriou
            _.bindAll(this, "handle_vm_added");
44 c6e9caec Kostas Papadimitriou
            storage.vms.bind("add", this.handle_vm_added);
45 35584d80 Kostas Papadimitriou
            this.password.text("");
46 c6e9caec Kostas Papadimitriou
        },
47 c6e9caec Kostas Papadimitriou
48 c6e9caec Kostas Papadimitriou
        handle_vm_added: function() {
49 c6e9caec Kostas Papadimitriou
            this.$(".show-machine").removeClass("in-progress");
50 8d08f18a Kostas Papadimitriou
        },
51 8d08f18a Kostas Papadimitriou
        
52 8d08f18a Kostas Papadimitriou
        show_password: function() {
53 c6e9caec Kostas Papadimitriou
            this.$(".show-machine").addClass("in-progress");
54 8d08f18a Kostas Papadimitriou
            this.password.text(this.pass);
55 a08a37d2 Kostas Papadimitriou
            if (storage.vms.get(this.vm_id)) {
56 2b2afade Kostas Papadimitriou
                this.$(".show-machine").removeClass("in-progress");
57 2b2afade Kostas Papadimitriou
            }
58 35584d80 Kostas Papadimitriou
            
59 35584d80 Kostas Papadimitriou
            this.clip = new snf.util.ClipHelper(this.copy, this.pass);
60 8d08f18a Kostas Papadimitriou
        },
61 8d08f18a Kostas Papadimitriou
62 8d08f18a Kostas Papadimitriou
        onClose: function() {
63 8d08f18a Kostas Papadimitriou
            this.password.text("");
64 c6e9caec Kostas Papadimitriou
            this.vm_id = undefined;
65 35584d80 Kostas Papadimitriou
            try { delete this.clip; } catch (err) {};
66 8d08f18a Kostas Papadimitriou
        },
67 bd8fa10c Kostas Papadimitriou
        
68 bd8fa10c Kostas Papadimitriou
        beforeOpen: function() {
69 35584d80 Kostas Papadimitriou
            this.copy.empty();
70 bd8fa10c Kostas Papadimitriou
        },
71 bd8fa10c Kostas Papadimitriou
        
72 bd8fa10c Kostas Papadimitriou
        onOpen: function() {
73 35584d80 Kostas Papadimitriou
            this.show_password();
74 bd8fa10c Kostas Papadimitriou
        },
75 bd8fa10c Kostas Papadimitriou
76 8d08f18a Kostas Papadimitriou
        show: function(pass, vm_id) {
77 8d08f18a Kostas Papadimitriou
            this.pass = pass;
78 8d08f18a Kostas Papadimitriou
            this.vm_id = vm_id;
79 c6e9caec Kostas Papadimitriou
            
80 8d08f18a Kostas Papadimitriou
            views.VMCreationPasswordView.__super__.show.apply(this, arguments);
81 8d08f18a Kostas Papadimitriou
        }
82 8d08f18a Kostas Papadimitriou
    })
83 8d08f18a Kostas Papadimitriou
84 8d08f18a Kostas Papadimitriou
85 8d08f18a Kostas Papadimitriou
    
86 8d08f18a Kostas Papadimitriou
    views.CreateVMStepView = views.View.extend({
87 8d08f18a Kostas Papadimitriou
        step: "1",
88 8d08f18a Kostas Papadimitriou
        title: "Image",
89 8d08f18a Kostas Papadimitriou
        submit: false,
90 8d08f18a Kostas Papadimitriou
91 8d08f18a Kostas Papadimitriou
        initialize: function(view) {
92 8d08f18a Kostas Papadimitriou
            this.parent = view;
93 8d08f18a Kostas Papadimitriou
            this.el = view.$("div.create-step-cont.step-" + this.step);
94 820ef2f0 Kostas Papadimitriou
            this.header = this.$(".step-header .step-" + this.step);
95 8d08f18a Kostas Papadimitriou
            this.view_id = "create_step_" + this.step;
96 8d08f18a Kostas Papadimitriou
97 8d08f18a Kostas Papadimitriou
            views.CreateVMStepView.__super__.initialize.apply(this);
98 8d08f18a Kostas Papadimitriou
        },
99 8d08f18a Kostas Papadimitriou
100 8d08f18a Kostas Papadimitriou
        show: function() {
101 8d08f18a Kostas Papadimitriou
            // show current
102 8d08f18a Kostas Papadimitriou
            this.el.show();
103 8d08f18a Kostas Papadimitriou
            this.header.addClass("current");
104 820ef2f0 Kostas Papadimitriou
            this.header.show();
105 8d08f18a Kostas Papadimitriou
            this.update_layout();
106 8d08f18a Kostas Papadimitriou
        },
107 8d08f18a Kostas Papadimitriou
108 8d08f18a Kostas Papadimitriou
        reset: function() {
109 8d08f18a Kostas Papadimitriou
        }
110 8d08f18a Kostas Papadimitriou
    })
111 8d08f18a Kostas Papadimitriou
112 8d08f18a Kostas Papadimitriou
    views.CreateImageSelectView = views.CreateVMStepView.extend({
113 8d08f18a Kostas Papadimitriou
114 8d08f18a Kostas Papadimitriou
        initialize: function() {
115 8d08f18a Kostas Papadimitriou
            views.CreateImageSelectView.__super__.initialize.apply(this, arguments);
116 8d08f18a Kostas Papadimitriou
117 820ef2f0 Kostas Papadimitriou
            // elements
118 73e25ce2 Kostas Papadimitriou
            this.images_list_cont = this.$(".images-list-cont");
119 820ef2f0 Kostas Papadimitriou
            this.images_list = this.$(".images-list-cont ul");
120 820ef2f0 Kostas Papadimitriou
            this.image_details = this.$(".images-info-cont");
121 820ef2f0 Kostas Papadimitriou
            this.image_details_desc = this.$(".images-info-cont .description p");
122 820ef2f0 Kostas Papadimitriou
            this.image_details_title = this.$(".images-info-cont h4");
123 820ef2f0 Kostas Papadimitriou
            this.image_details_size = this.$(".images-info-cont .size p");
124 820ef2f0 Kostas Papadimitriou
            this.image_details_os = this.$(".images-info-cont .os p");
125 820ef2f0 Kostas Papadimitriou
            this.image_details_kernel = this.$(".images-info-cont .kernel p");
126 820ef2f0 Kostas Papadimitriou
            this.image_details_gui = this.$(".images-info-cont .gui p");
127 820ef2f0 Kostas Papadimitriou
128 820ef2f0 Kostas Papadimitriou
            this.types = this.$(".type-filter li");
129 820ef2f0 Kostas Papadimitriou
            this.categories_list = this.$(".category-filters");
130 820ef2f0 Kostas Papadimitriou
131 820ef2f0 Kostas Papadimitriou
            // params initialization
132 820ef2f0 Kostas Papadimitriou
            this.type_selections = ["system", "custom"]
133 820ef2f0 Kostas Papadimitriou
            this.selected_type = "system";
134 820ef2f0 Kostas Papadimitriou
            this.selected_categories = [];
135 820ef2f0 Kostas Papadimitriou
            this.images = [];
136 820ef2f0 Kostas Papadimitriou
137 820ef2f0 Kostas Papadimitriou
            // update
138 820ef2f0 Kostas Papadimitriou
            this.update_images();
139 820ef2f0 Kostas Papadimitriou
140 820ef2f0 Kostas Papadimitriou
            // handlers initialization
141 820ef2f0 Kostas Papadimitriou
            this.init_handlers();
142 820ef2f0 Kostas Papadimitriou
            this.init_position();
143 820ef2f0 Kostas Papadimitriou
        },
144 820ef2f0 Kostas Papadimitriou
145 820ef2f0 Kostas Papadimitriou
        init_position: function() {
146 820ef2f0 Kostas Papadimitriou
            //this.el.css({position: "absolute"});
147 820ef2f0 Kostas Papadimitriou
            //this.el.css({top:"10px"})
148 820ef2f0 Kostas Papadimitriou
        },
149 820ef2f0 Kostas Papadimitriou
        
150 820ef2f0 Kostas Papadimitriou
        init_handlers: function() {
151 820ef2f0 Kostas Papadimitriou
            var self = this;
152 820ef2f0 Kostas Papadimitriou
            this.types.live("click", function() {
153 820ef2f0 Kostas Papadimitriou
                self.select_type($(this).attr("id").replace("type-select-",""));
154 820ef2f0 Kostas Papadimitriou
            })
155 820ef2f0 Kostas Papadimitriou
        },
156 820ef2f0 Kostas Papadimitriou
157 820ef2f0 Kostas Papadimitriou
        update_images: function() {
158 820ef2f0 Kostas Papadimitriou
            this.images = storage.images.active();
159 820ef2f0 Kostas Papadimitriou
            this.images_ids = _.map(this.images, function(img){return img.id});
160 820ef2f0 Kostas Papadimitriou
            if (this.selected_type == "custom") { this.images = []; this.images_ids = []; }
161 820ef2f0 Kostas Papadimitriou
162 820ef2f0 Kostas Papadimitriou
            return this.images;
163 8d08f18a Kostas Papadimitriou
        },
164 8d08f18a Kostas Papadimitriou
165 8d08f18a Kostas Papadimitriou
        update_layout: function() {
166 820ef2f0 Kostas Papadimitriou
            this.select_type(this.selected_type);
167 820ef2f0 Kostas Papadimitriou
        },
168 820ef2f0 Kostas Papadimitriou
        
169 820ef2f0 Kostas Papadimitriou
        get_categories: function(images) {
170 820ef2f0 Kostas Papadimitriou
            return [];
171 820ef2f0 Kostas Papadimitriou
            return ["Desktop", "Server", "Linux", "Windows"];
172 820ef2f0 Kostas Papadimitriou
        },
173 820ef2f0 Kostas Papadimitriou
174 820ef2f0 Kostas Papadimitriou
        reset_categories: function() {
175 820ef2f0 Kostas Papadimitriou
            var categories = this.get_categories(this.images);
176 820ef2f0 Kostas Papadimitriou
            this.categories_list.find("li").remove();
177 820ef2f0 Kostas Papadimitriou
178 820ef2f0 Kostas Papadimitriou
            _.each(categories, _.bind(function(cat) {
179 820ef2f0 Kostas Papadimitriou
                var el = $("<li />");
180 820ef2f0 Kostas Papadimitriou
                el.text(cat);
181 820ef2f0 Kostas Papadimitriou
                this.categories_list.append(el);
182 820ef2f0 Kostas Papadimitriou
            }, this));
183 820ef2f0 Kostas Papadimitriou
184 820ef2f0 Kostas Papadimitriou
            if (!categories.length) { 
185 820ef2f0 Kostas Papadimitriou
                this.categories_list.parent().find(".clear").hide();
186 820ef2f0 Kostas Papadimitriou
                this.categories_list.parent().find(".empty").show();
187 820ef2f0 Kostas Papadimitriou
            } else {
188 820ef2f0 Kostas Papadimitriou
                this.categories_list.parent().find(".clear").show();
189 820ef2f0 Kostas Papadimitriou
                this.categories_list.parent().find(".empty").hide();
190 820ef2f0 Kostas Papadimitriou
            }
191 820ef2f0 Kostas Papadimitriou
        },
192 820ef2f0 Kostas Papadimitriou
        
193 820ef2f0 Kostas Papadimitriou
        select_type: function(type) {
194 820ef2f0 Kostas Papadimitriou
            this.selected_type = type;
195 820ef2f0 Kostas Papadimitriou
            this.types.removeClass("selected");
196 820ef2f0 Kostas Papadimitriou
            this.types.filter("#type-select-" + this.selected_type).addClass("selected");
197 820ef2f0 Kostas Papadimitriou
198 820ef2f0 Kostas Papadimitriou
            this.reset_categories();
199 820ef2f0 Kostas Papadimitriou
            this.update_images();
200 820ef2f0 Kostas Papadimitriou
            this.reset_images();
201 820ef2f0 Kostas Papadimitriou
            this.select_image();
202 8d08f18a Kostas Papadimitriou
        },
203 8d08f18a Kostas Papadimitriou
204 8d08f18a Kostas Papadimitriou
        select_image: function(image) {
205 820ef2f0 Kostas Papadimitriou
            if (!image && this.images_ids.length) {
206 820ef2f0 Kostas Papadimitriou
                if (this.selected_image && this.images_ids.indexOf(this.selected_image.id) > -1) {
207 820ef2f0 Kostas Papadimitriou
                    image = this.selected_image;
208 820ef2f0 Kostas Papadimitriou
                } else {
209 820ef2f0 Kostas Papadimitriou
                    image = storage.images.get(this.images_ids[0]);
210 820ef2f0 Kostas Papadimitriou
                }
211 8d08f18a Kostas Papadimitriou
            }
212 8d08f18a Kostas Papadimitriou
213 820ef2f0 Kostas Papadimitriou
            if (!this.images_ids.length) { image = this.selected_image || undefined };
214 820ef2f0 Kostas Papadimitriou
            
215 8d08f18a Kostas Papadimitriou
            this.selected_image = image;
216 820ef2f0 Kostas Papadimitriou
            this.trigger("change", image);
217 8d08f18a Kostas Papadimitriou
            
218 820ef2f0 Kostas Papadimitriou
            if (image) {
219 820ef2f0 Kostas Papadimitriou
                this.image_details.show();
220 820ef2f0 Kostas Papadimitriou
                this.images_list.find(".image-details").removeClass("selected");
221 820ef2f0 Kostas Papadimitriou
                this.images_list.find(".image-details#create-vm-image-" + this.selected_image.id).addClass("selected");
222 820ef2f0 Kostas Papadimitriou
                
223 820ef2f0 Kostas Papadimitriou
                this.image_details_desc.text(image.get("description"));
224 820ef2f0 Kostas Papadimitriou
                
225 820ef2f0 Kostas Papadimitriou
                var img = snf.ui.helpers.os_icon_tag(image.get("OS"))
226 820ef2f0 Kostas Papadimitriou
                this.image_details_title.html(img + image.get("name"));
227 820ef2f0 Kostas Papadimitriou
                this.image_details_os.text(_(image.get("OS")).capitalize());
228 820ef2f0 Kostas Papadimitriou
                this.image_details_kernel.text(image.get("kernel"));
229 820ef2f0 Kostas Papadimitriou
230 5a434360 Kostas Papadimitriou
                var size = image.get_readable_size();
231 5a434360 Kostas Papadimitriou
232 820ef2f0 Kostas Papadimitriou
                this.image_details_size.text(size);
233 820ef2f0 Kostas Papadimitriou
                this.image_details_gui.text(image.get("GUI"));
234 820ef2f0 Kostas Papadimitriou
235 820ef2f0 Kostas Papadimitriou
            } else {
236 820ef2f0 Kostas Papadimitriou
                this.image_details.hide();
237 820ef2f0 Kostas Papadimitriou
            }
238 cd4d5c5f Kostas Papadimitriou
239 cd4d5c5f Kostas Papadimitriou
            this.validate();
240 8d08f18a Kostas Papadimitriou
        },
241 8d08f18a Kostas Papadimitriou
242 8d08f18a Kostas Papadimitriou
        reset_images: function() {
243 820ef2f0 Kostas Papadimitriou
            this.images_list.find("li").remove();
244 820ef2f0 Kostas Papadimitriou
            _.each(this.images, _.bind(function(img){
245 8d08f18a Kostas Papadimitriou
                this.add_image(img);
246 8d08f18a Kostas Papadimitriou
            }, this))
247 820ef2f0 Kostas Papadimitriou
            
248 820ef2f0 Kostas Papadimitriou
            if (this.images.length) {
249 820ef2f0 Kostas Papadimitriou
                this.images_list.parent().find(".empty").hide();
250 820ef2f0 Kostas Papadimitriou
            } else {
251 820ef2f0 Kostas Papadimitriou
                this.images_list.parent().find(".empty").show();
252 820ef2f0 Kostas Papadimitriou
            }
253 8d08f18a Kostas Papadimitriou
254 8d08f18a Kostas Papadimitriou
            this.select_image();
255 8d08f18a Kostas Papadimitriou
            
256 8d08f18a Kostas Papadimitriou
            var self = this;
257 820ef2f0 Kostas Papadimitriou
            this.images_list.find(".image-details").click(function(){
258 8d08f18a Kostas Papadimitriou
                self.select_image($(this).data("image"));
259 820ef2f0 Kostas Papadimitriou
            });
260 820ef2f0 Kostas Papadimitriou
            
261 820ef2f0 Kostas Papadimitriou
        },
262 820ef2f0 Kostas Papadimitriou
263 820ef2f0 Kostas Papadimitriou
        show: function() {
264 820ef2f0 Kostas Papadimitriou
            views.CreateImageSelectView.__super__.show.apply(this, arguments);
265 8d08f18a Kostas Papadimitriou
        },
266 8d08f18a Kostas Papadimitriou
267 8d08f18a Kostas Papadimitriou
        add_image: function(img) {
268 820ef2f0 Kostas Papadimitriou
            var image = $(('<li id="create-vm-image-{1}"' +
269 820ef2f0 Kostas Papadimitriou
                           'class="image-details clearfix">{2}{0}' +
270 820ef2f0 Kostas Papadimitriou
                           '<p>{4}</p><span class="size">{3}' +
271 820ef2f0 Kostas Papadimitriou
                           '</span></li>').format(img.get("name"), 
272 820ef2f0 Kostas Papadimitriou
                                                  img.id, 
273 820ef2f0 Kostas Papadimitriou
                                                  snf.ui.helpers.os_icon_tag(img.get("OS")),
274 5a434360 Kostas Papadimitriou
                                                  img.get_readable_size(),
275 5afdfc72 Kostas Papadimitriou
                                                  util.truncate(img.get("description"), 35)));
276 8d08f18a Kostas Papadimitriou
            image.data("image", img);
277 8d08f18a Kostas Papadimitriou
            image.data("image_id", img.id);
278 820ef2f0 Kostas Papadimitriou
            this.images_list.append(image);
279 8d08f18a Kostas Papadimitriou
        },
280 8d08f18a Kostas Papadimitriou
281 8d08f18a Kostas Papadimitriou
        reset: function() {
282 8d08f18a Kostas Papadimitriou
            this.selected_image = undefined;
283 8d08f18a Kostas Papadimitriou
            this.reset_images();
284 8d08f18a Kostas Papadimitriou
        },
285 8d08f18a Kostas Papadimitriou
286 8d08f18a Kostas Papadimitriou
        get: function() {
287 8d08f18a Kostas Papadimitriou
            return {'image': this.selected_image};
288 cd4d5c5f Kostas Papadimitriou
        },
289 cd4d5c5f Kostas Papadimitriou
290 cd4d5c5f Kostas Papadimitriou
        validate: function() {
291 cd4d5c5f Kostas Papadimitriou
            if (!this.selected_image) {
292 cd4d5c5f Kostas Papadimitriou
                this.parent.$(".form-action.next").hide();
293 cd4d5c5f Kostas Papadimitriou
            } else {
294 cd4d5c5f Kostas Papadimitriou
                this.parent.$(".form-action.next").show();
295 cd4d5c5f Kostas Papadimitriou
            }
296 8d08f18a Kostas Papadimitriou
        }
297 8d08f18a Kostas Papadimitriou
    });
298 8d08f18a Kostas Papadimitriou
299 8d08f18a Kostas Papadimitriou
    views.CreateFlavorSelectView = views.CreateVMStepView.extend({
300 8d08f18a Kostas Papadimitriou
        step: 2,
301 8d08f18a Kostas Papadimitriou
        initialize: function() {
302 8d08f18a Kostas Papadimitriou
            views.CreateFlavorSelectView.__super__.initialize.apply(this, arguments);
303 8d08f18a Kostas Papadimitriou
            this.parent.bind("image:change", _.bind(this.handle_image_change, this));
304 8d08f18a Kostas Papadimitriou
305 820ef2f0 Kostas Papadimitriou
            this.cpus = this.$(".flavors-cpu-list");
306 820ef2f0 Kostas Papadimitriou
            this.disks = this.$(".flavors-disk-list");
307 d965e6dc Kostas Papadimitriou
            this.disk_templates = this.$(".flavors-disk-template-list");
308 820ef2f0 Kostas Papadimitriou
            this.mems = this.$(".flavors-mem-list");
309 8d08f18a Kostas Papadimitriou
310 820ef2f0 Kostas Papadimitriou
            this.predefined_flavors = SUGGESTED_FLAVORS;
311 2ecab6a2 Kostas Papadimitriou
            this.predefined_flavors_keys = _.keys(SUGGESTED_FLAVORS);
312 2ecab6a2 Kostas Papadimitriou
            this.predefined_flavors_keys = _.sortBy(this.predefined_flavors_keys, _.bind(function(k){
313 2ecab6a2 Kostas Papadimitriou
                var flv = this.predefined_flavors[k];
314 d965e6dc Kostas Papadimitriou
                return (flv.ram * flv.cpu * flv.disk) + flv.disk_template;
315 2ecab6a2 Kostas Papadimitriou
            }, this));
316 2ecab6a2 Kostas Papadimitriou
317 820ef2f0 Kostas Papadimitriou
            this.predefined = this.$(".predefined-list");
318 820ef2f0 Kostas Papadimitriou
            this.update_predefined_flavors();
319 8d08f18a Kostas Papadimitriou
        },
320 8d08f18a Kostas Papadimitriou
321 8d08f18a Kostas Papadimitriou
        handle_image_change: function(data) {
322 8d08f18a Kostas Papadimitriou
            this.current_image = data;
323 820ef2f0 Kostas Papadimitriou
            this.update_valid_predefined();
324 8d08f18a Kostas Papadimitriou
            this.update_flavors_data();
325 8d08f18a Kostas Papadimitriou
            this.reset_flavors();
326 8d08f18a Kostas Papadimitriou
            this.update_layout();
327 8d08f18a Kostas Papadimitriou
        },
328 8d08f18a Kostas Papadimitriou
329 283bb7de Kostas Papadimitriou
        validate_selected_flavor: function() {
330 283bb7de Kostas Papadimitriou
            if (!this.flavor_is_valid(this.current_flavor)) {
331 283bb7de Kostas Papadimitriou
                this.select_valid_flavor();
332 283bb7de Kostas Papadimitriou
            }
333 283bb7de Kostas Papadimitriou
        },
334 283bb7de Kostas Papadimitriou
335 8d08f18a Kostas Papadimitriou
        reset_flavors: function() {
336 8d08f18a Kostas Papadimitriou
            this.$(".flavor-opts-list .option").remove();
337 8d08f18a Kostas Papadimitriou
            this.create_flavors();
338 8d08f18a Kostas Papadimitriou
        },
339 8d08f18a Kostas Papadimitriou
340 820ef2f0 Kostas Papadimitriou
        update_predefined_flavors: function() {
341 820ef2f0 Kostas Papadimitriou
            this.predefined.find("li").remove();
342 2ecab6a2 Kostas Papadimitriou
            _.each(this.predefined_flavors_keys, _.bind(function(key) {
343 2ecab6a2 Kostas Papadimitriou
                var val = this.predefined_flavors[key];
344 820ef2f0 Kostas Papadimitriou
                var el = $(('<li class="predefined-selection" id="predefined-flavor-{0}">' +
345 2ecab6a2 Kostas Papadimitriou
                           '{1}</li>').format(key, _(key).capitalize()));
346 820ef2f0 Kostas Papadimitriou
347 820ef2f0 Kostas Papadimitriou
                this.predefined.append(el);
348 d965e6dc Kostas Papadimitriou
                el.data({flavor: storage.flavors.get_flavor(val.cpu, val.ram, val.disk, val.disk_template, this.flavors)});
349 820ef2f0 Kostas Papadimitriou
                el.click(_.bind(function() {
350 820ef2f0 Kostas Papadimitriou
                    this.handle_predefined_click(el);
351 820ef2f0 Kostas Papadimitriou
                }, this))
352 820ef2f0 Kostas Papadimitriou
            }, this));
353 820ef2f0 Kostas Papadimitriou
            this.update_valid_predefined();
354 820ef2f0 Kostas Papadimitriou
        },
355 820ef2f0 Kostas Papadimitriou
356 820ef2f0 Kostas Papadimitriou
        handle_predefined_click: function(el) {
357 820ef2f0 Kostas Papadimitriou
            if (el.hasClass("disabled")) { return };
358 16c860f4 Kostas Papadimitriou
            this.set_current(el.data("flavor"));
359 820ef2f0 Kostas Papadimitriou
        },
360 820ef2f0 Kostas Papadimitriou
361 283bb7de Kostas Papadimitriou
        select_valid_flavor: function() {
362 283bb7de Kostas Papadimitriou
            var found = false;
363 283bb7de Kostas Papadimitriou
            var self = this;
364 283bb7de Kostas Papadimitriou
            _.each(this.flavors, function(flv) {
365 283bb7de Kostas Papadimitriou
                if (self.flavor_is_valid(flv)) {
366 283bb7de Kostas Papadimitriou
                    found = flv;
367 283bb7de Kostas Papadimitriou
                    return false;
368 283bb7de Kostas Papadimitriou
                }
369 283bb7de Kostas Papadimitriou
            });
370 283bb7de Kostas Papadimitriou
            
371 283bb7de Kostas Papadimitriou
            if (found) {
372 283bb7de Kostas Papadimitriou
                this.set_current(found);
373 283bb7de Kostas Papadimitriou
            } else {
374 283bb7de Kostas Papadimitriou
                this.current_flavor = undefined;
375 283bb7de Kostas Papadimitriou
                this.validate();
376 283bb7de Kostas Papadimitriou
                this.$("li.predefined-selection").addClass("disabled");
377 283bb7de Kostas Papadimitriou
                this.$(".flavor-opts-list li").removeClass("selected");
378 283bb7de Kostas Papadimitriou
            }
379 283bb7de Kostas Papadimitriou
        },
380 283bb7de Kostas Papadimitriou
381 820ef2f0 Kostas Papadimitriou
        update_valid_predefined: function() {
382 820ef2f0 Kostas Papadimitriou
            this.update_unavailable_values();
383 820ef2f0 Kostas Papadimitriou
            var self = this;
384 820ef2f0 Kostas Papadimitriou
            this.valid_predefined = _.select(_.map(this.predefined_flavors, function(flv, key){
385 d965e6dc Kostas Papadimitriou
                var existing = storage.flavors.get_flavor(flv.cpu, flv.ram, flv.disk, flv.disk_template, self.flavors);
386 820ef2f0 Kostas Papadimitriou
                // non existing
387 820ef2f0 Kostas Papadimitriou
                if (!existing) {
388 820ef2f0 Kostas Papadimitriou
                    return false;
389 820ef2f0 Kostas Papadimitriou
                }
390 820ef2f0 Kostas Papadimitriou
                
391 820ef2f0 Kostas Papadimitriou
                // not available for image
392 820ef2f0 Kostas Papadimitriou
                if (self.unavailable_values && self.unavailable_values.disk.indexOf(existing.get_disk_size()) > -1) {
393 820ef2f0 Kostas Papadimitriou
                    return false
394 820ef2f0 Kostas Papadimitriou
                }
395 820ef2f0 Kostas Papadimitriou
396 820ef2f0 Kostas Papadimitriou
                return key;
397 820ef2f0 Kostas Papadimitriou
            }), function(ret) { return ret });
398 820ef2f0 Kostas Papadimitriou
            
399 820ef2f0 Kostas Papadimitriou
            $("li.predefined-selection").addClass("disabled");
400 820ef2f0 Kostas Papadimitriou
            _.each(this.valid_predefined, function(key) {
401 820ef2f0 Kostas Papadimitriou
                $("#predefined-flavor-" + key).removeClass("disabled");
402 820ef2f0 Kostas Papadimitriou
            })
403 820ef2f0 Kostas Papadimitriou
        },
404 820ef2f0 Kostas Papadimitriou
405 820ef2f0 Kostas Papadimitriou
        update_selected_predefined: function() {
406 820ef2f0 Kostas Papadimitriou
            var self = this;
407 820ef2f0 Kostas Papadimitriou
            this.predefined.find("li").removeClass("selected");
408 820ef2f0 Kostas Papadimitriou
409 820ef2f0 Kostas Papadimitriou
            _.each(this.valid_predefined, function(key){
410 820ef2f0 Kostas Papadimitriou
                var flv = self.predefined_flavors[key];
411 d965e6dc Kostas Papadimitriou
                var exists = storage.flavors.get_flavor(flv.cpu, flv.ram, flv.disk, flv.disk_template, self.flavors);
412 820ef2f0 Kostas Papadimitriou
413 820ef2f0 Kostas Papadimitriou
                if (exists && (exists.id == self.current_flavor.id)) {
414 820ef2f0 Kostas Papadimitriou
                    $("#predefined-flavor-" + key).addClass("selected");
415 820ef2f0 Kostas Papadimitriou
                }
416 820ef2f0 Kostas Papadimitriou
            })
417 820ef2f0 Kostas Papadimitriou
        },
418 820ef2f0 Kostas Papadimitriou
        
419 8d08f18a Kostas Papadimitriou
        update_flavors_data: function() {
420 820ef2f0 Kostas Papadimitriou
            this.flavors = storage.flavors.active();
421 8d08f18a Kostas Papadimitriou
            this.flavors_data = storage.flavors.get_data(this.flavors);
422 820ef2f0 Kostas Papadimitriou
            
423 820ef2f0 Kostas Papadimitriou
            var self = this;
424 820ef2f0 Kostas Papadimitriou
            var set = false;
425 820ef2f0 Kostas Papadimitriou
            
426 820ef2f0 Kostas Papadimitriou
            // FIXME: validate current flavor
427 820ef2f0 Kostas Papadimitriou
            
428 820ef2f0 Kostas Papadimitriou
            if (!this.current_flavor) {
429 820ef2f0 Kostas Papadimitriou
                _.each(this.valid_predefined, function(key) {
430 820ef2f0 Kostas Papadimitriou
                    var flv = self.predefined_flavors[key];
431 d965e6dc Kostas Papadimitriou
                    var exists = storage.flavors.get_flavor(flv.cpu, flv.ram, flv.disk, flv.disk_template, self.flavors);
432 820ef2f0 Kostas Papadimitriou
                    if (exists && !set) {
433 820ef2f0 Kostas Papadimitriou
                        self.set_current(exists);
434 820ef2f0 Kostas Papadimitriou
                        set = true;
435 820ef2f0 Kostas Papadimitriou
                    }
436 820ef2f0 Kostas Papadimitriou
                })
437 8d08f18a Kostas Papadimitriou
            }
438 820ef2f0 Kostas Papadimitriou
439 820ef2f0 Kostas Papadimitriou
            this.update_unavailable_values();
440 8d08f18a Kostas Papadimitriou
        },
441 8d08f18a Kostas Papadimitriou
442 820ef2f0 Kostas Papadimitriou
        update_unavailable_values: function() {
443 820ef2f0 Kostas Papadimitriou
            if (!this.current_image) { this.unavailable_values = {disk:[], ram:[], cpu:[]}; return };
444 820ef2f0 Kostas Papadimitriou
            this.unavailable_values = storage.flavors.unavailable_values_for_image(this.current_image);
445 820ef2f0 Kostas Papadimitriou
        },
446 820ef2f0 Kostas Papadimitriou
        
447 820ef2f0 Kostas Papadimitriou
        flavor_is_valid: function(flv) {
448 820ef2f0 Kostas Papadimitriou
            if (!flv) { return false };
449 283bb7de Kostas Papadimitriou
450 d965e6dc Kostas Papadimitriou
            var existing = storage.flavors.get_flavor(flv.get("cpu"), flv.get("ram"), flv.get("disk"), flv.get("disk_template"), this.flavors);
451 820ef2f0 Kostas Papadimitriou
            if (!existing) { return false };
452 283bb7de Kostas Papadimitriou
            
453 283bb7de Kostas Papadimitriou
            if (this.unavailable_values && (this.unavailable_values.disk.indexOf(parseInt(flv.get("disk")) * 1000) > -1)) {
454 283bb7de Kostas Papadimitriou
                return false;
455 820ef2f0 Kostas Papadimitriou
            }
456 820ef2f0 Kostas Papadimitriou
            return true;
457 820ef2f0 Kostas Papadimitriou
        },
458 820ef2f0 Kostas Papadimitriou
            
459 885a592b Kostas Papadimitriou
        set_valid_current_for: function(t, val) {
460 885a592b Kostas Papadimitriou
            var found = this.flavors[0];
461 885a592b Kostas Papadimitriou
            _.each(this.flavors, function(flv) {
462 885a592b Kostas Papadimitriou
                if (flv.get(t) == val) {
463 885a592b Kostas Papadimitriou
                    found = flv;
464 885a592b Kostas Papadimitriou
                }
465 885a592b Kostas Papadimitriou
            });
466 885a592b Kostas Papadimitriou
467 885a592b Kostas Papadimitriou
            this.set_current(found);
468 283bb7de Kostas Papadimitriou
            this.validate_selected_flavor();
469 885a592b Kostas Papadimitriou
        },
470 885a592b Kostas Papadimitriou
471 8d08f18a Kostas Papadimitriou
        set_current: function(flv) {
472 885a592b Kostas Papadimitriou
473 885a592b Kostas Papadimitriou
            if (!flv) {
474 885a592b Kostas Papadimitriou
                // user clicked on invalid combination
475 885a592b Kostas Papadimitriou
                // force the first available choice for the
476 885a592b Kostas Papadimitriou
                // type of option he last clicked
477 885a592b Kostas Papadimitriou
                this.set_valid_current_for.apply(this, this.last_choice);
478 885a592b Kostas Papadimitriou
                return;
479 885a592b Kostas Papadimitriou
            }
480 885a592b Kostas Papadimitriou
481 8d08f18a Kostas Papadimitriou
            this.current_flavor = flv;
482 8d08f18a Kostas Papadimitriou
            this.trigger("change");
483 cd4d5c5f Kostas Papadimitriou
            if (this.current_flavor) {
484 cd4d5c5f Kostas Papadimitriou
                this.update_selected_flavor();
485 cd4d5c5f Kostas Papadimitriou
                this.update_selected_predefined();
486 cd4d5c5f Kostas Papadimitriou
            }
487 cd4d5c5f Kostas Papadimitriou
            
488 cd4d5c5f Kostas Papadimitriou
            this.validate();
489 820ef2f0 Kostas Papadimitriou
        },
490 820ef2f0 Kostas Papadimitriou
        
491 820ef2f0 Kostas Papadimitriou
        select_default_flavor: function() {
492 820ef2f0 Kostas Papadimitriou
               
493 820ef2f0 Kostas Papadimitriou
        },
494 820ef2f0 Kostas Papadimitriou
495 820ef2f0 Kostas Papadimitriou
        update_selected_from_ui: function() {
496 820ef2f0 Kostas Papadimitriou
            this.set_current(this.ui_selected());
497 820ef2f0 Kostas Papadimitriou
        },
498 820ef2f0 Kostas Papadimitriou
        
499 820ef2f0 Kostas Papadimitriou
        update_disabled_flavors: function() {
500 820ef2f0 Kostas Papadimitriou
            this.$(".flavor-options.disk li").removeClass("disabled");
501 820ef2f0 Kostas Papadimitriou
            if (!this.unavailable_values) { return }
502 885a592b Kostas Papadimitriou
            
503 885a592b Kostas Papadimitriou
            this.$("#create-vm-flavor-options .flavor-options.disk li").each(_.bind(function(i, el){
504 885a592b Kostas Papadimitriou
                var el_value = $(el).data("value") * 1000;
505 820ef2f0 Kostas Papadimitriou
                if (this.unavailable_values.disk.indexOf(el_value) > -1) {
506 820ef2f0 Kostas Papadimitriou
                    $(el).addClass("disabled");
507 820ef2f0 Kostas Papadimitriou
                };
508 820ef2f0 Kostas Papadimitriou
            }, this));
509 8d08f18a Kostas Papadimitriou
        },
510 8d08f18a Kostas Papadimitriou
511 8d08f18a Kostas Papadimitriou
        create_flavors: function() {
512 820ef2f0 Kostas Papadimitriou
            var flavors = this.get_active_flavors();
513 820ef2f0 Kostas Papadimitriou
            var valid_flavors = this.get_valid_flavors();
514 d965e6dc Kostas Papadimitriou
            this.__added_flavors = {'cpu':[], 'ram':[], 'disk':[], 'disk_template':[] };
515 820ef2f0 Kostas Papadimitriou
516 8d08f18a Kostas Papadimitriou
            _.each(flavors, _.bind(function(flv){
517 8d08f18a Kostas Papadimitriou
                this.add_flavor(flv);
518 8d08f18a Kostas Papadimitriou
            }, this));
519 8d08f18a Kostas Papadimitriou
            
520 5f26e13f Kostas Papadimitriou
            this.sort_flavors(this.disks);
521 5f26e13f Kostas Papadimitriou
            this.sort_flavors(this.cpus);
522 5f26e13f Kostas Papadimitriou
            this.sort_flavors(this.mems);
523 d965e6dc Kostas Papadimitriou
            this.sort_flavors(this.disk_templates);
524 5f26e13f Kostas Papadimitriou
525 8d08f18a Kostas Papadimitriou
            var self = this;
526 8d08f18a Kostas Papadimitriou
            this.$(".flavor-options li.option").click(function(){
527 8d08f18a Kostas Papadimitriou
                var el = $(this);
528 820ef2f0 Kostas Papadimitriou
529 820ef2f0 Kostas Papadimitriou
                if (el.hasClass("disabled")) { return }
530 820ef2f0 Kostas Papadimitriou
531 8d08f18a Kostas Papadimitriou
                el.parent().find(".option").removeClass("selected");
532 8d08f18a Kostas Papadimitriou
                el.addClass("selected");
533 820ef2f0 Kostas Papadimitriou
                
534 885a592b Kostas Papadimitriou
                if (el.hasClass("mem")) { self.last_choice = ["ram", $(this).data("value")] }
535 885a592b Kostas Papadimitriou
                if (el.hasClass("cpu")) { self.last_choice = ["cpu", $(this).data("value")] }
536 885a592b Kostas Papadimitriou
                if (el.hasClass("disk")) { self.last_choice = ["disk", $(this).data("value")] }
537 d965e6dc Kostas Papadimitriou
                if (el.hasClass("disk_template")) { self.last_choice = ["disk_template", $(this).data("value")] }
538 820ef2f0 Kostas Papadimitriou
539 8d08f18a Kostas Papadimitriou
                self.update_selected_from_ui();
540 8d08f18a Kostas Papadimitriou
            })
541 d965e6dc Kostas Papadimitriou
542 5afdfc72 Kostas Papadimitriou
            //this.$(".flavor-options li.disk_template.option").mouseover(function(){
543 5afdfc72 Kostas Papadimitriou
                //$(this).parent().find(".description").hide();
544 5afdfc72 Kostas Papadimitriou
                //$(this).find(".description").show();
545 5afdfc72 Kostas Papadimitriou
            //}).mouseout(function(){
546 5afdfc72 Kostas Papadimitriou
                //$(this).parent().find(".description").hide();
547 5afdfc72 Kostas Papadimitriou
                //$(this).parent().find(".selected .description").show();
548 5afdfc72 Kostas Papadimitriou
            //});
549 8d08f18a Kostas Papadimitriou
        },
550 5f26e13f Kostas Papadimitriou
551 5f26e13f Kostas Papadimitriou
        sort_flavors: function(els) {
552 5f26e13f Kostas Papadimitriou
            var prev = undefined;
553 5f26e13f Kostas Papadimitriou
            els.find("li").each(function(i,el){
554 5f26e13f Kostas Papadimitriou
                el = $(el);
555 5f26e13f Kostas Papadimitriou
                if (!prev) { prev = el; return true };
556 5f26e13f Kostas Papadimitriou
                if (el.data("value") < prev.data("value")) {
557 5f26e13f Kostas Papadimitriou
                    prev.before(el);
558 5f26e13f Kostas Papadimitriou
                }
559 5f26e13f Kostas Papadimitriou
                prev = el;
560 5f26e13f Kostas Papadimitriou
            })
561 5f26e13f Kostas Papadimitriou
        },
562 8d08f18a Kostas Papadimitriou
        
563 8d08f18a Kostas Papadimitriou
        ui_selected: function() {
564 820ef2f0 Kostas Papadimitriou
            var args = [this.$(".option.cpu.selected").data("value"), 
565 8d08f18a Kostas Papadimitriou
                this.$(".option.mem.selected").data("value"), 
566 8d08f18a Kostas Papadimitriou
                this.$(".option.disk.selected").data("value"),
567 d965e6dc Kostas Papadimitriou
                this.$(".option.disk_template.selected").data("value"),
568 8d08f18a Kostas Papadimitriou
            this.flavors];
569 8d08f18a Kostas Papadimitriou
570 820ef2f0 Kostas Papadimitriou
            var flv = storage.flavors.get_flavor.apply(storage.flavors, args);
571 820ef2f0 Kostas Papadimitriou
            return flv;
572 8d08f18a Kostas Papadimitriou
        },
573 8d08f18a Kostas Papadimitriou
574 8d08f18a Kostas Papadimitriou
        update_selected_flavor: function() {
575 820ef2f0 Kostas Papadimitriou
            var flv = this.current_flavor;
576 cd4d5c5f Kostas Papadimitriou
            if (!flv) { return }
577 820ef2f0 Kostas Papadimitriou
            this.$(".option").removeClass("selected");
578 8d08f18a Kostas Papadimitriou
579 820ef2f0 Kostas Papadimitriou
            this.$(".option.cpu.value-" + flv.get("cpu")).addClass("selected");
580 820ef2f0 Kostas Papadimitriou
            this.$(".option.mem.value-" + flv.get("ram")).addClass("selected");
581 820ef2f0 Kostas Papadimitriou
            this.$(".option.disk.value-" + flv.get("disk")).addClass("selected");
582 d965e6dc Kostas Papadimitriou
            this.$(".option.disk_template.value-" + flv.get("disk_template")).addClass("selected");
583 5afdfc72 Kostas Papadimitriou
            
584 5afdfc72 Kostas Papadimitriou
            var disk_el = this.$(".option.disk_template.value-" + flv.get("disk_template"));
585 5afdfc72 Kostas Papadimitriou
            var basebgpos = 470;
586 5afdfc72 Kostas Papadimitriou
                
587 5afdfc72 Kostas Papadimitriou
            var append_to_bg_pos = 40 + (disk_el.index() * 91);
588 5afdfc72 Kostas Papadimitriou
            var bg_pos = basebgpos - append_to_bg_pos;
589 5afdfc72 Kostas Papadimitriou
590 5afdfc72 Kostas Papadimitriou
            this.$(".disk-template-description").css({backgroundPosition:'-' + bg_pos + 'px top'})
591 5afdfc72 Kostas Papadimitriou
            this.$(".disk-template-description p").html(flv.get_disk_template_info().description || "");
592 8d08f18a Kostas Papadimitriou
        },
593 885a592b Kostas Papadimitriou
        
594 d965e6dc Kostas Papadimitriou
        __added_flavors: {'cpu':[], 'ram':[], 'disk':[], 'disk_template':[]},
595 8d08f18a Kostas Papadimitriou
        add_flavor: function(flv) {
596 d965e6dc Kostas Papadimitriou
            var values = {'cpu': flv.get('cpu'), 
597 d965e6dc Kostas Papadimitriou
                          'mem': flv.get('ram'), 
598 d965e6dc Kostas Papadimitriou
                          'disk': flv.get('disk'), 
599 d965e6dc Kostas Papadimitriou
                          'disk_template': flv.get('disk_template')};
600 820ef2f0 Kostas Papadimitriou
601 820ef2f0 Kostas Papadimitriou
            disabled = "";
602 885a592b Kostas Papadimitriou
            
603 885a592b Kostas Papadimitriou
            if (this.__added_flavors.cpu.indexOf(values.cpu) == -1) {
604 820ef2f0 Kostas Papadimitriou
                var cpu = $(('<li class="option cpu value-{0} {1}">' + 
605 820ef2f0 Kostas Papadimitriou
                             '<span class="value">{0}</span>' + 
606 820ef2f0 Kostas Papadimitriou
                             '<span class="metric">x</span></li>').format(values.cpu, disabled)).data('value', values.cpu);
607 8d08f18a Kostas Papadimitriou
                this.cpus.append(cpu);
608 885a592b Kostas Papadimitriou
                this.__added_flavors.cpu.push(values.cpu);
609 8d08f18a Kostas Papadimitriou
            }
610 885a592b Kostas Papadimitriou
611 885a592b Kostas Papadimitriou
            if (this.__added_flavors.ram.indexOf(values.mem) == -1) {
612 820ef2f0 Kostas Papadimitriou
                var mem = $(('<li class="option mem value-{0}">' + 
613 820ef2f0 Kostas Papadimitriou
                             '<span class="value">{0}</span>' + 
614 820ef2f0 Kostas Papadimitriou
                             '<span class="metric">MB</span></li>').format(values.mem)).data('value', values.mem);
615 8d08f18a Kostas Papadimitriou
                this.mems.append(mem);
616 885a592b Kostas Papadimitriou
                this.__added_flavors.ram.push(values.mem);
617 8d08f18a Kostas Papadimitriou
            }
618 885a592b Kostas Papadimitriou
619 885a592b Kostas Papadimitriou
            if (this.__added_flavors.disk.indexOf(values.disk) == -1) {
620 820ef2f0 Kostas Papadimitriou
                var disk = $(('<li class="option disk value-{0}">' + 
621 820ef2f0 Kostas Papadimitriou
                              '<span class="value">{0}</span>' + 
622 820ef2f0 Kostas Papadimitriou
                              '<span class="metric">GB</span></li>').format(values.disk)).data('value', values.disk);
623 8d08f18a Kostas Papadimitriou
                this.disks.append(disk);
624 885a592b Kostas Papadimitriou
                this.__added_flavors.disk.push(values.disk)
625 8d08f18a Kostas Papadimitriou
            }
626 d965e6dc Kostas Papadimitriou
            
627 d965e6dc Kostas Papadimitriou
            if (this.__added_flavors.disk_template.indexOf(values.disk_template) == -1) {
628 d965e6dc Kostas Papadimitriou
                var template_info = flv.get_disk_template_info();
629 5afdfc72 Kostas Papadimitriou
                var disk_template = $(('<li title="{2}" class="option disk_template value-{0}">' + 
630 5afdfc72 Kostas Papadimitriou
                                       '<span class="value name">{1}</span>' +
631 d965e6dc Kostas Papadimitriou
                                       '</li>').format(values.disk_template, 
632 d965e6dc Kostas Papadimitriou
                                            template_info.name, 
633 d965e6dc Kostas Papadimitriou
                                            template_info.description)).data('value', 
634 d965e6dc Kostas Papadimitriou
                                                                values.disk_template);
635 d965e6dc Kostas Papadimitriou
636 d965e6dc Kostas Papadimitriou
                this.disk_templates.append(disk_template);
637 5afdfc72 Kostas Papadimitriou
                //disk_template.tooltip({position:'top center', offset:[-5,0], delay:100, tipClass:'tooltip disktip'});
638 d965e6dc Kostas Papadimitriou
                this.__added_flavors.disk_template.push(values.disk_template)
639 d965e6dc Kostas Papadimitriou
            }
640 8d08f18a Kostas Papadimitriou
            
641 8d08f18a Kostas Papadimitriou
        },
642 820ef2f0 Kostas Papadimitriou
        
643 820ef2f0 Kostas Papadimitriou
        get_active_flavors: function() {
644 820ef2f0 Kostas Papadimitriou
            return storage.flavors.active();
645 820ef2f0 Kostas Papadimitriou
        },
646 8d08f18a Kostas Papadimitriou
647 820ef2f0 Kostas Papadimitriou
        get_valid_flavors: function() {
648 8d08f18a Kostas Papadimitriou
            return this.flavors;
649 8d08f18a Kostas Papadimitriou
        },
650 8d08f18a Kostas Papadimitriou
651 8d08f18a Kostas Papadimitriou
        update_layout: function() {
652 820ef2f0 Kostas Papadimitriou
            this.update_selected_flavor();
653 820ef2f0 Kostas Papadimitriou
            this.update_disabled_flavors();
654 cd4d5c5f Kostas Papadimitriou
            this.validate();
655 283bb7de Kostas Papadimitriou
            this.validate_selected_flavor();
656 8d08f18a Kostas Papadimitriou
        },
657 8d08f18a Kostas Papadimitriou
658 8d08f18a Kostas Papadimitriou
        reset: function() {
659 8d08f18a Kostas Papadimitriou
            this.current_image = storage.images.at(0);
660 8d08f18a Kostas Papadimitriou
            this.flavors = [];
661 8d08f18a Kostas Papadimitriou
            this.flavors_data = {'cpu':[], 'mem':[], 'disk':[]};
662 8d08f18a Kostas Papadimitriou
            this.update_flavors_data();
663 8d08f18a Kostas Papadimitriou
        },
664 8d08f18a Kostas Papadimitriou
665 cd4d5c5f Kostas Papadimitriou
        validate: function() {
666 cd4d5c5f Kostas Papadimitriou
            if (!this.current_flavor) {
667 cd4d5c5f Kostas Papadimitriou
                this.parent.$(".form-action.next").hide();
668 cd4d5c5f Kostas Papadimitriou
            } else {
669 cd4d5c5f Kostas Papadimitriou
                this.parent.$(".form-action.next").show();
670 cd4d5c5f Kostas Papadimitriou
            }
671 cd4d5c5f Kostas Papadimitriou
        },
672 cd4d5c5f Kostas Papadimitriou
673 8d08f18a Kostas Papadimitriou
        get: function() {
674 d965e6dc Kostas Papadimitriou
            return {'flavor': this.current_flavor}
675 8d08f18a Kostas Papadimitriou
        }
676 8d08f18a Kostas Papadimitriou
677 8d08f18a Kostas Papadimitriou
    });
678 8d08f18a Kostas Papadimitriou
679 47276ec2 Kostas Papadimitriou
    views.CreatePersonalizeView = views.CreateVMStepView.extend({
680 8d08f18a Kostas Papadimitriou
        step: 3,
681 8d08f18a Kostas Papadimitriou
        initialize: function() {
682 8d08f18a Kostas Papadimitriou
            views.CreateSubmitView.__super__.initialize.apply(this, arguments);
683 73e25ce2 Kostas Papadimitriou
            this.roles = this.$("li.predefined-meta.role .values");
684 73e25ce2 Kostas Papadimitriou
            this.name = this.$("input.rename-field");
685 8d08f18a Kostas Papadimitriou
            this.name_changed = false;
686 73e25ce2 Kostas Papadimitriou
            this.init_suggested_roles();
687 8d08f18a Kostas Papadimitriou
            this.init_handlers();
688 47276ec2 Kostas Papadimitriou
            this.ssh_list = this.$(".ssh ul");
689 47276ec2 Kostas Papadimitriou
            this.selected_keys = [];
690 47276ec2 Kostas Papadimitriou
691 47276ec2 Kostas Papadimitriou
            var self = this;
692 47276ec2 Kostas Papadimitriou
            this.$(".create-ssh-key").click(function() {
693 47276ec2 Kostas Papadimitriou
                var confirm_close = true || confirm("This action will close the virtual machine creation wizard." +
694 47276ec2 Kostas Papadimitriou
                                            " Are you sure you want to continue ?")
695 47276ec2 Kostas Papadimitriou
                if (confirm_close) {
696 47276ec2 Kostas Papadimitriou
                    snf.ui.main.public_keys_view.show(self.parent);
697 47276ec2 Kostas Papadimitriou
                } else {
698 47276ec2 Kostas Papadimitriou
                }
699 47276ec2 Kostas Papadimitriou
            });
700 8d08f18a Kostas Papadimitriou
        },
701 8d08f18a Kostas Papadimitriou
702 73e25ce2 Kostas Papadimitriou
        init_suggested_roles: function() {
703 73e25ce2 Kostas Papadimitriou
            var cont = this.roles;
704 73e25ce2 Kostas Papadimitriou
            cont.empty();
705 73e25ce2 Kostas Papadimitriou
            
706 73e25ce2 Kostas Papadimitriou
            // TODO: get suggested from snf.api.conf
707 73e25ce2 Kostas Papadimitriou
            _.each(window.SUGGESTED_ROLES, function(r){
708 73e25ce2 Kostas Papadimitriou
                var el = $('<span class="val">{0}</span>'.format(r));
709 73e25ce2 Kostas Papadimitriou
                el.data("value", r);
710 73e25ce2 Kostas Papadimitriou
                cont.append(el);
711 73e25ce2 Kostas Papadimitriou
                el.click(function() {
712 73e25ce2 Kostas Papadimitriou
                    $(this).parent().find(".val").removeClass("selected");
713 73e25ce2 Kostas Papadimitriou
                    $(this).toggleClass("selected");
714 73e25ce2 Kostas Papadimitriou
                })
715 47276ec2 Kostas Papadimitriou
            });
716 47276ec2 Kostas Papadimitriou
            
717 47276ec2 Kostas Papadimitriou
            var self = this;
718 47276ec2 Kostas Papadimitriou
            $(".ssh li.ssh-key-option").live("click", function(e) {
719 47276ec2 Kostas Papadimitriou
                var key = $(this).data("model");
720 47276ec2 Kostas Papadimitriou
                self.select_key(key);
721 47276ec2 Kostas Papadimitriou
            });
722 47276ec2 Kostas Papadimitriou
        },
723 47276ec2 Kostas Papadimitriou
724 47276ec2 Kostas Papadimitriou
        select_key: function(key) {
725 47276ec2 Kostas Papadimitriou
            var exists = this.selected_keys.indexOf(key.id);
726 47276ec2 Kostas Papadimitriou
            if (exists > -1) {
727 47276ec2 Kostas Papadimitriou
                this.selected_keys.splice(exists, 1);
728 47276ec2 Kostas Papadimitriou
            } else {
729 47276ec2 Kostas Papadimitriou
                this.selected_keys.push(key.id);
730 47276ec2 Kostas Papadimitriou
            }
731 47276ec2 Kostas Papadimitriou
            this.update_ui_keys_selections(this.selected_keys);
732 47276ec2 Kostas Papadimitriou
        },
733 47276ec2 Kostas Papadimitriou
734 47276ec2 Kostas Papadimitriou
        update_ui_keys_selections: function(keys) {
735 47276ec2 Kostas Papadimitriou
            var self = this;
736 47276ec2 Kostas Papadimitriou
            self.$(".ssh-key-option").removeClass("selected");
737 47276ec2 Kostas Papadimitriou
            self.$(".ssh-key-option .check").attr("checked", false);
738 47276ec2 Kostas Papadimitriou
            _.each(keys, function(kid) {
739 47276ec2 Kostas Papadimitriou
                $("#ssh-key-option-" + kid).addClass("selected");
740 47276ec2 Kostas Papadimitriou
                $("#ssh-key-option-" + kid).find(".check").attr("checked", true);
741 47276ec2 Kostas Papadimitriou
            });
742 47276ec2 Kostas Papadimitriou
        },
743 47276ec2 Kostas Papadimitriou
744 47276ec2 Kostas Papadimitriou
        update_ssh_keys: function() {
745 47276ec2 Kostas Papadimitriou
            this.ssh_list.empty();
746 47276ec2 Kostas Papadimitriou
            var keys = snf.storage.keys.models;
747 47276ec2 Kostas Papadimitriou
            if (keys.length == 0) { 
748 47276ec2 Kostas Papadimitriou
                this.$(".ssh .empty").show();
749 47276ec2 Kostas Papadimitriou
            } else {
750 47276ec2 Kostas Papadimitriou
                this.$(".ssh .empty").hide();
751 47276ec2 Kostas Papadimitriou
            }
752 47276ec2 Kostas Papadimitriou
            _.each(keys, _.bind(function(key){
753 47276ec2 Kostas Papadimitriou
                var el = $('<li id="ssh-key-option-{1}" class="ssh-key-option">{0}</li>'.format(key.get("name"), key.id));
754 47276ec2 Kostas Papadimitriou
                var check = $('<input class="check" type="checkbox"></input>')
755 47276ec2 Kostas Papadimitriou
                el.append(check);
756 47276ec2 Kostas Papadimitriou
                el.data("model", key);
757 47276ec2 Kostas Papadimitriou
                this.ssh_list.append(el);
758 47276ec2 Kostas Papadimitriou
            }, this));
759 73e25ce2 Kostas Papadimitriou
        },
760 73e25ce2 Kostas Papadimitriou
761 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
762 820ef2f0 Kostas Papadimitriou
            this.name.bind("keypress", _.bind(function(e) {
763 8d08f18a Kostas Papadimitriou
                this.name_changed = true;
764 47276ec2 Kostas Papadimitriou
                if (e.keyCode == 13) { this.parent.set_step(4); this.parent.update_layout() };    
765 8d08f18a Kostas Papadimitriou
            }, this));
766 8d08f18a Kostas Papadimitriou
767 8d08f18a Kostas Papadimitriou
            this.name.bind("click", _.bind(function() {
768 8d08f18a Kostas Papadimitriou
                if (!this.name_changed) {
769 8d08f18a Kostas Papadimitriou
                    this.name.val("");
770 8d08f18a Kostas Papadimitriou
                }
771 8d08f18a Kostas Papadimitriou
            }, this))
772 8d08f18a Kostas Papadimitriou
        },
773 8d08f18a Kostas Papadimitriou
774 8d08f18a Kostas Papadimitriou
        show: function() {
775 47276ec2 Kostas Papadimitriou
            views.CreatePersonalizeView.__super__.show.apply(this, arguments);
776 8d08f18a Kostas Papadimitriou
            this.update_layout();
777 8d08f18a Kostas Papadimitriou
        },
778 820ef2f0 Kostas Papadimitriou
        
779 8d08f18a Kostas Papadimitriou
        update_layout: function() {
780 8d08f18a Kostas Papadimitriou
            var params = this.parent.get_params();
781 47276ec2 Kostas Papadimitriou
782 cd4d5c5f Kostas Papadimitriou
            if (!params.image || !params.flavor) { return }
783 820ef2f0 Kostas Papadimitriou
784 820ef2f0 Kostas Papadimitriou
            if (!params.image) { return }
785 c130b56e Kostas Papadimitriou
            var vm_name_tpl = snf.config.vm_name_template || "My {0} server";
786 c130b56e Kostas Papadimitriou
            var vm_name = vm_name_tpl.format(params.image.get("name"));
787 8d08f18a Kostas Papadimitriou
            var orig_name = vm_name;
788 8d08f18a Kostas Papadimitriou
            
789 8d08f18a Kostas Papadimitriou
            var existing = true;
790 8d08f18a Kostas Papadimitriou
            var j = 0;
791 b128dc09 Kostas Papadimitriou
792 820ef2f0 Kostas Papadimitriou
            while (existing && !this.name_changed) {
793 8d08f18a Kostas Papadimitriou
                var existing = storage.vms.select(function(vm){return vm.get("name") == vm_name}).length
794 8d08f18a Kostas Papadimitriou
                if (existing) {
795 8d08f18a Kostas Papadimitriou
                    j++;
796 8d08f18a Kostas Papadimitriou
                    vm_name = orig_name + " " + j;
797 8d08f18a Kostas Papadimitriou
                }
798 8d08f18a Kostas Papadimitriou
            }
799 47276ec2 Kostas Papadimitriou
800 8d08f18a Kostas Papadimitriou
            if (!_(this.name.val()).trim() || !this.name_changed) {
801 8d08f18a Kostas Papadimitriou
                this.name.val(vm_name);
802 8d08f18a Kostas Papadimitriou
            }
803 8d08f18a Kostas Papadimitriou
804 4f1968db Kostas Papadimitriou
            if (!this.name_changed && this.parent.visible()) {
805 1325fc64 Kostas Papadimitriou
                if (!$.browser.msie && !$.browser.opera) {
806 4f1968db Kostas Papadimitriou
                    this.$("#create-vm-name").select();
807 4f1968db Kostas Papadimitriou
                } else {
808 4f1968db Kostas Papadimitriou
                    window.setTimeout(_.bind(function(){
809 4f1968db Kostas Papadimitriou
                        this.$("#create-vm-name").select();
810 1325fc64 Kostas Papadimitriou
                    }, this), 400)
811 4f1968db Kostas Papadimitriou
                }
812 820ef2f0 Kostas Papadimitriou
            }
813 820ef2f0 Kostas Papadimitriou
            
814 820ef2f0 Kostas Papadimitriou
            var img = snf.ui.helpers.os_icon_path(params.image.get("OS"))
815 820ef2f0 Kostas Papadimitriou
            this.name.css({backgroundImage:"url({0})".format(img)})
816 47276ec2 Kostas Papadimitriou
            
817 47276ec2 Kostas Papadimitriou
            if (!params.image.supports('ssh')) {
818 47276ec2 Kostas Papadimitriou
                this.disable_ssh_keys();
819 47276ec2 Kostas Papadimitriou
            } else {
820 47276ec2 Kostas Papadimitriou
                this.enable_ssh_keys();
821 47276ec2 Kostas Papadimitriou
                this.update_ssh_keys();
822 47276ec2 Kostas Papadimitriou
            }
823 820ef2f0 Kostas Papadimitriou
824 47276ec2 Kostas Papadimitriou
            this.update_ui_keys_selections(this.selected_keys);
825 47276ec2 Kostas Papadimitriou
        },
826 47276ec2 Kostas Papadimitriou
827 47276ec2 Kostas Papadimitriou
        disable_ssh_keys: function() {
828 47276ec2 Kostas Papadimitriou
            this.$(".disabled.desc").show();
829 47276ec2 Kostas Papadimitriou
            this.$(".empty.desc").hide();
830 47276ec2 Kostas Papadimitriou
            this.$(".ssh .confirm-params").hide();
831 47276ec2 Kostas Papadimitriou
            this.selected_keys = [];
832 47276ec2 Kostas Papadimitriou
        },
833 47276ec2 Kostas Papadimitriou
834 47276ec2 Kostas Papadimitriou
        enable_ssh_keys: function() {
835 47276ec2 Kostas Papadimitriou
            this.$(".ssh .confirm-params").show();
836 47276ec2 Kostas Papadimitriou
            this.$(".disabled.desc").hide();
837 8d08f18a Kostas Papadimitriou
        },
838 8d08f18a Kostas Papadimitriou
839 8d08f18a Kostas Papadimitriou
        reset: function() {
840 73e25ce2 Kostas Papadimitriou
            this.roles.find(".val").removeClass("selected");
841 820ef2f0 Kostas Papadimitriou
            this.name_changed = false;
842 47276ec2 Kostas Papadimitriou
            this.selected_keys = [];
843 8d08f18a Kostas Papadimitriou
            this.update_layout();
844 8d08f18a Kostas Papadimitriou
        },
845 8d08f18a Kostas Papadimitriou
846 73e25ce2 Kostas Papadimitriou
        get_meta: function() {
847 73e25ce2 Kostas Papadimitriou
            if (this.roles.find(".selected").length == 0) {
848 73e25ce2 Kostas Papadimitriou
                return false;
849 73e25ce2 Kostas Papadimitriou
            }
850 73e25ce2 Kostas Papadimitriou
851 73e25ce2 Kostas Papadimitriou
            var role = $(this.roles.find(".selected").get(0)).data("value");
852 73e25ce2 Kostas Papadimitriou
            return {'Role': role }
853 73e25ce2 Kostas Papadimitriou
        },
854 73e25ce2 Kostas Papadimitriou
855 8d08f18a Kostas Papadimitriou
        get: function() {
856 73e25ce2 Kostas Papadimitriou
            var val = {'name': this.name.val() };
857 73e25ce2 Kostas Papadimitriou
            if (this.get_meta()) {
858 73e25ce2 Kostas Papadimitriou
                val.metadata = this.get_meta();
859 73e25ce2 Kostas Papadimitriou
            }
860 47276ec2 Kostas Papadimitriou
861 47276ec2 Kostas Papadimitriou
            val.keys = _.map(this.selected_keys, function(k){ return snf.storage.keys.get(k)});
862 73e25ce2 Kostas Papadimitriou
            
863 73e25ce2 Kostas Papadimitriou
            return val;
864 8d08f18a Kostas Papadimitriou
        }
865 8d08f18a Kostas Papadimitriou
    });
866 8d08f18a Kostas Papadimitriou
867 47276ec2 Kostas Papadimitriou
    views.CreateSubmitView = views.CreateVMStepView.extend({
868 47276ec2 Kostas Papadimitriou
        step: 4,
869 47276ec2 Kostas Papadimitriou
        initialize: function() {
870 47276ec2 Kostas Papadimitriou
            views.CreateSubmitView.__super__.initialize.apply(this, arguments);
871 47276ec2 Kostas Papadimitriou
            this.roles = this.$("li.predefined-meta.role .values");
872 47276ec2 Kostas Papadimitriou
            this.confirm = this.$(".confirm-params ul");
873 47276ec2 Kostas Papadimitriou
            this.name = this.$("h3.vm-name");
874 47276ec2 Kostas Papadimitriou
            this.keys = this.$(".confirm-params.ssh");
875 47276ec2 Kostas Papadimitriou
            this.meta = this.$(".confirm-params.meta");
876 47276ec2 Kostas Papadimitriou
            this.init_handlers();
877 47276ec2 Kostas Papadimitriou
        },
878 47276ec2 Kostas Papadimitriou
879 47276ec2 Kostas Papadimitriou
        init_handlers: function() {
880 47276ec2 Kostas Papadimitriou
        },
881 47276ec2 Kostas Papadimitriou
882 47276ec2 Kostas Papadimitriou
        show: function() {
883 47276ec2 Kostas Papadimitriou
            views.CreateSubmitView.__super__.show.apply(this, arguments);
884 47276ec2 Kostas Papadimitriou
            this.update_layout();
885 47276ec2 Kostas Papadimitriou
        },
886 47276ec2 Kostas Papadimitriou
        
887 47276ec2 Kostas Papadimitriou
        update_flavor_details: function() {
888 47276ec2 Kostas Papadimitriou
            var flavor = this.parent.get_params().flavor;
889 47276ec2 Kostas Papadimitriou
890 47276ec2 Kostas Papadimitriou
            function set_detail(sel, key) {
891 47276ec2 Kostas Papadimitriou
                var val = key;
892 47276ec2 Kostas Papadimitriou
                if (key == undefined) { val = flavor.get(sel) };
893 47276ec2 Kostas Papadimitriou
                this.$(".confirm-cont.flavor .flavor-" + sel + " .value").text(val)
894 47276ec2 Kostas Papadimitriou
            }
895 47276ec2 Kostas Papadimitriou
            
896 47276ec2 Kostas Papadimitriou
            set_detail("cpu", flavor.get("cpu") + "x");
897 47276ec2 Kostas Papadimitriou
            set_detail("ram", flavor.get("ram") + " MB");
898 47276ec2 Kostas Papadimitriou
            set_detail("disk", util.readablizeBytes(flavor.get("disk") * 1024 * 1024 * 1024));
899 d965e6dc Kostas Papadimitriou
            set_detail("disktype", flavor.get_disk_template_info().name);
900 47276ec2 Kostas Papadimitriou
        },
901 47276ec2 Kostas Papadimitriou
902 47276ec2 Kostas Papadimitriou
        update_image_details: function() {
903 47276ec2 Kostas Papadimitriou
            var image = this.parent.get_params().image;
904 47276ec2 Kostas Papadimitriou
905 47276ec2 Kostas Papadimitriou
            function set_detail(sel, key) {
906 47276ec2 Kostas Papadimitriou
                var val = key;
907 47276ec2 Kostas Papadimitriou
                if (key == undefined) { val = image.get(sel) };
908 47276ec2 Kostas Papadimitriou
                this.$(".confirm-cont.image .image-" + sel + " .value").text(val)
909 47276ec2 Kostas Papadimitriou
            }
910 47276ec2 Kostas Papadimitriou
            
911 47276ec2 Kostas Papadimitriou
            set_detail("description");
912 47276ec2 Kostas Papadimitriou
            set_detail("name");
913 47276ec2 Kostas Papadimitriou
            set_detail("os", _(image.get("OS")).capitalize());
914 47276ec2 Kostas Papadimitriou
            set_detail("gui", image.get("GUI"));
915 47276ec2 Kostas Papadimitriou
            set_detail("size", image.get_readable_size());
916 47276ec2 Kostas Papadimitriou
            set_detail("kernel");
917 47276ec2 Kostas Papadimitriou
        },
918 47276ec2 Kostas Papadimitriou
919 47276ec2 Kostas Papadimitriou
        update_selected_keys: function(keys) {
920 47276ec2 Kostas Papadimitriou
            this.keys.empty();
921 47276ec2 Kostas Papadimitriou
            if (!keys || keys.length == 0) {
922 47276ec2 Kostas Papadimitriou
                this.keys.append(this.make("li", {'class':'empty'}, 'No keys selected'))
923 47276ec2 Kostas Papadimitriou
            }
924 47276ec2 Kostas Papadimitriou
            _.each(keys, _.bind(function(key) {
925 47276ec2 Kostas Papadimitriou
                var el = this.make("li", {'class':'selected-ssh-key'}, key.get('name'));
926 47276ec2 Kostas Papadimitriou
                this.keys.append(el);
927 47276ec2 Kostas Papadimitriou
            }, this))
928 47276ec2 Kostas Papadimitriou
        },
929 47276ec2 Kostas Papadimitriou
930 47276ec2 Kostas Papadimitriou
        update_selected_meta: function(meta) {
931 47276ec2 Kostas Papadimitriou
            this.meta.empty();
932 47276ec2 Kostas Papadimitriou
            if (!meta || meta.length == 0) {
933 47276ec2 Kostas Papadimitriou
                this.meta.append(this.make("li", {'class':'empty'}, 'No tags selected'))
934 47276ec2 Kostas Papadimitriou
            }
935 47276ec2 Kostas Papadimitriou
            _.each(meta, _.bind(function(value, key) {
936 47276ec2 Kostas Papadimitriou
                var el = this.make("li", {'class':"confirm-value"});
937 47276ec2 Kostas Papadimitriou
                var name = this.make("span", {'class':"ckey"}, key);
938 47276ec2 Kostas Papadimitriou
                var value = this.make("span", {'class':"cval"}, value);
939 47276ec2 Kostas Papadimitriou
940 47276ec2 Kostas Papadimitriou
                $(el).append(name)
941 47276ec2 Kostas Papadimitriou
                $(el).append(value);
942 47276ec2 Kostas Papadimitriou
                this.meta.append(el);
943 47276ec2 Kostas Papadimitriou
            }, this));
944 47276ec2 Kostas Papadimitriou
        },
945 47276ec2 Kostas Papadimitriou
946 47276ec2 Kostas Papadimitriou
        update_layout: function() {
947 47276ec2 Kostas Papadimitriou
            var params = this.parent.get_params();
948 47276ec2 Kostas Papadimitriou
            if (!params.image || !params.flavor) { return }
949 47276ec2 Kostas Papadimitriou
950 47276ec2 Kostas Papadimitriou
            if (!params.image) { return }
951 47276ec2 Kostas Papadimitriou
952 47276ec2 Kostas Papadimitriou
            this.name.text(params.name);
953 47276ec2 Kostas Papadimitriou
954 47276ec2 Kostas Papadimitriou
            this.confirm.find("li.image .value").text(params.flavor.get("image"));
955 47276ec2 Kostas Papadimitriou
            this.confirm.find("li.cpu .value").text(params.flavor.get("cpu") + "x");
956 47276ec2 Kostas Papadimitriou
            this.confirm.find("li.mem .value").text(params.flavor.get("ram"));
957 47276ec2 Kostas Papadimitriou
            this.confirm.find("li.disk .value").text(params.flavor.get("disk"));
958 47276ec2 Kostas Papadimitriou
959 47276ec2 Kostas Papadimitriou
            var img = snf.ui.helpers.os_icon_path(params.image.get("OS"))
960 47276ec2 Kostas Papadimitriou
            this.name.css({backgroundImage:"url({0})".format(img)})
961 47276ec2 Kostas Papadimitriou
962 47276ec2 Kostas Papadimitriou
            this.update_image_details();
963 47276ec2 Kostas Papadimitriou
            this.update_flavor_details();
964 47276ec2 Kostas Papadimitriou
965 47276ec2 Kostas Papadimitriou
            if (!params.image.supports('ssh')) {
966 47276ec2 Kostas Papadimitriou
                this.keys.hide();
967 47276ec2 Kostas Papadimitriou
                this.keys.prev().hide();
968 47276ec2 Kostas Papadimitriou
            } else {
969 47276ec2 Kostas Papadimitriou
                this.keys.show();
970 47276ec2 Kostas Papadimitriou
                this.keys.prev().show();
971 47276ec2 Kostas Papadimitriou
                this.update_selected_keys(params.keys);
972 47276ec2 Kostas Papadimitriou
            }
973 47276ec2 Kostas Papadimitriou
            
974 47276ec2 Kostas Papadimitriou
            this.update_selected_meta(params.metadata);
975 47276ec2 Kostas Papadimitriou
        },
976 47276ec2 Kostas Papadimitriou
977 47276ec2 Kostas Papadimitriou
        reset: function() {
978 47276ec2 Kostas Papadimitriou
            this.update_layout();
979 47276ec2 Kostas Papadimitriou
        },
980 47276ec2 Kostas Papadimitriou
981 47276ec2 Kostas Papadimitriou
        get_meta: function() {
982 47276ec2 Kostas Papadimitriou
        },
983 47276ec2 Kostas Papadimitriou
984 47276ec2 Kostas Papadimitriou
        get: function() {
985 47276ec2 Kostas Papadimitriou
            return {};
986 47276ec2 Kostas Papadimitriou
        }
987 47276ec2 Kostas Papadimitriou
    });
988 47276ec2 Kostas Papadimitriou
989 8d08f18a Kostas Papadimitriou
    views.CreateVMView = views.Overlay.extend({
990 8d08f18a Kostas Papadimitriou
        
991 8d08f18a Kostas Papadimitriou
        view_id: "create_vm_view",
992 8d08f18a Kostas Papadimitriou
        content_selector: "#createvm-overlay-content",
993 8d08f18a Kostas Papadimitriou
        css_class: 'overlay-createvm overlay-info',
994 8d08f18a Kostas Papadimitriou
        overlay_id: "metadata-overlay",
995 8d08f18a Kostas Papadimitriou
996 8d08f18a Kostas Papadimitriou
        subtitle: false,
997 8d08f18a Kostas Papadimitriou
        title: "Create new machine",
998 8d08f18a Kostas Papadimitriou
999 8d08f18a Kostas Papadimitriou
        initialize: function(options) {
1000 8d08f18a Kostas Papadimitriou
            views.CreateVMView.__super__.initialize.apply(this);
1001 8d08f18a Kostas Papadimitriou
            this.current_step = 1;
1002 8d08f18a Kostas Papadimitriou
1003 8d08f18a Kostas Papadimitriou
            this.password_view = new views.VMCreationPasswordView();
1004 8d08f18a Kostas Papadimitriou
1005 8d08f18a Kostas Papadimitriou
            this.steps = [];
1006 8d08f18a Kostas Papadimitriou
            this.steps[1] = new views.CreateImageSelectView(this);
1007 8d08f18a Kostas Papadimitriou
            this.steps[1].bind("change", _.bind(function(data) {this.trigger("image:change", data)}, this));
1008 8d08f18a Kostas Papadimitriou
1009 8d08f18a Kostas Papadimitriou
            this.steps[2] = new views.CreateFlavorSelectView(this);
1010 47276ec2 Kostas Papadimitriou
            this.steps[3] = new views.CreatePersonalizeView(this);
1011 47276ec2 Kostas Papadimitriou
            this.steps[4] = new views.CreateSubmitView(this);
1012 8d08f18a Kostas Papadimitriou
1013 1325fc64 Kostas Papadimitriou
            this.cancel_btn = this.$(".create-controls .cancel");
1014 1325fc64 Kostas Papadimitriou
            this.next_btn = this.$(".create-controls .next");
1015 1325fc64 Kostas Papadimitriou
            this.prev_btn = this.$(".create-controls .prev");
1016 1325fc64 Kostas Papadimitriou
            this.submit_btn = this.$(".create-controls .submit");
1017 1325fc64 Kostas Papadimitriou
1018 1325fc64 Kostas Papadimitriou
            this.history = this.$(".steps-history");
1019 1325fc64 Kostas Papadimitriou
            this.history_steps = this.$(".steps-history .steps-history-step");
1020 8d08f18a Kostas Papadimitriou
            
1021 8d08f18a Kostas Papadimitriou
            this.init_handlers();
1022 8d08f18a Kostas Papadimitriou
        },
1023 8d08f18a Kostas Papadimitriou
1024 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
1025 1325fc64 Kostas Papadimitriou
            var self = this;
1026 8d08f18a Kostas Papadimitriou
            this.next_btn.click(_.bind(function(){
1027 b128dc09 Kostas Papadimitriou
                this.set_step(this.current_step + 1);
1028 8d08f18a Kostas Papadimitriou
                this.update_layout();
1029 8d08f18a Kostas Papadimitriou
            }, this))
1030 8d08f18a Kostas Papadimitriou
            this.prev_btn.click(_.bind(function(){
1031 b128dc09 Kostas Papadimitriou
                this.set_step(this.current_step - 1);
1032 8d08f18a Kostas Papadimitriou
                this.update_layout();
1033 8d08f18a Kostas Papadimitriou
            }, this))
1034 8d08f18a Kostas Papadimitriou
            this.cancel_btn.click(_.bind(function(){
1035 8d08f18a Kostas Papadimitriou
                this.close_all();
1036 8d08f18a Kostas Papadimitriou
            }, this))
1037 8d08f18a Kostas Papadimitriou
            this.submit_btn.click(_.bind(function(){
1038 8d08f18a Kostas Papadimitriou
                this.submit();
1039 8d08f18a Kostas Papadimitriou
            }, this))
1040 1325fc64 Kostas Papadimitriou
            
1041 1325fc64 Kostas Papadimitriou
            this.history.find(".completed").live("click", function() {
1042 1325fc64 Kostas Papadimitriou
                var step = parseInt($(this).attr("id").replace("vm-create-step-history-", ""));
1043 1325fc64 Kostas Papadimitriou
                self.set_step(step);
1044 1325fc64 Kostas Papadimitriou
                self.update_layout();
1045 1325fc64 Kostas Papadimitriou
            })
1046 8d08f18a Kostas Papadimitriou
        },
1047 8d08f18a Kostas Papadimitriou
1048 8d08f18a Kostas Papadimitriou
        set_step: function(st) {
1049 8d08f18a Kostas Papadimitriou
        },
1050 8d08f18a Kostas Papadimitriou
        
1051 8d08f18a Kostas Papadimitriou
        validate: function(data) {
1052 8d08f18a Kostas Papadimitriou
            if (_(data.name).trim() == "") {
1053 8d08f18a Kostas Papadimitriou
                this.$(".form-field").addClass("error");
1054 8d08f18a Kostas Papadimitriou
                return false;
1055 8d08f18a Kostas Papadimitriou
            } else {
1056 8d08f18a Kostas Papadimitriou
                return true;
1057 8d08f18a Kostas Papadimitriou
            }
1058 8d08f18a Kostas Papadimitriou
        },
1059 8d08f18a Kostas Papadimitriou
1060 8d08f18a Kostas Papadimitriou
        submit: function() {
1061 820ef2f0 Kostas Papadimitriou
            if (this.submiting) { return };
1062 8d08f18a Kostas Papadimitriou
            var data = this.get_params();
1063 73e25ce2 Kostas Papadimitriou
            var meta = {};
1064 47276ec2 Kostas Papadimitriou
            var extra = {};
1065 47276ec2 Kostas Papadimitriou
            var personality = [];
1066 47276ec2 Kostas Papadimitriou
1067 8d08f18a Kostas Papadimitriou
            if (this.validate(data)) {
1068 8d08f18a Kostas Papadimitriou
                this.submit_btn.addClass("in-progress");
1069 820ef2f0 Kostas Papadimitriou
                this.submiting = true;
1070 73e25ce2 Kostas Papadimitriou
                if (data.metadata) { meta = data.metadata; }
1071 47276ec2 Kostas Papadimitriou
                if (data.keys && data.keys.length > 0) {
1072 47276ec2 Kostas Papadimitriou
                    personality.push(data.image.personality_data_for_keys(data.keys))
1073 47276ec2 Kostas Papadimitriou
                }
1074 47276ec2 Kostas Papadimitriou
1075 47276ec2 Kostas Papadimitriou
                extra['personality'] = personality;
1076 47276ec2 Kostas Papadimitriou
                storage.vms.create(data.name, data.image, data.flavor, meta, extra, _.bind(function(data){
1077 8d08f18a Kostas Papadimitriou
                    this.close_all();
1078 820ef2f0 Kostas Papadimitriou
                    this.password_view.show(data.server.adminPass, data.server.id);
1079 820ef2f0 Kostas Papadimitriou
                    this.submiting = false;
1080 8d08f18a Kostas Papadimitriou
                }, this));
1081 8d08f18a Kostas Papadimitriou
            }
1082 8d08f18a Kostas Papadimitriou
        },
1083 8d08f18a Kostas Papadimitriou
1084 8d08f18a Kostas Papadimitriou
        close_all: function() {
1085 8d08f18a Kostas Papadimitriou
            this.hide();
1086 8d08f18a Kostas Papadimitriou
        },
1087 8d08f18a Kostas Papadimitriou
1088 8d08f18a Kostas Papadimitriou
        reset: function() {
1089 8d08f18a Kostas Papadimitriou
            this.current_step = 1;
1090 b128dc09 Kostas Papadimitriou
1091 8d08f18a Kostas Papadimitriou
            this.steps[1].reset();
1092 8d08f18a Kostas Papadimitriou
            this.steps[2].reset();
1093 8d08f18a Kostas Papadimitriou
            this.steps[3].reset();
1094 47276ec2 Kostas Papadimitriou
            this.steps[4].reset();
1095 8d08f18a Kostas Papadimitriou
1096 b128dc09 Kostas Papadimitriou
            this.steps[1].show();
1097 b128dc09 Kostas Papadimitriou
            this.steps[2].show();
1098 b128dc09 Kostas Papadimitriou
            this.steps[3].show();
1099 47276ec2 Kostas Papadimitriou
            this.steps[4].show();
1100 b128dc09 Kostas Papadimitriou
1101 8d08f18a Kostas Papadimitriou
            this.submit_btn.removeClass("in-progress");
1102 8d08f18a Kostas Papadimitriou
        },
1103 8d08f18a Kostas Papadimitriou
1104 8d08f18a Kostas Papadimitriou
        onShow: function() {
1105 8d08f18a Kostas Papadimitriou
            this.reset()
1106 8d08f18a Kostas Papadimitriou
            this.update_layout();
1107 8d08f18a Kostas Papadimitriou
        },
1108 8d08f18a Kostas Papadimitriou
1109 8d08f18a Kostas Papadimitriou
        update_layout: function() {
1110 8d08f18a Kostas Papadimitriou
            this.show_step(this.current_step);
1111 8d08f18a Kostas Papadimitriou
            this.current_view.update_layout();
1112 8d08f18a Kostas Papadimitriou
        },
1113 8d08f18a Kostas Papadimitriou
1114 8d08f18a Kostas Papadimitriou
        beforeOpen: function() {
1115 47276ec2 Kostas Papadimitriou
            if (!this.skip_reset_on_next_open) {
1116 47276ec2 Kostas Papadimitriou
                this.submiting = false;
1117 47276ec2 Kostas Papadimitriou
                this.reset();
1118 47276ec2 Kostas Papadimitriou
                this.current_step = 1;
1119 47276ec2 Kostas Papadimitriou
                this.$(".steps-container").css({"margin-left":0 + "px"});
1120 47276ec2 Kostas Papadimitriou
                this.show_step(1);
1121 47276ec2 Kostas Papadimitriou
            }
1122 47276ec2 Kostas Papadimitriou
            
1123 47276ec2 Kostas Papadimitriou
            this.skip_reset_on_next_open = false;
1124 47276ec2 Kostas Papadimitriou
            this.update_layout();
1125 8d08f18a Kostas Papadimitriou
        },
1126 b128dc09 Kostas Papadimitriou
        
1127 b128dc09 Kostas Papadimitriou
        set_step: function(step) {
1128 8d08f18a Kostas Papadimitriou
            if (step <= 1) {
1129 8d08f18a Kostas Papadimitriou
                step = 1
1130 8d08f18a Kostas Papadimitriou
            }
1131 8d08f18a Kostas Papadimitriou
            if (step > this.steps.length - 1) {
1132 8d08f18a Kostas Papadimitriou
                step = this.steps.length - 1;
1133 8d08f18a Kostas Papadimitriou
            }
1134 bd8fa10c Kostas Papadimitriou
            this.current_step = step;
1135 b128dc09 Kostas Papadimitriou
        },
1136 b128dc09 Kostas Papadimitriou
1137 b128dc09 Kostas Papadimitriou
        show_step: function(step) {
1138 bd8fa10c Kostas Papadimitriou
            this.current_view = this.steps[step];
1139 bd8fa10c Kostas Papadimitriou
            this.update_controls();
1140 bd8fa10c Kostas Papadimitriou
1141 b128dc09 Kostas Papadimitriou
            this.steps[step].show();
1142 820ef2f0 Kostas Papadimitriou
            var width = this.el.find('.container').width();
1143 820ef2f0 Kostas Papadimitriou
            var left = (step -1) * width * -1;
1144 1325fc64 Kostas Papadimitriou
            this.$(".steps-container").animate({"margin-left": left + "px"}, 300);
1145 1325fc64 Kostas Papadimitriou
1146 1325fc64 Kostas Papadimitriou
            this.update_steps_history();
1147 1325fc64 Kostas Papadimitriou
        },
1148 1325fc64 Kostas Papadimitriou
1149 1325fc64 Kostas Papadimitriou
        update_steps_history: function() {
1150 1325fc64 Kostas Papadimitriou
            var self = this;
1151 1325fc64 Kostas Papadimitriou
            function get_step(s) {
1152 1325fc64 Kostas Papadimitriou
                return self.history.find(".step" + s + "h");
1153 1325fc64 Kostas Papadimitriou
            }
1154 1325fc64 Kostas Papadimitriou
            
1155 1325fc64 Kostas Papadimitriou
            var current_step = parseInt(this.current_view.step);
1156 1325fc64 Kostas Papadimitriou
            _.each(this.steps, function(stepv) {
1157 1325fc64 Kostas Papadimitriou
                var step = parseInt(stepv.step);
1158 1325fc64 Kostas Papadimitriou
                get_step(step).removeClass("completed").removeClass("current");
1159 1325fc64 Kostas Papadimitriou
                if (step == current_step) {
1160 1325fc64 Kostas Papadimitriou
                    get_step(step).removeClass("completed").addClass("current");
1161 1325fc64 Kostas Papadimitriou
                }
1162 1325fc64 Kostas Papadimitriou
                if (step < current_step) {
1163 1325fc64 Kostas Papadimitriou
                    get_step(step).removeClass("current").addClass("completed");
1164 1325fc64 Kostas Papadimitriou
                }
1165 1325fc64 Kostas Papadimitriou
            });
1166 8d08f18a Kostas Papadimitriou
        },
1167 8d08f18a Kostas Papadimitriou
1168 8d08f18a Kostas Papadimitriou
        update_controls: function() {
1169 8d08f18a Kostas Papadimitriou
            var step = this.current_step;
1170 8d08f18a Kostas Papadimitriou
            if (step == 1) {
1171 8d08f18a Kostas Papadimitriou
                this.prev_btn.hide();
1172 8d08f18a Kostas Papadimitriou
                this.cancel_btn.show();
1173 8d08f18a Kostas Papadimitriou
            } else {
1174 8d08f18a Kostas Papadimitriou
                this.prev_btn.show();
1175 8d08f18a Kostas Papadimitriou
                this.cancel_btn.hide();
1176 8d08f18a Kostas Papadimitriou
            }
1177 8d08f18a Kostas Papadimitriou
            
1178 8d08f18a Kostas Papadimitriou
            if (step == this.steps.length - 1) {
1179 8d08f18a Kostas Papadimitriou
                this.next_btn.hide();
1180 8d08f18a Kostas Papadimitriou
                this.submit_btn.show();
1181 8d08f18a Kostas Papadimitriou
            } else {
1182 8d08f18a Kostas Papadimitriou
                this.next_btn.show();
1183 8d08f18a Kostas Papadimitriou
                this.submit_btn.hide();
1184 8d08f18a Kostas Papadimitriou
            }
1185 8d08f18a Kostas Papadimitriou
        },
1186 8d08f18a Kostas Papadimitriou
1187 8d08f18a Kostas Papadimitriou
        get_params: function() {
1188 8d08f18a Kostas Papadimitriou
            return _.extend({}, this.steps[1].get(), this.steps[2].get(), this.steps[3].get());
1189 8d08f18a Kostas Papadimitriou
        }
1190 8d08f18a Kostas Papadimitriou
    });
1191 8d08f18a Kostas Papadimitriou
    
1192 8d08f18a Kostas Papadimitriou
})(this);