Statistics
| Branch: | Tag: | Revision:

root / ui / static / snf / js / ui / web / ui_create_view.js @ a1dbcae1

History | View | Annotate | Download (27.9 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 60599850 Kostas Papadimitriou
34 60599850 Kostas Papadimitriou
            this.$(".show-machine").click(_.bind(function(){
35 60599850 Kostas Papadimitriou
                this.hide();
36 60599850 Kostas Papadimitriou
                snf.ui.main.show_vm_details(storage.vms.get(this.vm_id));
37 60599850 Kostas Papadimitriou
            }, this));
38 8d08f18a Kostas Papadimitriou
        },
39 8d08f18a Kostas Papadimitriou
        
40 8d08f18a Kostas Papadimitriou
        show_password: function() {
41 8d08f18a Kostas Papadimitriou
            this.password.text(this.pass);
42 8d08f18a Kostas Papadimitriou
        },
43 8d08f18a Kostas Papadimitriou
44 8d08f18a Kostas Papadimitriou
        onClose: function() {
45 8d08f18a Kostas Papadimitriou
            this.password.text("");
46 8d08f18a Kostas Papadimitriou
        },
47 8d08f18a Kostas Papadimitriou
            
48 8d08f18a Kostas Papadimitriou
        show: function(pass, vm_id) {
49 8d08f18a Kostas Papadimitriou
            this.pass = pass;
50 8d08f18a Kostas Papadimitriou
            this.vm_id = vm_id;
51 8d08f18a Kostas Papadimitriou
52 8d08f18a Kostas Papadimitriou
            views.VMCreationPasswordView.__super__.show.apply(this, arguments);
53 8d08f18a Kostas Papadimitriou
            this.show_password();
54 8d08f18a Kostas Papadimitriou
        }
55 8d08f18a Kostas Papadimitriou
    })
56 8d08f18a Kostas Papadimitriou
57 8d08f18a Kostas Papadimitriou
58 8d08f18a Kostas Papadimitriou
    
59 8d08f18a Kostas Papadimitriou
    views.CreateVMStepView = views.View.extend({
60 8d08f18a Kostas Papadimitriou
        step: "1",
61 8d08f18a Kostas Papadimitriou
        title: "Image",
62 8d08f18a Kostas Papadimitriou
        submit: false,
63 8d08f18a Kostas Papadimitriou
64 8d08f18a Kostas Papadimitriou
        initialize: function(view) {
65 8d08f18a Kostas Papadimitriou
            this.parent = view;
66 8d08f18a Kostas Papadimitriou
            this.el = view.$("div.create-step-cont.step-" + this.step);
67 820ef2f0 Kostas Papadimitriou
            this.header = this.$(".step-header .step-" + this.step);
68 8d08f18a Kostas Papadimitriou
            this.view_id = "create_step_" + this.step;
69 8d08f18a Kostas Papadimitriou
70 8d08f18a Kostas Papadimitriou
            views.CreateVMStepView.__super__.initialize.apply(this);
71 8d08f18a Kostas Papadimitriou
        },
72 8d08f18a Kostas Papadimitriou
73 8d08f18a Kostas Papadimitriou
        show: function() {
74 8d08f18a Kostas Papadimitriou
            // show current
75 8d08f18a Kostas Papadimitriou
            this.el.show();
76 8d08f18a Kostas Papadimitriou
            this.header.addClass("current");
77 820ef2f0 Kostas Papadimitriou
            this.header.show();
78 8d08f18a Kostas Papadimitriou
            this.update_layout();
79 8d08f18a Kostas Papadimitriou
        },
80 8d08f18a Kostas Papadimitriou
81 8d08f18a Kostas Papadimitriou
        reset: function() {
82 8d08f18a Kostas Papadimitriou
        }
83 8d08f18a Kostas Papadimitriou
    })
84 8d08f18a Kostas Papadimitriou
85 8d08f18a Kostas Papadimitriou
    views.CreateImageSelectView = views.CreateVMStepView.extend({
86 8d08f18a Kostas Papadimitriou
87 8d08f18a Kostas Papadimitriou
        initialize: function() {
88 8d08f18a Kostas Papadimitriou
            views.CreateImageSelectView.__super__.initialize.apply(this, arguments);
89 8d08f18a Kostas Papadimitriou
90 820ef2f0 Kostas Papadimitriou
            // elements
91 73e25ce2 Kostas Papadimitriou
            this.images_list_cont = this.$(".images-list-cont");
92 820ef2f0 Kostas Papadimitriou
            this.images_list = this.$(".images-list-cont ul");
93 820ef2f0 Kostas Papadimitriou
            this.image_details = this.$(".images-info-cont");
94 820ef2f0 Kostas Papadimitriou
            this.image_details_desc = this.$(".images-info-cont .description p");
95 820ef2f0 Kostas Papadimitriou
            this.image_details_title = this.$(".images-info-cont h4");
96 820ef2f0 Kostas Papadimitriou
            this.image_details_size = this.$(".images-info-cont .size p");
97 820ef2f0 Kostas Papadimitriou
            this.image_details_os = this.$(".images-info-cont .os p");
98 820ef2f0 Kostas Papadimitriou
            this.image_details_kernel = this.$(".images-info-cont .kernel p");
99 820ef2f0 Kostas Papadimitriou
            this.image_details_gui = this.$(".images-info-cont .gui p");
100 820ef2f0 Kostas Papadimitriou
101 820ef2f0 Kostas Papadimitriou
            this.types = this.$(".type-filter li");
102 820ef2f0 Kostas Papadimitriou
            this.categories_list = this.$(".category-filters");
103 820ef2f0 Kostas Papadimitriou
104 820ef2f0 Kostas Papadimitriou
            // params initialization
105 820ef2f0 Kostas Papadimitriou
            this.type_selections = ["system", "custom"]
106 820ef2f0 Kostas Papadimitriou
            this.selected_type = "system";
107 820ef2f0 Kostas Papadimitriou
            this.selected_categories = [];
108 820ef2f0 Kostas Papadimitriou
            this.images = [];
109 820ef2f0 Kostas Papadimitriou
110 820ef2f0 Kostas Papadimitriou
            // update
111 820ef2f0 Kostas Papadimitriou
            this.update_images();
112 820ef2f0 Kostas Papadimitriou
113 820ef2f0 Kostas Papadimitriou
            // handlers initialization
114 820ef2f0 Kostas Papadimitriou
            this.init_handlers();
115 820ef2f0 Kostas Papadimitriou
            this.init_position();
116 820ef2f0 Kostas Papadimitriou
        },
117 820ef2f0 Kostas Papadimitriou
118 820ef2f0 Kostas Papadimitriou
        init_position: function() {
119 820ef2f0 Kostas Papadimitriou
            //this.el.css({position: "absolute"});
120 820ef2f0 Kostas Papadimitriou
            //this.el.css({top:"10px"})
121 820ef2f0 Kostas Papadimitriou
        },
122 820ef2f0 Kostas Papadimitriou
        
123 820ef2f0 Kostas Papadimitriou
        init_handlers: function() {
124 820ef2f0 Kostas Papadimitriou
            var self = this;
125 820ef2f0 Kostas Papadimitriou
            this.types.live("click", function() {
126 820ef2f0 Kostas Papadimitriou
                self.select_type($(this).attr("id").replace("type-select-",""));
127 820ef2f0 Kostas Papadimitriou
            })
128 820ef2f0 Kostas Papadimitriou
        },
129 820ef2f0 Kostas Papadimitriou
130 820ef2f0 Kostas Papadimitriou
        update_images: function() {
131 820ef2f0 Kostas Papadimitriou
            this.images = storage.images.active();
132 820ef2f0 Kostas Papadimitriou
            this.images_ids = _.map(this.images, function(img){return img.id});
133 820ef2f0 Kostas Papadimitriou
            if (this.selected_type == "custom") { this.images = []; this.images_ids = []; }
134 820ef2f0 Kostas Papadimitriou
135 820ef2f0 Kostas Papadimitriou
            return this.images;
136 8d08f18a Kostas Papadimitriou
        },
137 8d08f18a Kostas Papadimitriou
138 8d08f18a Kostas Papadimitriou
        update_layout: function() {
139 820ef2f0 Kostas Papadimitriou
            this.select_type(this.selected_type);
140 820ef2f0 Kostas Papadimitriou
        },
141 820ef2f0 Kostas Papadimitriou
        
142 820ef2f0 Kostas Papadimitriou
        get_categories: function(images) {
143 820ef2f0 Kostas Papadimitriou
            return [];
144 820ef2f0 Kostas Papadimitriou
            return ["Desktop", "Server", "Linux", "Windows"];
145 820ef2f0 Kostas Papadimitriou
        },
146 820ef2f0 Kostas Papadimitriou
147 820ef2f0 Kostas Papadimitriou
        reset_categories: function() {
148 820ef2f0 Kostas Papadimitriou
            var categories = this.get_categories(this.images);
149 820ef2f0 Kostas Papadimitriou
            this.categories_list.find("li").remove();
150 820ef2f0 Kostas Papadimitriou
151 820ef2f0 Kostas Papadimitriou
            _.each(categories, _.bind(function(cat) {
152 820ef2f0 Kostas Papadimitriou
                var el = $("<li />");
153 820ef2f0 Kostas Papadimitriou
                el.text(cat);
154 820ef2f0 Kostas Papadimitriou
                this.categories_list.append(el);
155 820ef2f0 Kostas Papadimitriou
            }, this));
156 820ef2f0 Kostas Papadimitriou
157 820ef2f0 Kostas Papadimitriou
            if (!categories.length) { 
158 820ef2f0 Kostas Papadimitriou
                this.categories_list.parent().find(".clear").hide();
159 820ef2f0 Kostas Papadimitriou
                this.categories_list.parent().find(".empty").show();
160 820ef2f0 Kostas Papadimitriou
            } else {
161 820ef2f0 Kostas Papadimitriou
                this.categories_list.parent().find(".clear").show();
162 820ef2f0 Kostas Papadimitriou
                this.categories_list.parent().find(".empty").hide();
163 820ef2f0 Kostas Papadimitriou
            }
164 820ef2f0 Kostas Papadimitriou
        },
165 820ef2f0 Kostas Papadimitriou
        
166 820ef2f0 Kostas Papadimitriou
        select_type: function(type) {
167 820ef2f0 Kostas Papadimitriou
            this.selected_type = type;
168 820ef2f0 Kostas Papadimitriou
            this.types.removeClass("selected");
169 820ef2f0 Kostas Papadimitriou
            this.types.filter("#type-select-" + this.selected_type).addClass("selected");
170 820ef2f0 Kostas Papadimitriou
171 820ef2f0 Kostas Papadimitriou
            this.reset_categories();
172 820ef2f0 Kostas Papadimitriou
            this.update_images();
173 820ef2f0 Kostas Papadimitriou
            this.reset_images();
174 820ef2f0 Kostas Papadimitriou
            this.select_image();
175 8d08f18a Kostas Papadimitriou
        },
176 8d08f18a Kostas Papadimitriou
177 8d08f18a Kostas Papadimitriou
        select_image: function(image) {
178 820ef2f0 Kostas Papadimitriou
            if (!image && this.images_ids.length) {
179 820ef2f0 Kostas Papadimitriou
                if (this.selected_image && this.images_ids.indexOf(this.selected_image.id) > -1) {
180 820ef2f0 Kostas Papadimitriou
                    image = this.selected_image;
181 820ef2f0 Kostas Papadimitriou
                } else {
182 820ef2f0 Kostas Papadimitriou
                    image = storage.images.get(this.images_ids[0]);
183 820ef2f0 Kostas Papadimitriou
                }
184 8d08f18a Kostas Papadimitriou
            }
185 8d08f18a Kostas Papadimitriou
186 820ef2f0 Kostas Papadimitriou
            if (!this.images_ids.length) { image = this.selected_image || undefined };
187 820ef2f0 Kostas Papadimitriou
            
188 8d08f18a Kostas Papadimitriou
            this.selected_image = image;
189 820ef2f0 Kostas Papadimitriou
            this.trigger("change", image);
190 8d08f18a Kostas Papadimitriou
            
191 820ef2f0 Kostas Papadimitriou
            if (image) {
192 820ef2f0 Kostas Papadimitriou
                this.image_details.show();
193 820ef2f0 Kostas Papadimitriou
                this.images_list.find(".image-details").removeClass("selected");
194 820ef2f0 Kostas Papadimitriou
                this.images_list.find(".image-details#create-vm-image-" + this.selected_image.id).addClass("selected");
195 820ef2f0 Kostas Papadimitriou
                
196 820ef2f0 Kostas Papadimitriou
                this.image_details_desc.text(image.get("description"));
197 820ef2f0 Kostas Papadimitriou
                
198 820ef2f0 Kostas Papadimitriou
                var img = snf.ui.helpers.os_icon_tag(image.get("OS"))
199 820ef2f0 Kostas Papadimitriou
                this.image_details_title.html(img + image.get("name"));
200 820ef2f0 Kostas Papadimitriou
                this.image_details_os.text(_(image.get("OS")).capitalize());
201 820ef2f0 Kostas Papadimitriou
                this.image_details_kernel.text(image.get("kernel"));
202 820ef2f0 Kostas Papadimitriou
203 73e25ce2 Kostas Papadimitriou
                var size = util.readablizeBytes(parseInt(image.get("size")) * 1024 * 1024);
204 820ef2f0 Kostas Papadimitriou
                this.image_details_size.text(size);
205 820ef2f0 Kostas Papadimitriou
                this.image_details_gui.text(image.get("GUI"));
206 820ef2f0 Kostas Papadimitriou
207 820ef2f0 Kostas Papadimitriou
            } else {
208 820ef2f0 Kostas Papadimitriou
                this.image_details.hide();
209 820ef2f0 Kostas Papadimitriou
            }
210 8d08f18a Kostas Papadimitriou
        },
211 8d08f18a Kostas Papadimitriou
212 8d08f18a Kostas Papadimitriou
        reset_images: function() {
213 820ef2f0 Kostas Papadimitriou
            this.images_list.find("li").remove();
214 820ef2f0 Kostas Papadimitriou
            _.each(this.images, _.bind(function(img){
215 8d08f18a Kostas Papadimitriou
                this.add_image(img);
216 8d08f18a Kostas Papadimitriou
            }, this))
217 820ef2f0 Kostas Papadimitriou
            
218 820ef2f0 Kostas Papadimitriou
            if (this.images.length) {
219 820ef2f0 Kostas Papadimitriou
                this.images_list.parent().find(".empty").hide();
220 820ef2f0 Kostas Papadimitriou
            } else {
221 820ef2f0 Kostas Papadimitriou
                this.images_list.parent().find(".empty").show();
222 820ef2f0 Kostas Papadimitriou
            }
223 8d08f18a Kostas Papadimitriou
224 8d08f18a Kostas Papadimitriou
            this.select_image();
225 8d08f18a Kostas Papadimitriou
            
226 8d08f18a Kostas Papadimitriou
            var self = this;
227 820ef2f0 Kostas Papadimitriou
            this.images_list.find(".image-details").click(function(){
228 8d08f18a Kostas Papadimitriou
                self.select_image($(this).data("image"));
229 820ef2f0 Kostas Papadimitriou
            });
230 820ef2f0 Kostas Papadimitriou
            
231 820ef2f0 Kostas Papadimitriou
        },
232 820ef2f0 Kostas Papadimitriou
233 820ef2f0 Kostas Papadimitriou
        show: function() {
234 820ef2f0 Kostas Papadimitriou
            views.CreateImageSelectView.__super__.show.apply(this, arguments);
235 8d08f18a Kostas Papadimitriou
        },
236 8d08f18a Kostas Papadimitriou
237 8d08f18a Kostas Papadimitriou
        add_image: function(img) {
238 820ef2f0 Kostas Papadimitriou
            var image = $(('<li id="create-vm-image-{1}"' +
239 820ef2f0 Kostas Papadimitriou
                           'class="image-details clearfix">{2}{0}' +
240 820ef2f0 Kostas Papadimitriou
                           '<p>{4}</p><span class="size">{3}' +
241 820ef2f0 Kostas Papadimitriou
                           '</span></li>').format(img.get("name"), 
242 820ef2f0 Kostas Papadimitriou
                                                  img.id, 
243 820ef2f0 Kostas Papadimitriou
                                                  snf.ui.helpers.os_icon_tag(img.get("OS")),
244 73e25ce2 Kostas Papadimitriou
                                                  util.readablizeBytes(parseInt(img.get("size"))* 1024 * 1024),
245 820ef2f0 Kostas Papadimitriou
                                                  util.truncate(img.get("description"),35)));
246 8d08f18a Kostas Papadimitriou
            image.data("image", img);
247 8d08f18a Kostas Papadimitriou
            image.data("image_id", img.id);
248 820ef2f0 Kostas Papadimitriou
            this.images_list.append(image);
249 8d08f18a Kostas Papadimitriou
        },
250 8d08f18a Kostas Papadimitriou
251 8d08f18a Kostas Papadimitriou
        reset: function() {
252 8d08f18a Kostas Papadimitriou
            this.selected_image = undefined;
253 8d08f18a Kostas Papadimitriou
            this.reset_images();
254 8d08f18a Kostas Papadimitriou
        },
255 8d08f18a Kostas Papadimitriou
256 8d08f18a Kostas Papadimitriou
        get: function() {
257 8d08f18a Kostas Papadimitriou
            return {'image': this.selected_image};
258 8d08f18a Kostas Papadimitriou
        }
259 8d08f18a Kostas Papadimitriou
    });
260 8d08f18a Kostas Papadimitriou
261 8d08f18a Kostas Papadimitriou
    views.CreateFlavorSelectView = views.CreateVMStepView.extend({
262 8d08f18a Kostas Papadimitriou
        step: 2,
263 8d08f18a Kostas Papadimitriou
        initialize: function() {
264 8d08f18a Kostas Papadimitriou
            views.CreateFlavorSelectView.__super__.initialize.apply(this, arguments);
265 8d08f18a Kostas Papadimitriou
            this.parent.bind("image:change", _.bind(this.handle_image_change, this));
266 8d08f18a Kostas Papadimitriou
267 820ef2f0 Kostas Papadimitriou
            this.cpus = this.$(".flavors-cpu-list");
268 820ef2f0 Kostas Papadimitriou
            this.disks = this.$(".flavors-disk-list");
269 820ef2f0 Kostas Papadimitriou
            this.mems = this.$(".flavors-mem-list");
270 8d08f18a Kostas Papadimitriou
271 820ef2f0 Kostas Papadimitriou
            this.predefined_flavors = SUGGESTED_FLAVORS;
272 820ef2f0 Kostas Papadimitriou
            this.predefined = this.$(".predefined-list");
273 820ef2f0 Kostas Papadimitriou
            this.update_predefined_flavors();
274 8d08f18a Kostas Papadimitriou
        },
275 8d08f18a Kostas Papadimitriou
276 8d08f18a Kostas Papadimitriou
        handle_image_change: function(data) {
277 8d08f18a Kostas Papadimitriou
            this.current_image = data;
278 820ef2f0 Kostas Papadimitriou
            this.update_valid_predefined();
279 8d08f18a Kostas Papadimitriou
            this.update_flavors_data();
280 8d08f18a Kostas Papadimitriou
            this.reset_flavors();
281 8d08f18a Kostas Papadimitriou
            this.update_layout();
282 8d08f18a Kostas Papadimitriou
        },
283 8d08f18a Kostas Papadimitriou
284 8d08f18a Kostas Papadimitriou
        reset_flavors: function() {
285 8d08f18a Kostas Papadimitriou
            this.$(".flavor-opts-list .option").remove();
286 8d08f18a Kostas Papadimitriou
            this.create_flavors();
287 8d08f18a Kostas Papadimitriou
        },
288 8d08f18a Kostas Papadimitriou
289 820ef2f0 Kostas Papadimitriou
        update_predefined_flavors: function() {
290 820ef2f0 Kostas Papadimitriou
            this.predefined.find("li").remove();
291 820ef2f0 Kostas Papadimitriou
            _.each(this.predefined_flavors, _.bind(function(val, key) {
292 820ef2f0 Kostas Papadimitriou
                var el = $(('<li class="predefined-selection" id="predefined-flavor-{0}">' +
293 820ef2f0 Kostas Papadimitriou
                           '{1}</li>').format(key, key));
294 820ef2f0 Kostas Papadimitriou
295 820ef2f0 Kostas Papadimitriou
                this.predefined.append(el);
296 820ef2f0 Kostas Papadimitriou
                el.data({flavor: storage.flavors.get_flavor(val.cpu, val.ram, val.disk, this.flavors)})
297 820ef2f0 Kostas Papadimitriou
                el.click(_.bind(function() {
298 820ef2f0 Kostas Papadimitriou
                    this.handle_predefined_click(el);
299 820ef2f0 Kostas Papadimitriou
                }, this))
300 820ef2f0 Kostas Papadimitriou
            }, this));
301 820ef2f0 Kostas Papadimitriou
            this.update_valid_predefined();
302 820ef2f0 Kostas Papadimitriou
        },
303 820ef2f0 Kostas Papadimitriou
304 820ef2f0 Kostas Papadimitriou
        handle_predefined_click: function(el) {
305 820ef2f0 Kostas Papadimitriou
            if (el.hasClass("disabled")) { return };
306 820ef2f0 Kostas Papadimitriou
            this.set_current(el.data("flavor"))
307 820ef2f0 Kostas Papadimitriou
        },
308 820ef2f0 Kostas Papadimitriou
309 820ef2f0 Kostas Papadimitriou
        update_valid_predefined: function() {
310 820ef2f0 Kostas Papadimitriou
            this.update_unavailable_values();
311 820ef2f0 Kostas Papadimitriou
            var self = this;
312 820ef2f0 Kostas Papadimitriou
            this.valid_predefined = _.select(_.map(this.predefined_flavors, function(flv, key){
313 820ef2f0 Kostas Papadimitriou
                var existing = storage.flavors.get_flavor(flv.cpu, flv.ram, flv.disk, self.flavors);
314 820ef2f0 Kostas Papadimitriou
                // non existing
315 820ef2f0 Kostas Papadimitriou
                if (!existing) {
316 820ef2f0 Kostas Papadimitriou
                    return false;
317 820ef2f0 Kostas Papadimitriou
                }
318 820ef2f0 Kostas Papadimitriou
                
319 820ef2f0 Kostas Papadimitriou
                // not available for image
320 820ef2f0 Kostas Papadimitriou
                if (self.unavailable_values && self.unavailable_values.disk.indexOf(existing.get_disk_size()) > -1) {
321 820ef2f0 Kostas Papadimitriou
                    return false
322 820ef2f0 Kostas Papadimitriou
                }
323 820ef2f0 Kostas Papadimitriou
324 820ef2f0 Kostas Papadimitriou
                return key;
325 820ef2f0 Kostas Papadimitriou
            }), function(ret) { return ret });
326 820ef2f0 Kostas Papadimitriou
            
327 820ef2f0 Kostas Papadimitriou
            $("li.predefined-selection").addClass("disabled");
328 820ef2f0 Kostas Papadimitriou
            _.each(this.valid_predefined, function(key) {
329 820ef2f0 Kostas Papadimitriou
                $("#predefined-flavor-" + key).removeClass("disabled");
330 820ef2f0 Kostas Papadimitriou
            })
331 820ef2f0 Kostas Papadimitriou
        },
332 820ef2f0 Kostas Papadimitriou
333 820ef2f0 Kostas Papadimitriou
        update_selected_predefined: function() {
334 820ef2f0 Kostas Papadimitriou
            var self = this;
335 820ef2f0 Kostas Papadimitriou
            this.predefined.find("li").removeClass("selected");
336 820ef2f0 Kostas Papadimitriou
337 820ef2f0 Kostas Papadimitriou
            _.each(this.valid_predefined, function(key){
338 820ef2f0 Kostas Papadimitriou
                var flv = self.predefined_flavors[key];
339 820ef2f0 Kostas Papadimitriou
                var exists = storage.flavors.get_flavor(flv.cpu, flv.ram, flv.disk, self.flavors);
340 820ef2f0 Kostas Papadimitriou
341 820ef2f0 Kostas Papadimitriou
                if (exists && (exists.id == self.current_flavor.id)) {
342 820ef2f0 Kostas Papadimitriou
                    $("#predefined-flavor-" + key).addClass("selected");
343 820ef2f0 Kostas Papadimitriou
                }
344 820ef2f0 Kostas Papadimitriou
            })
345 820ef2f0 Kostas Papadimitriou
        },
346 820ef2f0 Kostas Papadimitriou
        
347 8d08f18a Kostas Papadimitriou
        update_flavors_data: function() {
348 820ef2f0 Kostas Papadimitriou
            this.flavors = storage.flavors.active();
349 8d08f18a Kostas Papadimitriou
            this.flavors_data = storage.flavors.get_data(this.flavors);
350 820ef2f0 Kostas Papadimitriou
            
351 820ef2f0 Kostas Papadimitriou
            var self = this;
352 820ef2f0 Kostas Papadimitriou
            var set = false;
353 820ef2f0 Kostas Papadimitriou
            
354 820ef2f0 Kostas Papadimitriou
            // FIXME: validate current flavor
355 820ef2f0 Kostas Papadimitriou
            
356 820ef2f0 Kostas Papadimitriou
            if (!this.current_flavor) {
357 820ef2f0 Kostas Papadimitriou
                _.each(this.valid_predefined, function(key) {
358 820ef2f0 Kostas Papadimitriou
                    var flv = self.predefined_flavors[key];
359 820ef2f0 Kostas Papadimitriou
                    var exists = storage.flavors.get_flavor(flv.cpu, flv.ram, flv.disk, self.flavors);
360 820ef2f0 Kostas Papadimitriou
                    if (exists && !set) {
361 820ef2f0 Kostas Papadimitriou
                        self.set_current(exists);
362 820ef2f0 Kostas Papadimitriou
                        set = true;
363 820ef2f0 Kostas Papadimitriou
                    }
364 820ef2f0 Kostas Papadimitriou
                })
365 8d08f18a Kostas Papadimitriou
            }
366 820ef2f0 Kostas Papadimitriou
367 820ef2f0 Kostas Papadimitriou
            this.update_unavailable_values();
368 8d08f18a Kostas Papadimitriou
        },
369 8d08f18a Kostas Papadimitriou
370 820ef2f0 Kostas Papadimitriou
        update_unavailable_values: function() {
371 820ef2f0 Kostas Papadimitriou
            if (!this.current_image) { this.unavailable_values = {disk:[], ram:[], cpu:[]}; return };
372 820ef2f0 Kostas Papadimitriou
            this.unavailable_values = storage.flavors.unavailable_values_for_image(this.current_image);
373 820ef2f0 Kostas Papadimitriou
        },
374 820ef2f0 Kostas Papadimitriou
        
375 820ef2f0 Kostas Papadimitriou
        flavor_is_valid: function(flv) {
376 820ef2f0 Kostas Papadimitriou
            if (!flv) { return false };
377 820ef2f0 Kostas Papadimitriou
            var existing = storage.flavors.get_flavor(flv.get("cpu"), flv.get("ram"), flv.get("disk"), this.flavors);
378 820ef2f0 Kostas Papadimitriou
            if (!existing) { return false };
379 820ef2f0 Kostas Papadimitriou
            if (this.unavailable_values && this.unavailable_values.disk.indexOf(flv.get("disk") > -1)) {
380 820ef2f0 Kostas Papadimitriou
                return false
381 820ef2f0 Kostas Papadimitriou
            }
382 820ef2f0 Kostas Papadimitriou
            return true;
383 820ef2f0 Kostas Papadimitriou
        },
384 820ef2f0 Kostas Papadimitriou
            
385 8d08f18a Kostas Papadimitriou
        set_current: function(flv) {
386 820ef2f0 Kostas Papadimitriou
            //console.log(flv);
387 820ef2f0 Kostas Papadimitriou
            //if (!this.flavor_is_valid(flv)) { flv = undefined };
388 820ef2f0 Kostas Papadimitriou
            
389 820ef2f0 Kostas Papadimitriou
            console.log(flv);
390 8d08f18a Kostas Papadimitriou
            this.current_flavor = flv;
391 8d08f18a Kostas Papadimitriou
            this.trigger("change");
392 8d08f18a Kostas Papadimitriou
            this.update_selected_flavor();
393 820ef2f0 Kostas Papadimitriou
            this.update_selected_predefined();
394 820ef2f0 Kostas Papadimitriou
        },
395 820ef2f0 Kostas Papadimitriou
        
396 820ef2f0 Kostas Papadimitriou
        select_default_flavor: function() {
397 820ef2f0 Kostas Papadimitriou
               
398 820ef2f0 Kostas Papadimitriou
        },
399 820ef2f0 Kostas Papadimitriou
400 820ef2f0 Kostas Papadimitriou
        update_selected_from_ui: function() {
401 820ef2f0 Kostas Papadimitriou
            this.set_current(this.ui_selected());
402 820ef2f0 Kostas Papadimitriou
        },
403 820ef2f0 Kostas Papadimitriou
        
404 820ef2f0 Kostas Papadimitriou
        update_disabled_flavors: function() {
405 820ef2f0 Kostas Papadimitriou
            this.$(".flavor-options.disk li").removeClass("disabled");
406 820ef2f0 Kostas Papadimitriou
            if (!this.unavailable_values) { return }
407 820ef2f0 Kostas Papadimitriou
408 820ef2f0 Kostas Papadimitriou
            this.$(".flavor-options.disk li").each(_.bind(function(i, el){
409 73e25ce2 Kostas Papadimitriou
                var el_value = $(el).data("value") * 1024;
410 820ef2f0 Kostas Papadimitriou
                if (this.unavailable_values.disk.indexOf(el_value) > -1) {
411 820ef2f0 Kostas Papadimitriou
                    $(el).addClass("disabled");
412 820ef2f0 Kostas Papadimitriou
                };
413 820ef2f0 Kostas Papadimitriou
            }, this));
414 8d08f18a Kostas Papadimitriou
        },
415 8d08f18a Kostas Papadimitriou
416 8d08f18a Kostas Papadimitriou
        create_flavors: function() {
417 820ef2f0 Kostas Papadimitriou
            var flavors = this.get_active_flavors();
418 820ef2f0 Kostas Papadimitriou
            var valid_flavors = this.get_valid_flavors();
419 820ef2f0 Kostas Papadimitriou
420 8d08f18a Kostas Papadimitriou
            _.each(flavors, _.bind(function(flv){
421 8d08f18a Kostas Papadimitriou
                this.add_flavor(flv);
422 8d08f18a Kostas Papadimitriou
            }, this));
423 8d08f18a Kostas Papadimitriou
            
424 8d08f18a Kostas Papadimitriou
            var self = this;
425 8d08f18a Kostas Papadimitriou
            this.$(".flavor-options li.option").click(function(){
426 8d08f18a Kostas Papadimitriou
                var el = $(this);
427 820ef2f0 Kostas Papadimitriou
428 820ef2f0 Kostas Papadimitriou
                if (el.hasClass("disabled")) { return }
429 820ef2f0 Kostas Papadimitriou
430 8d08f18a Kostas Papadimitriou
                el.parent().find(".option").removeClass("selected");
431 8d08f18a Kostas Papadimitriou
                el.addClass("selected");
432 820ef2f0 Kostas Papadimitriou
                
433 820ef2f0 Kostas Papadimitriou
                if (el.hasClass("mem")) { this.last_choice = "mem" }
434 820ef2f0 Kostas Papadimitriou
                if (el.hasClass("cpu")) { this.last_choice = "cpu" }
435 820ef2f0 Kostas Papadimitriou
                if (el.hasClass("disk")) { this.last_choice = "disk" }
436 820ef2f0 Kostas Papadimitriou
437 8d08f18a Kostas Papadimitriou
                self.update_selected_from_ui();
438 8d08f18a Kostas Papadimitriou
            })
439 8d08f18a Kostas Papadimitriou
        },
440 8d08f18a Kostas Papadimitriou
        
441 8d08f18a Kostas Papadimitriou
        ui_selected: function() {
442 820ef2f0 Kostas Papadimitriou
            var args = [this.$(".option.cpu.selected").data("value"), 
443 8d08f18a Kostas Papadimitriou
                this.$(".option.mem.selected").data("value"), 
444 8d08f18a Kostas Papadimitriou
                this.$(".option.disk.selected").data("value"),
445 8d08f18a Kostas Papadimitriou
            this.flavors];
446 8d08f18a Kostas Papadimitriou
447 820ef2f0 Kostas Papadimitriou
            var flv = storage.flavors.get_flavor.apply(storage.flavors, args);
448 820ef2f0 Kostas Papadimitriou
            return flv;
449 8d08f18a Kostas Papadimitriou
        },
450 8d08f18a Kostas Papadimitriou
451 8d08f18a Kostas Papadimitriou
        update_selected_flavor: function() {
452 820ef2f0 Kostas Papadimitriou
            var flv = this.current_flavor;
453 820ef2f0 Kostas Papadimitriou
            this.$(".option").removeClass("selected");
454 8d08f18a Kostas Papadimitriou
455 820ef2f0 Kostas Papadimitriou
            this.$(".option.cpu.value-" + flv.get("cpu")).addClass("selected");
456 820ef2f0 Kostas Papadimitriou
            this.$(".option.mem.value-" + flv.get("ram")).addClass("selected");
457 820ef2f0 Kostas Papadimitriou
            this.$(".option.disk.value-" + flv.get("disk")).addClass("selected");
458 8d08f18a Kostas Papadimitriou
        },
459 8d08f18a Kostas Papadimitriou
460 8d08f18a Kostas Papadimitriou
        add_flavor: function(flv) {
461 8d08f18a Kostas Papadimitriou
            var values = {'cpu': flv.get('cpu'), 'mem': flv.get('ram'), 'disk': flv.get('disk')};
462 820ef2f0 Kostas Papadimitriou
463 820ef2f0 Kostas Papadimitriou
            disabled = "";
464 820ef2f0 Kostas Papadimitriou
465 8d08f18a Kostas Papadimitriou
            if (this.$('li.option.cpu.value-{0}'.format(values.cpu)).length == 0) {
466 820ef2f0 Kostas Papadimitriou
                var cpu = $(('<li class="option cpu value-{0} {1}">' + 
467 820ef2f0 Kostas Papadimitriou
                             '<span class="value">{0}</span>' + 
468 820ef2f0 Kostas Papadimitriou
                             '<span class="metric">x</span></li>').format(values.cpu, disabled)).data('value', values.cpu);
469 820ef2f0 Kostas Papadimitriou
470 8d08f18a Kostas Papadimitriou
                this.cpus.append(cpu);
471 8d08f18a Kostas Papadimitriou
            }
472 8d08f18a Kostas Papadimitriou
            if (this.$('li.option.mem.value-{0}'.format(values.mem)).length == 0) {
473 820ef2f0 Kostas Papadimitriou
                var mem = $(('<li class="option mem value-{0}">' + 
474 820ef2f0 Kostas Papadimitriou
                             '<span class="value">{0}</span>' + 
475 820ef2f0 Kostas Papadimitriou
                             '<span class="metric">MB</span></li>').format(values.mem)).data('value', values.mem);
476 820ef2f0 Kostas Papadimitriou
477 8d08f18a Kostas Papadimitriou
                this.mems.append(mem);
478 8d08f18a Kostas Papadimitriou
            }
479 8d08f18a Kostas Papadimitriou
            if (this.$('li.option.disk.value-{0}'.format(values.disk)).length == 0) {
480 820ef2f0 Kostas Papadimitriou
                var disk = $(('<li class="option disk value-{0}">' + 
481 820ef2f0 Kostas Papadimitriou
                              '<span class="value">{0}</span>' + 
482 820ef2f0 Kostas Papadimitriou
                              '<span class="metric">GB</span></li>').format(values.disk)).data('value', values.disk);
483 820ef2f0 Kostas Papadimitriou
484 8d08f18a Kostas Papadimitriou
                this.disks.append(disk);
485 8d08f18a Kostas Papadimitriou
            }
486 8d08f18a Kostas Papadimitriou
            
487 8d08f18a Kostas Papadimitriou
        },
488 820ef2f0 Kostas Papadimitriou
        
489 820ef2f0 Kostas Papadimitriou
        get_active_flavors: function() {
490 820ef2f0 Kostas Papadimitriou
            return storage.flavors.active();
491 820ef2f0 Kostas Papadimitriou
        },
492 8d08f18a Kostas Papadimitriou
493 820ef2f0 Kostas Papadimitriou
        get_valid_flavors: function() {
494 8d08f18a Kostas Papadimitriou
            return this.flavors;
495 8d08f18a Kostas Papadimitriou
        },
496 8d08f18a Kostas Papadimitriou
497 8d08f18a Kostas Papadimitriou
        update_layout: function() {
498 820ef2f0 Kostas Papadimitriou
            this.update_selected_flavor();
499 820ef2f0 Kostas Papadimitriou
            this.update_disabled_flavors();
500 8d08f18a Kostas Papadimitriou
        },
501 8d08f18a Kostas Papadimitriou
502 8d08f18a Kostas Papadimitriou
        reset: function() {
503 8d08f18a Kostas Papadimitriou
            this.current_image = storage.images.at(0);
504 8d08f18a Kostas Papadimitriou
            this.flavors = [];
505 8d08f18a Kostas Papadimitriou
            this.flavors_data = {'cpu':[], 'mem':[], 'disk':[]};
506 8d08f18a Kostas Papadimitriou
            this.update_flavors_data();
507 8d08f18a Kostas Papadimitriou
            this.reset_flavors();
508 8d08f18a Kostas Papadimitriou
        },
509 8d08f18a Kostas Papadimitriou
510 8d08f18a Kostas Papadimitriou
        get: function() {
511 8d08f18a Kostas Papadimitriou
            return {'flavor': this.current_flavor}
512 8d08f18a Kostas Papadimitriou
        }
513 8d08f18a Kostas Papadimitriou
514 8d08f18a Kostas Papadimitriou
    });
515 8d08f18a Kostas Papadimitriou
516 8d08f18a Kostas Papadimitriou
    views.CreateSubmitView = views.CreateVMStepView.extend({
517 8d08f18a Kostas Papadimitriou
        step: 3,
518 8d08f18a Kostas Papadimitriou
        initialize: function() {
519 8d08f18a Kostas Papadimitriou
            views.CreateSubmitView.__super__.initialize.apply(this, arguments);
520 73e25ce2 Kostas Papadimitriou
            this.roles = this.$("li.predefined-meta.role .values");
521 8d08f18a Kostas Papadimitriou
            this.confirm = this.$(".confirm-params ul");
522 73e25ce2 Kostas Papadimitriou
            this.name = this.$("input.rename-field");
523 8d08f18a Kostas Papadimitriou
            this.name_changed = false;
524 73e25ce2 Kostas Papadimitriou
            this.init_suggested_roles();
525 8d08f18a Kostas Papadimitriou
            this.init_handlers();
526 8d08f18a Kostas Papadimitriou
        },
527 8d08f18a Kostas Papadimitriou
528 73e25ce2 Kostas Papadimitriou
        init_suggested_roles: function() {
529 73e25ce2 Kostas Papadimitriou
            var cont = this.roles;
530 73e25ce2 Kostas Papadimitriou
            cont.empty();
531 73e25ce2 Kostas Papadimitriou
            
532 73e25ce2 Kostas Papadimitriou
            // TODO: get suggested from snf.api.conf
533 73e25ce2 Kostas Papadimitriou
            _.each(window.SUGGESTED_ROLES, function(r){
534 73e25ce2 Kostas Papadimitriou
                var el = $('<span class="val">{0}</span>'.format(r));
535 73e25ce2 Kostas Papadimitriou
                el.data("value", r);
536 73e25ce2 Kostas Papadimitriou
                cont.append(el);
537 73e25ce2 Kostas Papadimitriou
                el.click(function() {
538 73e25ce2 Kostas Papadimitriou
                    $(this).parent().find(".val").removeClass("selected");
539 73e25ce2 Kostas Papadimitriou
                    $(this).toggleClass("selected");
540 73e25ce2 Kostas Papadimitriou
                })
541 73e25ce2 Kostas Papadimitriou
            })
542 73e25ce2 Kostas Papadimitriou
        },
543 73e25ce2 Kostas Papadimitriou
544 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
545 820ef2f0 Kostas Papadimitriou
            this.name.bind("keypress", _.bind(function(e) {
546 8d08f18a Kostas Papadimitriou
                this.name_changed = true;
547 820ef2f0 Kostas Papadimitriou
                if (e.keyCode == 13) { this.parent.submit() };    
548 8d08f18a Kostas Papadimitriou
            }, this));
549 8d08f18a Kostas Papadimitriou
550 8d08f18a Kostas Papadimitriou
            this.name.bind("click", _.bind(function() {
551 8d08f18a Kostas Papadimitriou
                if (!this.name_changed) {
552 8d08f18a Kostas Papadimitriou
                    this.name.val("");
553 8d08f18a Kostas Papadimitriou
                }
554 8d08f18a Kostas Papadimitriou
            }, this))
555 8d08f18a Kostas Papadimitriou
        },
556 8d08f18a Kostas Papadimitriou
557 8d08f18a Kostas Papadimitriou
        show: function() {
558 8d08f18a Kostas Papadimitriou
            views.CreateSubmitView.__super__.show.apply(this, arguments);
559 8d08f18a Kostas Papadimitriou
            this.update_layout();
560 8d08f18a Kostas Papadimitriou
        },
561 820ef2f0 Kostas Papadimitriou
        
562 73e25ce2 Kostas Papadimitriou
        update_flavor_details: function() {
563 73e25ce2 Kostas Papadimitriou
            var flavor = this.parent.get_params().flavor;
564 73e25ce2 Kostas Papadimitriou
565 73e25ce2 Kostas Papadimitriou
            function set_detail(sel, key) {
566 73e25ce2 Kostas Papadimitriou
                var val = key;
567 73e25ce2 Kostas Papadimitriou
                if (key == undefined) { val = flavor.get(sel) };
568 73e25ce2 Kostas Papadimitriou
                this.$(".confirm-cont.flavor .flavor-" + sel + " .value").text(val)
569 73e25ce2 Kostas Papadimitriou
            }
570 73e25ce2 Kostas Papadimitriou
            
571 73e25ce2 Kostas Papadimitriou
            set_detail("cpu");
572 73e25ce2 Kostas Papadimitriou
            set_detail("ram", flavor.get("ram") + " MB");
573 73e25ce2 Kostas Papadimitriou
            set_detail("disk", util.readablizeBytes(flavor.get("disk") * 1024 * 1024 * 1024));
574 73e25ce2 Kostas Papadimitriou
        },
575 73e25ce2 Kostas Papadimitriou
576 820ef2f0 Kostas Papadimitriou
        update_image_details: function() {
577 820ef2f0 Kostas Papadimitriou
            var image = this.parent.get_params().image;
578 820ef2f0 Kostas Papadimitriou
579 73e25ce2 Kostas Papadimitriou
            function set_detail(sel, key) {
580 73e25ce2 Kostas Papadimitriou
                var val = key;
581 73e25ce2 Kostas Papadimitriou
                if (key == undefined) { val = image.get(sel) };
582 73e25ce2 Kostas Papadimitriou
                this.$(".confirm-cont.image .image-" + sel + " .value").text(val)
583 820ef2f0 Kostas Papadimitriou
            }
584 820ef2f0 Kostas Papadimitriou
            
585 73e25ce2 Kostas Papadimitriou
            set_detail("description");
586 73e25ce2 Kostas Papadimitriou
            set_detail("name");
587 73e25ce2 Kostas Papadimitriou
            set_detail("os", image.get("OS"));
588 73e25ce2 Kostas Papadimitriou
            set_detail("gui", image.get("GUI"));
589 73e25ce2 Kostas Papadimitriou
            set_detail("size", util.readablizeBytes(image.get_size() * 1024 * 1024));
590 73e25ce2 Kostas Papadimitriou
            set_detail("kernel");
591 820ef2f0 Kostas Papadimitriou
        },
592 8d08f18a Kostas Papadimitriou
593 8d08f18a Kostas Papadimitriou
        update_layout: function() {
594 8d08f18a Kostas Papadimitriou
            var params = this.parent.get_params();
595 820ef2f0 Kostas Papadimitriou
596 820ef2f0 Kostas Papadimitriou
            if (!params.image) { return }
597 8d08f18a Kostas Papadimitriou
            var vm_name = "My {0} server".format(params.image.get("name"));
598 8d08f18a Kostas Papadimitriou
            var orig_name = vm_name;
599 8d08f18a Kostas Papadimitriou
            
600 8d08f18a Kostas Papadimitriou
            var existing = true;
601 8d08f18a Kostas Papadimitriou
            var j = 0;
602 820ef2f0 Kostas Papadimitriou
            while (existing && !this.name_changed) {
603 8d08f18a Kostas Papadimitriou
                var existing = storage.vms.select(function(vm){return vm.get("name") == vm_name}).length
604 8d08f18a Kostas Papadimitriou
                if (existing) {
605 8d08f18a Kostas Papadimitriou
                    j++;
606 8d08f18a Kostas Papadimitriou
                    vm_name = orig_name + " " + j;
607 8d08f18a Kostas Papadimitriou
                }
608 8d08f18a Kostas Papadimitriou
            }
609 8d08f18a Kostas Papadimitriou
            if (!_(this.name.val()).trim() || !this.name_changed) {
610 8d08f18a Kostas Papadimitriou
                this.name.val(vm_name);
611 8d08f18a Kostas Papadimitriou
            }
612 8d08f18a Kostas Papadimitriou
613 8d08f18a Kostas Papadimitriou
            this.confirm.find("li.image .value").text(params.flavor.get("image"));
614 60143907 Kostas Papadimitriou
            this.confirm.find("li.cpu .value").text(params.flavor.get("cpu") + "x");
615 8d08f18a Kostas Papadimitriou
            this.confirm.find("li.mem .value").text(params.flavor.get("ram"));
616 8d08f18a Kostas Papadimitriou
            this.confirm.find("li.disk .value").text(params.flavor.get("disk"));
617 820ef2f0 Kostas Papadimitriou
618 820ef2f0 Kostas Papadimitriou
            if (!this.name_changed) {
619 820ef2f0 Kostas Papadimitriou
                this.name.select().focus();
620 820ef2f0 Kostas Papadimitriou
            }
621 820ef2f0 Kostas Papadimitriou
            
622 820ef2f0 Kostas Papadimitriou
            var img = snf.ui.helpers.os_icon_path(params.image.get("OS"))
623 820ef2f0 Kostas Papadimitriou
            this.name.css({backgroundImage:"url({0})".format(img)})
624 820ef2f0 Kostas Papadimitriou
625 820ef2f0 Kostas Papadimitriou
            this.update_image_details();
626 73e25ce2 Kostas Papadimitriou
            this.update_flavor_details();
627 8d08f18a Kostas Papadimitriou
        },
628 8d08f18a Kostas Papadimitriou
629 8d08f18a Kostas Papadimitriou
        reset: function() {
630 73e25ce2 Kostas Papadimitriou
            this.roles.find(".val").removeClass("selected");
631 820ef2f0 Kostas Papadimitriou
            this.name_changed = false;
632 8d08f18a Kostas Papadimitriou
            this.update_layout();
633 8d08f18a Kostas Papadimitriou
        },
634 8d08f18a Kostas Papadimitriou
635 73e25ce2 Kostas Papadimitriou
        get_meta: function() {
636 73e25ce2 Kostas Papadimitriou
            if (this.roles.find(".selected").length == 0) {
637 73e25ce2 Kostas Papadimitriou
                return false;
638 73e25ce2 Kostas Papadimitriou
            }
639 73e25ce2 Kostas Papadimitriou
640 73e25ce2 Kostas Papadimitriou
            var role = $(this.roles.find(".selected").get(0)).data("value");
641 73e25ce2 Kostas Papadimitriou
            return {'Role': role }
642 73e25ce2 Kostas Papadimitriou
        },
643 73e25ce2 Kostas Papadimitriou
644 8d08f18a Kostas Papadimitriou
        get: function() {
645 73e25ce2 Kostas Papadimitriou
            var val = {'name': this.name.val() };
646 73e25ce2 Kostas Papadimitriou
            if (this.get_meta()) {
647 73e25ce2 Kostas Papadimitriou
                val.metadata = this.get_meta();
648 73e25ce2 Kostas Papadimitriou
            }
649 73e25ce2 Kostas Papadimitriou
            
650 73e25ce2 Kostas Papadimitriou
            console.log(val, this.get_meta());
651 73e25ce2 Kostas Papadimitriou
            return val;
652 8d08f18a Kostas Papadimitriou
        }
653 8d08f18a Kostas Papadimitriou
    });
654 8d08f18a Kostas Papadimitriou
655 8d08f18a Kostas Papadimitriou
    views.CreateVMView = views.Overlay.extend({
656 8d08f18a Kostas Papadimitriou
        
657 8d08f18a Kostas Papadimitriou
        view_id: "create_vm_view",
658 8d08f18a Kostas Papadimitriou
        content_selector: "#createvm-overlay-content",
659 8d08f18a Kostas Papadimitriou
        css_class: 'overlay-createvm overlay-info',
660 8d08f18a Kostas Papadimitriou
        overlay_id: "metadata-overlay",
661 8d08f18a Kostas Papadimitriou
662 8d08f18a Kostas Papadimitriou
        subtitle: false,
663 8d08f18a Kostas Papadimitriou
        title: "Create new machine",
664 8d08f18a Kostas Papadimitriou
665 8d08f18a Kostas Papadimitriou
        initialize: function(options) {
666 8d08f18a Kostas Papadimitriou
            views.CreateVMView.__super__.initialize.apply(this);
667 8d08f18a Kostas Papadimitriou
            this.current_step = 1;
668 8d08f18a Kostas Papadimitriou
669 8d08f18a Kostas Papadimitriou
            this.password_view = new views.VMCreationPasswordView();
670 8d08f18a Kostas Papadimitriou
671 8d08f18a Kostas Papadimitriou
            this.steps = [];
672 8d08f18a Kostas Papadimitriou
            this.steps[1] = new views.CreateImageSelectView(this);
673 8d08f18a Kostas Papadimitriou
            this.steps[1].bind("change", _.bind(function(data) {this.trigger("image:change", data)}, this));
674 8d08f18a Kostas Papadimitriou
675 8d08f18a Kostas Papadimitriou
            this.steps[2] = new views.CreateFlavorSelectView(this);
676 8d08f18a Kostas Papadimitriou
            this.steps[3] = new views.CreateSubmitView(this);
677 8d08f18a Kostas Papadimitriou
678 8d08f18a Kostas Papadimitriou
            this.cancel_btn = this.$(".create-controls .cancel")
679 8d08f18a Kostas Papadimitriou
            this.next_btn = this.$(".create-controls .next")
680 8d08f18a Kostas Papadimitriou
            this.prev_btn = this.$(".create-controls .prev")
681 8d08f18a Kostas Papadimitriou
            this.submit_btn = this.$(".create-controls .submit")
682 8d08f18a Kostas Papadimitriou
            
683 8d08f18a Kostas Papadimitriou
            this.init_handlers();
684 8d08f18a Kostas Papadimitriou
            this.update_layout();
685 8d08f18a Kostas Papadimitriou
        },
686 8d08f18a Kostas Papadimitriou
687 8d08f18a Kostas Papadimitriou
        init_handlers: function() {
688 8d08f18a Kostas Papadimitriou
            this.next_btn.click(_.bind(function(){
689 8d08f18a Kostas Papadimitriou
                this.show_step(this.current_step + 1);
690 8d08f18a Kostas Papadimitriou
                this.update_layout();
691 8d08f18a Kostas Papadimitriou
            }, this))
692 8d08f18a Kostas Papadimitriou
            this.prev_btn.click(_.bind(function(){
693 8d08f18a Kostas Papadimitriou
                this.show_step(this.current_step - 1);
694 8d08f18a Kostas Papadimitriou
                this.update_layout();
695 8d08f18a Kostas Papadimitriou
            }, this))
696 8d08f18a Kostas Papadimitriou
            this.cancel_btn.click(_.bind(function(){
697 8d08f18a Kostas Papadimitriou
                this.close_all();
698 8d08f18a Kostas Papadimitriou
            }, this))
699 8d08f18a Kostas Papadimitriou
            this.submit_btn.click(_.bind(function(){
700 8d08f18a Kostas Papadimitriou
                this.submit();
701 8d08f18a Kostas Papadimitriou
            }, this))
702 8d08f18a Kostas Papadimitriou
        },
703 8d08f18a Kostas Papadimitriou
704 8d08f18a Kostas Papadimitriou
        set_step: function(st) {
705 8d08f18a Kostas Papadimitriou
        },
706 8d08f18a Kostas Papadimitriou
        
707 8d08f18a Kostas Papadimitriou
        validate: function(data) {
708 8d08f18a Kostas Papadimitriou
            if (_(data.name).trim() == "") {
709 8d08f18a Kostas Papadimitriou
                this.$(".form-field").addClass("error");
710 8d08f18a Kostas Papadimitriou
                return false;
711 8d08f18a Kostas Papadimitriou
            } else {
712 8d08f18a Kostas Papadimitriou
                return true;
713 8d08f18a Kostas Papadimitriou
            }
714 8d08f18a Kostas Papadimitriou
        },
715 8d08f18a Kostas Papadimitriou
716 8d08f18a Kostas Papadimitriou
        submit: function() {
717 820ef2f0 Kostas Papadimitriou
            if (this.submiting) { return };
718 8d08f18a Kostas Papadimitriou
            var data = this.get_params();
719 73e25ce2 Kostas Papadimitriou
            var meta = {};
720 8d08f18a Kostas Papadimitriou
            if (this.validate(data)) {
721 8d08f18a Kostas Papadimitriou
                this.submit_btn.addClass("in-progress");
722 820ef2f0 Kostas Papadimitriou
                this.submiting = true;
723 73e25ce2 Kostas Papadimitriou
                if (data.metadata) { meta = data.metadata; }
724 73e25ce2 Kostas Papadimitriou
                storage.vms.create(data.name, data.image, data.flavor, meta, {}, _.bind(function(data){
725 8d08f18a Kostas Papadimitriou
                    this.close_all();
726 820ef2f0 Kostas Papadimitriou
                    this.password_view.show(data.server.adminPass, data.server.id);
727 820ef2f0 Kostas Papadimitriou
                    this.submiting = false;
728 8d08f18a Kostas Papadimitriou
                }, this));
729 8d08f18a Kostas Papadimitriou
            }
730 8d08f18a Kostas Papadimitriou
        },
731 8d08f18a Kostas Papadimitriou
732 8d08f18a Kostas Papadimitriou
        close_all: function() {
733 8d08f18a Kostas Papadimitriou
            this.hide();
734 8d08f18a Kostas Papadimitriou
        },
735 8d08f18a Kostas Papadimitriou
736 8d08f18a Kostas Papadimitriou
        reset: function() {
737 8d08f18a Kostas Papadimitriou
            this.current_step = 1;
738 8d08f18a Kostas Papadimitriou
            this.steps[1].reset();
739 8d08f18a Kostas Papadimitriou
            this.steps[2].reset();
740 8d08f18a Kostas Papadimitriou
            this.steps[3].reset();
741 8d08f18a Kostas Papadimitriou
742 8d08f18a Kostas Papadimitriou
            this.submit_btn.removeClass("in-progress");
743 8d08f18a Kostas Papadimitriou
        },
744 8d08f18a Kostas Papadimitriou
745 8d08f18a Kostas Papadimitriou
        onShow: function() {
746 8d08f18a Kostas Papadimitriou
            this.reset()
747 8d08f18a Kostas Papadimitriou
            this.update_layout();
748 8d08f18a Kostas Papadimitriou
        },
749 8d08f18a Kostas Papadimitriou
750 8d08f18a Kostas Papadimitriou
        update_layout: function() {
751 8d08f18a Kostas Papadimitriou
            this.show_step(this.current_step);
752 8d08f18a Kostas Papadimitriou
            this.current_view.update_layout();
753 8d08f18a Kostas Papadimitriou
        },
754 8d08f18a Kostas Papadimitriou
755 8d08f18a Kostas Papadimitriou
        beforeOpen: function() {
756 820ef2f0 Kostas Papadimitriou
            this.submiting = false;
757 8d08f18a Kostas Papadimitriou
            this.reset();
758 8d08f18a Kostas Papadimitriou
            this.current_step = 1;
759 820ef2f0 Kostas Papadimitriou
            this.$(".steps-container").css({"margin-left":0 + "px"});
760 8d08f18a Kostas Papadimitriou
            this.show_step(1);
761 8d08f18a Kostas Papadimitriou
        },
762 8d08f18a Kostas Papadimitriou
763 8d08f18a Kostas Papadimitriou
        show_step: function(step) {
764 8d08f18a Kostas Papadimitriou
            if (step <= 1) {
765 8d08f18a Kostas Papadimitriou
                step = 1
766 8d08f18a Kostas Papadimitriou
            }
767 8d08f18a Kostas Papadimitriou
            if (step > this.steps.length - 1) {
768 8d08f18a Kostas Papadimitriou
                step = this.steps.length - 1;
769 8d08f18a Kostas Papadimitriou
            }
770 8d08f18a Kostas Papadimitriou
                
771 8d08f18a Kostas Papadimitriou
            // hide other
772 820ef2f0 Kostas Papadimitriou
            //this.$(".step-header .header-step").removeClass("current").hide();
773 820ef2f0 Kostas Papadimitriou
            //this.$(".create-step-cont").hide();
774 820ef2f0 Kostas Papadimitriou
            var width = this.el.find('.container').width();
775 820ef2f0 Kostas Papadimitriou
            var left = (step -1) * width * -1;
776 820ef2f0 Kostas Papadimitriou
            this.$(".steps-container").css({"margin-left":left + "px"});
777 8d08f18a Kostas Papadimitriou
            
778 8d08f18a Kostas Papadimitriou
            this.steps[step].show();
779 8d08f18a Kostas Papadimitriou
            this.current_step = step;
780 8d08f18a Kostas Papadimitriou
            this.current_view = this.steps[step];
781 8d08f18a Kostas Papadimitriou
            this.update_controls();
782 8d08f18a Kostas Papadimitriou
        },
783 8d08f18a Kostas Papadimitriou
784 8d08f18a Kostas Papadimitriou
        update_controls: function() {
785 8d08f18a Kostas Papadimitriou
            var step = this.current_step;
786 8d08f18a Kostas Papadimitriou
            if (step == 1) {
787 8d08f18a Kostas Papadimitriou
                this.prev_btn.hide();
788 8d08f18a Kostas Papadimitriou
                this.cancel_btn.show();
789 8d08f18a Kostas Papadimitriou
            } else {
790 8d08f18a Kostas Papadimitriou
                this.prev_btn.show();
791 8d08f18a Kostas Papadimitriou
                this.cancel_btn.hide();
792 8d08f18a Kostas Papadimitriou
            }
793 8d08f18a Kostas Papadimitriou
            
794 8d08f18a Kostas Papadimitriou
            if (step == this.steps.length - 1) {
795 8d08f18a Kostas Papadimitriou
                this.next_btn.hide();
796 8d08f18a Kostas Papadimitriou
                this.submit_btn.show();
797 8d08f18a Kostas Papadimitriou
            } else {
798 8d08f18a Kostas Papadimitriou
                this.next_btn.show();
799 8d08f18a Kostas Papadimitriou
                this.submit_btn.hide();
800 8d08f18a Kostas Papadimitriou
            }
801 8d08f18a Kostas Papadimitriou
        },
802 8d08f18a Kostas Papadimitriou
803 8d08f18a Kostas Papadimitriou
        get_params: function() {
804 8d08f18a Kostas Papadimitriou
            return _.extend({}, this.steps[1].get(), this.steps[2].get(), this.steps[3].get());
805 8d08f18a Kostas Papadimitriou
        }
806 8d08f18a Kostas Papadimitriou
    });
807 8d08f18a Kostas Papadimitriou
    
808 8d08f18a Kostas Papadimitriou
})(this);