Statistics
| Branch: | Tag: | Revision:

root / ui / static / synnefo.js @ cbadb3d8

History | View | Annotate | Download (90 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 9eefb3a2 Kostas Papadimitriou
$.ajaxSetup({
43 9eefb3a2 Kostas Papadimitriou
    'beforeSend': function(xhr) {
44 7991d0c5 Kostas Papadimitriou
          // save ajax settings, we might need them for error reporting
45 7991d0c5 Kostas Papadimitriou
          last_request = this;
46 9eefb3a2 Kostas Papadimitriou
          xhr.setRequestHeader("X-Auth-Token", $.cookie("X-Auth-Token"));
47 9eefb3a2 Kostas Papadimitriou
    },
48 9eefb3a2 Kostas Papadimitriou
49 9eefb3a2 Kostas Papadimitriou
    // catch uncaught error requests
50 9eefb3a2 Kostas Papadimitriou
    // stop interaction and show only for the 5xx errors
51 9eefb3a2 Kostas Papadimitriou
    // refresh the page after 20secs
52 9eefb3a2 Kostas Papadimitriou
    error: function(jqXHR, textStatus, errorThrown) {
53 7991d0c5 Kostas Papadimitriou
54 7991d0c5 Kostas Papadimitriou
        // check if xhr is in valid state (no status property)
55 7991d0c5 Kostas Papadimitriou
        try {
56 7991d0c5 Kostas Papadimitriou
            var status = jqXHR.status;
57 7991d0c5 Kostas Papadimitriou
        } catch (err) {
58 7991d0c5 Kostas Papadimitriou
            return false;
59 7991d0c5 Kostas Papadimitriou
        }
60 7991d0c5 Kostas Papadimitriou
61 9eefb3a2 Kostas Papadimitriou
        // stop interaction for important (aka 500) error codes only
62 9eefb3a2 Kostas Papadimitriou
        if (jqXHR.status >= 500 && jqXHR.status < 600)
63 9eefb3a2 Kostas Papadimitriou
        {
64 9eefb3a2 Kostas Papadimitriou
            try {
65 9eefb3a2 Kostas Papadimitriou
                ajax_error(jqXHR.status, undefined, 'Unknown', jqXHR.responseText);
66 9eefb3a2 Kostas Papadimitriou
            } catch(err) {
67 7991d0c5 Kostas Papadimitriou
                if (!isXhrException(err)) {
68 7991d0c5 Kostas Papadimitriou
                    ajax_error(-501, "UI Error", 'Generic error', err);
69 7991d0c5 Kostas Papadimitriou
                } else {
70 7991d0c5 Kostas Papadimitriou
                    return false;
71 7991d0c5 Kostas Papadimitriou
                }
72 9eefb3a2 Kostas Papadimitriou
            }
73 8b17cf6e Markos Gogoulos
        }
74 9eefb3a2 Kostas Papadimitriou
75 9eefb3a2 Kostas Papadimitriou
        // refresh after 10 seconds
76 9eefb3a2 Kostas Papadimitriou
        window.setTimeout("window.location.reload()", window.error_timeout);
77 9eefb3a2 Kostas Papadimitriou
    }
78 9eefb3a2 Kostas Papadimitriou
});
79 d994d118 Markos Gogoulos
80 7991d0c5 Kostas Papadimitriou
function isXhrException(err) {
81 7991d0c5 Kostas Papadimitriou
82 7991d0c5 Kostas Papadimitriou
    DOM_EXCEPTION_NAMES = [
83 7991d0c5 Kostas Papadimitriou
        "NS_ERROR_NOT_AVAILABLE", // Firefox
84 7991d0c5 Kostas Papadimitriou
        "INVALID_STATE_ERR" // Chrome
85 7991d0c5 Kostas Papadimitriou
    ];
86 7991d0c5 Kostas Papadimitriou
87 7991d0c5 Kostas Papadimitriou
    try {
88 7991d0c5 Kostas Papadimitriou
        if (DOM_EXCEPTION_NAMES.indexOf(err.name) != -1) {
89 7991d0c5 Kostas Papadimitriou
            return true;
90 7991d0c5 Kostas Papadimitriou
        } 
91 7991d0c5 Kostas Papadimitriou
        
92 7991d0c5 Kostas Papadimitriou
        // ie !!!!
93 7991d0c5 Kostas Papadimitriou
        if (err.number == -2147467259) {
94 7991d0c5 Kostas Papadimitriou
            return true;
95 7991d0c5 Kostas Papadimitriou
        }
96 7991d0c5 Kostas Papadimitriou
97 7991d0c5 Kostas Papadimitriou
    } catch(err) {
98 7991d0c5 Kostas Papadimitriou
        return false;
99 7991d0c5 Kostas Papadimitriou
    }
100 7991d0c5 Kostas Papadimitriou
101 7991d0c5 Kostas Papadimitriou
    return false;
102 7991d0c5 Kostas Papadimitriou
}
103 7991d0c5 Kostas Papadimitriou
104 54417a11 Kostas Papadimitriou
Object.prototype.toString = function(o){
105 54417a11 Kostas Papadimitriou
    
106 54417a11 Kostas Papadimitriou
    var parse = function(_o){
107 54417a11 Kostas Papadimitriou
        var a = [], t;
108 54417a11 Kostas Papadimitriou
        for(var p in _o){
109 54417a11 Kostas Papadimitriou
            if(_o.hasOwnProperty(p)){
110 54417a11 Kostas Papadimitriou
                t = _o[p];
111 54417a11 Kostas Papadimitriou
                if(t && typeof t == "object"){
112 54417a11 Kostas Papadimitriou
                    a[a.length]= p + ":{ " + arguments.callee(t).join(", ") + "}";
113 54417a11 Kostas Papadimitriou
                }
114 54417a11 Kostas Papadimitriou
                else {
115 54417a11 Kostas Papadimitriou
                    if(typeof t == "string"){
116 54417a11 Kostas Papadimitriou
                        a[a.length] = [ p+ ": \"" + t.toString() + "\"" ];
117 54417a11 Kostas Papadimitriou
                    }
118 54417a11 Kostas Papadimitriou
                    else{
119 54417a11 Kostas Papadimitriou
                        a[a.length] = [ p+ ": " + t.toString()];
120 54417a11 Kostas Papadimitriou
                    }
121 54417a11 Kostas Papadimitriou
                }
122 54417a11 Kostas Papadimitriou
            }
123 54417a11 Kostas Papadimitriou
        }
124 54417a11 Kostas Papadimitriou
        return a;
125 54417a11 Kostas Papadimitriou
        
126 54417a11 Kostas Papadimitriou
    }
127 54417a11 Kostas Papadimitriou
    return "{" + parse(o).join(", ") + "}";
128 54417a11 Kostas Papadimitriou
   
129 54417a11 Kostas Papadimitriou
}
130 a583aa29 Kostas Papadimitriou
131 d790d9b7 Kostas Papadimitriou
// http://stackoverflow.com/questions/499126/jquery-set-cursor-position-in-text-area 
132 d790d9b7 Kostas Papadimitriou
$.fn.setCursorPosition = function(pos) {
133 d790d9b7 Kostas Papadimitriou
    if ($(this).get(0).setSelectionRange) {
134 d790d9b7 Kostas Papadimitriou
      $(this).get(0).setSelectionRange(pos, pos);
135 d790d9b7 Kostas Papadimitriou
    } else if ($(this).get(0).createTextRange) {
136 d790d9b7 Kostas Papadimitriou
      var range = $(this).get(0).createTextRange();
137 d790d9b7 Kostas Papadimitriou
      range.collapse(true);
138 d790d9b7 Kostas Papadimitriou
      range.moveEnd('character', pos);
139 d790d9b7 Kostas Papadimitriou
      range.moveStart('character', pos);
140 d790d9b7 Kostas Papadimitriou
      range.select();
141 d790d9b7 Kostas Papadimitriou
    }
142 d790d9b7 Kostas Papadimitriou
}
143 d790d9b7 Kostas Papadimitriou
144 70eab221 Kostas Papadimitriou
// jquery show/hide events
145 a583aa29 Kostas Papadimitriou
var _oldshow = $.fn.show;
146 a583aa29 Kostas Papadimitriou
$.fn.show = function(speed, callback) {
147 a583aa29 Kostas Papadimitriou
    $(this).trigger('show');
148 a583aa29 Kostas Papadimitriou
    return _oldshow.apply(this,arguments);
149 a583aa29 Kostas Papadimitriou
}
150 70eab221 Kostas Papadimitriou
var _oldhide = $.fn.hide;
151 70eab221 Kostas Papadimitriou
$.fn.hide = function(speed, callback) {
152 70eab221 Kostas Papadimitriou
    $(this).trigger('hide');
153 70eab221 Kostas Papadimitriou
    return _oldhide.apply(this,arguments);
154 70eab221 Kostas Papadimitriou
}
155 a583aa29 Kostas Papadimitriou
156 c5a032c4 Markos Gogoulos
function ISODateString(d){
157 b02144c8 Vangelis Koukis
    //return a date in an ISO 8601 format using UTC.
158 c5a032c4 Markos Gogoulos
    //do not include time zone info (Z) at the end
159 b02144c8 Vangelis Koukis
    //taken from the Mozilla Developer Center
160 267403ca Dimitris Moraitis
    function pad(n){ return n<10 ? '0'+n : n }
161 267403ca Dimitris Moraitis
    return  d.getUTCFullYear()+ '-' +
162 f533f224 Vangelis Koukis
            pad(d.getUTCMonth()+1) + '-' +
163 f533f224 Vangelis Koukis
            pad(d.getUTCDate()) + 'T' +
164 f533f224 Vangelis Koukis
            pad(d.getUTCHours()) + ':' +
165 f533f224 Vangelis Koukis
            pad(d.getUTCMinutes()) + ':' +
166 f533f224 Vangelis Koukis
            pad(d.getUTCSeconds()) +'Z'
167 038383b1 Dimitris Moraitis
}
168 038383b1 Dimitris Moraitis
169 f533f224 Vangelis Koukis
function parse_error(responseText, errorCode){
170 f533f224 Vangelis Koukis
    var errors = [];
171 f533f224 Vangelis Koukis
    try {
172 f533f224 Vangelis Koukis
        responseObj = JSON.parse(responseText);
173 f533f224 Vangelis Koukis
    }
174 f533f224 Vangelis Koukis
    catch(err) {
175 f533f224 Vangelis Koukis
        errors[0] = {'code': errorCode};
176 f533f224 Vangelis Koukis
        return errors;
177 f533f224 Vangelis Koukis
    }
178 f533f224 Vangelis Koukis
    for (var err in responseObj){
179 f533f224 Vangelis Koukis
        errors[errors.length] = responseObj[err];
180 f533f224 Vangelis Koukis
    }
181 f533f224 Vangelis Koukis
    return errors;
182 267403ca Dimitris Moraitis
}
183 c5a032c4 Markos Gogoulos
184 41cad45d Dimitris Moraitis
// indexOf prototype for IE
185 41cad45d Dimitris Moraitis
if (!Array.prototype.indexOf) {
186 41cad45d Dimitris Moraitis
  Array.prototype.indexOf = function(elt /*, from*/) {
187 41cad45d Dimitris Moraitis
    var len = this.length;
188 41cad45d Dimitris Moraitis
    var from = Number(arguments[1]) || 0;
189 41cad45d Dimitris Moraitis
    from = (from < 0)
190 41cad45d Dimitris Moraitis
         ? Math.ceil(from)
191 41cad45d Dimitris Moraitis
         : Math.floor(from);
192 41cad45d Dimitris Moraitis
    if (from < 0)
193 41cad45d Dimitris Moraitis
      from += len;
194 41cad45d Dimitris Moraitis
195 41cad45d Dimitris Moraitis
    for (; from < len; from++) {
196 41cad45d Dimitris Moraitis
      if (from in this &&
197 41cad45d Dimitris Moraitis
          this[from] === elt)
198 41cad45d Dimitris Moraitis
        return from;
199 41cad45d Dimitris Moraitis
    }
200 41cad45d Dimitris Moraitis
    return -1;
201 41cad45d Dimitris Moraitis
  };
202 41cad45d Dimitris Moraitis
}
203 41cad45d Dimitris Moraitis
204 380c0520 Dimitris Moraitis
// trim prototype for IE
205 380c0520 Dimitris Moraitis
if(typeof String.prototype.trim !== 'function') {
206 380c0520 Dimitris Moraitis
    String.prototype.trim = function() {
207 82835e06 Christodoulos Psaltis
        return this.replace(/^\s+|\s+$/g, '');
208 380c0520 Dimitris Moraitis
    }
209 380c0520 Dimitris Moraitis
}
210 380c0520 Dimitris Moraitis
211 a70fb308 Christodoulos Psaltis
function update_confirmations() {
212 dcf153ce Christodoulos Psaltis
    // hide all confirm boxes to begin with
213 f533f224 Vangelis Koukis
    $('#machines-pane div.confirm_single').hide();
214 f533f224 Vangelis Koukis
    $('#machines-pane div.confirm_multiple').hide();
215 a70fb308 Christodoulos Psaltis
    var action_type = [];
216 9b2ab29a Christodoulos Psaltis
    // standard view or single view
217 9b2ab29a Christodoulos Psaltis
    if ($.cookie("view") == '0' || $.cookie("view") == '2') {
218 9044c6eb Christodoulos Psaltis
        for (var i=0; i<pending_actions.length; i++) {
219 dcf153ce Christodoulos Psaltis
            // show single confirms
220 a70fb308 Christodoulos Psaltis
            if (pending_actions[i][0] == reboot) {
221 9044c6eb Christodoulos Psaltis
                action_type = "reboot";
222 a70fb308 Christodoulos Psaltis
            } else if (pending_actions[i][0] == shutdown) {
223 9044c6eb Christodoulos Psaltis
                action_type = "shutdown";
224 a70fb308 Christodoulos Psaltis
            } else if (pending_actions[i][0] == start) {
225 9044c6eb Christodoulos Psaltis
                action_type = "start";
226 9044c6eb Christodoulos Psaltis
            } else if (pending_actions[i][0] == open_console) {
227 9044c6eb Christodoulos Psaltis
                action_type = "console";
228 a70fb308 Christodoulos Psaltis
            } else {
229 9044c6eb Christodoulos Psaltis
                action_type = "destroy";
230 a70fb308 Christodoulos Psaltis
            }
231 9b2ab29a Christodoulos Psaltis
            $("#machines-pane #" + pending_actions[i][1] +
232 9b2ab29a Christodoulos Psaltis
            " div.action-container." + action_type + " div.confirm_single").show();
233 dc3e66b9 Mike Muzurakis
        }
234 f533f224 Vangelis Koukis
    }
235 f533f224 Vangelis Koukis
    // if more than one pending action show multiple confirm box
236 f533f224 Vangelis Koukis
    if (pending_actions.length>1 || $.cookie("view") == '1' && pending_actions.length == 1){
237 f533f224 Vangelis Koukis
        $('#machines-pane div.confirm_multiple span.actionLen').text(pending_actions.length);
238 f533f224 Vangelis Koukis
        $('#machines-pane div.confirm_multiple').show();
239 f533f224 Vangelis Koukis
    }
240 f533f224 Vangelis Koukis
}
241 dcf153ce Christodoulos Psaltis
242 f533f224 Vangelis Koukis
function update_network_confirmations(){
243 f533f224 Vangelis Koukis
    // hide all confirm boxes to begin with
244 f533f224 Vangelis Koukis
    $('#networks-pane div.confirm_multiple').hide();
245 f533f224 Vangelis Koukis
246 f533f224 Vangelis Koukis
    for (var i=0;i<pending_actions.length;i++){
247 f533f224 Vangelis Koukis
        // show single confirms depending on the action
248 f533f224 Vangelis Koukis
        if (pending_actions[i][0] == delete_network) {
249 f533f224 Vangelis Koukis
            $("#networks-pane div.network#net-"+pending_actions[i][1]).children('.confirm_single').show();
250 f533f224 Vangelis Koukis
        } else if (pending_actions[i][0] == remove_server_from_network) {
251 f533f224 Vangelis Koukis
            $("#networks-pane div.network #net-"+pending_actions[i][1]+"-server-"+pending_actions[i][2]).children('.confirm_single').show();
252 f533f224 Vangelis Koukis
        } // else {}
253 f533f224 Vangelis Koukis
    }
254 f533f224 Vangelis Koukis
255 f533f224 Vangelis Koukis
    // if more than one pending action show multiple confirm box
256 f533f224 Vangelis Koukis
    if (pending_actions.length > 1){
257 f533f224 Vangelis Koukis
        $('#networks-pane div.confirm_multiple span.actionLen').text(pending_actions.length);
258 f533f224 Vangelis Koukis
        $('#networks-pane div.confirm_multiple').show();
259 f533f224 Vangelis Koukis
    }
260 3d286f84 Dimitris Moraitis
}
261 3d286f84 Dimitris Moraitis
262 42f67a2a Dimitris Moraitis
function list_view() {
263 f533f224 Vangelis Koukis
    changes_since = 0; // to reload full list
264 f533f224 Vangelis Koukis
    pending_actions = []; // clear pending actions
265 f533f224 Vangelis Koukis
    update_confirmations();
266 f533f224 Vangelis Koukis
    clearTimeout(deferred);    // clear old deferred calls
267 f533f224 Vangelis Koukis
    try {
268 f533f224 Vangelis Koukis
        update_request.abort(); // cancel pending ajax updates
269 f533f224 Vangelis Koukis
        load_request.abort();
270 f533f224 Vangelis Koukis
    }catch(err){}
271 f533f224 Vangelis Koukis
    $.cookie("view", '1'); // set list cookie
272 f533f224 Vangelis Koukis
    uri = $("a#list").attr("href");
273 267403ca Dimitris Moraitis
    load_request = $.ajax({
274 267403ca Dimitris Moraitis
        url: uri,
275 267403ca Dimitris Moraitis
        type: "GET",
276 267403ca Dimitris Moraitis
        timeout: TIMEOUT,
277 267403ca Dimitris Moraitis
        dataType: "html",
278 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
279 f533f224 Vangelis Koukis
            return false;
280 f533f224 Vangelis Koukis
        },
281 267403ca Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
282 f533f224 Vangelis Koukis
            $("a#list")[0].className += ' activelink';
283 f533f224 Vangelis Koukis
            $("a#standard")[0].className = '';
284 f533f224 Vangelis Koukis
            $("a#single")[0].className = '';
285 f533f224 Vangelis Koukis
            $("div#machinesview").html(data);
286 f533f224 Vangelis Koukis
        }
287 f533f224 Vangelis Koukis
    });
288 f533f224 Vangelis Koukis
    return false;
289 f533f224 Vangelis Koukis
}
290 b02144c8 Vangelis Koukis
291 f533f224 Vangelis Koukis
function single_view() {
292 f533f224 Vangelis Koukis
    changes_since = 0; // to reload full list
293 f533f224 Vangelis Koukis
    pending_actions = []; // clear pending actions
294 f533f224 Vangelis Koukis
    update_confirmations();
295 f533f224 Vangelis Koukis
    clearTimeout(deferred);    // clear old deferred calls
296 f533f224 Vangelis Koukis
    try {
297 f533f224 Vangelis Koukis
        update_request.abort(); // cancel pending ajax updates
298 f533f224 Vangelis Koukis
        load_request.abort();
299 f533f224 Vangelis Koukis
    }catch(err){}
300 f533f224 Vangelis Koukis
    $.cookie("view", '2'); // set list cookie
301 f533f224 Vangelis Koukis
    uri = $("a#single").attr("href");
302 f533f224 Vangelis Koukis
    load_request = $.ajax({
303 f533f224 Vangelis Koukis
        url: uri,
304 f533f224 Vangelis Koukis
        type: "GET",
305 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
306 f533f224 Vangelis Koukis
        dataType: "html",
307 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
308 f533f224 Vangelis Koukis
            return false;
309 f533f224 Vangelis Koukis
        },
310 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
311 f533f224 Vangelis Koukis
            $("a#single")[0].className += ' activelink';
312 f533f224 Vangelis Koukis
            $("a#standard")[0].className = '';
313 f533f224 Vangelis Koukis
            $("a#list")[0].className = '';
314 f533f224 Vangelis Koukis
            $("div#machinesview").html(data);
315 f533f224 Vangelis Koukis
        }
316 f533f224 Vangelis Koukis
    });
317 42f67a2a Dimitris Moraitis
    return false;
318 42f67a2a Dimitris Moraitis
}
319 42f67a2a Dimitris Moraitis
320 42f67a2a Dimitris Moraitis
function standard_view() {
321 f533f224 Vangelis Koukis
    changes_since = 0; // to reload full list
322 f533f224 Vangelis Koukis
    pending_actions = []; // clear pending actions
323 f533f224 Vangelis Koukis
    update_confirmations();
324 f533f224 Vangelis Koukis
    clearTimeout(deferred);    // clear old deferred calls
325 f533f224 Vangelis Koukis
    try {
326 f533f224 Vangelis Koukis
        update_request.abort() // cancel pending ajax updates
327 f533f224 Vangelis Koukis
        load_request.abort();
328 f533f224 Vangelis Koukis
    }catch(err){}
329 f533f224 Vangelis Koukis
    $.cookie("view", '0');
330 267403ca Dimitris Moraitis
    uri = $("a#standard").attr("href");
331 267403ca Dimitris Moraitis
    load_request = $.ajax({
332 267403ca Dimitris Moraitis
        url: uri,
333 267403ca Dimitris Moraitis
        type: "GET",
334 267403ca Dimitris Moraitis
        timeout: TIMEOUT,
335 267403ca Dimitris Moraitis
        dataType: "html",
336 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
337 f533f224 Vangelis Koukis
            return false;
338 f533f224 Vangelis Koukis
        },
339 267403ca Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
340 f533f224 Vangelis Koukis
            $("a#standard")[0].className += ' activelink';
341 f533f224 Vangelis Koukis
            $("a#list")[0].className = '';
342 f533f224 Vangelis Koukis
            $("a#single")[0].className = '';
343 f533f224 Vangelis Koukis
            $("div#machinesview").html(data);
344 f533f224 Vangelis Koukis
        }
345 f533f224 Vangelis Koukis
    });
346 42f67a2a Dimitris Moraitis
    return false;
347 42f67a2a Dimitris Moraitis
}
348 42f67a2a Dimitris Moraitis
349 42f67a2a Dimitris Moraitis
function choose_view() {
350 f533f224 Vangelis Koukis
    if ($.cookie("view")=='1') {
351 42f67a2a Dimitris Moraitis
        list_view();
352 f533f224 Vangelis Koukis
    } else if ($.cookie("view")=='2'){
353 f533f224 Vangelis Koukis
        single_view();
354 42f67a2a Dimitris Moraitis
    } else {
355 42f67a2a Dimitris Moraitis
        standard_view();
356 42f67a2a Dimitris Moraitis
    }
357 42f67a2a Dimitris Moraitis
}
358 42f67a2a Dimitris Moraitis
359 e4f32f27 Mike Muzurakis
// return value from metadata key "OS", if it exists
360 e4f32f27 Mike Muzurakis
function os_icon(metadata) {
361 e4f32f27 Mike Muzurakis
    if (!metadata) {
362 552c32d8 Kostas Papadimitriou
        return 'okeanos';
363 e4f32f27 Mike Muzurakis
    }
364 e4f32f27 Mike Muzurakis
    if (metadata.values.OS == undefined || metadata.values.OS == '') {
365 552c32d8 Kostas Papadimitriou
        return 'okeanos';
366 e4f32f27 Mike Muzurakis
    } else {
367 e4f32f27 Mike Muzurakis
        if (os_icons.indexOf(metadata.values.OS) == -1) {
368 552c32d8 Kostas Papadimitriou
            return 'okeanos';
369 e4f32f27 Mike Muzurakis
        } else {
370 e4f32f27 Mike Muzurakis
            return metadata.values.OS;
371 e4f32f27 Mike Muzurakis
        }
372 e4f32f27 Mike Muzurakis
    }
373 e4f32f27 Mike Muzurakis
}
374 e4f32f27 Mike Muzurakis
375 e4f32f27 Mike Muzurakis
function os_icon_from_value(metadata) {
376 e4f32f27 Mike Muzurakis
    if (!metadata) {
377 552c32d8 Kostas Papadimitriou
        return 'okeanos';
378 e4f32f27 Mike Muzurakis
    }
379 e4f32f27 Mike Muzurakis
if (metadata == undefined || metadata == '') {
380 552c32d8 Kostas Papadimitriou
        return 'okeanos';
381 e4f32f27 Mike Muzurakis
    } else {
382 e4f32f27 Mike Muzurakis
        if (os_icons.indexOf(metadata) == -1) {
383 552c32d8 Kostas Papadimitriou
            return 'okeanos';
384 e4f32f27 Mike Muzurakis
        } else {
385 e4f32f27 Mike Muzurakis
            return metadata;
386 e4f32f27 Mike Muzurakis
        }
387 e4f32f27 Mike Muzurakis
    }
388 e4f32f27 Mike Muzurakis
}
389 e4f32f27 Mike Muzurakis
390 f533f224 Vangelis Koukis
// get and show a list of running and terminated machines
391 f533f224 Vangelis Koukis
function update_vms(interval) {
392 f533f224 Vangelis Koukis
    try{ console.info('updating machines'); } catch(err){}
393 f533f224 Vangelis Koukis
    var uri= API_URL + '/servers/detail';
394 b02144c8 Vangelis Koukis
395 f533f224 Vangelis Koukis
    if (changes_since != 0)
396 f533f224 Vangelis Koukis
        uri+='?changes-since='+changes_since
397 b02144c8 Vangelis Koukis
398 f533f224 Vangelis Koukis
    update_request = $.ajax({
399 f533f224 Vangelis Koukis
        cache: false,
400 f533f224 Vangelis Koukis
        url: uri,
401 f533f224 Vangelis Koukis
        type: "GET",
402 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
403 f533f224 Vangelis Koukis
        dataType: "json",
404 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
405 f533f224 Vangelis Koukis
            // don't forget to try again later
406 f533f224 Vangelis Koukis
            if (interval) {
407 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
408 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_vms(interval);},interval,interval);
409 f533f224 Vangelis Koukis
            }
410 f533f224 Vangelis Koukis
            // as for now, just show an error message
411 f533f224 Vangelis Koukis
            try { console.info('update_vms errback:' + jqXHR.status ) } catch(err) {}
412 7991d0c5 Kostas Papadimitriou
                try {
413 7991d0c5 Kostas Papadimitriou
                    ajax_error(jqXHR.status, undefined, 'Update VMs', jqXHR.responseText);
414 7991d0c5 Kostas Papadimitriou
                } catch(err) {
415 7991d0c5 Kostas Papadimitriou
                    if (!isXhrException(err)) {
416 7991d0c5 Kostas Papadimitriou
                        ajax_error(-502, "UI Error", 'Update VMs', err);
417 7991d0c5 Kostas Papadimitriou
                    } else {
418 7991d0c5 Kostas Papadimitriou
                        return false;
419 7991d0c5 Kostas Papadimitriou
                    }
420 7991d0c5 Kostas Papadimitriou
                }
421 7991d0c5 Kostas Papadimitriou
                return false;
422 f533f224 Vangelis Koukis
            },
423 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
424 f533f224 Vangelis Koukis
            // create changes_since string if necessary
425 f533f224 Vangelis Koukis
            if (jqXHR.getResponseHeader('Date') != null){
426 f533f224 Vangelis Koukis
                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
427 f533f224 Vangelis Koukis
                changes_since = ISODateString(changes_since_date);
428 f533f224 Vangelis Koukis
            }
429 b02144c8 Vangelis Koukis
430 f533f224 Vangelis Koukis
            if (interval) {
431 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
432 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_vms(interval);},interval,interval);
433 f533f224 Vangelis Koukis
            }
434 42f67a2a Dimitris Moraitis
435 f533f224 Vangelis Koukis
            if (jqXHR.status == 200 || jqXHR.status == 203) {
436 f533f224 Vangelis Koukis
                try {
437 7acbe201 Kostas Papadimitriou
                    //servers = data.servers.values;
438 7acbe201 Kostas Papadimitriou
                    update_servers_data(data.servers.values, data);
439 882ceb8f Dimitris Moraitis
                    update_machines_view(data);
440 7991d0c5 Kostas Papadimitriou
                } catch (err) { ajax_error(-503, "UI Error", 'Update VMs', err);}
441 f533f224 Vangelis Koukis
            } else if (jqXHR.status != 304){
442 f533f224 Vangelis Koukis
                try { console.info('update_vms callback:' + jqXHR.status ) } catch(err) {}
443 f533f224 Vangelis Koukis
                /*
444 f533f224 Vangelis Koukis
                FIXME:  Here it should return the error, however Opera does not support 304.
445 f533f224 Vangelis Koukis
                        Instead 304 it returns 0. To dealt with this we treat 0 as an
446 f533f224 Vangelis Koukis
                        304, which should be corrected (Bug #317).
447 f533f224 Vangelis Koukis
                */
448 54417a11 Kostas Papadimitriou
                // ajax_error(jqXHR.status, "Ajax error", 'Update VMs', jqXHR.responseText);
449 f533f224 Vangelis Koukis
            }
450 f533f224 Vangelis Koukis
            return false;
451 f533f224 Vangelis Koukis
        }
452 42f67a2a Dimitris Moraitis
    });
453 f533f224 Vangelis Koukis
    return false;
454 f533f224 Vangelis Koukis
}
455 f533f224 Vangelis Koukis
456 7acbe201 Kostas Papadimitriou
function update_servers_data(servers_update, data) {
457 7acbe201 Kostas Papadimitriou
    $(window).trigger("vm:update", servers_update, data);
458 7acbe201 Kostas Papadimitriou
459 7acbe201 Kostas Papadimitriou
    // first call
460 7acbe201 Kostas Papadimitriou
    if (!window.servers || window.servers.length == 0) {
461 7acbe201 Kostas Papadimitriou
        window.servers = servers_update;
462 7acbe201 Kostas Papadimitriou
        return;
463 7acbe201 Kostas Papadimitriou
    }
464 7acbe201 Kostas Papadimitriou
    
465 7acbe201 Kostas Papadimitriou
    // server exists helper
466 7acbe201 Kostas Papadimitriou
    server_exists = function(server) {
467 7acbe201 Kostas Papadimitriou
        var id = server.id;
468 7acbe201 Kostas Papadimitriou
        var found = false;
469 7acbe201 Kostas Papadimitriou
        var index = 0;
470 7acbe201 Kostas Papadimitriou
        $.each(servers, function(i, s) {
471 7acbe201 Kostas Papadimitriou
            if (s.id == id) { found = true, index = i };
472 7acbe201 Kostas Papadimitriou
        });
473 7acbe201 Kostas Papadimitriou
        if (found)
474 7acbe201 Kostas Papadimitriou
            return [found, index];
475 7acbe201 Kostas Papadimitriou
476 7acbe201 Kostas Papadimitriou
        return false;
477 7acbe201 Kostas Papadimitriou
    }
478 7acbe201 Kostas Papadimitriou
479 7acbe201 Kostas Papadimitriou
    // merge object properties
480 7acbe201 Kostas Papadimitriou
    merge = function() {
481 7acbe201 Kostas Papadimitriou
        var initial = arguments[0];
482 d6eb963b Kostas Papadimitriou
        var status_changed = undefined;
483 7acbe201 Kostas Papadimitriou
        $.each(arguments, function(index, el) {
484 7acbe201 Kostas Papadimitriou
            $.each(el, function(key,v) {
485 7acbe201 Kostas Papadimitriou
                // new attribute added
486 d6eb963b Kostas Papadimitriou
                var previous_value = initial[key];
487 4b2ed497 Kostas Papadimitriou
                var v = v;
488 7acbe201 Kostas Papadimitriou
                if (initial[key] == undefined) {
489 7acbe201 Kostas Papadimitriou
                    $(window).trigger("vm:attr:add", initial, key, v);
490 7acbe201 Kostas Papadimitriou
                } else {
491 7acbe201 Kostas Papadimitriou
                    // value changed
492 7acbe201 Kostas Papadimitriou
                    if (initial[key] != v) {
493 d6eb963b Kostas Papadimitriou
                        if (key == "status") {
494 4b2ed497 Kostas Papadimitriou
                            // dont change if in destroy state
495 4b2ed497 Kostas Papadimitriou
                            if (initial.status == "DESTROY") {
496 4b2ed497 Kostas Papadimitriou
                                v = "DESTROY";
497 4b2ed497 Kostas Papadimitriou
                            }
498 d6eb963b Kostas Papadimitriou
                            status_changed = {'old': previous_value, 'new': v}; 
499 d6eb963b Kostas Papadimitriou
                        }
500 e9e7fe51 Kostas Papadimitriou
501 7acbe201 Kostas Papadimitriou
                        $(window).trigger("vm:attr:change", {'initial': initial, 'attr': key, 'newvalue': v});
502 7acbe201 Kostas Papadimitriou
                    }
503 7acbe201 Kostas Papadimitriou
                }
504 7acbe201 Kostas Papadimitriou
                initial[key] = v;
505 7acbe201 Kostas Papadimitriou
            });
506 7acbe201 Kostas Papadimitriou
        });
507 d6eb963b Kostas Papadimitriou
        if (status_changed !== undefined) {
508 d6eb963b Kostas Papadimitriou
            $(window).trigger('vm:status:change', {'vm': initial, 'old': status_changed['old'], 'new': status_changed['new']});
509 d6eb963b Kostas Papadimitriou
        }
510 7acbe201 Kostas Papadimitriou
        return initial;
511 7acbe201 Kostas Papadimitriou
    }
512 7acbe201 Kostas Papadimitriou
    
513 7acbe201 Kostas Papadimitriou
    // server removed
514 7acbe201 Kostas Papadimitriou
    var remove = [];
515 7acbe201 Kostas Papadimitriou
    $.each(servers_update, function(index, server) {
516 7acbe201 Kostas Papadimitriou
        if (server.status == "DELETED") {
517 7acbe201 Kostas Papadimitriou
            remove.push(server.id);
518 7acbe201 Kostas Papadimitriou
        }
519 7acbe201 Kostas Papadimitriou
    });
520 7acbe201 Kostas Papadimitriou
    
521 7acbe201 Kostas Papadimitriou
    // check server, if exists merge it with new values else add it
522 7acbe201 Kostas Papadimitriou
    $.each(servers_update, function(index, server) {
523 7acbe201 Kostas Papadimitriou
        var exists = server_exists(server);
524 e9e7fe51 Kostas Papadimitriou
        var old_server = servers[exists[1]];
525 e9e7fe51 Kostas Papadimitriou
526 e9e7fe51 Kostas Papadimitriou
        // reset network transition
527 e9e7fe51 Kostas Papadimitriou
        try {
528 e9e7fe51 Kostas Papadimitriou
            if (old_server.network_transition) {
529 e9e7fe51 Kostas Papadimitriou
                if (old_server.network_transition == "NETWORK_CHANGE") {
530 e9e7fe51 Kostas Papadimitriou
                    // network profile changed, servers data updated, so act if the change was made
531 e9e7fe51 Kostas Papadimitriou
                    // this flag will trigger ui to remove any transiiton indicators
532 e9e7fe51 Kostas Papadimitriou
                    // and hopefully apply the new value to the profile options
533 e9e7fe51 Kostas Papadimitriou
                    old_server.network_transition = "CHANGED"
534 e9e7fe51 Kostas Papadimitriou
                } else {
535 e9e7fe51 Kostas Papadimitriou
                    // nothing happened
536 e9e7fe51 Kostas Papadimitriou
                    old_server.network_transition = undefined;
537 e9e7fe51 Kostas Papadimitriou
                };
538 e9e7fe51 Kostas Papadimitriou
            }
539 e9e7fe51 Kostas Papadimitriou
        } catch (err) { console.info(err) }
540 e9e7fe51 Kostas Papadimitriou
541 7acbe201 Kostas Papadimitriou
        if (exists !== false) {
542 d6eb963b Kostas Papadimitriou
            try {
543 d6eb963b Kostas Papadimitriou
                servers[exists[1]] = merge(servers[exists[1]], server);
544 d6eb963b Kostas Papadimitriou
            } catch (err) {
545 d6eb963b Kostas Papadimitriou
            }
546 7acbe201 Kostas Papadimitriou
        } else {
547 7acbe201 Kostas Papadimitriou
            servers.push(server);
548 7acbe201 Kostas Papadimitriou
            $(window).trigger("vm:add", server);
549 7acbe201 Kostas Papadimitriou
        }
550 7acbe201 Kostas Papadimitriou
        if (remove.indexOf(server.id) > -1) {
551 7acbe201 Kostas Papadimitriou
            var remove_exists = server_exists(server);
552 7acbe201 Kostas Papadimitriou
            servers.splice(remove_exists[1], 1);
553 7acbe201 Kostas Papadimitriou
            $(window).trigger("vm:remove", server);
554 7acbe201 Kostas Papadimitriou
        }
555 7acbe201 Kostas Papadimitriou
    });
556 7acbe201 Kostas Papadimitriou
}
557 7acbe201 Kostas Papadimitriou
558 f533f224 Vangelis Koukis
// get a list of running and terminated machines, used in network view
559 f533f224 Vangelis Koukis
function update_networks(interval) {
560 f533f224 Vangelis Koukis
    try{ console.info('updating networks'); } catch(err){}
561 f533f224 Vangelis Koukis
    var uri= API_URL + '/servers/detail';
562 f533f224 Vangelis Koukis
563 f533f224 Vangelis Koukis
    if (changes_since != 0)
564 f533f224 Vangelis Koukis
        uri+='?changes-since='+changes_since
565 f533f224 Vangelis Koukis
566 f533f224 Vangelis Koukis
    update_request = $.ajax({
567 f533f224 Vangelis Koukis
        cache: false,
568 f533f224 Vangelis Koukis
        url: uri,
569 f533f224 Vangelis Koukis
        type: "GET",
570 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
571 f533f224 Vangelis Koukis
        dataType: "json",
572 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
573 f533f224 Vangelis Koukis
            // don't forget to try again later
574 f533f224 Vangelis Koukis
            if (interval) {
575 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
576 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_networks(interval);},interval,interval);
577 f533f224 Vangelis Koukis
            }
578 f533f224 Vangelis Koukis
            // as for now, just show an error message
579 f533f224 Vangelis Koukis
            try { console.info('update_networks errback:' + jqXHR.status ) } catch(err) {}
580 7991d0c5 Kostas Papadimitriou
581 aeed1f09 Mike Muzurakis
            try {
582 aeed1f09 Mike Muzurakis
                ajax_error(jqXHR.status, undefined, 'Update networks', jqXHR.responseText);
583 aeed1f09 Mike Muzurakis
            } catch(err) {
584 7991d0c5 Kostas Papadimitriou
                if (!isXhrException(err)) {
585 7991d0c5 Kostas Papadimitriou
                    ajax_error(-504, "UI Error", 'Update networks', err);
586 7991d0c5 Kostas Papadimitriou
                } else {
587 7991d0c5 Kostas Papadimitriou
                    return false;
588 7991d0c5 Kostas Papadimitriou
                }
589 aeed1f09 Mike Muzurakis
            }
590 f533f224 Vangelis Koukis
            return false;
591 f533f224 Vangelis Koukis
            },
592 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
593 f533f224 Vangelis Koukis
            // create changes_since string if necessary
594 f533f224 Vangelis Koukis
            if (jqXHR.getResponseHeader('Date') != null){
595 f533f224 Vangelis Koukis
                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
596 f533f224 Vangelis Koukis
                changes_since = ISODateString(changes_since_date);
597 f533f224 Vangelis Koukis
            }
598 f533f224 Vangelis Koukis
599 f533f224 Vangelis Koukis
            if (interval) {
600 f533f224 Vangelis Koukis
                clearTimeout(deferred);    // clear old deferred calls
601 f533f224 Vangelis Koukis
                deferred = setTimeout(function() {update_networks(interval);},interval,interval);
602 f533f224 Vangelis Koukis
            }
603 f533f224 Vangelis Koukis
604 f533f224 Vangelis Koukis
            if (jqXHR.status == 200 || jqXHR.status == 203) {
605 f533f224 Vangelis Koukis
                try {
606 7acbe201 Kostas Papadimitriou
                    //servers = data.servers.values;
607 7acbe201 Kostas Papadimitriou
                    update_servers_data(data.servers.values, data);
608 882ceb8f Dimitris Moraitis
                    update_network_names(data);
609 7991d0c5 Kostas Papadimitriou
                } catch(err) { ajax_error(-505, "UI Error", 'Update networks', err);}
610 f533f224 Vangelis Koukis
            } else if (jqXHR.status == 304) {
611 f533f224 Vangelis Koukis
                update_network_names();
612 f533f224 Vangelis Koukis
            }
613 f533f224 Vangelis Koukis
            else {
614 f533f224 Vangelis Koukis
                try { console.info('update_networks callback:' + jqXHR.status ) } catch(err) {}
615 f533f224 Vangelis Koukis
                /*
616 f533f224 Vangelis Koukis
                FIXME:  Here it should return the error, however Opera does not support 304.
617 f533f224 Vangelis Koukis
                        Instead 304 it returns 0. To dealt with this we treat 0 as an
618 f533f224 Vangelis Koukis
                        304, which should be corrected (Bug #317).
619 f533f224 Vangelis Koukis
                */
620 f533f224 Vangelis Koukis
                //ajax_error(jqXHR.status, undefined, 'Update networks', jqXHR.responseText);
621 f533f224 Vangelis Koukis
                update_network_names();
622 f533f224 Vangelis Koukis
            }
623 f533f224 Vangelis Koukis
            return false;
624 42f67a2a Dimitris Moraitis
        }
625 42f67a2a Dimitris Moraitis
    });
626 42f67a2a Dimitris Moraitis
    return false;
627 42f67a2a Dimitris Moraitis
}
628 42f67a2a Dimitris Moraitis
629 f533f224 Vangelis Koukis
// get and show a list of public and private networks
630 f533f224 Vangelis Koukis
function update_network_names(servers_data) {
631 f533f224 Vangelis Koukis
    try{ console.info('updating network names'); } catch(err){}
632 f533f224 Vangelis Koukis
    var uri= API_URL + '/networks/detail';
633 f533f224 Vangelis Koukis
634 f533f224 Vangelis Koukis
    if (networks_changes_since != 0)
635 f533f224 Vangelis Koukis
        //FIXME: Comment out the following, until metadata do not 304 when changed
636 f533f224 Vangelis Koukis
        uri+='?changes-since=' + networks_changes_since
637 ce4f9227 Mike Muzurakis
638 1c7978ce Dimitris Moraitis
    update_request = $.ajax({
639 c8bde382 Mike Muzurakis
        cache: false,
640 1a49199e Dimitris Moraitis
        url: uri,
641 42f67a2a Dimitris Moraitis
        type: "GET",
642 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
643 42f67a2a Dimitris Moraitis
        dataType: "json",
644 146b6003 Dimitris Moraitis
        error: function(jqXHR, textStatus, errorThrown) {
645 f533f224 Vangelis Koukis
            // as for now, just show an error message
646 f533f224 Vangelis Koukis
            try {
647 f533f224 Vangelis Koukis
                console.info('update_network names errback:' + jqXHR.status )
648 f533f224 Vangelis Koukis
            } catch(err) {}
649 aeed1f09 Mike Muzurakis
            try {
650 aeed1f09 Mike Muzurakis
                ajax_error(jqXHR.status, undefined, 'Update network names', jqXHR.responseText);
651 aeed1f09 Mike Muzurakis
            } catch(err) {
652 7991d0c5 Kostas Papadimitriou
                ajax_error(-506, "UI Error", 'Update network names', err);
653 aeed1f09 Mike Muzurakis
            }
654 f533f224 Vangelis Koukis
            return false;
655 f533f224 Vangelis Koukis
            },
656 1a49199e Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
657 e6561111 Mike Muzurakis
            // create changes_since string if necessary
658 e6561111 Mike Muzurakis
            if (jqXHR.getResponseHeader('Date') != null){
659 f533f224 Vangelis Koukis
                changes_since_date = new Date(jqXHR.getResponseHeader('Date'));
660 f533f224 Vangelis Koukis
                networks_changes_since = ISODateString(changes_since_date);
661 f533f224 Vangelis Koukis
            }
662 f533f224 Vangelis Koukis
663 f533f224 Vangelis Koukis
            if (jqXHR.status == 200 || jqXHR.status == 203) {
664 f533f224 Vangelis Koukis
                try {
665 f533f224 Vangelis Koukis
                    networks = data.networks.values;
666 882ceb8f Dimitris Moraitis
                    update_networks_view(servers_data, data);
667 f533f224 Vangelis Koukis
                } catch(err) {
668 7991d0c5 Kostas Papadimitriou
                    ajax_error(-507, "UI Error", 'Update network names', err);
669 f533f224 Vangelis Koukis
                }
670 f533f224 Vangelis Koukis
            } else if (jqXHR.status == 304) {
671 7991d0c5 Kostas Papadimitriou
                    update_networks_view(servers_data);
672 f533f224 Vangelis Koukis
            } else if (jqXHR.status != 304){
673 f533f224 Vangelis Koukis
                try { console.info('update_network_names callback:' + jqXHR.status ) } catch(err) {}
674 f533f224 Vangelis Koukis
                /*
675 f533f224 Vangelis Koukis
                FIXME:  Here it should return the error, however Opera does not support 304.
676 f533f224 Vangelis Koukis
                        Instead 304 it returns 0. To dealt with this we treat 0 as an
677 f533f224 Vangelis Koukis
                        304, which should be corrected (Bug #317).
678 f533f224 Vangelis Koukis
                */
679 f533f224 Vangelis Koukis
                //ajax_error(jqXHR.status, undefined, 'Update network names', jqXHR.responseText);
680 f533f224 Vangelis Koukis
                update_networks_view(servers_data);
681 f533f224 Vangelis Koukis
            }
682 f533f224 Vangelis Koukis
            return false;
683 42f67a2a Dimitris Moraitis
        }
684 42f67a2a Dimitris Moraitis
    });
685 42f67a2a Dimitris Moraitis
    return false;
686 42f67a2a Dimitris Moraitis
}
687 42f67a2a Dimitris Moraitis
688 146b6003 Dimitris Moraitis
// get and show a list of available standard and custom images
689 b02144c8 Vangelis Koukis
function update_images() {
690 42f67a2a Dimitris Moraitis
    $.ajax({
691 73c2c75b Markos Gogoulos
        url: API_URL + '/images/detail',
692 42f67a2a Dimitris Moraitis
        type: "GET",
693 42f67a2a Dimitris Moraitis
        //async: false,
694 42f67a2a Dimitris Moraitis
        dataType: "json",
695 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
696 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
697 aeed1f09 Mike Muzurakis
                    try {
698 aeed1f09 Mike Muzurakis
                        ajax_error(jqXHR.status, undefined, 'Update Images', jqXHR.responseText);
699 aeed1f09 Mike Muzurakis
                    } catch(err) {
700 7991d0c5 Kostas Papadimitriou
                        ajax_error(-508, "UI error", 'Update Images', err);
701 aeed1f09 Mike Muzurakis
                    }
702 aeed1f09 Mike Muzurakis
                },
703 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
704 146b6003 Dimitris Moraitis
            try {
705 f533f224 Vangelis Koukis
                images = data.images.values;
706 ddf929a7 Christodoulos Psaltis
                jQuery.parseJSON(data);
707 f533f224 Vangelis Koukis
                update_wizard_images();
708 f533f224 Vangelis Koukis
            } catch(err){
709 f533f224 Vangelis Koukis
                ajax_error("NO_IMAGES");
710 f533f224 Vangelis Koukis
            }
711 42f67a2a Dimitris Moraitis
        }
712 42f67a2a Dimitris Moraitis
    });
713 42f67a2a Dimitris Moraitis
    return false;
714 42f67a2a Dimitris Moraitis
}
715 42f67a2a Dimitris Moraitis
716 d134b632 Dimitris Moraitis
function update_wizard_images() {
717 f533f224 Vangelis Koukis
    if ($("ul#standard-images li").toArray().length + $("ul#custom-images li").toArray().length == 0) {
718 f533f224 Vangelis Koukis
        $.each(images, function(i,image){
719 f533f224 Vangelis Koukis
            var img = $('#image-template').clone().attr("id","img-"+image.id).fadeIn("slow");
720 f533f224 Vangelis Koukis
            img.find("label").attr('for',"img-radio-" + image.id);
721 f533f224 Vangelis Koukis
            img.find(".image-title").text(image.name);
722 73c2c75b Markos Gogoulos
            if (image.metadata) {
723 73c2c75b Markos Gogoulos
                if (image.metadata.values.description != undefined) {
724 73c2c75b Markos Gogoulos
                    img.find(".description").text(image.metadata.values.description);
725 73c2c75b Markos Gogoulos
                }
726 73c2c75b Markos Gogoulos
                if (image.metadata.values.size != undefined) {
727 f533f224 Vangelis Koukis
                    img.find("#size").text(image.metadata.values.size);
728 73c2c75b Markos Gogoulos
                }
729 73c2c75b Markos Gogoulos
            }
730 f533f224 Vangelis Koukis
            img.find("input.radio").attr('id',"img-radio-" + image.id);
731 f533f224 Vangelis Koukis
            if (i==0) img.find("input.radio").attr("checked","checked");
732 a64e74f0 Markos Gogoulos
            var image_logo = os_icon(image.metadata);
733 f533f224 Vangelis Koukis
            img.find("img.image-logo").attr('src','static/icons/os/'+image_logo+'.png');
734 73c2c75b Markos Gogoulos
            if (image.metadata) {
735 73c2c75b Markos Gogoulos
                if (image.metadata.values.serverId != undefined) {
736 73c2c75b Markos Gogoulos
                    img.appendTo("ul#custom-images");
737 73c2c75b Markos Gogoulos
                } else {
738 73c2c75b Markos Gogoulos
                    img.appendTo("ul#standard-images");
739 73c2c75b Markos Gogoulos
                }
740 73c2c75b Markos Gogoulos
            } else {
741 73c2c75b Markos Gogoulos
                img.appendTo("ul#standard-images");
742 73c2c75b Markos Gogoulos
            }
743 f533f224 Vangelis Koukis
        });
744 f533f224 Vangelis Koukis
    }
745 d134b632 Dimitris Moraitis
}
746 d134b632 Dimitris Moraitis
747 d134b632 Dimitris Moraitis
function update_wizard_flavors(){
748 f533f224 Vangelis Koukis
    // sliders for selecting VM flavor
749 f533f224 Vangelis Koukis
    $("#cpu:range").rangeinput({min:0,
750 f533f224 Vangelis Koukis
                               value:0,
751 f533f224 Vangelis Koukis
                               step:1,
752 f533f224 Vangelis Koukis
                               progress: true,
753 f533f224 Vangelis Koukis
                               max:cpus.length-1});
754 f533f224 Vangelis Koukis
755 f533f224 Vangelis Koukis
    $("#storage:range").rangeinput({min:0,
756 f533f224 Vangelis Koukis
                               value:0,
757 f533f224 Vangelis Koukis
                               step:1,
758 f533f224 Vangelis Koukis
                               progress: true,
759 f533f224 Vangelis Koukis
                               max:disks.length-1});
760 f533f224 Vangelis Koukis
761 f533f224 Vangelis Koukis
    $("#ram:range").rangeinput({min:0,
762 f533f224 Vangelis Koukis
                               value:0,
763 f533f224 Vangelis Koukis
                               step:1,
764 f533f224 Vangelis Koukis
                               progress: true,
765 f533f224 Vangelis Koukis
                               max:ram.length-1});
766 f533f224 Vangelis Koukis
    $("#small").click();
767 f533f224 Vangelis Koukis
768 f533f224 Vangelis Koukis
    // update the indicators when sliding
769 f533f224 Vangelis Koukis
    $("#cpu:range").data().rangeinput.onSlide(function(event,value){
770 f533f224 Vangelis Koukis
        $("#cpu-indicator")[0].value = cpus[Number(value)];
771 afa2ebd2 Mike Muzurakis
        $("#cpu-indicator").addClass('selectedrange');
772 f533f224 Vangelis Koukis
    });
773 f533f224 Vangelis Koukis
    $("#cpu:range").data().rangeinput.change(function(event,value){
774 f533f224 Vangelis Koukis
        $("#cpu-indicator")[0].value = cpus[Number(value)];
775 f533f224 Vangelis Koukis
        $("#custom").click();
776 f533f224 Vangelis Koukis
        $("#cpu-indicator").removeClass('selectedrange');
777 f533f224 Vangelis Koukis
    });
778 f533f224 Vangelis Koukis
    $("#ram:range").data().rangeinput.onSlide(function(event,value){
779 f533f224 Vangelis Koukis
        $("#ram-indicator")[0].value = ram[Number(value)];
780 afa2ebd2 Mike Muzurakis
        $("#ram-indicator").addClass('selectedrange');
781 f533f224 Vangelis Koukis
    });
782 f533f224 Vangelis Koukis
    $("#ram:range").data().rangeinput.change(function(event,value){
783 f533f224 Vangelis Koukis
        $("#ram-indicator")[0].value = ram[Number(value)];
784 f533f224 Vangelis Koukis
        $("#custom").click();
785 f533f224 Vangelis Koukis
        $("#ram-indicator").removeClass('selectedrange');
786 f533f224 Vangelis Koukis
    });
787 f533f224 Vangelis Koukis
    $("#storage:range").data().rangeinput.onSlide(function(event,value){
788 f533f224 Vangelis Koukis
        $("#storage-indicator")[0].value = disks[Number(value)];
789 afa2ebd2 Mike Muzurakis
        $("#storage-indicator").addClass('selectedrange');
790 f533f224 Vangelis Koukis
    });
791 f533f224 Vangelis Koukis
    $("#storage:range").data().rangeinput.change(function(event,value){
792 f533f224 Vangelis Koukis
        $("#storage-indicator")[0].value = disks[Number(value)];
793 f533f224 Vangelis Koukis
        $("#custom").click();
794 f533f224 Vangelis Koukis
        $("#storage-indicator").removeClass('selectedrange');
795 f533f224 Vangelis Koukis
    });
796 d134b632 Dimitris Moraitis
}
797 d134b632 Dimitris Moraitis
798 42f67a2a Dimitris Moraitis
Array.prototype.unique = function () {
799 f533f224 Vangelis Koukis
    var r = new Array();
800 f533f224 Vangelis Koukis
    o:for(var i = 0, n = this.length; i < n; i++)
801 f533f224 Vangelis Koukis
    {
802 f533f224 Vangelis Koukis
        for(var x = 0, y = r.length; x < y; x++)
803 f533f224 Vangelis Koukis
        {
804 f533f224 Vangelis Koukis
            if(r[x]==this[i])
805 f533f224 Vangelis Koukis
            {
806 f533f224 Vangelis Koukis
                continue o;
807 f533f224 Vangelis Koukis
            }
808 f533f224 Vangelis Koukis
        }
809 f533f224 Vangelis Koukis
        r[r.length] = this[i];
810 f533f224 Vangelis Koukis
    }
811 f533f224 Vangelis Koukis
    return r;
812 42f67a2a Dimitris Moraitis
}
813 42f67a2a Dimitris Moraitis
814 42f67a2a Dimitris Moraitis
// get and configure flavor selection
815 b02144c8 Vangelis Koukis
function update_flavors() {
816 42f67a2a Dimitris Moraitis
    $.ajax({
817 f1641e4d Markos Gogoulos
        url: API_URL + '/flavors/detail',
818 42f67a2a Dimitris Moraitis
        type: "GET",
819 42f67a2a Dimitris Moraitis
        //async: false,
820 42f67a2a Dimitris Moraitis
        dataType: "json",
821 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
822 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
823 146b6003 Dimitris Moraitis
            try {
824 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Update Flavors', jqXHR.responseText);
825 f533f224 Vangelis Koukis
            } catch (err) {
826 7991d0c5 Kostas Papadimitriou
                ajax_error(-509, "UI Error", "Update Flavors", err);
827 f533f224 Vangelis Koukis
            }
828 66307c9e Christodoulos Psaltis
            // start updating vm list
829 66307c9e Christodoulos Psaltis
            update_vms(UPDATE_INTERVAL);
830 42f67a2a Dimitris Moraitis
        },
831 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
832 9b2ab29a Christodoulos Psaltis
833 882ceb8f Dimitris Moraitis
            try {
834 882ceb8f Dimitris Moraitis
                flavors = data.flavors.values;
835 882ceb8f Dimitris Moraitis
                jQuery.parseJSON(data);
836 882ceb8f Dimitris Moraitis
                $.each(flavors, function(i, flavor) {
837 882ceb8f Dimitris Moraitis
                    cpus[i] = flavor['cpu'];
838 882ceb8f Dimitris Moraitis
                    disks[i] = flavor['disk'];
839 882ceb8f Dimitris Moraitis
                    ram[i] = flavor['ram'];
840 882ceb8f Dimitris Moraitis
                });
841 882ceb8f Dimitris Moraitis
                cpus = cpus.unique();
842 882ceb8f Dimitris Moraitis
                disks = disks.unique();
843 882ceb8f Dimitris Moraitis
                ram = ram.unique();
844 882ceb8f Dimitris Moraitis
                update_wizard_flavors();
845 882ceb8f Dimitris Moraitis
            } catch(err){
846 882ceb8f Dimitris Moraitis
                ajax_error("NO_FLAVORS");
847 882ceb8f Dimitris Moraitis
            }
848 66307c9e Christodoulos Psaltis
            // start updating vm list
849 66307c9e Christodoulos Psaltis
            update_vms(UPDATE_INTERVAL);
850 42f67a2a Dimitris Moraitis
        }
851 42f67a2a Dimitris Moraitis
    });
852 42f67a2a Dimitris Moraitis
    return false;
853 42f67a2a Dimitris Moraitis
}
854 1a49199e Dimitris Moraitis
855 b335768e Markos Gogoulos
// return flavorRef from cpu, disk, ram values
856 42f67a2a Dimitris Moraitis
function identify_flavor(cpu, disk, ram){
857 42f67a2a Dimitris Moraitis
    for (i=0;i<flavors.length;i++){
858 42f67a2a Dimitris Moraitis
        if (flavors[i]['cpu'] == cpu && flavors[i]['disk']==disk && flavors[i]['ram']==ram) {
859 42f67a2a Dimitris Moraitis
            return flavors[i]['id']
860 42f67a2a Dimitris Moraitis
        }
861 42f67a2a Dimitris Moraitis
    }
862 42f67a2a Dimitris Moraitis
    return 0;
863 42f67a2a Dimitris Moraitis
}
864 42f67a2a Dimitris Moraitis
865 45ab204d Markos Gogoulos
// return image entry from imageRef
866 45ab204d Markos Gogoulos
function get_image(imageRef) {
867 45ab204d Markos Gogoulos
    for (i=0;i<images.length;i++){
868 45ab204d Markos Gogoulos
        if (images[i]['id'] == imageRef) {
869 45ab204d Markos Gogoulos
            return images[i];
870 45ab204d Markos Gogoulos
        }
871 45ab204d Markos Gogoulos
    }
872 45ab204d Markos Gogoulos
    return 0;
873 45ab204d Markos Gogoulos
}
874 45ab204d Markos Gogoulos
875 f533f224 Vangelis Koukis
// return machine entry from serverID
876 f533f224 Vangelis Koukis
function get_machine(serverID) {
877 f533f224 Vangelis Koukis
    for (i=0;i<servers.length;i++){
878 f533f224 Vangelis Koukis
        if (servers[i]['id'] == serverID) {
879 f533f224 Vangelis Koukis
            return servers[i];
880 f533f224 Vangelis Koukis
        }
881 f533f224 Vangelis Koukis
    }
882 f533f224 Vangelis Koukis
    return 0;
883 f533f224 Vangelis Koukis
}
884 f533f224 Vangelis Koukis
885 f533f224 Vangelis Koukis
// update the actions in icon view, per server
886 f533f224 Vangelis Koukis
function update_iconview_actions(serverID, server_status) {
887 dc3e66b9 Mike Muzurakis
    if ($.cookie("view")=='2') {
888 dc3e66b9 Mike Muzurakis
        // remove .disable from all actions to begin with
889 6a738cca Christodoulos Psaltis
        $('#machinesview-single #' + serverID + ' div.single-action').show();
890 dc3e66b9 Mike Muzurakis
        // decide which actions should be disabled
891 dc3e66b9 Mike Muzurakis
        for (current_action in actions) {
892 dc3e66b9 Mike Muzurakis
            if (actions[current_action].indexOf(server_status) == -1 ) {
893 6a738cca Christodoulos Psaltis
                $('#machinesview-single #' + serverID + ' div.action-' + current_action).hide();
894 dc3e66b9 Mike Muzurakis
            }
895 dc3e66b9 Mike Muzurakis
        }
896 dc3e66b9 Mike Muzurakis
    } else {
897 dc3e66b9 Mike Muzurakis
        // remove .disable from all actions to begin with
898 19697f4f Mike Muzurakis
        $('#machinesview-icon.standard #' + serverID + ' div.actions').find('a').removeClass('disabled');
899 dc3e66b9 Mike Muzurakis
        // decide which actions should be disabled
900 dc3e66b9 Mike Muzurakis
        for (current_action in actions) {
901 dc3e66b9 Mike Muzurakis
            if (actions[current_action].indexOf(server_status) == -1 ) {
902 dc3e66b9 Mike Muzurakis
                $('#machinesview-icon.standard #' + serverID + ' a.action-' + current_action).addClass('disabled');
903 dc3e66b9 Mike Muzurakis
            }
904 f533f224 Vangelis Koukis
        }
905 f533f224 Vangelis Koukis
    }
906 f533f224 Vangelis Koukis
}
907 f533f224 Vangelis Koukis
908 dcf153ce Christodoulos Psaltis
// update the actions in list view
909 f533f224 Vangelis Koukis
function update_listview_actions() {
910 f533f224 Vangelis Koukis
    var states = [];
911 f533f224 Vangelis Koukis
    var on = [];
912 f533f224 Vangelis Koukis
    var checked = $("table.list-machines tbody input[type='checkbox']:checked");
913 f533f224 Vangelis Koukis
    // disable all actions to begin with
914 f533f224 Vangelis Koukis
    $('#machinesview .list div.actions').children().removeClass('enabled');
915 f533f224 Vangelis Koukis
916 f533f224 Vangelis Koukis
    // are there multiple machines selected?
917 f533f224 Vangelis Koukis
    if (checked.length>1)
918 f533f224 Vangelis Koukis
        states[0] = 'multiple';
919 f533f224 Vangelis Koukis
920 f533f224 Vangelis Koukis
    // check the states of selected machines
921 f533f224 Vangelis Koukis
    checked.each(function(i,checkbox) {
922 f533f224 Vangelis Koukis
        states[states.length] = checkbox.className;
923 f533f224 Vangelis Koukis
        var ip = $("#" + checkbox.id.replace('input-','') + ".ip span.public").text();
924 f533f224 Vangelis Koukis
        if (ip.replace('undefined','').length)
925 f533f224 Vangelis Koukis
            states[states.length] = 'network';
926 f533f224 Vangelis Koukis
    });
927 f533f224 Vangelis Koukis
928 f533f224 Vangelis Koukis
    // decide which actions should be enabled
929 f533f224 Vangelis Koukis
    for (a in actions) {
930 f533f224 Vangelis Koukis
        var enabled = false;
931 f533f224 Vangelis Koukis
        for (var s =0; s<states.length; s++) {
932 f533f224 Vangelis Koukis
            if (actions[a].indexOf(states[s]) != -1 ) {
933 f533f224 Vangelis Koukis
                enabled = true;
934 f533f224 Vangelis Koukis
            } else {
935 f533f224 Vangelis Koukis
                enabled = false;
936 f533f224 Vangelis Koukis
                break;
937 f533f224 Vangelis Koukis
            }
938 f533f224 Vangelis Koukis
        }
939 f533f224 Vangelis Koukis
        if (enabled)
940 f533f224 Vangelis Koukis
            on[on.length]=a;
941 f533f224 Vangelis Koukis
    }
942 f533f224 Vangelis Koukis
    // enable those actions
943 f533f224 Vangelis Koukis
    for (action in on) {
944 f533f224 Vangelis Koukis
        $("#action-" + on[action]).addClass('enabled');
945 f533f224 Vangelis Koukis
    }
946 e32c2a5d Dimitris Moraitis
}
947 146b6003 Dimitris Moraitis
948 0971fa71 Markos Gogoulos
//create server action
949 0971fa71 Markos Gogoulos
function create_vm(machineName, imageRef, flavorRef){
950 45ab204d Markos Gogoulos
    var image_logo = os_icon(get_image(imageRef).metadata);
951 f533f224 Vangelis Koukis
    var uri = API_URL + '/servers';
952 0971fa71 Markos Gogoulos
    var payload = {
953 0971fa71 Markos Gogoulos
        "server": {
954 0971fa71 Markos Gogoulos
            "name": machineName,
955 0971fa71 Markos Gogoulos
            "imageRef": imageRef,
956 0971fa71 Markos Gogoulos
            "flavorRef" : flavorRef,
957 0971fa71 Markos Gogoulos
            "metadata" : {
958 45ab204d Markos Gogoulos
                "OS" : image_logo
959 038383b1 Dimitris Moraitis
            }
960 0971fa71 Markos Gogoulos
        }
961 0971fa71 Markos Gogoulos
    };
962 0971fa71 Markos Gogoulos
963 0971fa71 Markos Gogoulos
    $.ajax({
964 7e45ddef Dimitris Moraitis
    url: uri,
965 0971fa71 Markos Gogoulos
    type: "POST",
966 f533f224 Vangelis Koukis
    contentType: "application/json",
967 b02144c8 Vangelis Koukis
    dataType: "json",
968 0971fa71 Markos Gogoulos
    data: JSON.stringify(payload),
969 0971fa71 Markos Gogoulos
    timeout: TIMEOUT,
970 b02144c8 Vangelis Koukis
    error: function(jqXHR, textStatus, errorThrown) {
971 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
972 ddf929a7 Christodoulos Psaltis
                $('#machines-pane a#create').data('overlay').close();
973 aeed1f09 Mike Muzurakis
                    try {
974 cbb7a325 Christodoulos Psaltis
                        ajax_error(jqXHR.status, undefined, 'Create VM', jqXHR.responseText);
975 aeed1f09 Mike Muzurakis
                    } catch(err) {
976 7991d0c5 Kostas Papadimitriou
                        if (!isXhrException(err)) {
977 7991d0c5 Kostas Papadimitriou
                            ajax_error(-510, "UI Error", 'Create VM', err);
978 7991d0c5 Kostas Papadimitriou
                        }
979 aeed1f09 Mike Muzurakis
                    }
980 0971fa71 Markos Gogoulos
           },
981 0971fa71 Markos Gogoulos
    success: function(data, textStatus, jqXHR) {
982 0971fa71 Markos Gogoulos
                if ( jqXHR.status == '202') {
983 b02144c8 Vangelis Koukis
                    ajax_success("CREATE_VM_SUCCESS", data.server.adminPass);
984 0971fa71 Markos Gogoulos
                } else {
985 ddf929a7 Christodoulos Psaltis
                    // close wizard and show error box
986 ddf929a7 Christodoulos Psaltis
                    $('#machines-pane a#create').data('overlay').close();
987 038383b1 Dimitris Moraitis
                    ajax_error(jqXHR.status, undefined, 'Create VM', jqXHR.responseText);
988 0971fa71 Markos Gogoulos
                }
989 0971fa71 Markos Gogoulos
            }
990 0971fa71 Markos Gogoulos
    });
991 0971fa71 Markos Gogoulos
}
992 0971fa71 Markos Gogoulos
993 42f67a2a Dimitris Moraitis
// reboot action
994 42f67a2a Dimitris Moraitis
function reboot(serverIDs){
995 f533f224 Vangelis Koukis
    if (!serverIDs.length){
996 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
997 f533f224 Vangelis Koukis
        return false;
998 f533f224 Vangelis Koukis
    }
999 42f67a2a Dimitris Moraitis
    // ajax post reboot call
1000 42f67a2a Dimitris Moraitis
    var payload = {
1001 42f67a2a Dimitris Moraitis
        "reboot": {"type" : "HARD"}
1002 42f67a2a Dimitris Moraitis
    };
1003 f533f224 Vangelis Koukis
1004 a1a31201 Dimitris Moraitis
    var serverID = serverIDs.pop();
1005 f533f224 Vangelis Koukis
1006 f533f224 Vangelis Koukis
    $.ajax({
1007 f533f224 Vangelis Koukis
        url: API_URL + '/servers/' + serverID + '/action',
1008 f533f224 Vangelis Koukis
        type: "POST",
1009 f533f224 Vangelis Koukis
        contentType: "application/json",
1010 f533f224 Vangelis Koukis
        dataType: "json",
1011 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1012 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1013 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1014 3a254f7c Christodoulos Psaltis
                    // in machine views
1015 3a254f7c Christodoulos Psaltis
                    if ( $.cookie("pane") == 0) {
1016 3a254f7c Christodoulos Psaltis
                        try {
1017 3a254f7c Christodoulos Psaltis
                            display_failure(jqXHR.status, serverID, 'Reboot', jqXHR.responseText);
1018 3a254f7c Christodoulos Psaltis
                        } catch (err) {
1019 3a254f7c Christodoulos Psaltis
                            display_failure(0, serverID, 'Reboot', jqXHR.responseText);
1020 3a254f7c Christodoulos Psaltis
                        }
1021 3a254f7c Christodoulos Psaltis
                    }
1022 3a254f7c Christodoulos Psaltis
                    // in network view
1023 3a254f7c Christodoulos Psaltis
                    else {
1024 3a254f7c Christodoulos Psaltis
                        try {
1025 3a254f7c Christodoulos Psaltis
                            display_reboot_failure(jqXHR.status, serverID, jqXHR.responseText);
1026 3a254f7c Christodoulos Psaltis
                        } catch (err) {
1027 3a254f7c Christodoulos Psaltis
                            display_reboot_failure(0, serverID, jqXHR.responseText);
1028 3a254f7c Christodoulos Psaltis
                        }
1029 aeed1f09 Mike Muzurakis
                    }
1030 f533f224 Vangelis Koukis
                },
1031 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1032 f533f224 Vangelis Koukis
                    if ( jqXHR.status == '202') {
1033 583932c4 Christodoulos Psaltis
                        try {
1034 583932c4 Christodoulos Psaltis
                            console.info('rebooted ' + serverID);
1035 a1a31201 Dimitris Moraitis
                        } catch(err) {}
1036 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1037 3a254f7c Christodoulos Psaltis
                        // in machine views
1038 3a254f7c Christodoulos Psaltis
                        if ( $.cookie("pane") == 0) {
1039 3a254f7c Christodoulos Psaltis
                            display_success(serverID);
1040 3a254f7c Christodoulos Psaltis
                        }
1041 3a254f7c Christodoulos Psaltis
                        // in network view
1042 3a254f7c Christodoulos Psaltis
                        else {
1043 3a254f7c Christodoulos Psaltis
                            display_reboot_success(serverID);
1044 3a254f7c Christodoulos Psaltis
                        }
1045 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
1046 f533f224 Vangelis Koukis
                        reboot(serverIDs);
1047 f533f224 Vangelis Koukis
                    } else {
1048 f533f224 Vangelis Koukis
                        ajax_error(jqXHR.status, serverID, 'Reboot', jqXHR.responseText);
1049 f533f224 Vangelis Koukis
                    }
1050 f533f224 Vangelis Koukis
                }
1051 42f67a2a Dimitris Moraitis
    });
1052 42f67a2a Dimitris Moraitis
    return false;
1053 42f67a2a Dimitris Moraitis
}
1054 42f67a2a Dimitris Moraitis
1055 42f67a2a Dimitris Moraitis
// shutdown action
1056 42f67a2a Dimitris Moraitis
function shutdown(serverIDs) {
1057 f533f224 Vangelis Koukis
    if (!serverIDs.length){
1058 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1059 f533f224 Vangelis Koukis
        return false;
1060 f533f224 Vangelis Koukis
    }
1061 42f67a2a Dimitris Moraitis
    // ajax post shutdown call
1062 42f67a2a Dimitris Moraitis
    var payload = {
1063 9bc2dbfa Vangelis Koukis
        "shutdown": {}
1064 b02144c8 Vangelis Koukis
    };
1065 42f67a2a Dimitris Moraitis
1066 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1067 f533f224 Vangelis Koukis
1068 42f67a2a Dimitris Moraitis
    $.ajax({
1069 f533f224 Vangelis Koukis
        url: API_URL + '/servers/' + serverID + '/action',
1070 f533f224 Vangelis Koukis
        type: "POST",
1071 f533f224 Vangelis Koukis
        contentType: "application/json",
1072 f533f224 Vangelis Koukis
        dataType: "json",
1073 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
1074 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
1075 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1076 aeed1f09 Mike Muzurakis
                    try {
1077 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Shutdown', jqXHR.responseText);
1078 aeed1f09 Mike Muzurakis
                    } catch(err) {
1079 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Shutdown', jqXHR.responseText);
1080 aeed1f09 Mike Muzurakis
                    }
1081 aeed1f09 Mike Muzurakis
                },
1082 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
1083 42f67a2a Dimitris Moraitis
                    if ( jqXHR.status == '202') {
1084 f533f224 Vangelis Koukis
                        try {
1085 583932c4 Christodoulos Psaltis
                            console.info('suspended ' + serverID);
1086 a1a31201 Dimitris Moraitis
                        } catch(err) {}
1087 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1088 f533f224 Vangelis Koukis
                        display_success(serverID);
1089 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
1090 42f67a2a Dimitris Moraitis
                        shutdown(serverIDs);
1091 42f67a2a Dimitris Moraitis
                    } else {
1092 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Shutdown', jqXHR.responseText);
1093 748139ba Christodoulos Psaltis
                    }
1094 b02144c8 Vangelis Koukis
                }
1095 42f67a2a Dimitris Moraitis
    });
1096 b02144c8 Vangelis Koukis
    return false;
1097 42f67a2a Dimitris Moraitis
}
1098 42f67a2a Dimitris Moraitis
1099 42f67a2a Dimitris Moraitis
// destroy action
1100 42f67a2a Dimitris Moraitis
function destroy(serverIDs) {
1101 f533f224 Vangelis Koukis
    if (!serverIDs.length){
1102 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1103 f533f224 Vangelis Koukis
        return false;
1104 f533f224 Vangelis Koukis
    }
1105 f15025bc Christodoulos Psaltis
    // ajax post destroy call can have an empty request body
1106 b02144c8 Vangelis Koukis
    var payload = {};
1107 42f67a2a Dimitris Moraitis
1108 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1109 f533f224 Vangelis Koukis
1110 42f67a2a Dimitris Moraitis
    $.ajax({
1111 f533f224 Vangelis Koukis
        url: API_URL + '/servers/' + serverID,
1112 f533f224 Vangelis Koukis
        type: "DELETE",
1113 f533f224 Vangelis Koukis
        contentType: "application/json",
1114 f533f224 Vangelis Koukis
        dataType: "json",
1115 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
1116 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
1117 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1118 aeed1f09 Mike Muzurakis
                    try {
1119 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Destroy', jqXHR.responseText);
1120 aeed1f09 Mike Muzurakis
                    } catch(err) {
1121 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Destroy', jqXHR.responseText);
1122 aeed1f09 Mike Muzurakis
                    }
1123 aeed1f09 Mike Muzurakis
                },
1124 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
1125 2d5cea9b Markos Gogoulos
                    if ( jqXHR.status == '204') {
1126 f533f224 Vangelis Koukis
                        try {
1127 f15025bc Christodoulos Psaltis
                            console.info('destroyed ' + serverID);
1128 a1a31201 Dimitris Moraitis
                        } catch (err) {}
1129 4b2ed497 Kostas Papadimitriou
1130 4b2ed497 Kostas Papadimitriou
                        // update status on local storage object
1131 4b2ed497 Kostas Papadimitriou
                        vm = get_machine(serverID);
1132 4b2ed497 Kostas Papadimitriou
                        vm.status = "DESTROY";
1133 4b2ed497 Kostas Papadimitriou
1134 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1135 f533f224 Vangelis Koukis
                        display_success(serverID);
1136 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
1137 38b1f387 Christodoulos Psaltis
                        destroy(serverIDs);
1138 42f67a2a Dimitris Moraitis
                    } else {
1139 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Destroy', jqXHR.responseText);
1140 748139ba Christodoulos Psaltis
                    }
1141 b02144c8 Vangelis Koukis
                }
1142 42f67a2a Dimitris Moraitis
    });
1143 b02144c8 Vangelis Koukis
    return false;
1144 42f67a2a Dimitris Moraitis
}
1145 42f67a2a Dimitris Moraitis
1146 42f67a2a Dimitris Moraitis
// start action
1147 42f67a2a Dimitris Moraitis
function start(serverIDs){
1148 f533f224 Vangelis Koukis
    if (!serverIDs.length){
1149 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1150 f533f224 Vangelis Koukis
        return false;
1151 f533f224 Vangelis Koukis
    }
1152 42f67a2a Dimitris Moraitis
    // ajax post start call
1153 42f67a2a Dimitris Moraitis
    var payload = {
1154 623d7244 Vangelis Koukis
        "start": {}
1155 b02144c8 Vangelis Koukis
    };
1156 42f67a2a Dimitris Moraitis
1157 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1158 f533f224 Vangelis Koukis
1159 42f67a2a Dimitris Moraitis
    $.ajax({
1160 0971fa71 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/action',
1161 42f67a2a Dimitris Moraitis
        type: "POST",
1162 f533f224 Vangelis Koukis
        contentType: "application/json",
1163 42f67a2a Dimitris Moraitis
        dataType: "json",
1164 42f67a2a Dimitris Moraitis
        data: JSON.stringify(payload),
1165 42f67a2a Dimitris Moraitis
        timeout: TIMEOUT,
1166 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1167 aeed1f09 Mike Muzurakis
                    try {
1168 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Start', jqXHR.responseText);
1169 aeed1f09 Mike Muzurakis
                    } catch(err) {
1170 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Start', jqXHR.responseText);
1171 aeed1f09 Mike Muzurakis
                    }
1172 aeed1f09 Mike Muzurakis
                },
1173 42f67a2a Dimitris Moraitis
        success: function(data, textStatus, jqXHR) {
1174 42f67a2a Dimitris Moraitis
                    if ( jqXHR.status == '202') {
1175 f533f224 Vangelis Koukis
                        try {
1176 583932c4 Christodoulos Psaltis
                            console.info('started ' + serverID);
1177 a1a31201 Dimitris Moraitis
                        } catch(err) {}
1178 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1179 f533f224 Vangelis Koukis
                        display_success(serverID);
1180 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
1181 42f67a2a Dimitris Moraitis
                        start(serverIDs);
1182 42f67a2a Dimitris Moraitis
                    } else {
1183 038383b1 Dimitris Moraitis
                        ajax_error(jqXHR.status, serverID, 'Start', jqXHR.responseText);
1184 748139ba Christodoulos Psaltis
                    }
1185 748139ba Christodoulos Psaltis
                }
1186 42f67a2a Dimitris Moraitis
    });
1187 42f67a2a Dimitris Moraitis
    return false;
1188 42f67a2a Dimitris Moraitis
}
1189 6902f72e clopy
1190 b02144c8 Vangelis Koukis
// Show VNC console
1191 b02144c8 Vangelis Koukis
function vnc_attachment(host, port, password) {
1192 b02144c8 Vangelis Koukis
    // FIXME: Must be made into parameters, in settings.py
1193 b02144c8 Vangelis Koukis
    //vnc = open("", "displayWindow",
1194 b02144c8 Vangelis Koukis
    //    "status=yes,toolbar=yes,menubar=yes");
1195 b02144c8 Vangelis Koukis
    vd = document.open("application/x-vnc");
1196 b02144c8 Vangelis Koukis
1197 b02144c8 Vangelis Koukis
    vd.writeln("[connection]");
1198 b02144c8 Vangelis Koukis
    vd.writeln("host=" + host);
1199 b02144c8 Vangelis Koukis
    vd.writeln("port=" + port);
1200 b02144c8 Vangelis Koukis
    vd.writeln("password=" + password);
1201 b02144c8 Vangelis Koukis
1202 b02144c8 Vangelis Koukis
    vd.close();
1203 b02144c8 Vangelis Koukis
}
1204 b02144c8 Vangelis Koukis
1205 b02144c8 Vangelis Koukis
// Show VNC console
1206 f533f224 Vangelis Koukis
function show_vnc_console(serverID, serverName, serverIP, host, port, password) {
1207 f277a1cd Kostas Papadimitriou
    var params_url = '?machine=' + serverName + '&host_ip=' + serverIP.v4 + '&host_ip_v6=' + serverIP.v6 + '&host=' + host + '&port=' + port + '&password=' + password;
1208 f533f224 Vangelis Koukis
    var params_window = 'scrollbars=no,' +
1209 f533f224 Vangelis Koukis
                        'menubar=no,' +
1210 f533f224 Vangelis Koukis
                        'toolbar=no,' +
1211 f533f224 Vangelis Koukis
                        'status=no,' +
1212 f533f224 Vangelis Koukis
                        'top=0,' +
1213 f533f224 Vangelis Koukis
                        'left=0,' +
1214 f533f224 Vangelis Koukis
                        'height=' + screen.height + ',' +
1215 f533f224 Vangelis Koukis
                        'width=' + screen.width + ',' +
1216 f533f224 Vangelis Koukis
                        'fullscreen=yes';
1217 f277a1cd Kostas Papadimitriou
    
1218 f277a1cd Kostas Papadimitriou
    var url = 'machines/console' + params_url;
1219 f277a1cd Kostas Papadimitriou
    window.open(url, 'formresult' + serverID, params_window);
1220 f533f224 Vangelis Koukis
1221 f533f224 Vangelis Koukis
    // Restore os icon in list view
1222 f533f224 Vangelis Koukis
    osIcon = $('#'+serverID).parent().parent().find('.list-logo');
1223 f533f224 Vangelis Koukis
    osIcon.attr('src',osIcon.attr('os'));
1224 9c901aec Markos Gogoulos
    return false;
1225 b02144c8 Vangelis Koukis
}
1226 b02144c8 Vangelis Koukis
1227 b02144c8 Vangelis Koukis
// console action
1228 fb3eec11 Christodoulos Psaltis
function open_console(serverIDs){
1229 f533f224 Vangelis Koukis
    if (!serverIDs.length){
1230 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1231 f533f224 Vangelis Koukis
        return false;
1232 f533f224 Vangelis Koukis
    }
1233 b02144c8 Vangelis Koukis
    // ajax post start call
1234 b02144c8 Vangelis Koukis
    var payload = {
1235 b02144c8 Vangelis Koukis
        "console": {"type": "vnc"}
1236 b02144c8 Vangelis Koukis
    };
1237 b02144c8 Vangelis Koukis
1238 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1239 f533f224 Vangelis Koukis
1240 f533f224 Vangelis Koukis
    var machine = get_machine(serverID);
1241 f533f224 Vangelis Koukis
    var serverName = machine.name;
1242 2ee4f989 Markos Gogoulos
    try {
1243 f277a1cd Kostas Papadimitriou
        var serverIP = {};
1244 f277a1cd Kostas Papadimitriou
        serverIP.v4 = machine.addresses.values[0].values[0].addr;
1245 f277a1cd Kostas Papadimitriou
        serverIP.v6 = machine.addresses.values[0].values[1].addr;
1246 2ee4f989 Markos Gogoulos
    } catch(err) { var serverIP = 'undefined'; }
1247 f533f224 Vangelis Koukis
1248 b02144c8 Vangelis Koukis
    $.ajax({
1249 b02144c8 Vangelis Koukis
        url: API_URL + '/servers/' + serverID + '/action',
1250 b02144c8 Vangelis Koukis
        type: "POST",
1251 f533f224 Vangelis Koukis
        contentType: "application/json",
1252 b02144c8 Vangelis Koukis
        dataType: "json",
1253 b02144c8 Vangelis Koukis
        data: JSON.stringify(payload),
1254 b02144c8 Vangelis Koukis
        timeout: TIMEOUT,
1255 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1256 aeed1f09 Mike Muzurakis
                    try {
1257 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Console', jqXHR.responseText);
1258 aeed1f09 Mike Muzurakis
                    } catch(err) {
1259 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Console', jqXHR.responseText);
1260 aeed1f09 Mike Muzurakis
                    }
1261 aeed1f09 Mike Muzurakis
                },
1262 b02144c8 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1263 b02144c8 Vangelis Koukis
                    if ( jqXHR.status == '200') {
1264 f533f224 Vangelis Koukis
                        try {
1265 b02144c8 Vangelis Koukis
                            console.info('got_console ' + serverID);
1266 b02144c8 Vangelis Koukis
                        } catch(err) {}
1267 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1268 ddf929a7 Christodoulos Psaltis
                        // show_vnc_console(serverID, serverName, serverIP,
1269 ddf929a7 Christodoulos Psaltis
                        // data.console.host,data.console.port,data.console.password);
1270 ddf929a7 Christodoulos Psaltis
                        show_vnc_console(serverID, serverName, serverIP,
1271 ddf929a7 Christodoulos Psaltis
                                         data.console.host,data.console.port,data.console.password);
1272 f533f224 Vangelis Koukis
                        display_success(serverID);
1273 74175c17 Christodoulos Psaltis
                        // hide spinner
1274 74175c17 Christodoulos Psaltis
                        $('#' + serverID + ' .spinner').hide();
1275 f533f224 Vangelis Koukis
                        // continue with the rest of the servers
1276 74175c17 Christodoulos Psaltis
                        open_console(serverIDs);
1277 b02144c8 Vangelis Koukis
                    } else {
1278 b02144c8 Vangelis Koukis
                        ajax_error(jqXHR.status, serverID, 'Console', jqXHR.responseText);
1279 b02144c8 Vangelis Koukis
                    }
1280 b02144c8 Vangelis Koukis
                }
1281 b02144c8 Vangelis Koukis
    });
1282 b02144c8 Vangelis Koukis
    return false;
1283 b02144c8 Vangelis Koukis
}
1284 b02144c8 Vangelis Koukis
1285 29772683 Kostas Papadimitriou
function vm_has_address(vmId) {
1286 29772683 Kostas Papadimitriou
    var vm = get_machine(vmId);
1287 29772683 Kostas Papadimitriou
1288 29772683 Kostas Papadimitriou
    if (!vm) return false;
1289 29772683 Kostas Papadimitriou
1290 29772683 Kostas Papadimitriou
    try {
1291 29772683 Kostas Papadimitriou
        var ip = vm.addresses.values[0].values[0].addr;
1292 29772683 Kostas Papadimitriou
    } catch (err) {
1293 29772683 Kostas Papadimitriou
        return false;
1294 29772683 Kostas Papadimitriou
    }
1295 29772683 Kostas Papadimitriou
    return ip;
1296 29772683 Kostas Papadimitriou
}
1297 29772683 Kostas Papadimitriou
1298 fd70c1db Markos Gogoulos
// connect to machine action
1299 fd70c1db Markos Gogoulos
function machine_connect(serverIDs){
1300 fd70c1db Markos Gogoulos
    if (!serverIDs.length){
1301 fd70c1db Markos Gogoulos
        //ajax_success('DEFAULT');
1302 fd70c1db Markos Gogoulos
        return false;
1303 fd70c1db Markos Gogoulos
    }
1304 406bf0d9 Kostas Papadimitriou
    
1305 406bf0d9 Kostas Papadimitriou
    // prefer metadata values for specific options (username, domain)
1306 65ecc5e4 Kostas Papadimitriou
    var username_meta_key = 'user';
1307 65ecc5e4 Kostas Papadimitriou
    var domain_meta_key = "domain";
1308 5bc1794f Kostas Papadimitriou
1309 fd70c1db Markos Gogoulos
    var serverID = serverIDs.pop();
1310 fd70c1db Markos Gogoulos
    var machine = get_machine(serverID);
1311 fd70c1db Markos Gogoulos
    var serverName = machine.name;
1312 6f4c1371 Kostas Papadimitriou
    
1313 2ee4f989 Markos Gogoulos
    try {
1314 2ee4f989 Markos Gogoulos
        var serverIP = machine.addresses.values[0].values[0].addr;
1315 406bf0d9 Kostas Papadimitriou
    } catch (err) { var serverIP = 'undefined'; }
1316 fd70c1db Markos Gogoulos
1317 afedad4d Markos Gogoulos
    try {
1318 6a48cd96 Kostas Papadimitriou
        var os = os_icon(machine.metadata);
1319 406bf0d9 Kostas Papadimitriou
    } catch (err) { var os = 'undefined'; }
1320 afedad4d Markos Gogoulos
1321 5bc1794f Kostas Papadimitriou
    var username = "";
1322 5bc1794f Kostas Papadimitriou
    try {
1323 5bc1794f Kostas Papadimitriou
        username = machine.metadata.values[username_meta_key];
1324 406bf0d9 Kostas Papadimitriou
    } catch (err) { username = undefined }
1325 406bf0d9 Kostas Papadimitriou
1326 406bf0d9 Kostas Papadimitriou
    var domain = "";
1327 406bf0d9 Kostas Papadimitriou
    try {
1328 406bf0d9 Kostas Papadimitriou
        domain = machine.metadata.values[domain_meta_key];
1329 406bf0d9 Kostas Papadimitriou
    } catch (erro) { domain = undefined }
1330 5bc1794f Kostas Papadimitriou
1331 9ed51b7e Kostas Papadimitriou
    var params_url = '?ip_address=' + serverIP + '&os=' + os + "&host_os=" + $.client.os + "&srv=" + serverID;
1332 5bc1794f Kostas Papadimitriou
1333 5bc1794f Kostas Papadimitriou
    if (username) {
1334 5bc1794f Kostas Papadimitriou
        params_url += "&username=" + username;
1335 5bc1794f Kostas Papadimitriou
    }
1336 406bf0d9 Kostas Papadimitriou
1337 406bf0d9 Kostas Papadimitriou
    if (domain) {
1338 406bf0d9 Kostas Papadimitriou
        params_url += "&domain=" + domain;
1339 406bf0d9 Kostas Papadimitriou
    }
1340 29772683 Kostas Papadimitriou
    
1341 65ecc5e4 Kostas Papadimitriou
    //if ($.client.os == "Windows" && os == "windows") {
1342 65ecc5e4 Kostas Papadimitriou
        //// request rdp file
1343 65ecc5e4 Kostas Papadimitriou
        //window.open('machines/connect' + params_url + "&rdp=1");
1344 65ecc5e4 Kostas Papadimitriou
        //return;
1345 65ecc5e4 Kostas Papadimitriou
    //}
1346 9ed51b7e Kostas Papadimitriou
    
1347 406bf0d9 Kostas Papadimitriou
    // FIXME: I18n ???
1348 1ea1fc33 Kostas Papadimitriou
    var title = 'Connect to: ' + '<span class="machine-title"><img src="static/icons/machines/small/'+os+'-on.png" /> ' + fix_server_name(serverName) + '</span>';
1349 406bf0d9 Kostas Papadimitriou
    
1350 406bf0d9 Kostas Papadimitriou
    // open msg box and fill it with json data retrieved from connect machine view
1351 b687587e Kostas Papadimitriou
    try {
1352 406bf0d9 Kostas Papadimitriou
        // open msg box
1353 406bf0d9 Kostas Papadimitriou
        msg_box({
1354 406bf0d9 Kostas Papadimitriou
            title:title, 
1355 de44fc6c Kostas Papadimitriou
            fixed: true,
1356 406bf0d9 Kostas Papadimitriou
            content:'loading...',
1357 406bf0d9 Kostas Papadimitriou
            extra:'', 'ajax':'machines/connect' + params_url,
1358 406bf0d9 Kostas Papadimitriou
            parse_data:function(data){
1359 406bf0d9 Kostas Papadimitriou
                var box_content = "<a href='"+data.link.url+"'>"+data.link.title+"</a>";
1360 406bf0d9 Kostas Papadimitriou
                if (!data.link.url) {
1361 406bf0d9 Kostas Papadimitriou
                    box_content = "<span class='cmd'>"+data.link.title+"</span>";
1362 406bf0d9 Kostas Papadimitriou
                }
1363 406bf0d9 Kostas Papadimitriou
                data.title = false;
1364 406bf0d9 Kostas Papadimitriou
                data.content = data.info;
1365 406bf0d9 Kostas Papadimitriou
                data.extra = box_content;
1366 406bf0d9 Kostas Papadimitriou
                return data;
1367 9ed51b7e Kostas Papadimitriou
            }
1368 b687587e Kostas Papadimitriou
        });
1369 b687587e Kostas Papadimitriou
    } catch (error) {
1370 406bf0d9 Kostas Papadimitriou
        // if msg box fails fallback redirecting the user to the connect url
1371 6f4c1371 Kostas Papadimitriou
        window.open('machines/connect' + params_url);
1372 b687587e Kostas Papadimitriou
    }
1373 29772683 Kostas Papadimitriou
1374 fd70c1db Markos Gogoulos
1375 fd70c1db Markos Gogoulos
    // Restore os icon in list view
1376 fd70c1db Markos Gogoulos
    osIcon = $('#'+serverID).parent().parent().find('.list-logo');
1377 fd70c1db Markos Gogoulos
    osIcon.attr('src',osIcon.attr('os'));
1378 fd70c1db Markos Gogoulos
1379 fd70c1db Markos Gogoulos
    return false;
1380 fd70c1db Markos Gogoulos
}
1381 fd70c1db Markos Gogoulos
1382 fd70c1db Markos Gogoulos
1383 f533f224 Vangelis Koukis
// rename server
1384 a70a9116 Mike Muzurakis
function rename(serverID, serverName){
1385 f533f224 Vangelis Koukis
    if (!serverID.length){
1386 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1387 f533f224 Vangelis Koukis
        return false;
1388 f533f224 Vangelis Koukis
    }
1389 0d4faeb8 Mike Muzurakis
    // ajax post rename call
1390 0d4faeb8 Mike Muzurakis
    var payload = {
1391 73715544 Christodoulos Psaltis
        "server": {"name": serverName}
1392 b02144c8 Vangelis Koukis
    };
1393 0d4faeb8 Mike Muzurakis
1394 0d4faeb8 Mike Muzurakis
    $.ajax({
1395 5b35631e Markos Gogoulos
        url: API_URL + '/servers/' + serverID,
1396 a70a9116 Mike Muzurakis
        type: "PUT",
1397 f533f224 Vangelis Koukis
        contentType: "application/json",
1398 0d4faeb8 Mike Muzurakis
        dataType: "json",
1399 0d4faeb8 Mike Muzurakis
        data: JSON.stringify(payload),
1400 0d4faeb8 Mike Muzurakis
        timeout: TIMEOUT,
1401 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1402 aeed1f09 Mike Muzurakis
                    try {
1403 aeed1f09 Mike Muzurakis
                        display_failure(jqXHR.status, serverID, 'Rename', jqXHR.responseText);
1404 aeed1f09 Mike Muzurakis
                    } catch(err) {
1405 b8110bae Mike Muzurakis
                        display_failure(0, serverID, 'Rename', jqXHR.responseText);
1406 aeed1f09 Mike Muzurakis
                    }
1407 aeed1f09 Mike Muzurakis
                },
1408 0d4faeb8 Mike Muzurakis
        success: function(data, textStatus, jqXHR) {
1409 380c0520 Dimitris Moraitis
                    if ( jqXHR.status == '204' || jqXHR.status == '1223') {
1410 f533f224 Vangelis Koukis
                        try {
1411 0d4faeb8 Mike Muzurakis
                            console.info('renamed ' + serverID);
1412 0d4faeb8 Mike Muzurakis
                        } catch(err) {}
1413 f533f224 Vangelis Koukis
                        // indicate that the action succeeded
1414 f533f224 Vangelis Koukis
                        display_success(serverID);
1415 0d4faeb8 Mike Muzurakis
                    } else {
1416 0d4faeb8 Mike Muzurakis
                        ajax_error(jqXHR.status, serverID, 'Rename', jqXHR.responseText);
1417 0d4faeb8 Mike Muzurakis
                    }
1418 0d4faeb8 Mike Muzurakis
                }
1419 0d4faeb8 Mike Muzurakis
    });
1420 0d4faeb8 Mike Muzurakis
    return false;
1421 0d4faeb8 Mike Muzurakis
}
1422 0d4faeb8 Mike Muzurakis
1423 5186eb04 Christodoulos Psaltis
// get server metadata
1424 f533f224 Vangelis Koukis
function get_metadata(serverID, keys_only) {
1425 5186eb04 Christodoulos Psaltis
    $.ajax({
1426 5186eb04 Christodoulos Psaltis
        url: API_URL + '/servers/' + serverID + '/meta',
1427 d1e14e2c Mike Muzurakis
        cache: false,
1428 5186eb04 Christodoulos Psaltis
        type: "GET",
1429 5186eb04 Christodoulos Psaltis
        //async: false,
1430 5186eb04 Christodoulos Psaltis
        dataType: "json",
1431 5186eb04 Christodoulos Psaltis
        timeout: TIMEOUT,
1432 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1433 5186eb04 Christodoulos Psaltis
            try {
1434 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1435 ddf929a7 Christodoulos Psaltis
                $("a#metadata-scrollable").data('overlay').close();
1436 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Get metadata', jqXHR.responseText);
1437 f533f224 Vangelis Koukis
            } catch (err) {
1438 7991d0c5 Kostas Papadimitriou
                if (!isXhrException(err)) {
1439 7991d0c5 Kostas Papadimitriou
                    ajax_error(-511, "UI Error", "Get metadata", err);
1440 7991d0c5 Kostas Papadimitriou
                } else {
1441 7991d0c5 Kostas Papadimitriou
                    return false;
1442 7991d0c5 Kostas Papadimitriou
                }
1443 f533f224 Vangelis Koukis
            }
1444 5186eb04 Christodoulos Psaltis
        },
1445 5186eb04 Christodoulos Psaltis
        success: function(data, textStatus, jqXHR) {
1446 1b3857ab Christodoulos Psaltis
            // to list the new results in the edit dialog
1447 f533f224 Vangelis Koukis
            if (keys_only) {
1448 f533f224 Vangelis Koukis
                list_metadata_keys(serverID, data.metadata.values);
1449 f533f224 Vangelis Koukis
            } else {
1450 f533f224 Vangelis Koukis
                list_metadata(data);
1451 f533f224 Vangelis Koukis
                list_metadata_keys(serverID, data.metadata.values);
1452 f533f224 Vangelis Koukis
            }
1453 f533f224 Vangelis Koukis
            //hide spinner
1454 f533f224 Vangelis Koukis
            $('#metadata-wizard .large-spinner').hide();
1455 5186eb04 Christodoulos Psaltis
        }
1456 5186eb04 Christodoulos Psaltis
    });
1457 5186eb04 Christodoulos Psaltis
    return false;
1458 5186eb04 Christodoulos Psaltis
}
1459 5186eb04 Christodoulos Psaltis
1460 1b3857ab Christodoulos Psaltis
// delete metadata key-value pair
1461 1b3857ab Christodoulos Psaltis
function delete_metadata(serverID, meta_key) {
1462 0943cc77 Markos Gogoulos
    $.ajax({
1463 0943cc77 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
1464 0943cc77 Markos Gogoulos
        type: "DELETE",
1465 0943cc77 Markos Gogoulos
        //async: false,
1466 0943cc77 Markos Gogoulos
        dataType: "json",
1467 0943cc77 Markos Gogoulos
        timeout: TIMEOUT,
1468 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1469 0943cc77 Markos Gogoulos
            try {
1470 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1471 ddf929a7 Christodoulos Psaltis
                $("a#metadata-scrollable").data('overlay').close();
1472 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Delete metadata', jqXHR.responseText);
1473 f533f224 Vangelis Koukis
            } catch (err) {
1474 7991d0c5 Kostas Papadimitriou
                if (!isXhrException(err)) {
1475 7991d0c5 Kostas Papadimitriou
                    ajax_error(-512, "UI Error", "Delete metadata", err);
1476 7991d0c5 Kostas Papadimitriou
                } else {
1477 7991d0c5 Kostas Papadimitriou
                    return false;
1478 7991d0c5 Kostas Papadimitriou
                }
1479 f533f224 Vangelis Koukis
            }
1480 0943cc77 Markos Gogoulos
        },
1481 0943cc77 Markos Gogoulos
        success: function(data, textStatus, jqXHR) {
1482 ddf929a7 Christodoulos Psaltis
                    // success: Do nothing, the UI is already updated
1483 0943cc77 Markos Gogoulos
        }
1484 0943cc77 Markos Gogoulos
    });
1485 0943cc77 Markos Gogoulos
    return false;
1486 0943cc77 Markos Gogoulos
}
1487 0943cc77 Markos Gogoulos
1488 1b3857ab Christodoulos Psaltis
// add metadata key-value pair
1489 f533f224 Vangelis Koukis
function update_metadata(serverID, meta_key, meta_value) {
1490 0c578a28 Markos Gogoulos
    var payload = {
1491 0c578a28 Markos Gogoulos
        "meta": {
1492 0c578a28 Markos Gogoulos
        }
1493 0c578a28 Markos Gogoulos
    };
1494 0c578a28 Markos Gogoulos
    payload["meta"][meta_key] = meta_value;
1495 0c578a28 Markos Gogoulos
1496 0c578a28 Markos Gogoulos
    $.ajax({
1497 0c578a28 Markos Gogoulos
        url: API_URL + '/servers/' + serverID + '/meta/' + meta_key,
1498 0c578a28 Markos Gogoulos
        type: "PUT",
1499 f533f224 Vangelis Koukis
        contentType: "application/json",
1500 f533f224 Vangelis Koukis
        dataType: "json",
1501 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1502 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1503 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1504 f533f224 Vangelis Koukis
            try {
1505 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1506 ddf929a7 Christodoulos Psaltis
                $("a#metadata-scrollable").data('overlay').close();
1507 7991d0c5 Kostas Papadimitriou
                ajax_error(jqXHR.status, undefined, 'Add metadata', jqXHR.responseText);
1508 f533f224 Vangelis Koukis
            } catch (err) {
1509 7991d0c5 Kostas Papadimitriou
                if (!isXhrException(err)) {
1510 7991d0c5 Kostas Papadimitriou
                    ajax_error(-513, "UI Error", "Add metadata", err);
1511 7991d0c5 Kostas Papadimitriou
                } else {
1512 7991d0c5 Kostas Papadimitriou
                    return false;
1513 7991d0c5 Kostas Papadimitriou
                }
1514 f533f224 Vangelis Koukis
            }
1515 f533f224 Vangelis Koukis
        },
1516 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1517 f533f224 Vangelis Koukis
            // success: Update icons if meta key is OS
1518 f533f224 Vangelis Koukis
            if (meta_key == "OS") {
1519 f533f224 Vangelis Koukis
                $("#metadata-wizard .machine-icon").attr("src","static/icons/machines/small/" + os_icon_from_value(meta_value) + '-' + $("#metadata-wizard div#on-off").text() + '.png');
1520 260d6bb3 Kostas Papadimitriou
                var machine_icon = $("#machinesview-icon").find("div#" + serverID);
1521 260d6bb3 Kostas Papadimitriou
                var machine_single = $("#machinesview-single").find("div#" + serverID);
1522 260d6bb3 Kostas Papadimitriou
1523 7af53e78 Kostas Papadimitriou
                var os = os_icon_from_value(meta_value);
1524 7af53e78 Kostas Papadimitriou
                var state = $("#metadata-wizard div#on-off").text()
1525 260d6bb3 Kostas Papadimitriou
                var state_single = $(".state", machine_single).hasClass("terminated-state") ? "off" : "on";
1526 4529511c Kostas Papadimitriou
1527 260d6bb3 Kostas Papadimitriou
                set_machine_os_image(machine_icon, "icon", state, os);
1528 260d6bb3 Kostas Papadimitriou
                set_machine_os_image(machine_single, "single", state_single, os);
1529 f533f224 Vangelis Koukis
            }
1530 f533f224 Vangelis Koukis
        }
1531 f533f224 Vangelis Koukis
    });
1532 f533f224 Vangelis Koukis
    return false;
1533 f533f224 Vangelis Koukis
}
1534 0506db29 Christodoulos Psaltis
1535 23ca3bc9 Christodoulos Psaltis
// get stats
1536 23ca3bc9 Christodoulos Psaltis
function get_server_stats(serverID) {
1537 a09987c3 Kostas Papadimitriou
    
1538 a09987c3 Kostas Papadimitriou
    // do not update stats if machine in build state
1539 a09987c3 Kostas Papadimitriou
    var vm = get_machine(serverID);
1540 a09987c3 Kostas Papadimitriou
    if (vm.status == "BUILD" && vm.stats_timeout) {
1541 a09987c3 Kostas Papadimitriou
        els = get_current_view_stats_elements(vm.id);
1542 a09987c3 Kostas Papadimitriou
        els.cpu.img.hide();
1543 a09987c3 Kostas Papadimitriou
        els.net.img.hide();
1544 a09987c3 Kostas Papadimitriou
1545 a09987c3 Kostas Papadimitriou
        els.cpu.busy.show();
1546 a09987c3 Kostas Papadimitriou
        els.net.busy.show();
1547 a09987c3 Kostas Papadimitriou
        return;
1548 a09987c3 Kostas Papadimitriou
    }
1549 a09987c3 Kostas Papadimitriou
1550 23ca3bc9 Christodoulos Psaltis
    $.ajax({
1551 23ca3bc9 Christodoulos Psaltis
        url: API_URL + '/servers/' + serverID + '/stats',
1552 23ca3bc9 Christodoulos Psaltis
        cache: false,
1553 23ca3bc9 Christodoulos Psaltis
        type: "GET",
1554 23ca3bc9 Christodoulos Psaltis
        //async: false,
1555 23ca3bc9 Christodoulos Psaltis
        dataType: "json",
1556 23ca3bc9 Christodoulos Psaltis
        timeout: TIMEOUT,
1557 23ca3bc9 Christodoulos Psaltis
        error: function(jqXHR, textStatus, errorThrown) {
1558 4529511c Kostas Papadimitriou
            try {
1559 4529511c Kostas Papadimitriou
                ajax_error(jqXHR.status, undefined, 'Get server stats', jqXHR.responseText);
1560 4529511c Kostas Papadimitriou
            } catch(err) {
1561 4529511c Kostas Papadimitriou
                if (!isXhrException(err)) {
1562 4529511c Kostas Papadimitriou
                    ajax_error(-520, "UI Error", "Get server stats", err);
1563 4529511c Kostas Papadimitriou
                }
1564 4529511c Kostas Papadimitriou
            }
1565 23ca3bc9 Christodoulos Psaltis
        },
1566 23ca3bc9 Christodoulos Psaltis
        success: function(data, textStatus, jqXHR) {
1567 4529511c Kostas Papadimitriou
            update_machine_stats(serverID, data);
1568 4529511c Kostas Papadimitriou
        },
1569 4529511c Kostas Papadimitriou
1570 4529511c Kostas Papadimitriou
        // pass server id to ajax settings
1571 4529511c Kostas Papadimitriou
        serverID: serverID
1572 4529511c Kostas Papadimitriou
    });
1573 4529511c Kostas Papadimitriou
    return false;
1574 4529511c Kostas Papadimitriou
}
1575 4529511c Kostas Papadimitriou
1576 4529511c Kostas Papadimitriou
// set timeout function to update machine stats
1577 cbadb3d8 Kostas Papadimitriou
function set_stats_update_handler(vm_id, interval, clear) {
1578 a09987c3 Kostas Papadimitriou
    var vm = get_machine(vm_id);
1579 a09987c3 Kostas Papadimitriou
1580 cbadb3d8 Kostas Papadimitriou
    if (clear) {
1581 cbadb3d8 Kostas Papadimitriou
        window.clearInterval(vm.stats_timeout);
1582 cbadb3d8 Kostas Papadimitriou
        vm.stats_timeout = false;
1583 cbadb3d8 Kostas Papadimitriou
        return;
1584 a09987c3 Kostas Papadimitriou
    }
1585 a09987c3 Kostas Papadimitriou
    
1586 cbadb3d8 Kostas Papadimitriou
    if (!vm.stats_timeout) {
1587 cbadb3d8 Kostas Papadimitriou
        vm.stats_timeout = window.setInterval(function(){
1588 cbadb3d8 Kostas Papadimitriou
            get_server_stats(vm_id);
1589 cbadb3d8 Kostas Papadimitriou
        }, interval * 1000);
1590 cbadb3d8 Kostas Papadimitriou
    }
1591 4529511c Kostas Papadimitriou
}
1592 4529511c Kostas Papadimitriou
1593 4529511c Kostas Papadimitriou
// update machine stats
1594 4529511c Kostas Papadimitriou
// call set_stats_update_handler if machine stats are visible
1595 4529511c Kostas Papadimitriou
// to reupdate the stats (based on api interval)
1596 4529511c Kostas Papadimitriou
function update_machine_stats(vm_id, data) {
1597 4529511c Kostas Papadimitriou
    var els = get_current_view_stats_elements(vm_id);
1598 4529511c Kostas Papadimitriou
    var from_error = false;
1599 4529511c Kostas Papadimitriou
    var vm = get_machine(vm_id);    
1600 cbadb3d8 Kostas Papadimitriou
    var clear = false;
1601 4529511c Kostas Papadimitriou
1602 4529511c Kostas Papadimitriou
    // api error
1603 4529511c Kostas Papadimitriou
    if (!data) {
1604 4529511c Kostas Papadimitriou
        from_error = true;
1605 4529511c Kostas Papadimitriou
    }
1606 4529511c Kostas Papadimitriou
1607 4529511c Kostas Papadimitriou
    // hide helpers
1608 4529511c Kostas Papadimitriou
    function hide_imgs(els) {
1609 4529511c Kostas Papadimitriou
        els.cpu.img.hide();
1610 4529511c Kostas Papadimitriou
        els.net.img.hide();
1611 4529511c Kostas Papadimitriou
    }
1612 4529511c Kostas Papadimitriou
1613 4529511c Kostas Papadimitriou
    function hide_busy(els) {
1614 4529511c Kostas Papadimitriou
        els.cpu.busy.hide();
1615 4529511c Kostas Papadimitriou
        els.net.busy.hide();
1616 4529511c Kostas Papadimitriou
    }
1617 4529511c Kostas Papadimitriou
1618 4529511c Kostas Papadimitriou
    function hide_errors(els) {
1619 4529511c Kostas Papadimitriou
        els.cpu.error.hide();
1620 4529511c Kostas Papadimitriou
        els.net.error.hide();
1621 4529511c Kostas Papadimitriou
    }
1622 4529511c Kostas Papadimitriou
1623 4529511c Kostas Papadimitriou
    // apply logic
1624 4529511c Kostas Papadimitriou
    if (from_error) {
1625 4529511c Kostas Papadimitriou
        // api call returned error show error messages
1626 cbadb3d8 Kostas Papadimitriou
        clear = true;
1627 4529511c Kostas Papadimitriou
    } else {
1628 4529511c Kostas Papadimitriou
        // no need to show stats while machine in building state
1629 4529511c Kostas Papadimitriou
        if (vm.status == "BUILD") {
1630 4529511c Kostas Papadimitriou
            hide_imgs(els);
1631 4529511c Kostas Papadimitriou
            hide_errors(els);
1632 4529511c Kostas Papadimitriou
            els.cpu.busy.show();
1633 4529511c Kostas Papadimitriou
            els.net.busy.show();
1634 4529511c Kostas Papadimitriou
        } else {
1635 4529511c Kostas Papadimitriou
            hide_busy(els);
1636 4529511c Kostas Papadimitriou
1637 4529511c Kostas Papadimitriou
            // update stats, decide for series or bar image
1638 4529511c Kostas Papadimitriou
            // based on img class
1639 4529511c Kostas Papadimitriou
            if (els.cpu.img.hasClass("series")) {
1640 4529511c Kostas Papadimitriou
                els.cpu.img.attr("src", data.stats.cpuTimeSeries);
1641 4529511c Kostas Papadimitriou
            } else {
1642 4529511c Kostas Papadimitriou
                els.cpu.img.attr("src", data.stats.cpuBar);
1643 23ca3bc9 Christodoulos Psaltis
            }
1644 4529511c Kostas Papadimitriou
1645 4529511c Kostas Papadimitriou
            if (els.net.img.hasClass("series")) {
1646 4529511c Kostas Papadimitriou
                els.net.img.attr("src", data.stats.netTimeSeries);
1647 4529511c Kostas Papadimitriou
            } else {
1648 4529511c Kostas Papadimitriou
                els.net.img.attr("src", data.stats.netBar);
1649 4529511c Kostas Papadimitriou
            }
1650 4529511c Kostas Papadimitriou
        }
1651 4529511c Kostas Papadimitriou
    }
1652 4529511c Kostas Papadimitriou
1653 4529511c Kostas Papadimitriou
    // stats container is hidden
1654 4529511c Kostas Papadimitriou
    // do not update the stats
1655 4529511c Kostas Papadimitriou
    if (!els.cont.is(":visible")) {
1656 cbadb3d8 Kostas Papadimitriou
        clear = true;
1657 4529511c Kostas Papadimitriou
    }
1658 4529511c Kostas Papadimitriou
    
1659 4529511c Kostas Papadimitriou
    // set timeout to call the stats update
1660 cbadb3d8 Kostas Papadimitriou
    set_stats_update_handler(vm_id, data.stats.refresh, clear);
1661 4529511c Kostas Papadimitriou
}
1662 4529511c Kostas Papadimitriou
1663 4529511c Kostas Papadimitriou
1664 4529511c Kostas Papadimitriou
// get stats elements based on current view
1665 4529511c Kostas Papadimitriou
function get_current_view_stats_elements(vm_id) {
1666 4529511c Kostas Papadimitriou
        // in icon view
1667 4529511c Kostas Papadimitriou
        if ( $.cookie('view') == 0 ) {
1668 4529511c Kostas Papadimitriou
            vm_el = $("#" + vm_id);
1669 4529511c Kostas Papadimitriou
            return {
1670 4529511c Kostas Papadimitriou
                'cont': vm_el.find('.vm-stats'),
1671 4529511c Kostas Papadimitriou
                'cpu': {
1672 4529511c Kostas Papadimitriou
                    'img': vm_el.find(' img.cpu'), 
1673 4529511c Kostas Papadimitriou
                    'busy': vm_el.find('.cpu-cont .stat-busy'),
1674 4529511c Kostas Papadimitriou
                    'error': vm_el.find('.cpu-cont .stat-error')
1675 4529511c Kostas Papadimitriou
                },
1676 4529511c Kostas Papadimitriou
                'net': { 
1677 4529511c Kostas Papadimitriou
                    'img': vm_el.find('img.net'),
1678 4529511c Kostas Papadimitriou
                    'busy': vm_el.find('.net-cont .stat-busy'),
1679 4529511c Kostas Papadimitriou
                    'error': vm_el.find('.net-cont .stat-error')
1680 4529511c Kostas Papadimitriou
                }
1681 4529511c Kostas Papadimitriou
            }
1682 4529511c Kostas Papadimitriou
        }
1683 4529511c Kostas Papadimitriou
        // in single view
1684 4529511c Kostas Papadimitriou
        else if ( $.cookie('view') == 2 ) {
1685 4529511c Kostas Papadimitriou
            vm_el = $("#" + vm_id);
1686 4529511c Kostas Papadimitriou
            return {
1687 4529511c Kostas Papadimitriou
                'cont': vm_el.find('.lower'),
1688 4529511c Kostas Papadimitriou
                'cpu': {
1689 4529511c Kostas Papadimitriou
                    'img': vm_el.find('div.cpu-graph img.stats'), 
1690 4529511c Kostas Papadimitriou
                    'busy': vm_el.find('div.cpu-graph img.stat-busy'),
1691 4529511c Kostas Papadimitriou
                    'error': vm_el.find('div.cpu-graph .stat-error')
1692 4529511c Kostas Papadimitriou
                },
1693 4529511c Kostas Papadimitriou
                'net': { 
1694 4529511c Kostas Papadimitriou
                    'img': vm_el.find('div.network-graph img.stats'),
1695 4529511c Kostas Papadimitriou
                    'busy': vm_el.find('div.network-graph img.stat-busy'),
1696 4529511c Kostas Papadimitriou
                    'error': vm_el.find('div.network-graph .stat-error')
1697 4529511c Kostas Papadimitriou
                }
1698 23ca3bc9 Christodoulos Psaltis
            }
1699 23ca3bc9 Christodoulos Psaltis
        }
1700 23ca3bc9 Christodoulos Psaltis
}
1701 f533f224 Vangelis Koukis
1702 f533f224 Vangelis Koukis
// create network
1703 f533f224 Vangelis Koukis
function create_network(networkName){
1704 f533f224 Vangelis Koukis
    // ajax post start call
1705 f533f224 Vangelis Koukis
    var payload = {
1706 f533f224 Vangelis Koukis
        "network": { "name": networkName }
1707 f533f224 Vangelis Koukis
    };
1708 f533f224 Vangelis Koukis
1709 f533f224 Vangelis Koukis
    $.ajax({
1710 f533f224 Vangelis Koukis
        url: API_URL + '/networks',
1711 f533f224 Vangelis Koukis
        type: "POST",
1712 f533f224 Vangelis Koukis
        contentType: "application/json",
1713 f533f224 Vangelis Koukis
        dataType: "json",
1714 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1715 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1716 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1717 f533f224 Vangelis Koukis
            try {
1718 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1719 ddf929a7 Christodoulos Psaltis
                $("a#networkscreate").overlay().close();
1720 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Create network', jqXHR.responseText);
1721 f533f224 Vangelis Koukis
            } catch (err) {
1722 7991d0c5 Kostas Papadimitriou
                if (!isXhrException(err)) {
1723 7991d0c5 Kostas Papadimitriou
                    ajax_error(-514, "UI Error", "Create network", err);
1724 7991d0c5 Kostas Papadimitriou
                } else {
1725 7991d0c5 Kostas Papadimitriou
                    return false;
1726 7991d0c5 Kostas Papadimitriou
                }
1727 f533f224 Vangelis Koukis
            }
1728 f533f224 Vangelis Koukis
        },
1729 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1730 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1731 f533f224 Vangelis Koukis
                try {
1732 f533f224 Vangelis Koukis
                    console.info('created network ' + networkName);
1733 f533f224 Vangelis Koukis
                } catch(err) {}
1734 a67bb993 Christodoulos Psaltis
                /*
1735 a67bb993 Christodoulos Psaltis
                On success of this call nothing happens.
1736 a67bb993 Christodoulos Psaltis
                When the UI gets the first update containing the created server,
1737 a67bb993 Christodoulos Psaltis
                the creation wizard is closed and the new network is inserted
1738 a67bb993 Christodoulos Psaltis
                to the DOM. This is done in update_networks_view()
1739 a67bb993 Christodoulos Psaltis
                */
1740 f533f224 Vangelis Koukis
            } else {
1741 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1742 a67bb993 Christodoulos Psaltis
                $("a#networkscreate").overlay().close();
1743 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Create network', jqXHR.responseText);
1744 f533f224 Vangelis Koukis
            }
1745 f533f224 Vangelis Koukis
        }
1746 f533f224 Vangelis Koukis
    });
1747 f533f224 Vangelis Koukis
    return false;
1748 f533f224 Vangelis Koukis
}
1749 f533f224 Vangelis Koukis
1750 f533f224 Vangelis Koukis
// rename network
1751 f533f224 Vangelis Koukis
function rename_network(networkID, networkName){
1752 f533f224 Vangelis Koukis
    if (!networkID.length){
1753 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1754 f533f224 Vangelis Koukis
        return false;
1755 f533f224 Vangelis Koukis
    }
1756 f533f224 Vangelis Koukis
    // prepare payload
1757 f533f224 Vangelis Koukis
    var payload = {
1758 f533f224 Vangelis Koukis
        "network": {"name": networkName}
1759 f533f224 Vangelis Koukis
    };
1760 f533f224 Vangelis Koukis
    // ajax call
1761 f533f224 Vangelis Koukis
    $.ajax({
1762 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID,
1763 f533f224 Vangelis Koukis
        type: "PUT",
1764 f533f224 Vangelis Koukis
        contentType: "application/json",
1765 f533f224 Vangelis Koukis
        dataType: "json",
1766 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1767 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1768 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1769 f533f224 Vangelis Koukis
            try {
1770 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Rename network', jqXHR.responseText);
1771 f533f224 Vangelis Koukis
            } catch (err) {
1772 7991d0c5 Kostas Papadimitriou
                if (!isXhrException(err)) {
1773 7991d0c5 Kostas Papadimitriou
                    ajax_error(-515, "UI Error", 'Rename network', err);
1774 7991d0c5 Kostas Papadimitriou
                } else {
1775 7991d0c5 Kostas Papadimitriou
                    return false;
1776 7991d0c5 Kostas Papadimitriou
                }
1777 f533f224 Vangelis Koukis
            }
1778 f533f224 Vangelis Koukis
        },
1779 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1780 f533f224 Vangelis Koukis
            if ( jqXHR.status == '204') {
1781 f533f224 Vangelis Koukis
                try {
1782 f533f224 Vangelis Koukis
                    console.info('renamed network' + networkID);
1783 f533f224 Vangelis Koukis
                } catch(err) {}
1784 f533f224 Vangelis Koukis
            } else {
1785 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Rename network', jqXHR.responseText);
1786 f533f224 Vangelis Koukis
            }
1787 f533f224 Vangelis Koukis
        }
1788 f533f224 Vangelis Koukis
    });
1789 f533f224 Vangelis Koukis
    return false;
1790 f533f224 Vangelis Koukis
}
1791 f533f224 Vangelis Koukis
1792 f533f224 Vangelis Koukis
function delete_network(networkIDs){
1793 f533f224 Vangelis Koukis
    if (!networkIDs.length){
1794 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1795 f533f224 Vangelis Koukis
        return false;
1796 f533f224 Vangelis Koukis
    }
1797 f533f224 Vangelis Koukis
    // get a network
1798 f533f224 Vangelis Koukis
    var networkID = networkIDs.pop();
1799 f533f224 Vangelis Koukis
    // ajax post destroy call can have an empty request body
1800 f533f224 Vangelis Koukis
    var payload = {};
1801 f533f224 Vangelis Koukis
    // ajax call
1802 f533f224 Vangelis Koukis
    $.ajax({
1803 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID,
1804 f533f224 Vangelis Koukis
        type: "DELETE",
1805 f533f224 Vangelis Koukis
        contentType: "application/json",
1806 f533f224 Vangelis Koukis
        dataType: "json",
1807 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1808 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1809 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1810 f533f224 Vangelis Koukis
            try {
1811 2aab1d5e Christodoulos Psaltis
                display_net_failure(jqXHR.status, networkID, 'Delete', jqXHR.responseText);
1812 f533f224 Vangelis Koukis
            } catch (err) {
1813 2aab1d5e Christodoulos Psaltis
                display_net_failure(0, networkID, 'Delete', jqXHR.responseText);
1814 f533f224 Vangelis Koukis
            }
1815 f533f224 Vangelis Koukis
        },
1816 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1817 f533f224 Vangelis Koukis
            if ( jqXHR.status == '204') {
1818 f533f224 Vangelis Koukis
                try {
1819 f533f224 Vangelis Koukis
                    console.info('deleted network ' + networkID);
1820 f533f224 Vangelis Koukis
                } catch(err) {}
1821 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1822 f533f224 Vangelis Koukis
                delete_network(networkIDs);
1823 f533f224 Vangelis Koukis
            } else {
1824 3a254f7c Christodoulos Psaltis
                try {
1825 2aab1d5e Christodoulos Psaltis
                    display_net_failure(jqXHR.status, networkID, 'Delete', jqXHR.responseText);
1826 3a254f7c Christodoulos Psaltis
                } catch (err) {
1827 2aab1d5e Christodoulos Psaltis
                    display_net_failure(0, networkID, 'Delete', jqXHR.responseText);
1828 3a254f7c Christodoulos Psaltis
                }
1829 f533f224 Vangelis Koukis
            }
1830 f533f224 Vangelis Koukis
        }
1831 f533f224 Vangelis Koukis
    });
1832 f533f224 Vangelis Koukis
    return false;
1833 f533f224 Vangelis Koukis
}
1834 f533f224 Vangelis Koukis
1835 f39b36a6 Christodoulos Psaltis
function add_server_to_network(networkID, serverIDs, serverNames, serverStates) {
1836 f533f224 Vangelis Koukis
    if (!serverIDs.length){
1837 be191315 Christodoulos Psaltis
        // close the overlay when all the calls are made
1838 be191315 Christodoulos Psaltis
        $("a#add-machines-overlay").overlay().close();
1839 f533f224 Vangelis Koukis
        return false;
1840 f533f224 Vangelis Koukis
    }
1841 f533f224 Vangelis Koukis
    // get a server
1842 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1843 82835e06 Christodoulos Psaltis
    var serverName = serverNames.pop();
1844 f39b36a6 Christodoulos Psaltis
    var serverState = serverStates.pop();
1845 f533f224 Vangelis Koukis
    // prepare payload
1846 f533f224 Vangelis Koukis
    var payload = {
1847 f533f224 Vangelis Koukis
            "add": { "serverRef": serverID }
1848 f533f224 Vangelis Koukis
        };
1849 f533f224 Vangelis Koukis
    // prepare ajax call
1850 f533f224 Vangelis Koukis
    $.ajax({
1851 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID + '/action',
1852 f533f224 Vangelis Koukis
        type: "POST",
1853 f533f224 Vangelis Koukis
        contentType: "application/json",
1854 b02144c8 Vangelis Koukis
        dataType: "json",
1855 0c578a28 Markos Gogoulos
        data: JSON.stringify(payload),
1856 0c578a28 Markos Gogoulos
        timeout: TIMEOUT,
1857 b02144c8 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1858 0c578a28 Markos Gogoulos
            try {
1859 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1860 ddf929a7 Christodoulos Psaltis
                $("a#add-machines-overlay").data('overlay').close();
1861 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Add server to network', jqXHR.responseText);
1862 f533f224 Vangelis Koukis
            } catch (err) {
1863 7991d0c5 Kostas Papadimitriou
                if (!isXhrException(err)) {
1864 7991d0c5 Kostas Papadimitriou
                    ajax_error(-516, "UI Error", 'Add server to network', err);
1865 7991d0c5 Kostas Papadimitriou
                } else {
1866 7991d0c5 Kostas Papadimitriou
                    return false;
1867 7991d0c5 Kostas Papadimitriou
                }
1868 f533f224 Vangelis Koukis
            }
1869 0c578a28 Markos Gogoulos
        },
1870 0c578a28 Markos Gogoulos
        success: function(data, textStatus, jqXHR) {
1871 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1872 f533f224 Vangelis Koukis
                try {
1873 f533f224 Vangelis Koukis
                    console.info('added server ' + serverID + ' to network ' + networkID);
1874 f533f224 Vangelis Koukis
                } catch(err) {}
1875 82835e06 Christodoulos Psaltis
                // toggle the reboot dialog
1876 f39b36a6 Christodoulos Psaltis
                display_reboot_dialog(networkID, serverID, serverName, serverState);
1877 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1878 f39b36a6 Christodoulos Psaltis
                add_server_to_network(networkID, serverIDs, serverNames, serverStates);
1879 f533f224 Vangelis Koukis
            } else {
1880 ddf929a7 Christodoulos Psaltis
                // close wizard and show error box
1881 ddf929a7 Christodoulos Psaltis
                $("a#add-machines-overlay").data('overlay').close();
1882 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Add server to network', jqXHR.responseText);
1883 f533f224 Vangelis Koukis
            }
1884 0c578a28 Markos Gogoulos
        }
1885 0c578a28 Markos Gogoulos
    });
1886 0c578a28 Markos Gogoulos
    return false;
1887 0c578a28 Markos Gogoulos
}
1888 0c578a28 Markos Gogoulos
1889 f39b36a6 Christodoulos Psaltis
function remove_server_from_network(networkIDs, serverIDs, serverNames, serverStates) {
1890 f533f224 Vangelis Koukis
    if (!networkIDs.length){
1891 f533f224 Vangelis Koukis
        //ajax_success('DEFAULT');
1892 f533f224 Vangelis Koukis
        return false;
1893 f533f224 Vangelis Koukis
    }
1894 f533f224 Vangelis Koukis
    // get a network and a server
1895 f533f224 Vangelis Koukis
    var networkID = networkIDs.pop();
1896 f533f224 Vangelis Koukis
    var serverID = serverIDs.pop();
1897 82835e06 Christodoulos Psaltis
    var serverName = serverNames.pop();
1898 f39b36a6 Christodoulos Psaltis
    var serverState = serverStates.pop();
1899 f533f224 Vangelis Koukis
    // prepare payload
1900 f533f224 Vangelis Koukis
    var payload = {
1901 f533f224 Vangelis Koukis
            "remove": { "serverRef": serverID }
1902 f533f224 Vangelis Koukis
        };
1903 f533f224 Vangelis Koukis
    // prepare ajax call
1904 f533f224 Vangelis Koukis
    $.ajax({
1905 f533f224 Vangelis Koukis
        url: API_URL + '/networks/' + networkID + '/action',
1906 f533f224 Vangelis Koukis
        type: "POST",
1907 f533f224 Vangelis Koukis
        contentType: "application/json",
1908 f533f224 Vangelis Koukis
        dataType: "json",
1909 f533f224 Vangelis Koukis
        data: JSON.stringify(payload),
1910 f533f224 Vangelis Koukis
        timeout: TIMEOUT,
1911 f533f224 Vangelis Koukis
        error: function(jqXHR, textStatus, errorThrown) {
1912 f533f224 Vangelis Koukis
            try {
1913 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Remove server form network', jqXHR.responseText);
1914 f533f224 Vangelis Koukis
            } catch (err) {
1915 7991d0c5 Kostas Papadimitriou
                if (!isXhrException(err)) {
1916 7991d0c5 Kostas Papadimitriou
                    ajax_error(-517, "UI Error", 'Remove server form network', err);
1917 7991d0c5 Kostas Papadimitriou
                } else {
1918 7991d0c5 Kostas Papadimitriou
                    return false;
1919 7991d0c5 Kostas Papadimitriou
                }
1920 f533f224 Vangelis Koukis
            }
1921 f533f224 Vangelis Koukis
        },
1922 f533f224 Vangelis Koukis
        success: function(data, textStatus, jqXHR) {
1923 f533f224 Vangelis Koukis
            if ( jqXHR.status == '202') {
1924 f533f224 Vangelis Koukis
                try {
1925 f533f224 Vangelis Koukis
                    console.info('deleted server ' + serverID + ' from network ' + networkID);
1926 f533f224 Vangelis Koukis
                } catch(err) {}
1927 82835e06 Christodoulos Psaltis
                // toggle the reboot dialog
1928 f39b36a6 Christodoulos Psaltis
                display_reboot_dialog(networkID, serverID, serverName, serverState);
1929 f533f224 Vangelis Koukis
                // continue with the rest of the servers
1930 f39b36a6 Christodoulos Psaltis
                remove_server_form_network(networkIDs, serverIDs, serverNames, serverStates);
1931 f533f224 Vangelis Koukis
            } else {
1932 f533f224 Vangelis Koukis
                ajax_error(jqXHR.status, undefined, 'Remove server form network', jqXHR.responseText);
1933 f533f224 Vangelis Koukis
            }
1934 f533f224 Vangelis Koukis
        }
1935 f533f224 Vangelis Koukis
    });
1936 f533f224 Vangelis Koukis
    return false;
1937 f533f224 Vangelis Koukis
}
1938 0c578a28 Markos Gogoulos
1939 6423ba92 Christodoulos Psaltis
function set_firewall(networkID, serverID, profile) {
1940 6423ba92 Christodoulos Psaltis
    if (!networkID.length || !serverID.length || !profile.length){
1941 6423ba92 Christodoulos Psaltis
        return false;
1942 6423ba92 Christodoulos Psaltis
    }
1943 6423ba92 Christodoulos Psaltis
    // prepare payload
1944 6423ba92 Christodoulos Psaltis
    var payload = {
1945 6423ba92 Christodoulos Psaltis
            "firewallProfile": { "profile": profile }
1946 e9e7fe51 Kostas Papadimitriou
    };
1947 e9e7fe51 Kostas Papadimitriou
1948 6423ba92 Christodoulos Psaltis
    // prepare ajax call
1949 6423ba92 Christodoulos Psaltis
    $.ajax({
1950 6423ba92 Christodoulos Psaltis
        url: API_URL + '/servers/' + serverID + '/action',
1951 6423ba92 Christodoulos Psaltis
        type: "POST",
1952 6423ba92 Christodoulos Psaltis
        contentType: "application/json",
1953 6423ba92 Christodoulos Psaltis
        dataType: "json",
1954 6423ba92 Christodoulos Psaltis
        data: JSON.stringify(payload),
1955 6423ba92 Christodoulos Psaltis
        timeout: TIMEOUT,
1956 6423ba92 Christodoulos Psaltis
        error: function(jqXHR, textStatus, errorThrown) {
1957 6423ba92 Christodoulos Psaltis
            try {
1958 6423ba92 Christodoulos Psaltis
                ajax_error(jqXHR.status, undefined, 'Set firewall profile', jqXHR.responseText);
1959 6423ba92 Christodoulos Psaltis
            } catch (err) {
1960 7991d0c5 Kostas Papadimitriou
                if (!isXhrException(err)) {
1961 7991d0c5 Kostas Papadimitriou
                    ajax_error(-518, "UI Error", 'Set firewall profile', err);
1962 7991d0c5 Kostas Papadimitriou
                } else {
1963 7991d0c5 Kostas Papadimitriou
                    return false;
1964 7991d0c5 Kostas Papadimitriou
                }
1965 6423ba92 Christodoulos Psaltis
            }
1966 6423ba92 Christodoulos Psaltis
        },
1967 6423ba92 Christodoulos Psaltis
        success: function(data, textStatus, jqXHR) {
1968 6423ba92 Christodoulos Psaltis
            if ( jqXHR.status == '202') {
1969 6423ba92 Christodoulos Psaltis
                try {
1970 6423ba92 Christodoulos Psaltis
                    console.info('for server ' + serverID + ' set firewall profile to ' + profile);
1971 6423ba92 Christodoulos Psaltis
                } catch(err) {}
1972 6423ba92 Christodoulos Psaltis
                // toggle the reboot dialog
1973 e9e7fe51 Kostas Papadimitriou
                try {
1974 e9e7fe51 Kostas Papadimitriou
1975 e9e7fe51 Kostas Papadimitriou
                    var serverName = $('div#net-' + networkID + '-server-' + serverID + ' div.machine-name-div span.name').text();
1976 e9e7fe51 Kostas Papadimitriou
                    var serverState = $('div#net-' + networkID + '-server-' + serverID + ' img.logo').attr('src').split('-')[1];
1977 e9e7fe51 Kostas Papadimitriou
                    serverState = serverState.split('.')[0];
1978 e9e7fe51 Kostas Papadimitriou
                    display_reboot_dialog(networkID, serverID, serverName, serverState);
1979 e9e7fe51 Kostas Papadimitriou
1980 e9e7fe51 Kostas Papadimitriou
                    //remove progress gif and toggle the content
1981 e9e7fe51 Kostas Papadimitriou
                    $('div#net-' + networkID + '-server-' + serverID + ' button.firewall-apply').html(VARIOUS["APPLY"]);
1982 e9e7fe51 Kostas Papadimitriou
                    $('div#net-' + networkID + '-server-' + serverID + ' button.firewall-apply').attr("disabled", false);
1983 e9e7fe51 Kostas Papadimitriou
                    $('div#net-' + networkID + '-server-' + serverID + ' div.firewall-header').click();
1984 e9e7fe51 Kostas Papadimitriou
1985 e9e7fe51 Kostas Papadimitriou
                } catch (err) {
1986 e9e7fe51 Kostas Papadimitriou
                }
1987 e9e7fe51 Kostas Papadimitriou
                
1988 e9e7fe51 Kostas Papadimitriou
                // api call was made, set transition state to get reset 
1989 e9e7fe51 Kostas Papadimitriou
                // on the next machines update api call
1990 e9e7fe51 Kostas Papadimitriou
                var vm = get_machine(serverID)
1991 e9e7fe51 Kostas Papadimitriou
                vm.network_transition = "NETWORK_CHANGE";
1992 e9e7fe51 Kostas Papadimitriou
                show_machine_network_indicator(vm.id, 'pub');
1993 6423ba92 Christodoulos Psaltis
            } else {
1994 6423ba92 Christodoulos Psaltis
                ajax_error(jqXHR.status, undefined, 'Set firewall profile', jqXHR.responseText);
1995 6423ba92 Christodoulos Psaltis
            }
1996 6423ba92 Christodoulos Psaltis
        }
1997 6423ba92 Christodoulos Psaltis
    });
1998 6423ba92 Christodoulos Psaltis
    return false;
1999 6423ba92 Christodoulos Psaltis
}
2000 6423ba92 Christodoulos Psaltis
2001 6902f72e clopy
// show the welcome screen
2002 6902f72e clopy
function showWelcome() {
2003 f5ebca32 Mike Muzurakis
    $("#view-select").fadeOut("fast");
2004 f5ebca32 Mike Muzurakis
    $("#emptymachineslist").fadeIn("fast");
2005 f0215d6b Mike Muzurakis
    $("#machinesview").hide();
2006 6902f72e clopy
}
2007 6902f72e clopy
2008 6902f72e clopy
// hide the welcome screen
2009 6902f72e clopy
function hideWelcome() {
2010 6902f72e clopy
    $("#emptymachineslist").fadeOut("fast");
2011 6902f72e clopy
    $("#view-select").fadeIn("fast");
2012 ce4f9227 Mike Muzurakis
    $("div#view-select").show();
2013 f0215d6b Mike Muzurakis
    $("#machinesview").show();
2014 f533f224 Vangelis Koukis
}
2015 f533f224 Vangelis Koukis
2016 f533f224 Vangelis Koukis
function log_server_status_change(server_entry, new_status) {
2017 f533f224 Vangelis Koukis
    // firebug console logging
2018 f533f224 Vangelis Koukis
    try {
2019 09828cb5 Mike Muzurakis
        if ($("#machinesview-single").length > 0) {
2020 09828cb5 Mike Muzurakis
            console.info(server_entry.find("div.machine-details div.name").text() +
2021 09828cb5 Mike Muzurakis
                        ' from ' + server_entry.find(".state-label").text() +
2022 09828cb5 Mike Muzurakis
                        ' to ' + STATUSES[new_status]);
2023 09828cb5 Mike Muzurakis
        } else {
2024 09828cb5 Mike Muzurakis
            console.info(server_entry.find("div.name span.name").text() +
2025 6dd01959 Kostas Papadimitriou
                        ' from ' + server_entry.find(".status").text().replace(TRANSITION_STATE_APPEND, "") +
2026 09828cb5 Mike Muzurakis
                        ' to ' + STATUSES[new_status]);
2027 09828cb5 Mike Muzurakis
        }
2028 f533f224 Vangelis Koukis
    } catch(err) {}
2029 f533f224 Vangelis Koukis
}
2030 f533f224 Vangelis Koukis
2031 f533f224 Vangelis Koukis
function get_flavor_params(flavorRef) {
2032 f533f224 Vangelis Koukis
    var cpus, ram, disk;
2033 f533f224 Vangelis Koukis
    if ( flavors.length > 0 ) {
2034 f533f224 Vangelis Koukis
        var current_flavor = '';
2035 f533f224 Vangelis Koukis
        for (i=0; i<flavors.length; i++) {
2036 f533f224 Vangelis Koukis
            if (flavors[i]['id'] == flavorRef) {
2037 f533f224 Vangelis Koukis
                current_flavor = flavors[i];
2038 f533f224 Vangelis Koukis
            }
2039 f533f224 Vangelis Koukis
        }
2040 f533f224 Vangelis Koukis
        cpus = current_flavor['cpu'];
2041 f533f224 Vangelis Koukis
        ram = current_flavor['ram'];
2042 f533f224 Vangelis Koukis
        disk = current_flavor['disk'];
2043 f533f224 Vangelis Koukis
    } else {
2044 f533f224 Vangelis Koukis
        cpus = 'undefined';
2045 f533f224 Vangelis Koukis
        ram = 'undefined';
2046 f533f224 Vangelis Koukis
        disk = 'undefined';
2047 f533f224 Vangelis Koukis
    }
2048 f533f224 Vangelis Koukis
    return {'cpus': cpus, 'ram': ram, 'disk': disk};
2049 f533f224 Vangelis Koukis
}
2050 f533f224 Vangelis Koukis
2051 f533f224 Vangelis Koukis
function get_image_params(imageRef) {
2052 f533f224 Vangelis Koukis
    var image_name, image_size;
2053 f533f224 Vangelis Koukis
    if ( images.length > 0 ) {
2054 f533f224 Vangelis Koukis
        var current_image = '';
2055 f533f224 Vangelis Koukis
        for (i=0; i<images.length; i++) {
2056 f533f224 Vangelis Koukis
            if (images[i]['id'] == imageRef) {
2057 f533f224 Vangelis Koukis
                current_image = images[i];
2058 f533f224 Vangelis Koukis
            }
2059 f533f224 Vangelis Koukis
        }
2060 7ffea202 Dimitris Moraitis
        try {
2061 7ffea202 Dimitris Moraitis
            image_name = current_image['name'];
2062 7ffea202 Dimitris Moraitis
        } catch(err) { image_name = 'undefined'; }
2063 7ffea202 Dimitris Moraitis
        try{
2064 7ffea202 Dimitris Moraitis
            image_size = current_image['metadata']['values']['size'];
2065 7ffea202 Dimitris Moraitis
        } catch(err) { image_size = 'undefined'; }
2066 f533f224 Vangelis Koukis
    } else {
2067 f533f224 Vangelis Koukis
        image_name = 'undefined';
2068 f533f224 Vangelis Koukis
        image_size = 'undefined';
2069 f533f224 Vangelis Koukis
    }
2070 f533f224 Vangelis Koukis
    return {'name': image_name,'size': image_size};
2071 f533f224 Vangelis Koukis
}
2072 f533f224 Vangelis Koukis
2073 f533f224 Vangelis Koukis
function get_public_ips(server) {
2074 f533f224 Vangelis Koukis
    var ip4, ip6;
2075 f533f224 Vangelis Koukis
    try {
2076 f533f224 Vangelis Koukis
        if (server.addresses.values) {
2077 f533f224 Vangelis Koukis
            $.each (server.addresses.values, function(i, value) {
2078 f533f224 Vangelis Koukis
                if (value.id == 'public') {
2079 f533f224 Vangelis Koukis
                    try {
2080 f533f224 Vangelis Koukis
                        $.each (value.values, function(i, ip) {
2081 f533f224 Vangelis Koukis
                            if (ip.version == '4') {
2082 f533f224 Vangelis Koukis
                                ip4 = ip.addr;
2083 f533f224 Vangelis Koukis
                            } else if (ip.version == '6') {
2084 f533f224 Vangelis Koukis
                                ip6 = ip.addr;
2085 f533f224 Vangelis Koukis
                            } else {
2086 ffbf30f9 Kostas Papadimitriou
                                ip4 = 'pending';
2087 ffbf30f9 Kostas Papadimitriou
                                ip6 = 'pending';
2088 f533f224 Vangelis Koukis
                            }
2089 f533f224 Vangelis Koukis
                        });
2090 f533f224 Vangelis Koukis
                    } catch (err){
2091 f533f224 Vangelis Koukis
                        try{console.info('Server ' + server.id + ' has invalid ips')}catch(err){};
2092 ffbf30f9 Kostas Papadimitriou
                        ip4 = 'pending';
2093 ffbf30f9 Kostas Papadimitriou
                        ip6 = 'pending';
2094 f533f224 Vangelis Koukis
                    }
2095 f533f224 Vangelis Koukis
                }
2096 f533f224 Vangelis Koukis
            });
2097 f533f224 Vangelis Koukis
        }
2098 f533f224 Vangelis Koukis
    } catch (err) {
2099 f533f224 Vangelis Koukis
        try{console.info('Server ' + server.id + ' has no network addresses')}catch(err){};
2100 ffbf30f9 Kostas Papadimitriou
        ip4 = 'pending';
2101 ffbf30f9 Kostas Papadimitriou
        ip6 = 'pending';
2102 f533f224 Vangelis Koukis
    }
2103 f533f224 Vangelis Koukis
    return {'ip4': ip4, 'ip6': ip6};
2104 6902f72e clopy
}
2105 6902f72e clopy
2106 f533f224 Vangelis Koukis
function get_private_ips(server) {
2107 f533f224 Vangelis Koukis
2108 f533f224 Vangelis Koukis
}
2109 716c3ead Dimitris Moraitis
2110 716c3ead Dimitris Moraitis
function close_all_overlays() {
2111 716c3ead Dimitris Moraitis
        try {
2112 716c3ead Dimitris Moraitis
                $("a#networkscreate").overlay().close();
2113 716c3ead Dimitris Moraitis
        } catch(err) {}
2114 716c3ead Dimitris Moraitis
        try {
2115 716c3ead Dimitris Moraitis
                $('a#create').overlay().close();
2116 716c3ead Dimitris Moraitis
        } catch(err) {}
2117 716c3ead Dimitris Moraitis
        try {
2118 716c3ead Dimitris Moraitis
                $("a#add-machines-overlay").overlay().close();
2119 716c3ead Dimitris Moraitis
        } catch(err) {}
2120 716c3ead Dimitris Moraitis
        try {
2121 716c3ead Dimitris Moraitis
                $("a#metadata-scrollable").overlay().close();
2122 82835e06 Christodoulos Psaltis
        } catch(err) {}
2123 114082a7 Kostas Papadimitriou
        try {
2124 114082a7 Kostas Papadimitriou
                $("a#msgbox").overlay().close();
2125 114082a7 Kostas Papadimitriou
        } catch(err) {}
2126 54417a11 Kostas Papadimitriou
        try {
2127 54417a11 Kostas Papadimitriou
                $("a#feedbackbox").overlay().close();
2128 54417a11 Kostas Papadimitriou
        } catch(err) {}
2129 d1e14e2c Mike Muzurakis
}
2130 a583aa29 Kostas Papadimitriou
2131 af6fc929 Kostas Papadimitriou
// logout
2132 af6fc929 Kostas Papadimitriou
function user_session_logout() {
2133 af6fc929 Kostas Papadimitriou
    $.cookie("X-Auth-Token", null);
2134 8e5122dd Kostas Papadimitriou
    if (window.LOGOUT_REDIRECT !== undefined)
2135 8e5122dd Kostas Papadimitriou
    {
2136 8e5122dd Kostas Papadimitriou
        window.location = window.LOGOUT_REDIRECT;
2137 8e5122dd Kostas Papadimitriou
    } else {
2138 8e5122dd Kostas Papadimitriou
        window.location.reload();
2139 8e5122dd Kostas Papadimitriou
    }
2140 af6fc929 Kostas Papadimitriou
}
2141 af6fc929 Kostas Papadimitriou
2142 a583aa29 Kostas Papadimitriou
// action indicators
2143 a583aa29 Kostas Papadimitriou
function init_action_indicator_handlers(machines_view)
2144 a583aa29 Kostas Papadimitriou
{
2145 70eab221 Kostas Papadimitriou
    // init once for each view
2146 70eab221 Kostas Papadimitriou
    if (window.ACTION_ICON_HANDLERS == undefined)
2147 70eab221 Kostas Papadimitriou
    {
2148 70eab221 Kostas Papadimitriou
        window.ACTION_ICON_HANDLERS = {};
2149 70eab221 Kostas Papadimitriou
    }
2150 70eab221 Kostas Papadimitriou
2151 70eab221 Kostas Papadimitriou
    if (machines_view in window.ACTION_ICON_HANDLERS)
2152 70eab221 Kostas Papadimitriou
    {
2153 70eab221 Kostas Papadimitriou
        return;
2154 70eab221 Kostas Papadimitriou
    }
2155 70eab221 Kostas Papadimitriou
    window.ACTION_ICON_HANDLERS[machines_view] = 1;
2156 23ca3bc9 Christodoulos Psaltis
2157 a583aa29 Kostas Papadimitriou
    if (machines_view == "list")
2158 23ca3bc9 Christodoulos Psaltis
    {
2159 a583aa29 Kostas Papadimitriou
        // totally different logic for list view
2160 a583aa29 Kostas Papadimitriou
        init_action_indicator_list_handlers();
2161 a583aa29 Kostas Papadimitriou
        return;
2162 a583aa29 Kostas Papadimitriou
    }
2163 23ca3bc9 Christodoulos Psaltis
2164 cce434fc Kostas Papadimitriou
    function update_action_icon_indicators(force)
2165 23ca3bc9 Christodoulos Psaltis
    {
2166 cce434fc Kostas Papadimitriou
        function show(el, action) {
2167 cce434fc Kostas Papadimitriou
            $(".action-indicator", $(el)).attr("class", "action-indicator " + action);
2168 cce434fc Kostas Papadimitriou
            $(".action-indicator", $(el)).show();
2169 cce434fc Kostas Papadimitriou
        }
2170 cce434fc Kostas Papadimitriou
2171 23ca3bc9 Christodoulos Psaltis
        function hide(el) {
2172 cce434fc Kostas Papadimitriou
            $(".action-indicator", $(el)).hide();
2173 cce434fc Kostas Papadimitriou
        }
2174 23ca3bc9 Christodoulos Psaltis
2175 cce434fc Kostas Papadimitriou
        function get_pending_actions(el) {
2176 cce434fc Kostas Papadimitriou
            return $(".confirm_single:visible", $(el));
2177 cce434fc Kostas Papadimitriou
        }
2178 23ca3bc9 Christodoulos Psaltis
2179 cce434fc Kostas Papadimitriou
        function other_indicators(el) {
2180 cce434fc Kostas Papadimitriou
           return $("img.wave:visible, img.spinner:visible", $(el))
2181 cce434fc Kostas Papadimitriou
        }
2182 23ca3bc9 Christodoulos Psaltis
2183 cce434fc Kostas Papadimitriou
        $("div.machine:visible, div.single-container").each(function(index, el){
2184 cce434fc Kostas Papadimitriou
            var el = $(el);
2185 cce434fc Kostas Papadimitriou
            var pending = get_pending_actions(el);
2186 cce434fc Kostas Papadimitriou
            var other = other_indicators(el);
2187 cce434fc Kostas Papadimitriou
            var action = undefined;
2188 cce434fc Kostas Papadimitriou
            var force_action = force;
2189 cce434fc Kostas Papadimitriou
            var visible = $(el).css("display") == "block";
2190 cce434fc Kostas Papadimitriou
2191 cce434fc Kostas Papadimitriou
            if (force_action !==undefined && force_action.el !== el[0]) {
2192 cce434fc Kostas Papadimitriou
                // force action for other vm
2193 cce434fc Kostas Papadimitriou
                // skipping force action
2194 cce434fc Kostas Papadimitriou
                force_action = undefined;
2195 cce434fc Kostas Papadimitriou
            }
2196 23ca3bc9 Christodoulos Psaltis
2197 cce434fc Kostas Papadimitriou
            if (force_action !==undefined && force_action.el === el[0]) {
2198 cce434fc Kostas Papadimitriou
                action = force_action.action;
2199 cce434fc Kostas Papadimitriou
            }
2200 cce434fc Kostas Papadimitriou
2201 cce434fc Kostas Papadimitriou
            if (other.length >= 1) {
2202 cce434fc Kostas Papadimitriou
                return;
2203 cce434fc Kostas Papadimitriou
            }
2204 cce434fc Kostas Papadimitriou
2205 23ca3bc9 Christodoulos Psaltis
            if (pending.length >= 1 && force_action === undefined) {
2206 cce434fc Kostas Papadimitriou
                action = $(pending.parent()).attr("class").replace("action-container","");
2207 cce434fc Kostas Papadimitriou
            }
2208 23ca3bc9 Christodoulos Psaltis
2209 cce434fc Kostas Papadimitriou
            if (action in {'console':''}) {
2210 cce434fc Kostas Papadimitriou
                return;
2211 cce434fc Kostas Papadimitriou
            }
2212 23ca3bc9 Christodoulos Psaltis
2213 cce434fc Kostas Papadimitriou
            if (action !== undefined) {
2214 cce434fc Kostas Papadimitriou
                show(el, action);
2215 cce434fc Kostas Papadimitriou
            } else {
2216 23ca3bc9 Christodoulos Psaltis
                try {
2217 cce434fc Kostas Papadimitriou
                    if (el.attr('id') == pending_actions[0][1])
2218 cce434fc Kostas Papadimitriou
                    {
2219 23ca3bc9 Christodoulos Psaltis
                        return;
2220 cce434fc Kostas Papadimitriou
                    }
2221 cce434fc Kostas Papadimitriou
                } catch (err) {
2222 cce434fc Kostas Papadimitriou
                }
2223 cce434fc Kostas Papadimitriou
                hide(el);
2224 cce434fc Kostas Papadimitriou
            }
2225 cce434fc Kostas Papadimitriou
2226 cce434fc Kostas Papadimitriou
        });
2227 a583aa29 Kostas Papadimitriou
    }
2228 a583aa29 Kostas Papadimitriou
2229 a583aa29 Kostas Papadimitriou
    // action indicators
2230 cce434fc Kostas Papadimitriou
    $(".action-container").live('mouseover', function(evn) {
2231 cce434fc Kostas Papadimitriou
        force_action = {'el': $(evn.currentTarget).parent().parent()[0], 'action':$(evn.currentTarget).attr("class").replace("action-container","")};
2232 70eab221 Kostas Papadimitriou
        // single view case
2233 cce434fc Kostas Papadimitriou
        if ($(force_action.el).attr("class") == "upper")
2234 a583aa29 Kostas Papadimitriou
        {
2235 cce434fc Kostas Papadimitriou
            force_action.el = $(evn.currentTarget).parent().parent().parent()[0]
2236 cce434fc Kostas Papadimitriou
        };
2237 cce434fc Kostas Papadimitriou
        update_action_icon_indicators(force_action);
2238 a583aa29 Kostas Papadimitriou
    });
2239 a583aa29 Kostas Papadimitriou
2240 70eab221 Kostas Papadimitriou
    $("img.spinner, img.wave").live('hide', function(){
2241 70eab221 Kostas Papadimitriou
        update_action_icon_indicators();
2242 70eab221 Kostas Papadimitriou
    });
2243 cce434fc Kostas Papadimitriou
    // register events where icons should get updated
2244 cce434fc Kostas Papadimitriou
2245 a583aa29 Kostas Papadimitriou
    // hide action indicator image on mouse out, spinner appear, wave appear
2246 a583aa29 Kostas Papadimitriou
    $(".action-container").live("mouseout", function(evn){
2247 cce434fc Kostas Papadimitriou
        update_action_icon_indicators();
2248 cce434fc Kostas Papadimitriou
    });
2249 a583aa29 Kostas Papadimitriou
2250 cce434fc Kostas Papadimitriou
    $(".confirm_single").live("click", function(evn){
2251 cce434fc Kostas Papadimitriou
        update_action_icon_indicators();
2252 a583aa29 Kostas Papadimitriou
    });
2253 a583aa29 Kostas Papadimitriou
2254 a583aa29 Kostas Papadimitriou
    $("img.spinner, img.wave").live('show', function(){
2255 a583aa29 Kostas Papadimitriou
        $("div.action-indicator").hide();
2256 a583aa29 Kostas Papadimitriou
    });
2257 cce434fc Kostas Papadimitriou
2258 cce434fc Kostas Papadimitriou
    $(".confirm_single button.no").live('click', function(evn){
2259 cce434fc Kostas Papadimitriou
        $("div.action-indicator", $(evn.currentTarget).parent().parent()).hide();
2260 cce434fc Kostas Papadimitriou
    });
2261 cce434fc Kostas Papadimitriou
2262 cce434fc Kostas Papadimitriou
    $(".confirm_multiple button.no").click(function(){
2263 cce434fc Kostas Papadimitriou
        $("div.action-indicator").hide();
2264 cce434fc Kostas Papadimitriou
    });
2265 cce434fc Kostas Papadimitriou
2266 cce434fc Kostas Papadimitriou
    $(".confirm_multiple button.yes").click(function(){
2267 cce434fc Kostas Papadimitriou
        $("div.action-indicator").hide();
2268 cce434fc Kostas Papadimitriou
    });
2269 a583aa29 Kostas Papadimitriou
}
2270 a583aa29 Kostas Papadimitriou
2271 a583aa29 Kostas Papadimitriou
function init_action_indicator_list_handlers()
2272 23ca3bc9 Christodoulos Psaltis
{
2273 2339ea91 Kostas Papadimitriou
    var skip_actions = { 'connect':'','details':'' };
2274 a583aa29 Kostas Papadimitriou
2275 a583aa29 Kostas Papadimitriou
    var has_pending_confirmation = function()
2276 a583aa29 Kostas Papadimitriou
    {
2277 a583aa29 Kostas Papadimitriou
        return $(".confirm_multiple:visible").length >= 1
2278 a583aa29 Kostas Papadimitriou
    }
2279 23ca3bc9 Christodoulos Psaltis
2280 a583aa29 Kostas Papadimitriou
    function update_action_indicator_icons(force_action, skip_pending)
2281 23ca3bc9 Christodoulos Psaltis
    {
2282 a583aa29 Kostas Papadimitriou
        // pending action based on the element class
2283 a583aa29 Kostas Papadimitriou
        var pending_action = $(".selected", $(".actions"))[0];
2284 a583aa29 Kostas Papadimitriou
        var selected = get_list_view_selected_machine_rows();
2285 a583aa29 Kostas Papadimitriou
2286 a583aa29 Kostas Papadimitriou
        // reset previous state
2287 a583aa29 Kostas Papadimitriou
        list_view_hide_action_indicators();
2288 23ca3bc9 Christodoulos Psaltis
2289 a583aa29 Kostas Papadimitriou
        if (pending_action == undefined && !force_action)
2290 a583aa29 Kostas Papadimitriou
        {
2291 a583aa29 Kostas Papadimitriou
            // no action selected
2292 a583aa29 Kostas Papadimitriou
            return;
2293 a583aa29 Kostas Papadimitriou
        }
2294 23ca3bc9 Christodoulos Psaltis
2295 a583aa29 Kostas Papadimitriou
        if (force_action != undefined)
2296 a583aa29 Kostas Papadimitriou
        {
2297 a583aa29 Kostas Papadimitriou
            // user forced action choice
2298 a583aa29 Kostas Papadimitriou
            var action_class = force_action;
2299 a583aa29 Kostas Papadimitriou
        } else {
2300 a583aa29 Kostas Papadimitriou
            // retrieve action name (reboot, stop, etc..)
2301 a583aa29 Kostas Papadimitriou
            var action_class = $(pending_action).attr("id").replace("action-","");
2302 a583aa29 Kostas Papadimitriou
        }
2303 a583aa29 Kostas Papadimitriou
2304 a583aa29 Kostas Papadimitriou
        selected.each(function(index, el) {
2305 a583aa29 Kostas Papadimitriou
            if (has_pending_confirmation() && skip_pending)
2306 a583aa29 Kostas Papadimitriou
            {
2307 a583aa29 Kostas Papadimitriou
                return;
2308 a583aa29 Kostas Papadimitriou
            }
2309 a583aa29 Kostas Papadimitriou
            var el = $(el);
2310 a583aa29 Kostas Papadimitriou
            var logo = $("img.list-logo", el);
2311 a583aa29 Kostas Papadimitriou
            $(".action-indicator", el).remove();
2312 a583aa29 Kostas Papadimitriou
            var cls = "action-indicator " + action_class;
2313 a583aa29 Kostas Papadimitriou
            // add icon div
2314 a583aa29 Kostas Papadimitriou
            logo.after('<div class="' + cls + '"></div>');
2315 a583aa29 Kostas Papadimitriou
            // hide os logo
2316 a583aa29 Kostas Papadimitriou
            $("img.list-logo", el).hide();
2317 a583aa29 Kostas Papadimitriou
        });
2318 23ca3bc9 Christodoulos Psaltis
    }
2319 23ca3bc9 Christodoulos Psaltis
2320 a583aa29 Kostas Papadimitriou
    // on mouseover we force the images to the hovered action
2321 a583aa29 Kostas Papadimitriou
    $(".actions a").live("mouseover", function(evn) {
2322 a583aa29 Kostas Papadimitriou
        var el = $(evn.currentTarget);
2323 a583aa29 Kostas Papadimitriou
        if (!el.hasClass("enabled"))
2324 23ca3bc9 Christodoulos Psaltis
        {
2325 a583aa29 Kostas Papadimitriou
            return;
2326 a583aa29 Kostas Papadimitriou
        }
2327 a583aa29 Kostas Papadimitriou
        var action_class = el.attr("id").replace("action-","");
2328 a583aa29 Kostas Papadimitriou
        if (action_class in skip_actions)
2329 a583aa29 Kostas Papadimitriou
        {
2330 a583aa29 Kostas Papadimitriou
            return;
2331 a583aa29 Kostas Papadimitriou
        }
2332 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(action_class, false);
2333 a583aa29 Kostas Papadimitriou
    });
2334 23ca3bc9 Christodoulos Psaltis
2335 cce434fc Kostas Papadimitriou
2336 cce434fc Kostas Papadimitriou
    // register events where icons should get updated
2337 b35cda16 Kostas Papadimitriou
    $(".actions a.enabled").live("click", function(evn) {
2338 b35cda16 Kostas Papadimitriou
        // clear previous selections
2339 b35cda16 Kostas Papadimitriou
        $("a.selected").removeClass("selected");
2340 b35cda16 Kostas Papadimitriou
2341 a583aa29 Kostas Papadimitriou
        var el = $(evn.currentTarget);
2342 a583aa29 Kostas Papadimitriou
        el.addClass("selected");
2343 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(undefined, false);
2344 a583aa29 Kostas Papadimitriou
    });
2345 a583aa29 Kostas Papadimitriou
2346 a583aa29 Kostas Papadimitriou
    $(".actions a").live("mouseout", function(evn) {
2347 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(undefined, false);
2348 a583aa29 Kostas Papadimitriou
    });
2349 23ca3bc9 Christodoulos Psaltis
2350 a583aa29 Kostas Papadimitriou
    $(".confirm_multiple button.no").click(function(){
2351 a583aa29 Kostas Papadimitriou
        list_view_hide_action_indicators();
2352 a583aa29 Kostas Papadimitriou
    });
2353 a583aa29 Kostas Papadimitriou
2354 a583aa29 Kostas Papadimitriou
    $(".confirm_multiple button.yes").click(function(){
2355 a583aa29 Kostas Papadimitriou
        list_view_hide_action_indicators();
2356 a583aa29 Kostas Papadimitriou
    });
2357 23ca3bc9 Christodoulos Psaltis
2358 a583aa29 Kostas Papadimitriou
    $("input[type=checkbox]").live('change', function(){
2359 a583aa29 Kostas Papadimitriou
        // pending_actions will become empty on every checkbox click/change
2360 a583aa29 Kostas Papadimitriou
        // line 154 machines_list.html
2361 a583aa29 Kostas Papadimitriou
        pending_actions = [];
2362 a583aa29 Kostas Papadimitriou
        if (pending_actions.length == 0)
2363 a583aa29 Kostas Papadimitriou
        {
2364 a583aa29 Kostas Papadimitriou
            $(".confirm_multiple").hide();
2365 23ca3bc9 Christodoulos Psaltis
            $("a.selected").each(function(index, el){$(el).removeClass("selected")});
2366 a583aa29 Kostas Papadimitriou
        }
2367 a583aa29 Kostas Papadimitriou
        update_action_indicator_icons(undefined, false);
2368 a583aa29 Kostas Papadimitriou
    });
2369 23ca3bc9 Christodoulos Psaltis
2370 a583aa29 Kostas Papadimitriou
}
2371 a583aa29 Kostas Papadimitriou
2372 a583aa29 Kostas Papadimitriou
function list_view_hide_action_indicators()
2373 a583aa29 Kostas Papadimitriou
{
2374 a583aa29 Kostas Papadimitriou
    $("tr td .action-indicator").remove();
2375 a583aa29 Kostas Papadimitriou
    $("tr td img.list-logo").show();
2376 a583aa29 Kostas Papadimitriou
}
2377 a583aa29 Kostas Papadimitriou
2378 a583aa29 Kostas Papadimitriou
function get_list_view_selected_machine_rows()
2379 23ca3bc9 Christodoulos Psaltis
{
2380 a583aa29 Kostas Papadimitriou
    var table = $("table.list-machines");
2381 a583aa29 Kostas Papadimitriou
    var rows = $("tr:has(input[type=checkbox]:checked)",table);
2382 a583aa29 Kostas Papadimitriou
    return rows;
2383 a583aa29 Kostas Papadimitriou
}
2384 7af53e78 Kostas Papadimitriou
2385 7af53e78 Kostas Papadimitriou
// machines images utils
2386 7af53e78 Kostas Papadimitriou
function set_machine_os_image(machine, machines_view, state, os, skip_reset_states, remove_state) {
2387 7af53e78 Kostas Papadimitriou
    var views_map = {'single': '.single-image', 'icon': '.logo'};
2388 7af53e78 Kostas Papadimitriou
    var states_map = {'on': 'state1', 'off': 'state3', 'hover': 'state4', 'click': 'state2'}
2389 7af53e78 Kostas Papadimitriou
    var sizes_map = {'single': 'large', 'icon': 'medium'}
2390 7af53e78 Kostas Papadimitriou
2391 7af53e78 Kostas Papadimitriou
    var size = sizes_map[machines_view];
2392 7af53e78 Kostas Papadimitriou
    var img_selector = views_map[machines_view];
2393 7af53e78 Kostas Papadimitriou
    var cls = states_map[state];
2394 40e77a49 Kostas Papadimitriou
2395 40e77a49 Kostas Papadimitriou
    if (os === "unknown") { os = "okeanos" } ;
2396 7af53e78 Kostas Papadimitriou
    var new_img = 'url("./static/icons/machines/' + size + '/' + os + '-sprite.png")';
2397 7af53e78 Kostas Papadimitriou
2398 7af53e78 Kostas Papadimitriou
    var el = $(img_selector, machine);
2399 7af53e78 Kostas Papadimitriou
    var current_img = el.css("backgroundImage");
2400 7af53e78 Kostas Papadimitriou
    if (os == undefined){
2401 7af53e78 Kostas Papadimitriou
        new_img = current_img;
2402 7af53e78 Kostas Papadimitriou
    }
2403 7af53e78 Kostas Papadimitriou
2404 7af53e78 Kostas Papadimitriou
    // os changed
2405 7af53e78 Kostas Papadimitriou
    el.css("backgroundImage", new_img);
2406 7af53e78 Kostas Papadimitriou
2407 7af53e78 Kostas Papadimitriou
    // reset current state
2408 7af53e78 Kostas Papadimitriou
    if (skip_reset_states === undefined)
2409 7af53e78 Kostas Papadimitriou
    {
2410 7af53e78 Kostas Papadimitriou
        el.removeClass("single-image-state1");
2411 7af53e78 Kostas Papadimitriou
        el.removeClass("single-image-state2");
2412 7af53e78 Kostas Papadimitriou
        el.removeClass("single-image-state3");
2413 23a4a31b Kostas Papadimitriou
        el.removeClass("single-image-state4");
2414 7af53e78 Kostas Papadimitriou
    }
2415 7af53e78 Kostas Papadimitriou
2416 7af53e78 Kostas Papadimitriou
    if (remove_state !== undefined)
2417 7af53e78 Kostas Papadimitriou
    {
2418 7af53e78 Kostas Papadimitriou
        remove_state = "single-image-" + states_map[remove_state];
2419 7af53e78 Kostas Papadimitriou
        el.removeClass(remove_state);
2420 7af53e78 Kostas Papadimitriou
        return;
2421 7af53e78 Kostas Papadimitriou
    }
2422 7af53e78 Kostas Papadimitriou
    
2423 7af53e78 Kostas Papadimitriou
    // set proper state
2424 7af53e78 Kostas Papadimitriou
    el.addClass("single-image-" + cls);
2425 7af53e78 Kostas Papadimitriou
}
2426 7af53e78 Kostas Papadimitriou
2427 29772683 Kostas Papadimitriou
2428 29772683 Kostas Papadimitriou
// generic info box
2429 d790d9b7 Kostas Papadimitriou
function show_feedback_form(msg, from_error) {
2430 54417a11 Kostas Papadimitriou
    var box = $("#feedback-form");
2431 54417a11 Kostas Papadimitriou
    box.addClass("notification-box");
2432 54417a11 Kostas Papadimitriou
2433 54417a11 Kostas Papadimitriou
    // initialize
2434 54417a11 Kostas Papadimitriou
    box.find(".form-container").show();
2435 54417a11 Kostas Papadimitriou
    box.find("textarea").val("");
2436 54417a11 Kostas Papadimitriou
    box.find(".message").hide();
2437 d790d9b7 Kostas Papadimitriou
    
2438 d790d9b7 Kostas Papadimitriou
    var initial_msg = msg || undefined;
2439 d790d9b7 Kostas Papadimitriou
    
2440 54417a11 Kostas Papadimitriou
    var triggers = $("a#feedbackbox").overlay({
2441 54417a11 Kostas Papadimitriou
        // some mask tweaks suitable for modal dialogs
2442 54417a11 Kostas Papadimitriou
        mask: '#666',
2443 54417a11 Kostas Papadimitriou
        top: '10px',
2444 54417a11 Kostas Papadimitriou
        fixed: false,
2445 54417a11 Kostas Papadimitriou
        closeOnClick: false,
2446 54417a11 Kostas Papadimitriou
        oneInstance: false,
2447 d790d9b7 Kostas Papadimitriou
        load: false
2448 54417a11 Kostas Papadimitriou
    });
2449 d790d9b7 Kostas Papadimitriou
2450 54417a11 Kostas Papadimitriou
    
2451 d790d9b7 Kostas Papadimitriou
    if (initial_msg && from_error) {
2452 d790d9b7 Kostas Papadimitriou
        // feedback form from ajax_error window
2453 d790d9b7 Kostas Papadimitriou
        box.find("textarea").val(initial_msg);
2454 d790d9b7 Kostas Papadimitriou
        $("a#feedbackbox").overlay().onClose(function(){window.location.reload()});
2455 d790d9b7 Kostas Papadimitriou
        box.find("textarea").height(200);
2456 d790d9b7 Kostas Papadimitriou
        $("a#feedbackbox").overlay().onLoad(function(){box.find("textarea").focus().setCursorPosition(500);});
2457 d790d9b7 Kostas Papadimitriou
        
2458 d790d9b7 Kostas Papadimitriou
    }
2459 d790d9b7 Kostas Papadimitriou
2460 54417a11 Kostas Papadimitriou
    $("#feedback-form form").unbind("submit");
2461 54417a11 Kostas Papadimitriou
    $("#feedback-form form").submit(function(event) {
2462 54417a11 Kostas Papadimitriou
        event.preventDefault();
2463 54417a11 Kostas Papadimitriou
            
2464 54417a11 Kostas Papadimitriou
        // empty msg
2465 54417a11 Kostas Papadimitriou
        if ($("textarea.feedback-text").val().replace(/^\s*|\s*$/,"") == "") {
2466 54417a11 Kostas Papadimitriou
            alert($(".empty-error-msg", this).text());
2467 54417a11 Kostas Papadimitriou
            return;
2468 54417a11 Kostas Papadimitriou
        }
2469 54417a11 Kostas Papadimitriou
2470 7991d0c5 Kostas Papadimitriou
        $("textarea.data-text", this).val("").val(get_user_data_json());
2471 54417a11 Kostas Papadimitriou
2472 54417a11 Kostas Papadimitriou
        $.ajax({
2473 54417a11 Kostas Papadimitriou
            url: FEEDBACK_URL,
2474 54417a11 Kostas Papadimitriou
            data: $(this).serialize(),
2475 54417a11 Kostas Papadimitriou
            type: "POST",
2476 54417a11 Kostas Papadimitriou
            // show loading
2477 54417a11 Kostas Papadimitriou
            beforeSend: function() {box.find(".form-container").hide(); box.find(".sending").fadeIn() },
2478 54417a11 Kostas Papadimitriou
            // hide form
2479 54417a11 Kostas Papadimitriou
            complete: function() { box.find(".form-container").hide(); box.find(".sending").hide() },
2480 54417a11 Kostas Papadimitriou
            // on success display success message
2481 54417a11 Kostas Papadimitriou
            success: function() { box.find(".success").fadeIn(); box.find(".sending").hide() },
2482 54417a11 Kostas Papadimitriou
            // display error message
2483 54417a11 Kostas Papadimitriou
            error: function() { box.find(".errormsg").fadeIn(); box.find(".sending").hide() }
2484 54417a11 Kostas Papadimitriou
        })
2485 54417a11 Kostas Papadimitriou
    });
2486 54417a11 Kostas Papadimitriou
    
2487 54417a11 Kostas Papadimitriou
    $("a#feedbackbox").data('overlay').load();
2488 d790d9b7 Kostas Papadimitriou
2489 d790d9b7 Kostas Papadimitriou
    // reset feedback_pending for ajax_errors
2490 d790d9b7 Kostas Papadimitriou
    window.FEEDBACK_PENDING = false;
2491 54417a11 Kostas Papadimitriou
    return false;
2492 54417a11 Kostas Papadimitriou
}
2493 54417a11 Kostas Papadimitriou
2494 54417a11 Kostas Papadimitriou
function get_user_data(extra_data) {
2495 7991d0c5 Kostas Papadimitriou
    try {
2496 7991d0c5 Kostas Papadimitriou
        var last_req = $.extend({}, last_request);
2497 7991d0c5 Kostas Papadimitriou
2498 7991d0c5 Kostas Papadimitriou
        // reset xhr, might raise exceptions while converting to JSON
2499 7991d0c5 Kostas Papadimitriou
        last_req.xhr = {};
2500 7991d0c5 Kostas Papadimitriou
    } catch (err) {
2501 7991d0c5 Kostas Papadimitriou
        var last_req = {}
2502 7991d0c5 Kostas Papadimitriou
    }
2503 7991d0c5 Kostas Papadimitriou
2504 54417a11 Kostas Papadimitriou
    return $.extend({
2505 54417a11 Kostas Papadimitriou
        'servers': $.extend({}, servers),
2506 54417a11 Kostas Papadimitriou
        'client': {'browser': $.browser, 'screen': $.extend({}, screen), 'client': $.client},
2507 7991d0c5 Kostas Papadimitriou
        'dates': {'now': new Date, 'lastUpdate': changes_since_date},
2508 7991d0c5 Kostas Papadimitriou
        'last_request': last_req
2509 54417a11 Kostas Papadimitriou
    }, extra_data);
2510 54417a11 Kostas Papadimitriou
}
2511 29772683 Kostas Papadimitriou
2512 7991d0c5 Kostas Papadimitriou
function get_user_data_json() {
2513 7991d0c5 Kostas Papadimitriou
    try {
2514 7991d0c5 Kostas Papadimitriou
        return JSON.stringify(get_user_data());
2515 7991d0c5 Kostas Papadimitriou
    } catch (err) {
2516 7991d0c5 Kostas Papadimitriou
        return JSON.stringify({'error': err});
2517 7991d0c5 Kostas Papadimitriou
    }
2518 7991d0c5 Kostas Papadimitriou
}
2519 7991d0c5 Kostas Papadimitriou
2520 29772683 Kostas Papadimitriou
function msg_box(config) {
2521 29772683 Kostas Papadimitriou
    var config = $.extend({'title':'Info message', 'content': 'this is an info message', 'ajax': false, 'extra':false}, config);
2522 29772683 Kostas Papadimitriou
    // prepare the error message
2523 29772683 Kostas Papadimitriou
    // bring up success notification
2524 29772683 Kostas Papadimitriou
2525 29772683 Kostas Papadimitriou
    var box = $("#notification-box");
2526 54417a11 Kostas Papadimitriou
    box.addClass("notification-box");
2527 29772683 Kostas Papadimitriou
    box.addClass('success');
2528 29772683 Kostas Papadimitriou
    box.removeClass('error');
2529 29772683 Kostas Papadimitriou
2530 9eefb3a2 Kostas Papadimitriou
    var sel = function(s){return $(s, box)};
2531 81d11e38 Kostas Papadimitriou
    // reset texts
2532 81d11e38 Kostas Papadimitriou
    sel("h3 span.header-box").html("");
2533 81d11e38 Kostas Papadimitriou
    sel(".sub-text").html("");
2534 81d11e38 Kostas Papadimitriou
    sel(".password-container .password").html("");
2535 81d11e38 Kostas Papadimitriou
    sel("div.machine-now-building").html("");
2536 81d11e38 Kostas Papadimitriou
    
2537 81d11e38 Kostas Papadimitriou
2538 81d11e38 Kostas Papadimitriou
    // apply msg box contents
2539 9ed51b7e Kostas Papadimitriou
    sel("h3 span.header-box").html(config.title);
2540 29772683 Kostas Papadimitriou
    sel("div.machine-now-building").html(config.content);
2541 29772683 Kostas Papadimitriou
    sel(".popup-header").removeClass("popup-header-error");
2542 29772683 Kostas Papadimitriou
    box.removeClass("popup-border-error");
2543 29772683 Kostas Papadimitriou
    sel(".popup-details").removeClass("popup-details-error");
2544 29772683 Kostas Papadimitriou
    sel(".popup-separator").removeClass("popup-separator-error");
2545 29772683 Kostas Papadimitriou
    
2546 29772683 Kostas Papadimitriou
    sel(".password-container").hide();
2547 29772683 Kostas Papadimitriou
    if (config.extra) {
2548 29772683 Kostas Papadimitriou
        sel(".password-container .password").html(config.extra);
2549 29772683 Kostas Papadimitriou
        sel(".password-container").show();
2550 29772683 Kostas Papadimitriou
    }
2551 de44fc6c Kostas Papadimitriou
    
2552 de44fc6c Kostas Papadimitriou
    var conf = {
2553 29772683 Kostas Papadimitriou
        // some mask tweaks suitable for modal dialogs
2554 29772683 Kostas Papadimitriou
        mask: '#666',
2555 54417a11 Kostas Papadimitriou
        top: '10px',
2556 29772683 Kostas Papadimitriou
        closeOnClick: false,
2557 29772683 Kostas Papadimitriou
        oneInstance: false,
2558 29772683 Kostas Papadimitriou
        load: false,
2559 de44fc6c Kostas Papadimitriou
        fixed: config.fixed || false,
2560 29772683 Kostas Papadimitriou
        onClose: function () {
2561 29772683 Kostas Papadimitriou
            // With partial refresh working properly,
2562 29772683 Kostas Papadimitriou
            // it is no longer necessary to refresh the whole page
2563 29772683 Kostas Papadimitriou
            // choose_view();
2564 29772683 Kostas Papadimitriou
        }
2565 de44fc6c Kostas Papadimitriou
    }
2566 de44fc6c Kostas Papadimitriou
    
2567 de44fc6c Kostas Papadimitriou
    var triggers = $("a#msgbox").overlay(conf);
2568 de44fc6c Kostas Papadimitriou
2569 de44fc6c Kostas Papadimitriou
    try {
2570 de44fc6c Kostas Papadimitriou
        conf = $("a#msgbox").data('overlay').getConf();
2571 de44fc6c Kostas Papadimitriou
        conf.fixed = config.fixed || false;
2572 de44fc6c Kostas Papadimitriou
    } catch (err) {}
2573 29772683 Kostas Papadimitriou
    $("a#msgbox").data('overlay').load();
2574 29772683 Kostas Papadimitriou
    
2575 29772683 Kostas Papadimitriou
    var parse_data = config.parse_data || false;
2576 19e01943 Kostas Papadimitriou
    var load_html = config.html || false;
2577 19e01943 Kostas Papadimitriou
    var user_success = config.success || false;
2578 19e01943 Kostas Papadimitriou
    config.ajax = config.ajax || {};
2579 19e01943 Kostas Papadimitriou
2580 19e01943 Kostas Papadimitriou
    // requested to show remote data in msg_box
2581 29772683 Kostas Papadimitriou
    if (config.ajax) {
2582 19e01943 Kostas Papadimitriou
        $.ajax($.extend({ 
2583 29772683 Kostas Papadimitriou
            url:config.ajax, 
2584 29772683 Kostas Papadimitriou
            success: function(data){
2585 19e01943 Kostas Papadimitriou
                // we want to get our data parsed before
2586 19e01943 Kostas Papadimitriou
                // placing them in content
2587 29772683 Kostas Papadimitriou
                if (parse_data) {
2588 29772683 Kostas Papadimitriou
                    data = parse_data(data);
2589 29772683 Kostas Papadimitriou
                }
2590 29772683 Kostas Papadimitriou
2591 19e01943 Kostas Papadimitriou
                // no json response
2592 19e01943 Kostas Papadimitriou
                // load html body
2593 19e01943 Kostas Papadimitriou
                if (load_html) {
2594 19e01943 Kostas Papadimitriou
                    sel("div.machine-now-building").html(data);
2595 19e01943 Kostas Papadimitriou
                } else {
2596 29772683 Kostas Papadimitriou
2597 54417a11 Kostas Papadimitriou
                    if (data.title) {
2598 19e01943 Kostas Papadimitriou
                        sel("h3 span.header-box").text(data.title);
2599 54417a11 Kostas Papadimitriou
                    }
2600 29772683 Kostas Papadimitriou
2601 19e01943 Kostas Papadimitriou
                    if (data.content) {
2602 19e01943 Kostas Papadimitriou
                        sel("div.machine-now-building").html(data.content);
2603 19e01943 Kostas Papadimitriou
                    }
2604 19e01943 Kostas Papadimitriou
                    if (data.extra) {
2605 19e01943 Kostas Papadimitriou
                        sel(".password-container .password").html(data.extra);
2606 19e01943 Kostas Papadimitriou
                        sel(".password-container").show();
2607 19e01943 Kostas Papadimitriou
                    }
2608 9ed51b7e Kostas Papadimitriou
                    if (data.subinfo) {
2609 9ed51b7e Kostas Papadimitriou
                        sel(".sub-text").html(data.subinfo);
2610 9ed51b7e Kostas Papadimitriou
                    } else {
2611 9ed51b7e Kostas Papadimitriou
                        sel(".sub-text").html("");
2612 9ed51b7e Kostas Papadimitriou
                    }
2613 29772683 Kostas Papadimitriou
                }
2614 19e01943 Kostas Papadimitriou
2615 19e01943 Kostas Papadimitriou
                if (user_success) {
2616 19e01943 Kostas Papadimitriou
                    user_success($("div.machine-now-building"));
2617 19e01943 Kostas Papadimitriou
                }
2618 54417a11 Kostas Papadimitriou
            },
2619 54417a11 Kostas Papadimitriou
            error: function(xhr, status, err) {
2620 7991d0c5 Kostas Papadimitriou
                ajax_error(-519, "UI Error", "Machine connect", err);
2621 dc12a449 Kostas Papadimitriou
            }
2622 19e01943 Kostas Papadimitriou
        }, config.ajax_config));
2623 29772683 Kostas Papadimitriou
    }
2624 29772683 Kostas Papadimitriou
    return false;
2625 29772683 Kostas Papadimitriou
}
2626 19e01943 Kostas Papadimitriou
2627 19e01943 Kostas Papadimitriou
2628 19e01943 Kostas Papadimitriou
function show_invitations() {
2629 19e01943 Kostas Papadimitriou
2630 19e01943 Kostas Papadimitriou
    handle_invitations = function(el) {
2631 a697f671 Kostas Papadimitriou
2632 a697f671 Kostas Papadimitriou
        // proper class to identify the overlay block
2633 19e01943 Kostas Papadimitriou
        el.addClass("invitations");
2634 a697f671 Kostas Papadimitriou
2635 19e01943 Kostas Papadimitriou
        var cont = el;
2636 19e01943 Kostas Papadimitriou
        var form = $(el).find("form");
2637 f2141829 Kostas Papadimitriou
2638 f2141829 Kostas Papadimitriou
        // remove garbage rows that stay in DOM between requests
2639 f2141829 Kostas Papadimitriou
        $(".removable-field-row:hidden").remove();
2640 40a87146 Kostas Papadimitriou
2641 a697f671 Kostas Papadimitriou
        // avoid buggy behaviour, close all overlays if something went wrong
2642 40a87146 Kostas Papadimitriou
        try {
2643 a697f671 Kostas Papadimitriou
            // form is in content (form is not displayed if user has no invitations)
2644 a697f671 Kostas Papadimitriou
            if ($("#invform #removable-name-container-1").length) {
2645 a697f671 Kostas Papadimitriou
                $("#invform #removable-name-container-1").dynamicField();
2646 a697f671 Kostas Papadimitriou
            }
2647 40a87146 Kostas Papadimitriou
        } catch (err) {
2648 40a87146 Kostas Papadimitriou
            close_all_overlays();
2649 40a87146 Kostas Papadimitriou
        }
2650 d389b440 Kostas Papadimitriou
        
2651 a697f671 Kostas Papadimitriou
        // we copy/paste it on the title no need to show it twice
2652 d389b440 Kostas Papadimitriou
        $(".invitations-left").hide();
2653 a697f671 Kostas Papadimitriou
2654 a697f671 Kostas Papadimitriou
        // reset title
2655 54417a11 Kostas Papadimitriou
        $("#notification-box .header-box").html("");
2656 67921b5c Kostas Papadimitriou
        $("#notification-box .header-box").html(window.INVITATIONS_TITLE + " " + $($(".invitations-left")[0]).text());
2657 d389b440 Kostas Papadimitriou
2658 a697f671 Kostas Papadimitriou
        // handle form submit
2659 19e01943 Kostas Papadimitriou
        form.submit(function(evn){
2660 19e01943 Kostas Papadimitriou
            evn.preventDefault();
2661 a697f671 Kostas Papadimitriou
2662 a697f671 Kostas Papadimitriou
            // do the post
2663 f2141829 Kostas Papadimitriou
            $.post(form.attr("action"), form.serialize(), function(data) {
2664 a697f671 Kostas Papadimitriou
                // replace data
2665 eabbd5b7 Kostas Papadimitriou
                $(cont).html(data); 
2666 a697f671 Kostas Papadimitriou
2667 a697f671 Kostas Papadimitriou
                // append all handlers again (new html data need to redo all changes)
2668 eabbd5b7 Kostas Papadimitriou
                handle_invitations(cont);
2669 f2141829 Kostas Papadimitriou
            });
2670 a697f671 Kostas Papadimitriou
2671 19e01943 Kostas Papadimitriou
            return false;
2672 19e01943 Kostas Papadimitriou
        });
2673 19e01943 Kostas Papadimitriou
    }
2674 a697f671 Kostas Papadimitriou
    
2675 a697f671 Kostas Papadimitriou
    // first time clicked (show the msg box with /invitations content)
2676 de44fc6c Kostas Papadimitriou
    msg_box({
2677 de44fc6c Kostas Papadimitriou
        title:window.INVITATIONS_TITLE, 
2678 de44fc6c Kostas Papadimitriou
        content:'', 
2679 de44fc6c Kostas Papadimitriou
        fixed: false,
2680 de44fc6c Kostas Papadimitriou
        ajax:INVITATIONS_URL, 
2681 de44fc6c Kostas Papadimitriou
        html:true, 
2682 de44fc6c Kostas Papadimitriou
        success: function(el){ 
2683 de44fc6c Kostas Papadimitriou
            handle_invitations(el)
2684 de44fc6c Kostas Papadimitriou
        }
2685 19e01943 Kostas Papadimitriou
    });
2686 19e01943 Kostas Papadimitriou
}
2687 dc12a449 Kostas Papadimitriou
2688 f277a1cd Kostas Papadimitriou
2689 f277a1cd Kostas Papadimitriou
function get_short_v6(v6, parts_to_keep) {
2690 f277a1cd Kostas Papadimitriou
    var parts = v6.split(":");
2691 f277a1cd Kostas Papadimitriou
    var new_parts = parts.slice(parts.length - parts_to_keep);
2692 f277a1cd Kostas Papadimitriou
    return new_parts.join(":");
2693 f277a1cd Kostas Papadimitriou
}
2694 f277a1cd Kostas Papadimitriou
2695 f277a1cd Kostas Papadimitriou
function fix_v6_addresses() {
2696 f277a1cd Kostas Papadimitriou
2697 f277a1cd Kostas Papadimitriou
    // what to prepend
2698 99d2c273 Kostas Papadimitriou
    var match = "...";
2699 f277a1cd Kostas Papadimitriou
    // long ip min length
2700 f277a1cd Kostas Papadimitriou
    var limit = 20;
2701 f277a1cd Kostas Papadimitriou
    // parts to show after the transformation
2702 f277a1cd Kostas Papadimitriou
    // (from the end)
2703 f277a1cd Kostas Papadimitriou
    var parts_to_keep_from_end = 4;
2704 f277a1cd Kostas Papadimitriou
2705 f277a1cd Kostas Papadimitriou
    $(".ipv6-text").each(function(index, el){
2706 f277a1cd Kostas Papadimitriou
        var el = $(el);
2707 f277a1cd Kostas Papadimitriou
        var ip = $(el).text();
2708 f277a1cd Kostas Papadimitriou
            
2709 f277a1cd Kostas Papadimitriou
        // transformation not applyied
2710 f277a1cd Kostas Papadimitriou
        // FIXME: use $.data for the condition
2711 f277a1cd Kostas Papadimitriou
        if (ip.indexOf(match) == -1 && ip != "pending") {
2712 f277a1cd Kostas Papadimitriou
            
2713 f277a1cd Kostas Papadimitriou
            // only too long ips
2714 f277a1cd Kostas Papadimitriou
            if (ip.length > 20) {
2715 f277a1cd Kostas Papadimitriou
                $(el).data("ipstring", ip);
2716 f277a1cd Kostas Papadimitriou
                $(el).text(match + get_short_v6(ip, parts_to_keep_from_end));
2717 f277a1cd Kostas Papadimitriou
                $(el).attr("title", ip);
2718 6b1c18d5 Kostas Papadimitriou
                $(el).tooltip({'tipClass':'tooltip ipv6-tip', 'position': 'center center'});
2719 f277a1cd Kostas Papadimitriou
            }
2720 f277a1cd Kostas Papadimitriou
        } else {
2721 f277a1cd Kostas Papadimitriou
            if (ip.indexOf(match) == 0) {
2722 f277a1cd Kostas Papadimitriou
            } else {
2723 f277a1cd Kostas Papadimitriou
                // not a long ip anymore
2724 f277a1cd Kostas Papadimitriou
                $(el).data("ipstring", undefined);
2725 f277a1cd Kostas Papadimitriou
                $(el).css({'text-decoration':'none'});
2726 f277a1cd Kostas Papadimitriou
2727 f277a1cd Kostas Papadimitriou
                if ($(el).data('tooltip')) {
2728 f277a1cd Kostas Papadimitriou
                    $(el).data('tooltip').show = function () {};
2729 f277a1cd Kostas Papadimitriou
                }
2730 f277a1cd Kostas Papadimitriou
            }
2731 f277a1cd Kostas Papadimitriou
        }
2732 f277a1cd Kostas Papadimitriou
    });
2733 f277a1cd Kostas Papadimitriou
}
2734 f277a1cd Kostas Papadimitriou
2735 31279d33 Kostas Papadimitriou
function fix_server_name(str, limit, append) {
2736 31279d33 Kostas Papadimitriou
    limit = limit || 30;
2737 31279d33 Kostas Papadimitriou
    append = append || "...";
2738 31279d33 Kostas Papadimitriou
2739 31279d33 Kostas Papadimitriou
    if (str.length > limit) {
2740 31279d33 Kostas Papadimitriou
        str = str.substring(0,limit-append.length) + append;
2741 31279d33 Kostas Papadimitriou
    }
2742 31279d33 Kostas Papadimitriou
    return str;
2743 31279d33 Kostas Papadimitriou
}
2744 e9e7fe51 Kostas Papadimitriou
2745 e9e7fe51 Kostas Papadimitriou
function show_machine_network_indicator(vm_id, network_id) {
2746 e9e7fe51 Kostas Papadimitriou
    var el = $("div#net-" + network_id + '-server-' + vm_id);
2747 e9e7fe51 Kostas Papadimitriou
    el.find(".network-progress-indicator").show();
2748 e9e7fe51 Kostas Papadimitriou
}
2749 e9e7fe51 Kostas Papadimitriou
2750 e9e7fe51 Kostas Papadimitriou
2751 e9e7fe51 Kostas Papadimitriou
function get_firewall_profile(vm_id) {
2752 e9e7fe51 Kostas Papadimitriou
    var vm = get_machine(vm_id);
2753 e9e7fe51 Kostas Papadimitriou
2754 e9e7fe51 Kostas Papadimitriou
    try {
2755 e9e7fe51 Kostas Papadimitriou
        return vm.addresses.values[0].firewallProfile;
2756 e9e7fe51 Kostas Papadimitriou
    } catch (err) {
2757 e9e7fe51 Kostas Papadimitriou
        return undefined;
2758 e9e7fe51 Kostas Papadimitriou
    }
2759 e9e7fe51 Kostas Papadimitriou
}