Statistics
| Branch: | Tag: | Revision:

root / ui / static / snf / js / ui / web / ui_create_view.js @ 1325fc64

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