Statistics
| Branch: | Tag: | Revision:

root / ui / static / snf / js / utils.js @ 60376c36

History | View | Annotate | Download (13.6 kB)

1 8d08f18a Kostas Papadimitriou
;(function(root){
2 8d08f18a Kostas Papadimitriou
    
3 8d08f18a Kostas Papadimitriou
    var root = root;
4 8d08f18a Kostas Papadimitriou
    var snf = root.synnefo = root.synnefo || {};
5 8d08f18a Kostas Papadimitriou
    
6 8d08f18a Kostas Papadimitriou
    snf.i18n = {};
7 8d08f18a Kostas Papadimitriou
8 8d08f18a Kostas Papadimitriou
    // Logging namespace
9 8d08f18a Kostas Papadimitriou
    var logging = snf.logging = snf.logging || {};
10 8d08f18a Kostas Papadimitriou
11 8d08f18a Kostas Papadimitriou
    // logger object
12 8d08f18a Kostas Papadimitriou
    var logger = logging.logger = function(ns, level){
13 8d08f18a Kostas Papadimitriou
        var levels = ["debug", "info", "error"];
14 8d08f18a Kostas Papadimitriou
        var con = window.console;
15 8d08f18a Kostas Papadimitriou
        
16 8d08f18a Kostas Papadimitriou
        this.level = level || synnefo.logging.level;
17 8d08f18a Kostas Papadimitriou
        this.ns = ns || "";
18 8d08f18a Kostas Papadimitriou
19 8d08f18a Kostas Papadimitriou
        this._log = function(lvl) {
20 8d08f18a Kostas Papadimitriou
            if (lvl >= this.level && con) {
21 8d08f18a Kostas Papadimitriou
                var args = Array.prototype.slice.call(arguments[1]);
22 8d08f18a Kostas Papadimitriou
                var level_name = levels[lvl];
23 8d08f18a Kostas Papadimitriou
                    
24 8d08f18a Kostas Papadimitriou
                if (this.ns) {
25 8d08f18a Kostas Papadimitriou
                    args = ["["+this.ns+"] "].concat(args);
26 8d08f18a Kostas Papadimitriou
                }
27 8d08f18a Kostas Papadimitriou
28 8d08f18a Kostas Papadimitriou
                log = con.log
29 8d08f18a Kostas Papadimitriou
                if (con[level_name])
30 8d08f18a Kostas Papadimitriou
                    log = con[level_name]
31 8d08f18a Kostas Papadimitriou
32 8d08f18a Kostas Papadimitriou
                try {
33 8d08f18a Kostas Papadimitriou
                    con && log.apply(con, Array.prototype.slice.call(args));
34 8d08f18a Kostas Papadimitriou
                } catch (err) {}
35 8d08f18a Kostas Papadimitriou
            }
36 8d08f18a Kostas Papadimitriou
        }
37 8d08f18a Kostas Papadimitriou
38 8d08f18a Kostas Papadimitriou
        this.debug = function() {
39 8d08f18a Kostas Papadimitriou
            var args = [0]; args.push.call(args, arguments);
40 8d08f18a Kostas Papadimitriou
            this._log.apply(this, args);
41 8d08f18a Kostas Papadimitriou
        }
42 8d08f18a Kostas Papadimitriou
43 8d08f18a Kostas Papadimitriou
        this.info = function() {
44 8d08f18a Kostas Papadimitriou
            var args = [1]; args.push.call(args, arguments);
45 8d08f18a Kostas Papadimitriou
            this._log.apply(this, args);
46 8d08f18a Kostas Papadimitriou
        }
47 8d08f18a Kostas Papadimitriou
48 8d08f18a Kostas Papadimitriou
        this.error = function() {
49 8d08f18a Kostas Papadimitriou
            var args = [2]; args.push.call(args, arguments);
50 8d08f18a Kostas Papadimitriou
            this._log.apply(this, args);
51 8d08f18a Kostas Papadimitriou
        }
52 8d08f18a Kostas Papadimitriou
53 8d08f18a Kostas Papadimitriou
    };
54 8d08f18a Kostas Papadimitriou
    
55 8d08f18a Kostas Papadimitriou
    synnefo.collect_user_data = function() {
56 8d08f18a Kostas Papadimitriou
        var data = {}
57 8d08f18a Kostas Papadimitriou
        
58 8d08f18a Kostas Papadimitriou
        try {
59 9ffd10ce Kostas Papadimitriou
            data.client = {'browser': $.browser, 'screen': $.extend({}, screen), 'client': $.client}
60 9ffd10ce Kostas Papadimitriou
        } catch (err) { data.client = err }
61 9ffd10ce Kostas Papadimitriou
        try {
62 8d08f18a Kostas Papadimitriou
            data.calls = synnefo.api.requests;
63 8d08f18a Kostas Papadimitriou
        } catch (err) { data.calls = err }
64 8d08f18a Kostas Papadimitriou
        try {
65 8d08f18a Kostas Papadimitriou
            data.errors = synnefo.api.errors;
66 8d08f18a Kostas Papadimitriou
        } catch (err) { data.errors = err }
67 8d08f18a Kostas Papadimitriou
        try {
68 8d08f18a Kostas Papadimitriou
            data.data = {};
69 8d08f18a Kostas Papadimitriou
        } catch (err) { data.data = err }
70 8d08f18a Kostas Papadimitriou
        try {
71 8d08f18a Kostas Papadimitriou
            data.data.vms = synnefo.storage.vms.toJSON();
72 8d08f18a Kostas Papadimitriou
        } catch (err) { data.data.vms = err }
73 8d08f18a Kostas Papadimitriou
        try {
74 9ffd10ce Kostas Papadimitriou
            data.data.networks = synnefo.storage.networks.toJSON();
75 8d08f18a Kostas Papadimitriou
        } catch (err) { data.data.networks = err }
76 9ffd10ce Kostas Papadimitriou
        //try {
77 9ffd10ce Kostas Papadimitriou
            //data.data.images = synnefo.storage.images.toJSON();
78 9ffd10ce Kostas Papadimitriou
        //} catch (err) { data.data.images = err }
79 9ffd10ce Kostas Papadimitriou
        //try {
80 9ffd10ce Kostas Papadimitriou
            //data.data.flavors = synnefo.storage.flavors.toJSON();
81 9ffd10ce Kostas Papadimitriou
        //} catch (err) { data.data.flavors = err }
82 8d08f18a Kostas Papadimitriou
        try {
83 8d08f18a Kostas Papadimitriou
            data.date = new Date;
84 8d08f18a Kostas Papadimitriou
        } catch (err) { data.date = err }
85 8d08f18a Kostas Papadimitriou
86 8d08f18a Kostas Papadimitriou
        return data;
87 8d08f18a Kostas Papadimitriou
    }
88 8d08f18a Kostas Papadimitriou
89 8d08f18a Kostas Papadimitriou
    // default logger level (debug)
90 8d08f18a Kostas Papadimitriou
    synnefo.logging.level = 0;
91 8d08f18a Kostas Papadimitriou
92 8d08f18a Kostas Papadimitriou
    // generic logger
93 8d08f18a Kostas Papadimitriou
    synnefo.log = new logger({'ns':'SNF'});
94 8d08f18a Kostas Papadimitriou
95 8d08f18a Kostas Papadimitriou
    // synnefo config options
96 8d08f18a Kostas Papadimitriou
    synnefo.config = synnefo.config || {};
97 8d08f18a Kostas Papadimitriou
    synnefo.config.api_url = "/api/v1.1";
98 8d08f18a Kostas Papadimitriou
    
99 8d08f18a Kostas Papadimitriou
    // Util namespace
100 8d08f18a Kostas Papadimitriou
    synnefo.util = synnefo.util || {};
101 8d08f18a Kostas Papadimitriou
102 8d08f18a Kostas Papadimitriou
    // Extensions and Utility functions
103 8d08f18a Kostas Papadimitriou
    synnefo.util.ISODateString = function(d){
104 8d08f18a Kostas Papadimitriou
        function pad(n){
105 8d08f18a Kostas Papadimitriou
            return n<10 ? '0'+n : n
106 8d08f18a Kostas Papadimitriou
        }
107 8d08f18a Kostas Papadimitriou
         return d.getUTCFullYear()+'-'
108 8d08f18a Kostas Papadimitriou
         + pad(d.getUTCMonth()+1)+'-'
109 8d08f18a Kostas Papadimitriou
         + pad(d.getUTCDate())+'T'
110 8d08f18a Kostas Papadimitriou
         + pad(d.getUTCHours())+':'
111 8d08f18a Kostas Papadimitriou
         + pad(d.getUTCMinutes())+':'
112 8d08f18a Kostas Papadimitriou
         + pad(d.getUTCSeconds())+'Z'
113 8d08f18a Kostas Papadimitriou
    }
114 8d08f18a Kostas Papadimitriou
115 8d08f18a Kostas Papadimitriou
 
116 8d08f18a Kostas Papadimitriou
    synnefo.util.parseUri = function(sourceUri) {
117 8d08f18a Kostas Papadimitriou
        var uriPartNames = ["source","protocol","authority","domain","port","path","directoryPath","fileName","query","anchor"];
118 8d08f18a Kostas Papadimitriou
        var uriParts = new RegExp("^(?:([^:/?#.]+):)?(?://)?(([^:/?#]*)(?::(\\d*))?)?((/(?:[^?#](?![^?#/]*\\.[^?#/.]+(?:[\\?#]|$)))*/?)?([^?#/]*))?(?:\\?([^#]*))?(?:#(.*))?").exec(sourceUri);
119 8d08f18a Kostas Papadimitriou
        var uri = {};
120 8d08f18a Kostas Papadimitriou
        
121 8d08f18a Kostas Papadimitriou
        for(var i = 0; i < 10; i++){
122 8d08f18a Kostas Papadimitriou
            uri[uriPartNames[i]] = (uriParts[i] ? uriParts[i] : "");
123 8d08f18a Kostas Papadimitriou
        }
124 8d08f18a Kostas Papadimitriou
    
125 8d08f18a Kostas Papadimitriou
        // Always end directoryPath with a trailing backslash if a path was present in the source URI
126 8d08f18a Kostas Papadimitriou
        // Note that a trailing backslash is NOT automatically inserted within or appended to the "path" key
127 8d08f18a Kostas Papadimitriou
        if(uri.directoryPath.length > 0){
128 8d08f18a Kostas Papadimitriou
            uri.directoryPath = uri.directoryPath.replace(/\/?$/, "/");
129 8d08f18a Kostas Papadimitriou
        }
130 8d08f18a Kostas Papadimitriou
        
131 8d08f18a Kostas Papadimitriou
        return uri;
132 8d08f18a Kostas Papadimitriou
    }
133 8d08f18a Kostas Papadimitriou
134 820ef2f0 Kostas Papadimitriou
    synnefo.util.equalHeights = function() {
135 820ef2f0 Kostas Papadimitriou
        var max_height = 0;
136 820ef2f0 Kostas Papadimitriou
        var selectors = _.toArray(arguments);
137 73e25ce2 Kostas Papadimitriou
            
138 73e25ce2 Kostas Papadimitriou
        _.each(selectors, function(s){
139 73e25ce2 Kostas Papadimitriou
            console.log($(s).height());
140 73e25ce2 Kostas Papadimitriou
        })
141 820ef2f0 Kostas Papadimitriou
        // TODO: implement me
142 820ef2f0 Kostas Papadimitriou
    }
143 820ef2f0 Kostas Papadimitriou
144 60376c36 Kostas Papadimitriou
    synnefo.util.ClipHelper = function(cont, clear) {
145 60376c36 Kostas Papadimitriou
        this.force_empty = clear || false;
146 49772990 Kostas Papadimitriou
        this.cont = cont || $('<div class="clip-copy"></div>');
147 49772990 Kostas Papadimitriou
        this.clip = new ZeroClipboard.Client();
148 49772990 Kostas Papadimitriou
        this.clip.setHandCursor(true);
149 bd8fa10c Kostas Papadimitriou
150 49772990 Kostas Papadimitriou
        this.el = this.cont;
151 60376c36 Kostas Papadimitriou
        if (this.force_empty) {
152 60376c36 Kostas Papadimitriou
            this.cont.empty();
153 60376c36 Kostas Papadimitriou
        }
154 49772990 Kostas Papadimitriou
        this.el.append(this.clip.getHTML(20,20));
155 49772990 Kostas Papadimitriou
156 49772990 Kostas Papadimitriou
        this.setText = function(t) {
157 49772990 Kostas Papadimitriou
            this.clip.setText(t);
158 49772990 Kostas Papadimitriou
        }
159 49772990 Kostas Papadimitriou
160 a9d9f677 Kostas Papadimitriou
        var copy_prompt = "Click to copy to clipboard";
161 a9d9f677 Kostas Papadimitriou
        this.el.attr({title: copy_prompt});
162 a9d9f677 Kostas Papadimitriou
        this.el.tooltip();
163 a9d9f677 Kostas Papadimitriou
        var el = this.el;
164 a9d9f677 Kostas Papadimitriou
165 49772990 Kostas Papadimitriou
        this.clip.addEventListener('complete', _.bind(function(client, text) {
166 a9d9f677 Kostas Papadimitriou
            var tip = el.data("tooltip")
167 a9d9f677 Kostas Papadimitriou
            tip.hide().getTip().text("Copied");
168 978648f4 Kostas Papadimitriou
            
169 a9d9f677 Kostas Papadimitriou
            window.setTimeout(function() {
170 a9d9f677 Kostas Papadimitriou
                tip.show();
171 a9d9f677 Kostas Papadimitriou
            }, 70)
172 978648f4 Kostas Papadimitriou
173 a9d9f677 Kostas Papadimitriou
            window.setTimeout(function() {
174 a9d9f677 Kostas Papadimitriou
                tip.hide().getTip().text(copy_prompt);
175 a9d9f677 Kostas Papadimitriou
            }, 3000)
176 49772990 Kostas Papadimitriou
        }, this));
177 49772990 Kostas Papadimitriou
    }
178 49772990 Kostas Papadimitriou
179 8d08f18a Kostas Papadimitriou
    synnefo.util.truncate = function(string, size, append, words) {
180 85b48c69 Kostas Papadimitriou
        if (string === undefined) { return "" };
181 8d08f18a Kostas Papadimitriou
        if (string.length <= size) {
182 8d08f18a Kostas Papadimitriou
            return string;
183 8d08f18a Kostas Papadimitriou
        }
184 8d08f18a Kostas Papadimitriou
185 8d08f18a Kostas Papadimitriou
        if (append === undefined) {
186 8d08f18a Kostas Papadimitriou
            append = "...";
187 8d08f18a Kostas Papadimitriou
        }
188 8d08f18a Kostas Papadimitriou
        
189 8d08f18a Kostas Papadimitriou
        if (!append) { append = "" };
190 8d08f18a Kostas Papadimitriou
        // TODO: implement word truncate
191 8d08f18a Kostas Papadimitriou
        if (words === undefined) {
192 8d08f18a Kostas Papadimitriou
            words = false;
193 8d08f18a Kostas Papadimitriou
        }
194 8d08f18a Kostas Papadimitriou
        
195 8d08f18a Kostas Papadimitriou
        len = size - append.length;
196 8d08f18a Kostas Papadimitriou
        return string.substring(0, len) + append;
197 8d08f18a Kostas Papadimitriou
    }
198 8d08f18a Kostas Papadimitriou
199 8d08f18a Kostas Papadimitriou
    synnefo.util.readablizeBytes = function(bytes) {
200 8d08f18a Kostas Papadimitriou
        var s = ['bytes', 'kb', 'MB', 'GB', 'TB', 'PB'];
201 8d08f18a Kostas Papadimitriou
        var e = Math.floor(Math.log(bytes)/Math.log(1024));
202 8d08f18a Kostas Papadimitriou
        return (bytes/Math.pow(1024, Math.floor(e))).toFixed(2)+" "+s[e];
203 8d08f18a Kostas Papadimitriou
    }
204 8d08f18a Kostas Papadimitriou
    
205 8d08f18a Kostas Papadimitriou
    synnefo.i18n.API_ERROR_MESSAGES = {
206 8d08f18a Kostas Papadimitriou
        'timeout': {
207 b15a0cc4 Kostas Papadimitriou
            'message': 'TIMEOUT', 
208 b15a0cc4 Kostas Papadimitriou
            'allow_report': false,
209 b15a0cc4 Kostas Papadimitriou
            'type': 'Network'
210 8d08f18a Kostas Papadimitriou
        },
211 8d08f18a Kostas Papadimitriou
        
212 8d08f18a Kostas Papadimitriou
        'error': {
213 8d08f18a Kostas Papadimitriou
            'message': 'API error'
214 8d08f18a Kostas Papadimitriou
        }, 
215 8d08f18a Kostas Papadimitriou
216 8d08f18a Kostas Papadimitriou
        'abort': {},
217 9ce969a7 Kostas Papadimitriou
        'parserror': {},
218 9ce969a7 Kostas Papadimitriou
        '413': {
219 9ce969a7 Kostas Papadimitriou
            'title': "Account warning"
220 9ce969a7 Kostas Papadimitriou
        }
221 8d08f18a Kostas Papadimitriou
    }
222 8d08f18a Kostas Papadimitriou
    
223 8d08f18a Kostas Papadimitriou
    synnefo.util.array_diff = function(arr1, arr2) {
224 8d08f18a Kostas Papadimitriou
        var removed = [];
225 8d08f18a Kostas Papadimitriou
        var added = [];
226 8d08f18a Kostas Papadimitriou
227 8d08f18a Kostas Papadimitriou
        _.each(arr1, function(v) {
228 8d08f18a Kostas Papadimitriou
            if (arr2.indexOf(v) == -1) {
229 8d08f18a Kostas Papadimitriou
                removed[removed.length] = v;
230 8d08f18a Kostas Papadimitriou
            }
231 8d08f18a Kostas Papadimitriou
        })
232 8d08f18a Kostas Papadimitriou
233 8d08f18a Kostas Papadimitriou
234 8d08f18a Kostas Papadimitriou
        _.each(arr2, function(v) {
235 8d08f18a Kostas Papadimitriou
            if (arr1.indexOf(v) == -1) {
236 8d08f18a Kostas Papadimitriou
                added[added.length] = v;
237 8d08f18a Kostas Papadimitriou
            }
238 8d08f18a Kostas Papadimitriou
        })
239 8d08f18a Kostas Papadimitriou
240 8d08f18a Kostas Papadimitriou
        return {del: removed, add: added};
241 8d08f18a Kostas Papadimitriou
    }
242 8d08f18a Kostas Papadimitriou
243 8d08f18a Kostas Papadimitriou
    synnefo.util.open_window = function(url, name, specs) {
244 8d08f18a Kostas Papadimitriou
        // default specs
245 8d08f18a Kostas Papadimitriou
        var opts = _.extend({
246 8d08f18a Kostas Papadimitriou
            scrollbars: 'no',
247 8d08f18a Kostas Papadimitriou
            menubar: 'no',
248 8d08f18a Kostas Papadimitriou
            toolbar: 'no',
249 8d08f18a Kostas Papadimitriou
            status: 'no',
250 8d08f18a Kostas Papadimitriou
            top: 'no',
251 8d08f18a Kostas Papadimitriou
            left: 'no',
252 8d08f18a Kostas Papadimitriou
            height: screen.height,
253 8d08f18a Kostas Papadimitriou
            width: screen.width,
254 8d08f18a Kostas Papadimitriou
            fullscreen: 'yes',
255 8d08f18a Kostas Papadimitriou
            channelmode: 'yes',
256 8d08f18a Kostas Papadimitriou
            directories: 'no',
257 8d08f18a Kostas Papadimitriou
            left: 0,
258 8d08f18a Kostas Papadimitriou
            location: 'no',
259 8d08f18a Kostas Papadimitriou
            top: 0
260 8d08f18a Kostas Papadimitriou
        }, opts)
261 8d08f18a Kostas Papadimitriou
        
262 8d08f18a Kostas Papadimitriou
        window.open(url, name, opts);
263 8d08f18a Kostas Papadimitriou
    }
264 8d08f18a Kostas Papadimitriou
265 8d08f18a Kostas Papadimitriou
    synnefo.util.stacktrace = function() {
266 8d08f18a Kostas Papadimitriou
        try {
267 8d08f18a Kostas Papadimitriou
            var obj = {};
268 8d08f18a Kostas Papadimitriou
            if (window.Error && Error.captureStackTrace) {
269 8d08f18a Kostas Papadimitriou
                Error.captureStackTrace(obj, synnefo.util.stacktrace);
270 8d08f18a Kostas Papadimitriou
                return obj.stack;
271 8d08f18a Kostas Papadimitriou
            } else {
272 8d08f18a Kostas Papadimitriou
                return printStackTrace().join("<br /><br />");
273 8d08f18a Kostas Papadimitriou
            }
274 8d08f18a Kostas Papadimitriou
        } catch (err) {}
275 8d08f18a Kostas Papadimitriou
        return "";
276 8d08f18a Kostas Papadimitriou
    },
277 820ef2f0 Kostas Papadimitriou
    
278 820ef2f0 Kostas Papadimitriou
    synnefo.util.array_combinations = function(arr) {
279 820ef2f0 Kostas Papadimitriou
        if (arr.length == 1) {
280 820ef2f0 Kostas Papadimitriou
            return arr[0];
281 820ef2f0 Kostas Papadimitriou
        } else {
282 820ef2f0 Kostas Papadimitriou
            var result = [];
283 820ef2f0 Kostas Papadimitriou
284 820ef2f0 Kostas Papadimitriou
            // recur with the rest of array
285 820ef2f0 Kostas Papadimitriou
            var allCasesOfRest = synnefo.util.array_combinations(arr.slice(1));  
286 820ef2f0 Kostas Papadimitriou
            for (var i = 0; i < allCasesOfRest.length; i++) {
287 820ef2f0 Kostas Papadimitriou
                for (var j = 0; j < arr[0].length; j++) {
288 820ef2f0 Kostas Papadimitriou
                    result.push(arr[0][j] + "-" + allCasesOfRest[i]);
289 820ef2f0 Kostas Papadimitriou
                }
290 820ef2f0 Kostas Papadimitriou
            }
291 820ef2f0 Kostas Papadimitriou
            return result;
292 820ef2f0 Kostas Papadimitriou
        }
293 820ef2f0 Kostas Papadimitriou
    }
294 8d08f18a Kostas Papadimitriou
295 9ce969a7 Kostas Papadimitriou
    synnefo.util.parse_api_error = function() {
296 9ce969a7 Kostas Papadimitriou
        if (arguments.length == 1) { arguments = arguments[0] };
297 8d08f18a Kostas Papadimitriou
298 8d08f18a Kostas Papadimitriou
        var xhr = arguments[0];
299 8d08f18a Kostas Papadimitriou
        var error_message = arguments[1];
300 8d08f18a Kostas Papadimitriou
        var error_thrown = arguments[2];
301 9ce969a7 Kostas Papadimitriou
        var ajax_settings = _.last(arguments) || {};
302 9ce969a7 Kostas Papadimitriou
        var call_settings = ajax_settings.error_params || {};
303 8d08f18a Kostas Papadimitriou
        var json_data = undefined;
304 9ce969a7 Kostas Papadimitriou
305 9ce969a7 Kostas Papadimitriou
        var critical = ajax_settings.critical === undefined ? true : ajax_settings.critical;
306 9ce969a7 Kostas Papadimitriou
307 8d08f18a Kostas Papadimitriou
        if (xhr.responseText) {
308 8d08f18a Kostas Papadimitriou
            try {
309 8d08f18a Kostas Papadimitriou
                json_data = JSON.parse(xhr.responseText)
310 8d08f18a Kostas Papadimitriou
            } catch (err) {}
311 8d08f18a Kostas Papadimitriou
        }
312 8d08f18a Kostas Papadimitriou
        
313 8d08f18a Kostas Papadimitriou
        module = "API"
314 8d08f18a Kostas Papadimitriou
315 8d08f18a Kostas Papadimitriou
        try {
316 8d08f18a Kostas Papadimitriou
            path = synnefo.util.parseUri(ajax_settings.url).path.split("/");
317 8d08f18a Kostas Papadimitriou
            path.splice(0,3)
318 8d08f18a Kostas Papadimitriou
            module = path.join("/");
319 8d08f18a Kostas Papadimitriou
        } catch (err) {
320 8d08f18a Kostas Papadimitriou
            console.error("cannot identify api error module");
321 8d08f18a Kostas Papadimitriou
        }
322 6a3a5bf7 Kostas Papadimitriou
        
323 8d08f18a Kostas Papadimitriou
        defaults = {
324 8d08f18a Kostas Papadimitriou
            'message': 'Api error',
325 8d08f18a Kostas Papadimitriou
            'type': 'API',
326 6a3a5bf7 Kostas Papadimitriou
            'allow_report': true,
327 9ce969a7 Kostas Papadimitriou
            'fatal_error': ajax_settings.critical || false,
328 9ce969a7 Kostas Papadimitriou
            'non_critical': !critical
329 8d08f18a Kostas Papadimitriou
        }
330 8d08f18a Kostas Papadimitriou
331 8d08f18a Kostas Papadimitriou
        var code = -1;
332 8d08f18a Kostas Papadimitriou
        try {
333 8d08f18a Kostas Papadimitriou
            code = xhr.status || "undefined";
334 8d08f18a Kostas Papadimitriou
        } catch (err) {console.error(err);}
335 8d08f18a Kostas Papadimitriou
        var details = "";
336 7f34b497 Kostas Papadimitriou
        
337 7f34b497 Kostas Papadimitriou
        if ([413].indexOf(code) > -1) {
338 7f34b497 Kostas Papadimitriou
            defaults.non_critical = true;
339 7f34b497 Kostas Papadimitriou
            defaults.allow_report = false;
340 7f34b497 Kostas Papadimitriou
            defaults.allow_reload = false;
341 9ce969a7 Kostas Papadimitriou
            error_message = "limit_error";
342 9ce969a7 Kostas Papadimitriou
        }
343 9ce969a7 Kostas Papadimitriou
344 9ce969a7 Kostas Papadimitriou
        if (critical) {
345 9ce969a7 Kostas Papadimitriou
            defaults.allow_report = true;
346 7f34b497 Kostas Papadimitriou
        }
347 8d08f18a Kostas Papadimitriou
        
348 8d08f18a Kostas Papadimitriou
        if (json_data) {
349 8d08f18a Kostas Papadimitriou
            $.each(json_data, function(key, obj) {
350 8d08f18a Kostas Papadimitriou
                code = obj.code;
351 8d08f18a Kostas Papadimitriou
                details = obj.details.replace("\n","<br>");
352 8d08f18a Kostas Papadimitriou
                error_message = obj.message;
353 8d08f18a Kostas Papadimitriou
            })
354 8d08f18a Kostas Papadimitriou
        }
355 9ce969a7 Kostas Papadimitriou
356 8d08f18a Kostas Papadimitriou
        extra = {'URL': ajax_settings.url};
357 8d08f18a Kostas Papadimitriou
        options = {};
358 8d08f18a Kostas Papadimitriou
        options = _.extend(options, {'details': details, 'message': error_message, 'ns': module, 'extra_details': extra});
359 edd1d565 Kostas Papadimitriou
        options = _.extend(options, call_settings);
360 8d08f18a Kostas Papadimitriou
        options = _.extend(options, synnefo.i18n.API_ERROR_MESSAGES[error_message] || {});
361 9ce969a7 Kostas Papadimitriou
        options = _.extend(options, synnefo.i18n.API_ERROR_MESSAGES[code] || {});
362 b15a0cc4 Kostas Papadimitriou
        
363 b15a0cc4 Kostas Papadimitriou
        if (window.ERROR_OVERRIDES && window.ERROR_OVERRIDES[options.message]) {
364 b15a0cc4 Kostas Papadimitriou
            options.message = window.ERROR_OVERRIDES[options.message];
365 b15a0cc4 Kostas Papadimitriou
        }
366 73cb2274 Kostas Papadimitriou
        
367 73cb2274 Kostas Papadimitriou
        if (code && window.ERROR_OVERRIDES && window.ERROR_OVERRIDES[code]) {
368 b15a0cc4 Kostas Papadimitriou
            options.message = window.ERROR_OVERRIDES[code];
369 b15a0cc4 Kostas Papadimitriou
        }
370 b15a0cc4 Kostas Papadimitriou
371 8d08f18a Kostas Papadimitriou
        options = _.extend(defaults, options);
372 8d08f18a Kostas Papadimitriou
        options.code = code;
373 8d08f18a Kostas Papadimitriou
374 8d08f18a Kostas Papadimitriou
        return options;
375 8d08f18a Kostas Papadimitriou
    }
376 8d08f18a Kostas Papadimitriou
377 8d08f18a Kostas Papadimitriou
378 8d08f18a Kostas Papadimitriou
    // Backbone extensions
379 8d08f18a Kostas Papadimitriou
    //
380 8d08f18a Kostas Papadimitriou
    // super method
381 8d08f18a Kostas Papadimitriou
    Backbone.Model.prototype._super = Backbone.Collection.prototype._super = Backbone.View.prototype._super = function(funcName){
382 8d08f18a Kostas Papadimitriou
        return this.constructor.__super__[funcName].apply(this, _.rest(arguments));
383 8d08f18a Kostas Papadimitriou
    }
384 8d08f18a Kostas Papadimitriou
385 8d08f18a Kostas Papadimitriou
    // simple string format helper 
386 8d08f18a Kostas Papadimitriou
    // http://stackoverflow.com/questions/610406/javascript-equivalent-to-printf-string-format
387 8d08f18a Kostas Papadimitriou
    String.prototype.format = function() {
388 8d08f18a Kostas Papadimitriou
        var formatted = this;
389 8d08f18a Kostas Papadimitriou
        for (var i = 0; i < arguments.length; i++) {
390 8d08f18a Kostas Papadimitriou
            var regexp = new RegExp('\\{'+i+'\\}', 'gi');
391 8d08f18a Kostas Papadimitriou
            formatted = formatted.replace(regexp, arguments[i]);
392 8d08f18a Kostas Papadimitriou
        }
393 8d08f18a Kostas Papadimitriou
        return formatted;
394 8d08f18a Kostas Papadimitriou
    };
395 8d08f18a Kostas Papadimitriou
396 8d08f18a Kostas Papadimitriou
397 8d08f18a Kostas Papadimitriou
    $.fn.setCursorPosition = function(pos) {
398 8d08f18a Kostas Papadimitriou
        if ($(this).get(0).setSelectionRange) {
399 8d08f18a Kostas Papadimitriou
          $(this).get(0).setSelectionRange(pos, pos);
400 8d08f18a Kostas Papadimitriou
        } else if ($(this).get(0).createTextRange) {
401 8d08f18a Kostas Papadimitriou
          var range = $(this).get(0).createTextRange();
402 8d08f18a Kostas Papadimitriou
          range.collapse(true);
403 8d08f18a Kostas Papadimitriou
          range.moveEnd('character', pos);
404 8d08f18a Kostas Papadimitriou
          range.moveStart('character', pos);
405 8d08f18a Kostas Papadimitriou
          range.select();
406 8d08f18a Kostas Papadimitriou
        }
407 8d08f18a Kostas Papadimitriou
    }
408 73cb2274 Kostas Papadimitriou
409 73cb2274 Kostas Papadimitriou
    // trim prototype for IE
410 73cb2274 Kostas Papadimitriou
    if(typeof String.prototype.trim !== 'function') {
411 73cb2274 Kostas Papadimitriou
        String.prototype.trim = function() {
412 73cb2274 Kostas Papadimitriou
            return this.replace(/^\s+|\s+$/g, '');
413 73cb2274 Kostas Papadimitriou
        }
414 73cb2274 Kostas Papadimitriou
    }
415 73cb2274 Kostas Papadimitriou
416 73cb2274 Kostas Papadimitriou
    // http://stackoverflow.com/questions/499126/jquery-set-cursor-position-in-text-area 
417 73cb2274 Kostas Papadimitriou
    $.fn.setCursorPosition = function(pos) {
418 675df0d2 Kostas Papadimitriou
        // not all browsers support setSelectionRange
419 675df0d2 Kostas Papadimitriou
        // put it in try/catch, fallback to no text selection
420 675df0d2 Kostas Papadimitriou
        try {
421 675df0d2 Kostas Papadimitriou
            if ($(this).get(0).setSelectionRange) {
422 675df0d2 Kostas Papadimitriou
              $(this).get(0).setSelectionRange(pos, pos);
423 675df0d2 Kostas Papadimitriou
            } else if ($(this).get(0).createTextRange) {
424 675df0d2 Kostas Papadimitriou
              var range = $(this).get(0).createTextRange();
425 675df0d2 Kostas Papadimitriou
              range.collapse(true);
426 675df0d2 Kostas Papadimitriou
              range.moveEnd('character', pos);
427 675df0d2 Kostas Papadimitriou
              range.moveStart('character', pos);
428 675df0d2 Kostas Papadimitriou
              range.select();
429 675df0d2 Kostas Papadimitriou
            }
430 675df0d2 Kostas Papadimitriou
        } catch (err) {
431 73cb2274 Kostas Papadimitriou
        }
432 73cb2274 Kostas Papadimitriou
    }
433 73cb2274 Kostas Papadimitriou
434 73cb2274 Kostas Papadimitriou
    // indexOf prototype for IE
435 73cb2274 Kostas Papadimitriou
    if (!Array.prototype.indexOf) {
436 73cb2274 Kostas Papadimitriou
      Array.prototype.indexOf = function(elt /*, from*/) {
437 73cb2274 Kostas Papadimitriou
        var len = this.length;
438 73cb2274 Kostas Papadimitriou
        var from = Number(arguments[1]) || 0;
439 73cb2274 Kostas Papadimitriou
        from = (from < 0)
440 73cb2274 Kostas Papadimitriou
             ? Math.ceil(from)
441 73cb2274 Kostas Papadimitriou
             : Math.floor(from);
442 73cb2274 Kostas Papadimitriou
        if (from < 0)
443 73cb2274 Kostas Papadimitriou
          from += len;
444 73cb2274 Kostas Papadimitriou
445 73cb2274 Kostas Papadimitriou
        for (; from < len; from++) {
446 73cb2274 Kostas Papadimitriou
          if (from in this &&
447 73cb2274 Kostas Papadimitriou
              this[from] === elt)
448 73cb2274 Kostas Papadimitriou
            return from;
449 73cb2274 Kostas Papadimitriou
        }
450 73cb2274 Kostas Papadimitriou
        return -1;
451 73cb2274 Kostas Papadimitriou
      };
452 73cb2274 Kostas Papadimitriou
    }
453 73cb2274 Kostas Papadimitriou
454 8d08f18a Kostas Papadimitriou
})(this);