Statistics
| Branch: | Tag: | Revision:

root / ui / static / snf / js / utils.js @ 8d08f18a

History | View | Annotate | Download (9.1 kB)

1
;(function(root){
2
    
3
    var root = root;
4
    var snf = root.synnefo = root.synnefo || {};
5
    
6
    snf.i18n = {};
7

    
8
    // Logging namespace
9
    var logging = snf.logging = snf.logging || {};
10

    
11
    // logger object
12
    var logger = logging.logger = function(ns, level){
13
        var levels = ["debug", "info", "error"];
14
        var con = window.console;
15
        
16
        this.level = level || synnefo.logging.level;
17
        this.ns = ns || "";
18

    
19
        this._log = function(lvl) {
20
            if (lvl >= this.level && con) {
21
                var args = Array.prototype.slice.call(arguments[1]);
22
                var level_name = levels[lvl];
23
                    
24
                if (this.ns) {
25
                    args = ["["+this.ns+"] "].concat(args);
26
                }
27

    
28
                log = con.log
29
                if (con[level_name])
30
                    log = con[level_name]
31

    
32
                try {
33
                    con && log.apply(con, Array.prototype.slice.call(args));
34
                } catch (err) {}
35
            }
36
        }
37

    
38
        this.debug = function() {
39
            var args = [0]; args.push.call(args, arguments);
40
            this._log.apply(this, args);
41
        }
42

    
43
        this.info = function() {
44
            var args = [1]; args.push.call(args, arguments);
45
            this._log.apply(this, args);
46
        }
47

    
48
        this.error = function() {
49
            var args = [2]; args.push.call(args, arguments);
50
            try {
51
                console.trace()
52
            } catch (err) {}
53
            this._log.apply(this, args);
54
        }
55

    
56
    };
57
    
58
    synnefo.collect_user_data = function() {
59
        var data = {}
60
        
61
        try {
62
            data.calls = synnefo.api.requests;
63
        } catch (err) { data.calls = err }
64
        try {
65
            data.errors = synnefo.api.errors;
66
        } catch (err) { data.errors = err }
67
        try {
68
            data.data = {};
69
        } catch (err) { data.data = err }
70
        try {
71
            data.data.vms = synnefo.storage.vms.toJSON();
72
        } catch (err) { data.data.vms = err }
73
        try {
74
            data.data.networks = synnefo.storage.vms.toJSON();
75
        } catch (err) { data.data.networks = err }
76
        try {
77
            data.data.images = synnefo.storage.images.toJSON();
78
        } catch (err) { data.data.images = err }
79
        try {
80
            data.data.flavors = synnefo.storage.flavors.toJSON();
81
        } catch (err) { data.data.flavors = err }
82
        try {
83
            data.date = new Date;
84
        } catch (err) { data.date = err }
85

    
86
        return data;
87
    }
88

    
89
    // default logger level (debug)
90
    synnefo.logging.level = 0;
91

    
92
    // generic logger
93
    synnefo.log = new logger({'ns':'SNF'});
94

    
95
    // synnefo config options
96
    synnefo.config = synnefo.config || {};
97
    synnefo.config.api_url = "/api/v1.1";
98
    
99
    // Util namespace
100
    synnefo.util = synnefo.util || {};
101

    
102
    // Extensions and Utility functions
103
    synnefo.util.ISODateString = function(d){
104
        function pad(n){
105
            return n<10 ? '0'+n : n
106
        }
107
         return d.getUTCFullYear()+'-'
108
         + pad(d.getUTCMonth()+1)+'-'
109
         + pad(d.getUTCDate())+'T'
110
         + pad(d.getUTCHours())+':'
111
         + pad(d.getUTCMinutes())+':'
112
         + pad(d.getUTCSeconds())+'Z'
113
    }
114

    
115
 
116
    synnefo.util.parseUri = function(sourceUri) {
117
        var uriPartNames = ["source","protocol","authority","domain","port","path","directoryPath","fileName","query","anchor"];
118
        var uriParts = new RegExp("^(?:([^:/?#.]+):)?(?://)?(([^:/?#]*)(?::(\\d*))?)?((/(?:[^?#](?![^?#/]*\\.[^?#/.]+(?:[\\?#]|$)))*/?)?([^?#/]*))?(?:\\?([^#]*))?(?:#(.*))?").exec(sourceUri);
119
        var uri = {};
120
        
121
        for(var i = 0; i < 10; i++){
122
            uri[uriPartNames[i]] = (uriParts[i] ? uriParts[i] : "");
123
        }
124
    
125
        // Always end directoryPath with a trailing backslash if a path was present in the source URI
126
        // Note that a trailing backslash is NOT automatically inserted within or appended to the "path" key
127
        if(uri.directoryPath.length > 0){
128
            uri.directoryPath = uri.directoryPath.replace(/\/?$/, "/");
129
        }
130
        
131
        return uri;
132
    }
133

    
134
    synnefo.util.truncate = function(string, size, append, words) {
135
        if (string.length <= size) {
136
            return string;
137
        }
138

    
139
        if (append === undefined) {
140
            append = "...";
141
        }
142
        
143
        if (!append) { append = "" };
144
        // TODO: implement word truncate
145
        if (words === undefined) {
146
            words = false;
147
        }
148
        
149
        len = size - append.length;
150
        return string.substring(0, len) + append;
151
    }
152

    
153
    synnefo.util.readablizeBytes = function(bytes) {
154
        var s = ['bytes', 'kb', 'MB', 'GB', 'TB', 'PB'];
155
        var e = Math.floor(Math.log(bytes)/Math.log(1024));
156
        return (bytes/Math.pow(1024, Math.floor(e))).toFixed(2)+" "+s[e];
157
    }
158
    
159
    synnefo.i18n.API_ERROR_MESSAGES = {
160
        'timeout': {
161
            'message': 'Timeout', 
162
            'allow_report': false
163
        },
164
        
165
        'error': {
166
            'message': 'API error'
167
        }, 
168

    
169
        'abort': {},
170
        'parserror': {}
171
    }
172
    
173
    synnefo.util.array_diff = function(arr1, arr2) {
174
        var removed = [];
175
        var added = [];
176

    
177
        _.each(arr1, function(v) {
178
            if (arr2.indexOf(v) == -1) {
179
                removed[removed.length] = v;
180
            }
181
        })
182

    
183

    
184
        _.each(arr2, function(v) {
185
            if (arr1.indexOf(v) == -1) {
186
                added[added.length] = v;
187
            }
188
        })
189

    
190
        return {del: removed, add: added};
191
    }
192

    
193
    synnefo.util.open_window = function(url, name, specs) {
194
        // default specs
195
        var opts = _.extend({
196
            scrollbars: 'no',
197
            menubar: 'no',
198
            toolbar: 'no',
199
            status: 'no',
200
            top: 'no',
201
            left: 'no',
202
            height: screen.height,
203
            width: screen.width,
204
            fullscreen: 'yes',
205
            channelmode: 'yes',
206
            directories: 'no',
207
            left: 0,
208
            location: 'no',
209
            top: 0
210
        }, opts)
211
        
212
        window.open(url, name, opts);
213
    }
214

    
215
    synnefo.util.stacktrace = function() {
216
        try {
217
            var obj = {};
218
            if (window.Error && Error.captureStackTrace) {
219
                Error.captureStackTrace(obj, synnefo.util.stacktrace);
220
                return obj.stack;
221
            } else {
222
                return printStackTrace().join("<br /><br />");
223
            }
224
        } catch (err) {}
225
        return "";
226
    },
227

    
228
    synnefo.util.parse_api_error = function(arguments) {
229
        arguments = arguments[0];
230

    
231
        var xhr = arguments[0];
232
        var error_message = arguments[1];
233
        var error_thrown = arguments[2];
234
        var ajax_settings = arguments.ajax;
235

    
236
        var json_data = undefined;
237
        if (xhr.responseText) {
238
            try {
239
                json_data = JSON.parse(xhr.responseText)
240
            } catch (err) {}
241
        }
242
        
243
        module = "API"
244

    
245
        try {
246
            path = synnefo.util.parseUri(ajax_settings.url).path.split("/");
247
            path.splice(0,3)
248
            module = path.join("/");
249
        } catch (err) {
250
            console.error("cannot identify api error module");
251
        }
252

    
253
        defaults = {
254
            'message': 'Api error',
255
            'type': 'API',
256
            'allow_report': true
257
        }
258

    
259
        var code = -1;
260
        try {
261
            code = xhr.status || "undefined";
262
        } catch (err) {console.error(err);}
263
        var details = "";
264

    
265
        
266
        if (json_data) {
267
            $.each(json_data, function(key, obj) {
268
                code = obj.code;
269
                details = obj.details.replace("\n","<br>");
270
                error_message = obj.message;
271
            })
272
        }
273
        
274
        extra = {'URL': ajax_settings.url};
275
        options = {};
276
        options = _.extend(options, {'details': details, 'message': error_message, 'ns': module, 'extra_details': extra});
277
        options = _.extend(options, synnefo.i18n.API_ERROR_MESSAGES[error_message] || {});
278
        options = _.extend(defaults, options);
279
        options.code = code;
280

    
281
        return options;
282
    }
283

    
284

    
285
    // Backbone extensions
286
    //
287
    // super method
288
    Backbone.Model.prototype._super = Backbone.Collection.prototype._super = Backbone.View.prototype._super = function(funcName){
289
        return this.constructor.__super__[funcName].apply(this, _.rest(arguments));
290
    }
291

    
292
    // simple string format helper 
293
    // http://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format
294
    String.prototype.format = function() {
295
        var formatted = this;
296
        for (var i = 0; i < arguments.length; i++) {
297
            var regexp = new RegExp('\\{'+i+'\\}', 'gi');
298
            formatted = formatted.replace(regexp, arguments[i]);
299
        }
300
        return formatted;
301
    };
302

    
303

    
304
    $.fn.setCursorPosition = function(pos) {
305
        if ($(this).get(0).setSelectionRange) {
306
          $(this).get(0).setSelectionRange(pos, pos);
307
        } else if ($(this).get(0).createTextRange) {
308
          var range = $(this).get(0).createTextRange();
309
          range.collapse(true);
310
          range.moveEnd('character', pos);
311
          range.moveStart('character', pos);
312
          range.select();
313
        }
314
    }
315
})(this);