Statistics
| Branch: | Tag: | Revision:

root / snf-cyclades-app / synnefo / ui / static / snf / js / synnefo.js @ 2c239b28

History | View | Annotate | Download (15.2 kB)

1 a5bc3755 Vangelis Koukis
//
2 a5bc3755 Vangelis Koukis
// Copyright 2011 GRNET S.A. All rights reserved.
3 72872ba2 Christodoulos Psaltis
//
4 a5bc3755 Vangelis Koukis
// Redistribution and use in source and binary forms, with or
5 a5bc3755 Vangelis Koukis
// without modification, are permitted provided that the following
6 a5bc3755 Vangelis Koukis
// conditions are met:
7 72872ba2 Christodoulos Psaltis
//
8 a5bc3755 Vangelis Koukis
//   1. Redistributions of source code must retain the above
9 a5bc3755 Vangelis Koukis
//      copyright notice, this list of conditions and the following
10 a5bc3755 Vangelis Koukis
//      disclaimer.
11 72872ba2 Christodoulos Psaltis
//
12 a5bc3755 Vangelis Koukis
//   2. Redistributions in binary form must reproduce the above
13 a5bc3755 Vangelis Koukis
//      copyright notice, this list of conditions and the following
14 a5bc3755 Vangelis Koukis
//      disclaimer in the documentation and/or other materials
15 a5bc3755 Vangelis Koukis
//      provided with the distribution.
16 72872ba2 Christodoulos Psaltis
//
17 a5bc3755 Vangelis Koukis
// THIS SOFTWARE IS PROVIDED BY GRNET S.A. ``AS IS'' AND ANY EXPRESS
18 a5bc3755 Vangelis Koukis
// OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 a5bc3755 Vangelis Koukis
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
20 a5bc3755 Vangelis Koukis
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL GRNET S.A OR
21 a5bc3755 Vangelis Koukis
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 a5bc3755 Vangelis Koukis
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 a5bc3755 Vangelis Koukis
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
24 a5bc3755 Vangelis Koukis
// USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
25 a5bc3755 Vangelis Koukis
// AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
26 a5bc3755 Vangelis Koukis
// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
27 a5bc3755 Vangelis Koukis
// ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
28 a5bc3755 Vangelis Koukis
// POSSIBILITY OF SUCH DAMAGE.
29 72872ba2 Christodoulos Psaltis
//
30 a5bc3755 Vangelis Koukis
// The views and conclusions contained in the software and
31 a5bc3755 Vangelis Koukis
// documentation are those of the authors and should not be
32 a5bc3755 Vangelis Koukis
// interpreted as representing official policies, either expressed
33 a5bc3755 Vangelis Koukis
// or implied, of GRNET S.A.
34 a5bc3755 Vangelis Koukis
//
35 22afb635 Vangelis Koukis
var API_URL = "/api/v1.1";
36 f533f224 Vangelis Koukis
var changes_since = 0, deferred = 0, update_request = false, load_request = false, pending_actions = [];
37 f533f224 Vangelis Koukis
var flavors = [], images = [], servers = [], disks = [], cpus = [], ram = [];
38 f533f224 Vangelis Koukis
var networks = [], networks_changes_since = 0;
39 9eefb3a2 Kostas Papadimitriou
var error_timeout = 20000;
40 7991d0c5 Kostas Papadimitriou
var last_request = {};
41 7991d0c5 Kostas Papadimitriou
42 7991d0c5 Kostas Papadimitriou
43 54417a11 Kostas Papadimitriou
Object.prototype.toString = function(o){
44 54417a11 Kostas Papadimitriou
    
45 54417a11 Kostas Papadimitriou
    var parse = function(_o){
46 54417a11 Kostas Papadimitriou
        var a = [], t;
47 54417a11 Kostas Papadimitriou
        for(var p in _o){
48 54417a11 Kostas Papadimitriou
            if(_o.hasOwnProperty(p)){
49 54417a11 Kostas Papadimitriou
                t = _o[p];
50 54417a11 Kostas Papadimitriou
                if(t && typeof t == "object"){
51 54417a11 Kostas Papadimitriou
                    a[a.length]= p + ":{ " + arguments.callee(t).join(", ") + "}";
52 54417a11 Kostas Papadimitriou
                }
53 54417a11 Kostas Papadimitriou
                else {
54 54417a11 Kostas Papadimitriou
                    if(typeof t == "string"){
55 54417a11 Kostas Papadimitriou
                        a[a.length] = [ p+ ": \"" + t.toString() + "\"" ];
56 54417a11 Kostas Papadimitriou
                    }
57 54417a11 Kostas Papadimitriou
                    else{
58 54417a11 Kostas Papadimitriou
                        a[a.length] = [ p+ ": " + t.toString()];
59 54417a11 Kostas Papadimitriou
                    }
60 54417a11 Kostas Papadimitriou
                }
61 54417a11 Kostas Papadimitriou
            }
62 54417a11 Kostas Papadimitriou
        }
63 54417a11 Kostas Papadimitriou
        return a;
64 54417a11 Kostas Papadimitriou
        
65 54417a11 Kostas Papadimitriou
    }
66 54417a11 Kostas Papadimitriou
    return "{" + parse(o).join(", ") + "}";
67 54417a11 Kostas Papadimitriou
   
68 54417a11 Kostas Papadimitriou
}
69 a583aa29 Kostas Papadimitriou
70 3c08f055 Kostas Papadimitriou
function msg_box(user_config) {
71 3c08f055 Kostas Papadimitriou
    var defaults = {'title':'Info message', 'content': 'this is an info message', 'ajax': false, 'extra':false};
72 3c08f055 Kostas Papadimitriou
    var config = $.extend(defaults, user_config);
73 3c08f055 Kostas Papadimitriou
74 29772683 Kostas Papadimitriou
    // prepare the error message
75 29772683 Kostas Papadimitriou
    // bring up success notification
76 29772683 Kostas Papadimitriou
    var box = $("#notification-box");
77 54417a11 Kostas Papadimitriou
    box.addClass("notification-box");
78 29772683 Kostas Papadimitriou
    box.addClass('success');
79 3c08f055 Kostas Papadimitriou
    box.addClass(config.cls || '');
80 29772683 Kostas Papadimitriou
    box.removeClass('error');
81 29772683 Kostas Papadimitriou
82 9eefb3a2 Kostas Papadimitriou
    var sel = function(s){return $(s, box)};
83 81d11e38 Kostas Papadimitriou
    // reset texts
84 81d11e38 Kostas Papadimitriou
    sel("h3 span.header-box").html("");
85 81d11e38 Kostas Papadimitriou
    sel(".sub-text").html("");
86 81d11e38 Kostas Papadimitriou
    sel(".password-container .password").html("");
87 81d11e38 Kostas Papadimitriou
    sel("div.machine-now-building").html("");
88 81d11e38 Kostas Papadimitriou
89 81d11e38 Kostas Papadimitriou
    // apply msg box contents
90 9ed51b7e Kostas Papadimitriou
    sel("h3 span.header-box").html(config.title);
91 29772683 Kostas Papadimitriou
    sel("div.machine-now-building").html(config.content);
92 3c08f055 Kostas Papadimitriou
    sel(".sub-text").html(config.sub_content || '');
93 29772683 Kostas Papadimitriou
    sel(".popup-header").removeClass("popup-header-error");
94 29772683 Kostas Papadimitriou
    box.removeClass("popup-border-error");
95 29772683 Kostas Papadimitriou
    sel(".popup-details").removeClass("popup-details-error");
96 29772683 Kostas Papadimitriou
    sel(".popup-separator").removeClass("popup-separator-error");
97 29772683 Kostas Papadimitriou
    
98 29772683 Kostas Papadimitriou
    sel(".password-container").hide();
99 29772683 Kostas Papadimitriou
    if (config.extra) {
100 29772683 Kostas Papadimitriou
        sel(".password-container .password").html(config.extra);
101 29772683 Kostas Papadimitriou
        sel(".password-container").show();
102 29772683 Kostas Papadimitriou
    }
103 de44fc6c Kostas Papadimitriou
    
104 de44fc6c Kostas Papadimitriou
    var conf = {
105 29772683 Kostas Papadimitriou
        // some mask tweaks suitable for modal dialogs
106 29772683 Kostas Papadimitriou
        mask: '#666',
107 54417a11 Kostas Papadimitriou
        top: '10px',
108 29772683 Kostas Papadimitriou
        closeOnClick: false,
109 29772683 Kostas Papadimitriou
        oneInstance: false,
110 29772683 Kostas Papadimitriou
        load: false,
111 3c08f055 Kostas Papadimitriou
        onLoad: config.onLoad || false,
112 de44fc6c Kostas Papadimitriou
        fixed: config.fixed || false,
113 29772683 Kostas Papadimitriou
        onClose: function () {
114 29772683 Kostas Papadimitriou
            // With partial refresh working properly,
115 29772683 Kostas Papadimitriou
            // it is no longer necessary to refresh the whole page
116 29772683 Kostas Papadimitriou
            // choose_view();
117 29772683 Kostas Papadimitriou
        }
118 de44fc6c Kostas Papadimitriou
    }
119 3c08f055 Kostas Papadimitriou
120 de44fc6c Kostas Papadimitriou
    var triggers = $("a#msgbox").overlay(conf);
121 de44fc6c Kostas Papadimitriou
122 de44fc6c Kostas Papadimitriou
    try {
123 de44fc6c Kostas Papadimitriou
        conf = $("a#msgbox").data('overlay').getConf();
124 de44fc6c Kostas Papadimitriou
        conf.fixed = config.fixed || false;
125 de44fc6c Kostas Papadimitriou
    } catch (err) {}
126 29772683 Kostas Papadimitriou
    $("a#msgbox").data('overlay').load();
127 29772683 Kostas Papadimitriou
    
128 29772683 Kostas Papadimitriou
    var parse_data = config.parse_data || false;
129 19e01943 Kostas Papadimitriou
    var load_html = config.html || false;
130 19e01943 Kostas Papadimitriou
    var user_success = config.success || false;
131 19e01943 Kostas Papadimitriou
    config.ajax = config.ajax || {};
132 19e01943 Kostas Papadimitriou
133 19e01943 Kostas Papadimitriou
    // requested to show remote data in msg_box
134 3c08f055 Kostas Papadimitriou
    if (config.ajax && !$.isEmptyObject(config.ajax)) {
135 19e01943 Kostas Papadimitriou
        $.ajax($.extend({ 
136 29772683 Kostas Papadimitriou
            url:config.ajax, 
137 29772683 Kostas Papadimitriou
            success: function(data){
138 19e01943 Kostas Papadimitriou
                // we want to get our data parsed before
139 19e01943 Kostas Papadimitriou
                // placing them in content
140 29772683 Kostas Papadimitriou
                if (parse_data) {
141 29772683 Kostas Papadimitriou
                    data = parse_data(data);
142 29772683 Kostas Papadimitriou
                }
143 29772683 Kostas Papadimitriou
144 19e01943 Kostas Papadimitriou
                // no json response
145 19e01943 Kostas Papadimitriou
                // load html body
146 19e01943 Kostas Papadimitriou
                if (load_html) {
147 19e01943 Kostas Papadimitriou
                    sel("div.machine-now-building").html(data);
148 19e01943 Kostas Papadimitriou
                } else {
149 29772683 Kostas Papadimitriou
150 54417a11 Kostas Papadimitriou
                    if (data.title) {
151 19e01943 Kostas Papadimitriou
                        sel("h3 span.header-box").text(data.title);
152 54417a11 Kostas Papadimitriou
                    }
153 29772683 Kostas Papadimitriou
154 19e01943 Kostas Papadimitriou
                    if (data.content) {
155 19e01943 Kostas Papadimitriou
                        sel("div.machine-now-building").html(data.content);
156 19e01943 Kostas Papadimitriou
                    }
157 19e01943 Kostas Papadimitriou
                    if (data.extra) {
158 19e01943 Kostas Papadimitriou
                        sel(".password-container .password").html(data.extra);
159 19e01943 Kostas Papadimitriou
                        sel(".password-container").show();
160 19e01943 Kostas Papadimitriou
                    }
161 9ed51b7e Kostas Papadimitriou
                    if (data.subinfo) {
162 9ed51b7e Kostas Papadimitriou
                        sel(".sub-text").html(data.subinfo);
163 9ed51b7e Kostas Papadimitriou
                    } else {
164 9ed51b7e Kostas Papadimitriou
                        sel(".sub-text").html("");
165 9ed51b7e Kostas Papadimitriou
                    }
166 29772683 Kostas Papadimitriou
                }
167 19e01943 Kostas Papadimitriou
168 19e01943 Kostas Papadimitriou
                if (user_success) {
169 19e01943 Kostas Papadimitriou
                    user_success($("div.machine-now-building"));
170 19e01943 Kostas Papadimitriou
                }
171 54417a11 Kostas Papadimitriou
            },
172 54417a11 Kostas Papadimitriou
            error: function(xhr, status, err) {
173 d3eef3ce Kostas Papadimitriou
                ajax_error(-519, "UI Error", "Machine connect", err, this);
174 dc12a449 Kostas Papadimitriou
            }
175 19e01943 Kostas Papadimitriou
        }, config.ajax_config));
176 29772683 Kostas Papadimitriou
    }
177 29772683 Kostas Papadimitriou
    return false;
178 29772683 Kostas Papadimitriou
}
179 19e01943 Kostas Papadimitriou
180 19e01943 Kostas Papadimitriou
function show_invitations() {
181 51b0ca27 Kostas Papadimitriou
    
182 8d08f18a Kostas Papadimitriou
    function display_resend_success(msg) {
183 8d08f18a Kostas Papadimitriou
        clear_resend_messages();
184 8d08f18a Kostas Papadimitriou
        $("#invsent .message.success").text(msg).show();
185 48c07635 Kostas Papadimitriou
    }
186 48c07635 Kostas Papadimitriou
187 8d08f18a Kostas Papadimitriou
    function display_resend_error(msg) {
188 8d08f18a Kostas Papadimitriou
        clear_resend_messages();
189 8d08f18a Kostas Papadimitriou
        $("#invsent .message.errormsg").text(msg).show();
190 51b0ca27 Kostas Papadimitriou
    }
191 51b0ca27 Kostas Papadimitriou
192 51b0ca27 Kostas Papadimitriou
    // clear resent messages
193 51b0ca27 Kostas Papadimitriou
    function clear_resend_messages() {
194 51b0ca27 Kostas Papadimitriou
        $("#invsent .message").hide();
195 51b0ca27 Kostas Papadimitriou
    }
196 51b0ca27 Kostas Papadimitriou
197 51b0ca27 Kostas Papadimitriou
    // register resent click handlers
198 51b0ca27 Kostas Papadimitriou
    function register_invitation_resends() {
199 51b0ca27 Kostas Papadimitriou
        $(".invitations .resend-invitation").click(function() {
200 51b0ca27 Kostas Papadimitriou
            var invid = $(this).attr("id");
201 51b0ca27 Kostas Papadimitriou
202 51b0ca27 Kostas Papadimitriou
            if (invid == null)
203 51b0ca27 Kostas Papadimitriou
                return;
204 51b0ca27 Kostas Papadimitriou
205 51b0ca27 Kostas Papadimitriou
            var id = invid.split("-")[1];
206 51b0ca27 Kostas Papadimitriou
207 51b0ca27 Kostas Papadimitriou
            if (id == null)
208 51b0ca27 Kostas Papadimitriou
                return;
209 51b0ca27 Kostas Papadimitriou
210 51b0ca27 Kostas Papadimitriou
            var child = $(this).find("img");
211 51b0ca27 Kostas Papadimitriou
            child.attr('src', '/static/progress-tiny.gif');
212 51b0ca27 Kostas Papadimitriou
213 51b0ca27 Kostas Papadimitriou
            $.ajax({
214 51b0ca27 Kostas Papadimitriou
                type: "POST",
215 51b0ca27 Kostas Papadimitriou
                url : "/invitations/resend",
216 51b0ca27 Kostas Papadimitriou
                data : {invid : id},
217 51b0ca27 Kostas Papadimitriou
                success: function(msg) {
218 8d08f18a Kostas Papadimitriou
                    display_resend_success("Invitation has been resent");
219 51b0ca27 Kostas Papadimitriou
                    child.attr('src', '/static/resend.png');
220 51b0ca27 Kostas Papadimitriou
                },
221 51b0ca27 Kostas Papadimitriou
                error : function(xhr, status, error) {
222 8d08f18a Kostas Papadimitriou
                    display_resend_error("Something seems to have gone wrong. " +
223 8d08f18a Kostas Papadimitriou
                          "Please try again in a few minutes.");
224 51b0ca27 Kostas Papadimitriou
                    child.attr('src', '/static/resend.png');
225 51b0ca27 Kostas Papadimitriou
                }
226 51b0ca27 Kostas Papadimitriou
            });
227 51b0ca27 Kostas Papadimitriou
        });
228 51b0ca27 Kostas Papadimitriou
    }
229 19e01943 Kostas Papadimitriou
230 19e01943 Kostas Papadimitriou
    handle_invitations = function(el) {
231 3f1e9a62 Kostas Papadimitriou
232 a697f671 Kostas Papadimitriou
        // proper class to identify the overlay block
233 19e01943 Kostas Papadimitriou
        el.addClass("invitations");
234 a697f671 Kostas Papadimitriou
235 19e01943 Kostas Papadimitriou
        var cont = el;
236 19e01943 Kostas Papadimitriou
        var form = $(el).find("form");
237 f2141829 Kostas Papadimitriou
238 f2141829 Kostas Papadimitriou
        // remove garbage rows that stay in DOM between requests
239 f2141829 Kostas Papadimitriou
        $(".removable-field-row:hidden").remove();
240 40a87146 Kostas Papadimitriou
241 a697f671 Kostas Papadimitriou
        // avoid buggy behaviour, close all overlays if something went wrong
242 40a87146 Kostas Papadimitriou
        try {
243 a697f671 Kostas Papadimitriou
            // form is in content (form is not displayed if user has no invitations)
244 a697f671 Kostas Papadimitriou
            if ($("#invform #removable-name-container-1").length) {
245 a697f671 Kostas Papadimitriou
                $("#invform #removable-name-container-1").dynamicField();
246 a697f671 Kostas Papadimitriou
            }
247 40a87146 Kostas Papadimitriou
        } catch (err) {
248 40a87146 Kostas Papadimitriou
            close_all_overlays();
249 40a87146 Kostas Papadimitriou
        }
250 d389b440 Kostas Papadimitriou
        
251 a697f671 Kostas Papadimitriou
        // we copy/paste it on the title no need to show it twice
252 d389b440 Kostas Papadimitriou
        $(".invitations-left").hide();
253 51b0ca27 Kostas Papadimitriou
        
254 51b0ca27 Kostas Papadimitriou
        // sending finished or first invitations view
255 51b0ca27 Kostas Papadimitriou
        $(".invitations .sending").hide();
256 51b0ca27 Kostas Papadimitriou
        $(".invitations .submit").show();
257 51b0ca27 Kostas Papadimitriou
        $(".invitations #fieldheaders").show();
258 51b0ca27 Kostas Papadimitriou
        $(".invitations #fields").show();
259 a697f671 Kostas Papadimitriou
260 a697f671 Kostas Papadimitriou
        // reset title
261 54417a11 Kostas Papadimitriou
        $("#notification-box .header-box").html("");
262 67921b5c Kostas Papadimitriou
        $("#notification-box .header-box").html(window.INVITATIONS_TITLE + " " + $($(".invitations-left")[0]).text());
263 8d08f18a Kostas Papadimitriou
    
264 51b0ca27 Kostas Papadimitriou
        // resend buttons
265 51b0ca27 Kostas Papadimitriou
        register_invitation_resends();
266 51b0ca27 Kostas Papadimitriou
        clear_resend_messages();
267 d389b440 Kostas Papadimitriou
268 a697f671 Kostas Papadimitriou
        // handle form submit
269 19e01943 Kostas Papadimitriou
        form.submit(function(evn){
270 19e01943 Kostas Papadimitriou
            evn.preventDefault();
271 51b0ca27 Kostas Papadimitriou
            
272 51b0ca27 Kostas Papadimitriou
            // sending...
273 51b0ca27 Kostas Papadimitriou
            $(".invitations .sending").show();
274 51b0ca27 Kostas Papadimitriou
            $(".invitations .submit").hide();
275 51b0ca27 Kostas Papadimitriou
            $(".invitations #fieldheaders").hide();
276 51b0ca27 Kostas Papadimitriou
            $(".invitations #fields").hide();
277 a697f671 Kostas Papadimitriou
278 a697f671 Kostas Papadimitriou
            // do the post
279 f2141829 Kostas Papadimitriou
            $.post(form.attr("action"), form.serialize(), function(data) {
280 a697f671 Kostas Papadimitriou
                // replace data
281 eabbd5b7 Kostas Papadimitriou
                $(cont).html(data); 
282 a697f671 Kostas Papadimitriou
283 a697f671 Kostas Papadimitriou
                // append all handlers again (new html data need to redo all changes)
284 eabbd5b7 Kostas Papadimitriou
                handle_invitations(cont);
285 f2141829 Kostas Papadimitriou
            });
286 a697f671 Kostas Papadimitriou
287 19e01943 Kostas Papadimitriou
            return false;
288 19e01943 Kostas Papadimitriou
        });
289 19e01943 Kostas Papadimitriou
    }
290 a697f671 Kostas Papadimitriou
    
291 a697f671 Kostas Papadimitriou
    // first time clicked (show the msg box with /invitations content)
292 de44fc6c Kostas Papadimitriou
    msg_box({
293 de44fc6c Kostas Papadimitriou
        title:window.INVITATIONS_TITLE, 
294 de44fc6c Kostas Papadimitriou
        content:'', 
295 de44fc6c Kostas Papadimitriou
        fixed: false,
296 de44fc6c Kostas Papadimitriou
        ajax:INVITATIONS_URL, 
297 de44fc6c Kostas Papadimitriou
        html:true, 
298 de44fc6c Kostas Papadimitriou
        success: function(el){ 
299 de44fc6c Kostas Papadimitriou
            handle_invitations(el)
300 de44fc6c Kostas Papadimitriou
        }
301 19e01943 Kostas Papadimitriou
    });
302 19e01943 Kostas Papadimitriou
}
303 dc12a449 Kostas Papadimitriou
304 f277a1cd Kostas Papadimitriou
305 f277a1cd Kostas Papadimitriou
function get_short_v6(v6, parts_to_keep) {
306 f277a1cd Kostas Papadimitriou
    var parts = v6.split(":");
307 f277a1cd Kostas Papadimitriou
    var new_parts = parts.slice(parts.length - parts_to_keep);
308 f277a1cd Kostas Papadimitriou
    return new_parts.join(":");
309 f277a1cd Kostas Papadimitriou
}
310 f277a1cd Kostas Papadimitriou
311 f277a1cd Kostas Papadimitriou
function fix_v6_addresses() {
312 f277a1cd Kostas Papadimitriou
313 f277a1cd Kostas Papadimitriou
    // what to prepend
314 99d2c273 Kostas Papadimitriou
    var match = "...";
315 f277a1cd Kostas Papadimitriou
    // long ip min length
316 f277a1cd Kostas Papadimitriou
    var limit = 20;
317 f277a1cd Kostas Papadimitriou
    // parts to show after the transformation
318 f277a1cd Kostas Papadimitriou
    // (from the end)
319 f277a1cd Kostas Papadimitriou
    var parts_to_keep_from_end = 4;
320 f277a1cd Kostas Papadimitriou
321 8d08f18a Kostas Papadimitriou
    $(".machine .ipv6-text").each(function(index, el){
322 f277a1cd Kostas Papadimitriou
        var el = $(el);
323 f277a1cd Kostas Papadimitriou
        var ip = $(el).text();
324 f277a1cd Kostas Papadimitriou
            
325 f277a1cd Kostas Papadimitriou
        // transformation not applyied
326 f277a1cd Kostas Papadimitriou
        // FIXME: use $.data for the condition
327 f277a1cd Kostas Papadimitriou
        if (ip.indexOf(match) == -1 && ip != "pending") {
328 f277a1cd Kostas Papadimitriou
            
329 f277a1cd Kostas Papadimitriou
            // only too long ips
330 f277a1cd Kostas Papadimitriou
            if (ip.length > 20) {
331 f277a1cd Kostas Papadimitriou
                $(el).data("ipstring", ip);
332 f277a1cd Kostas Papadimitriou
                $(el).text(match + get_short_v6(ip, parts_to_keep_from_end));
333 f277a1cd Kostas Papadimitriou
                $(el).attr("title", ip);
334 6b1c18d5 Kostas Papadimitriou
                $(el).tooltip({'tipClass':'tooltip ipv6-tip', 'position': 'center center'});
335 f277a1cd Kostas Papadimitriou
            }
336 f277a1cd Kostas Papadimitriou
        } else {
337 f277a1cd Kostas Papadimitriou
            if (ip.indexOf(match) == 0) {
338 f277a1cd Kostas Papadimitriou
            } else {
339 f277a1cd Kostas Papadimitriou
                // not a long ip anymore
340 f277a1cd Kostas Papadimitriou
                $(el).data("ipstring", undefined);
341 f277a1cd Kostas Papadimitriou
                $(el).css({'text-decoration':'none'});
342 f277a1cd Kostas Papadimitriou
343 f277a1cd Kostas Papadimitriou
                if ($(el).data('tooltip')) {
344 f277a1cd Kostas Papadimitriou
                    $(el).data('tooltip').show = function () {};
345 f277a1cd Kostas Papadimitriou
                }
346 f277a1cd Kostas Papadimitriou
            }
347 f277a1cd Kostas Papadimitriou
        }
348 f277a1cd Kostas Papadimitriou
    });
349 f277a1cd Kostas Papadimitriou
}
350 f277a1cd Kostas Papadimitriou
351 8d08f18a Kostas Papadimitriou
// get stats
352 8d08f18a Kostas Papadimitriou
function get_server_stats(serverID) {
353 8d08f18a Kostas Papadimitriou
    
354 8d08f18a Kostas Papadimitriou
    // do not update stats if machine in build state
355 8d08f18a Kostas Papadimitriou
    var vm = get_machine(serverID);
356 8d08f18a Kostas Papadimitriou
    if (vm.status == "BUILD" && vm.stats_timeout) {
357 8d08f18a Kostas Papadimitriou
        els = get_current_view_stats_elements(vm.id);
358 8d08f18a Kostas Papadimitriou
        els.cpu.img.hide();
359 8d08f18a Kostas Papadimitriou
        els.net.img.hide();
360 31279d33 Kostas Papadimitriou
361 8d08f18a Kostas Papadimitriou
        els.cpu.busy.show();
362 8d08f18a Kostas Papadimitriou
        els.net.busy.show();
363 8d08f18a Kostas Papadimitriou
        return;
364 31279d33 Kostas Papadimitriou
    }
365 e9e7fe51 Kostas Papadimitriou
366 8d08f18a Kostas Papadimitriou
    $.ajax({
367 8d08f18a Kostas Papadimitriou
        repeated: true,
368 8d08f18a Kostas Papadimitriou
        url: API_URL + '/servers/' + serverID + '/stats',
369 8d08f18a Kostas Papadimitriou
        cache: false,
370 8d08f18a Kostas Papadimitriou
        type: "GET",
371 8d08f18a Kostas Papadimitriou
        //async: false,
372 8d08f18a Kostas Papadimitriou
        dataType: "json",
373 8d08f18a Kostas Papadimitriou
        timeout: TIMEOUT,
374 8d08f18a Kostas Papadimitriou
        error: function(jqXHR, textStatus, errorThrown) {
375 8d08f18a Kostas Papadimitriou
            handle_api_error(-21, undefined, 'Get server stats', jqXHR, textStatus, errorThrown, this);
376 8d08f18a Kostas Papadimitriou
        },
377 8d08f18a Kostas Papadimitriou
        success: function(data, textStatus, jqXHR) {
378 122850c5 Kostas Papadimitriou
            //update_machine_stats(serverID, data);
379 8d08f18a Kostas Papadimitriou
        },
380 e9e7fe51 Kostas Papadimitriou
381 8d08f18a Kostas Papadimitriou
        // pass server id to ajax settings
382 8d08f18a Kostas Papadimitriou
        serverID: serverID
383 8d08f18a Kostas Papadimitriou
    });
384 8d08f18a Kostas Papadimitriou
    return false;
385 e9e7fe51 Kostas Papadimitriou
}
386 55e4b353 Kostas Papadimitriou
387 55e4b353 Kostas Papadimitriou
function get_progress_details(id) {
388 55e4b353 Kostas Papadimitriou
    var vm = get_machine(id);
389 55e4b353 Kostas Papadimitriou
    var progress = vm.progress;
390 55e4b353 Kostas Papadimitriou
391 55e4b353 Kostas Papadimitriou
    // no details for active machines
392 55e4b353 Kostas Papadimitriou
    if (!vm.status == "BUILD") {
393 55e4b353 Kostas Papadimitriou
        return false;
394 55e4b353 Kostas Papadimitriou
    }
395 55e4b353 Kostas Papadimitriou
    
396 55e4b353 Kostas Papadimitriou
    // check if images not loaded yet
397 55e4b353 Kostas Papadimitriou
    try {
398 8d08f18a Kostas Papadimitriou
        var image = synnefo.storage.images.get(vm.imageRef).attributes;
399 55e4b353 Kostas Papadimitriou
        var size = image.size;
400 55e4b353 Kostas Papadimitriou
    } catch (err) {
401 55e4b353 Kostas Papadimitriou
        // images not loaded yet (can this really happen ??)
402 55e4b353 Kostas Papadimitriou
        return;
403 55e4b353 Kostas Papadimitriou
    }
404 55e4b353 Kostas Papadimitriou
    
405 55e4b353 Kostas Papadimitriou
    var to_copy = size;
406 55e4b353 Kostas Papadimitriou
    var copied = (size * progress / 100).toFixed(2);
407 55e4b353 Kostas Papadimitriou
    var status = "INIT"
408 55e4b353 Kostas Papadimitriou
409 55e4b353 Kostas Papadimitriou
    // apply state
410 55e4b353 Kostas Papadimitriou
    if (progress > 0) { status = "IMAGE_COPY" }
411 55e4b353 Kostas Papadimitriou
    if (progress >= 100) { status = "FINISH" }
412 55e4b353 Kostas Papadimitriou
    
413 55e4b353 Kostas Papadimitriou
    // user information
414 8d08f18a Kostas Papadimitriou
    var msg = BUILDING_MESSAGES[status];
415 55e4b353 Kostas Papadimitriou
416 55e4b353 Kostas Papadimitriou
    // image copy state display extended user information
417 8d08f18a Kostas Papadimitriou
    //if (status == "IMAGE_COPY") {
418 8d08f18a Kostas Papadimitriou
        //msg = msg.format(readablizeBytes(copied*(1024*1024)), readablizeBytes(to_copy*(1024*1024)), progress)
419 8d08f18a Kostas Papadimitriou
    //}
420 55e4b353 Kostas Papadimitriou
421 55e4b353 Kostas Papadimitriou
    var progress_data = {
422 55e4b353 Kostas Papadimitriou
        'percent': vm.progress,
423 55e4b353 Kostas Papadimitriou
        'build_status': status,
424 55e4b353 Kostas Papadimitriou
        'copied': copied,
425 55e4b353 Kostas Papadimitriou
        'to_copy': size,
426 55e4b353 Kostas Papadimitriou
        'msg': msg
427 55e4b353 Kostas Papadimitriou
    }
428 55e4b353 Kostas Papadimitriou
429 55e4b353 Kostas Papadimitriou
    return progress_data;
430 55e4b353 Kostas Papadimitriou
}
431 55e4b353 Kostas Papadimitriou
432 55e4b353 Kostas Papadimitriou
// display user friendly bytes amount
433 55e4b353 Kostas Papadimitriou
function readablizeBytes(bytes) {
434 55e4b353 Kostas Papadimitriou
    var s = ['bytes', 'kb', 'MB', 'GB', 'TB', 'PB'];
435 55e4b353 Kostas Papadimitriou
    var e = Math.floor(Math.log(bytes)/Math.log(1024));
436 55e4b353 Kostas Papadimitriou
    return (bytes/Math.pow(1024, Math.floor(e))).toFixed(2)+" "+s[e];
437 55e4b353 Kostas Papadimitriou
}
438 55e4b353 Kostas Papadimitriou
439 8d08f18a Kostas Papadimitriou
// machines images utils
440 8d08f18a Kostas Papadimitriou
function set_machine_os_image(machine, machines_view, state, os, skip_reset_states, remove_state) {
441 8d08f18a Kostas Papadimitriou
    var views_map = {'single': '.single-image', 'icon': '.logo'};
442 8d08f18a Kostas Papadimitriou
    var states_map = {'on': 'state1', 'off': 'state3', 'hover': 'state4', 'click': 'state2'}
443 8d08f18a Kostas Papadimitriou
    var sizes_map = {'single': 'large', 'icon': 'medium'}
444 9ac432ec Kostas Papadimitriou
445 8d08f18a Kostas Papadimitriou
    var size = sizes_map[machines_view];
446 8d08f18a Kostas Papadimitriou
    var img_selector = views_map[machines_view];
447 8d08f18a Kostas Papadimitriou
    var cls = states_map[state];
448 8fa1cbc9 Kostas Papadimitriou
    if (os === "unknown") { os = synnefo.config.unknown_os }
449 d42817ee Olga Brani
 
450 7970aa87 Kostas Papadimitriou
    var new_img = 'url("' + synnefo.config.machines_icons_url + size + '/' + os + '-sprite.png")';
451 9ac432ec Kostas Papadimitriou
452 8d08f18a Kostas Papadimitriou
    var el = $(img_selector, machine);
453 8d08f18a Kostas Papadimitriou
    var current_img = el.css("backgroundImage");
454 8d08f18a Kostas Papadimitriou
    if (os == undefined){
455 8d08f18a Kostas Papadimitriou
        new_img = current_img;
456 8d08f18a Kostas Papadimitriou
    }
457 8d08f18a Kostas Papadimitriou
458 8d08f18a Kostas Papadimitriou
    // os changed
459 8d08f18a Kostas Papadimitriou
    el.css("backgroundImage", new_img);
460 8d08f18a Kostas Papadimitriou
461 8d08f18a Kostas Papadimitriou
    // reset current state
462 8d08f18a Kostas Papadimitriou
    if (skip_reset_states === undefined)
463 8d08f18a Kostas Papadimitriou
    {
464 8d08f18a Kostas Papadimitriou
        el.removeClass("single-image-state1");
465 8d08f18a Kostas Papadimitriou
        el.removeClass("single-image-state2");
466 8d08f18a Kostas Papadimitriou
        el.removeClass("single-image-state3");
467 8d08f18a Kostas Papadimitriou
        el.removeClass("single-image-state4");
468 8d08f18a Kostas Papadimitriou
    }
469 8d08f18a Kostas Papadimitriou
470 8d08f18a Kostas Papadimitriou
    if (remove_state !== undefined)
471 8d08f18a Kostas Papadimitriou
    {
472 8d08f18a Kostas Papadimitriou
        remove_state = "single-image-" + states_map[remove_state];
473 8d08f18a Kostas Papadimitriou
        el.removeClass(remove_state);
474 8d08f18a Kostas Papadimitriou
        return;
475 8d08f18a Kostas Papadimitriou
    }
476 8d08f18a Kostas Papadimitriou
477 8d08f18a Kostas Papadimitriou
    // set proper state
478 8d08f18a Kostas Papadimitriou
    el.addClass("single-image-" + cls);
479 8d08f18a Kostas Papadimitriou
}
480 8d08f18a Kostas Papadimitriou
481 8d08f18a Kostas Papadimitriou
// return machine entry from serverID
482 8d08f18a Kostas Papadimitriou
function get_machine(serverID) {
483 8d08f18a Kostas Papadimitriou
    return synnefo.storage.vms.get(serverID).attributes;
484 9ac432ec Kostas Papadimitriou
}