CLIENT GUI Framework
[vnfsdk/refrepo.git] / portal-common / src / main / webapp / common / js / core / hk.min.js
1 /*\r
2  * Copyright 2016-2017, CMCC Technologies Co., Ltd.\r
3  *\r
4  * Licensed under the Apache License, Version 2.0 (the "License");\r
5  * you may not use this file except in compliance with the License.\r
6  * You may obtain a copy of the License at\r
7  *\r
8  *         http://www.apache.org/licenses/LICENSE-2.0\r
9  *\r
10  * Unless required by applicable law or agreed to in writing, software\r
11  * distributed under the License is distributed on an "AS IS" BASIS,\r
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13  * See the License for the specific language governing permissions and\r
14  * limitations under the License.\r
15  */\r
16 ;(function(window, define) {\r
17     var _ = {\r
18         version: "2.3.0",\r
19         areas: {},\r
20         apis: {},\r
21 \r
22         // utilities\r
23         inherit: function(api, o) {\r
24             for (var p in api) {\r
25                 if (!o.hasOwnProperty(p)) {\r
26                     o[p] = api[p];\r
27                 }\r
28             }\r
29             return o;\r
30         },\r
31         stringify: function(d) {\r
32             return d === undefined || typeof d === "function" ? d+'' : JSON.stringify(d);\r
33         },\r
34         parse: function(s) {\r
35             // if it doesn't parse, return as is\r
36             try{ return JSON.parse(s); }catch(e){ return s; }\r
37         },\r
38 \r
39         // extension hooks\r
40         fn: function(name, fn) {\r
41             _.storeAPI[name] = fn;\r
42             for (var api in _.apis) {\r
43                 _.apis[api][name] = fn;\r
44             }\r
45         },\r
46         get: function(area, key){ return area.getItem(key); },\r
47         set: function(area, key, string){ area.setItem(key, string); },\r
48         remove: function(area, key){ area.removeItem(key); },\r
49         key: function(area, i){ return area.key(i); },\r
50         length: function(area){ return area.length; },\r
51         clear: function(area){ area.clear(); },\r
52 \r
53         // core functions\r
54         Store: function(id, area, namespace) {\r
55             var store = _.inherit(_.storeAPI, function(key, data, overwrite) {\r
56                 if (arguments.length === 0){ return store.getAll(); }\r
57                 if (data !== undefined){ return store.set(key, data, overwrite); }\r
58                 if (typeof key === "string"){ return store.get(key); }\r
59                 if (!key){ return store.clear(); }\r
60                 return store.setAll(key, data);// overwrite=data, data=key\r
61             });\r
62             store._id = id;\r
63             try {\r
64                 var testKey = '_safariPrivate_';\r
65                 area.setItem(testKey, 'sucks');\r
66                 store._area = area;\r
67                 area.removeItem(testKey);\r
68             } catch (e) {}\r
69             if (!store._area) {\r
70                 store._area = _.inherit(_.storageAPI, { items: {}, name: 'fake' });\r
71             }\r
72             store._ns = namespace || '';\r
73             if (!_.areas[id]) {\r
74                 _.areas[id] = store._area;\r
75             }\r
76             if (!_.apis[store._ns+store._id]) {\r
77                 _.apis[store._ns+store._id] = store;\r
78             }\r
79             return store;\r
80         },\r
81         storeAPI: {\r
82             // admin functions\r
83             area: function(id, area) {\r
84                 var store = this[id];\r
85                 if (!store || !store.area) {\r
86                     store = _.Store(id, area, this._ns);//new area-specific api in this namespace\r
87                     if (!this[id]){ this[id] = store; }\r
88                 }\r
89                 return store;\r
90             },\r
91             namespace: function(namespace, noSession) {\r
92                 if (!namespace){\r
93                     return this._ns ? this._ns.substring(0,this._ns.length-1) : '';\r
94                 }\r
95                 var ns = namespace, store = this[ns];\r
96                 if (!store || !store.namespace) {\r
97                     store = _.Store(this._id, this._area, this._ns+ns+'.');//new namespaced api\r
98                     if (!this[ns]){ this[ns] = store; }\r
99                     if (!noSession){ store.area('session', _.areas.session); }\r
100                 }\r
101                 return store;\r
102             },\r
103             isFake: function(){ return this._area.name === 'fake'; },\r
104             toString: function() {\r
105                 return 'store'+(this._ns?'.'+this.namespace():'')+'['+this._id+']';\r
106             },\r
107 \r
108             // storage functions\r
109             has: function(key) {\r
110                 if (this._area.has) {\r
111                     return this._area.has(this._in(key));//extension hook\r
112                 }\r
113                 return !!(this._in(key) in this._area);\r
114             },\r
115             size: function(){ return this.keys().length; },\r
116             each: function(fn, and) {\r
117                 for (var i=0, m=_.length(this._area); i<m; i++) {\r
118                     var key = this._out(_.key(this._area, i));\r
119                     if (key !== undefined) {\r
120                         if (fn.call(this, key, and || this.get(key)) === false) {\r
121                             break;\r
122                         }\r
123                     }\r
124                     if (m > _.length(this._area)) { m--; i--; }// in case of removeItem\r
125                 }\r
126                 return and || this;\r
127             },\r
128             keys: function() {\r
129                 return this.each(function(k, list){ list.push(k); }, []);\r
130             },\r
131             get: function(key, alt) {\r
132                 var s = _.get(this._area, this._in(key));\r
133                 return s !== null ? _.parse(s) : alt || s;// support alt for easy default mgmt\r
134             },\r
135             getAll: function() {\r
136                 return this.each(function(k, all){ all[k] = this.get(k); }, {});\r
137             },\r
138             set: function(key, data, overwrite) {\r
139                 var d = this.get(key);\r
140                 if (d != null && overwrite === false) {\r
141                     return data;\r
142                 }\r
143                 return _.set(this._area, this._in(key), _.stringify(data), overwrite) || d;\r
144             },\r
145             setAll: function(data, overwrite) {\r
146                 var changed, val;\r
147                 for (var key in data) {\r
148                     val = data[key];\r
149                     if (this.set(key, val, overwrite) !== val) {\r
150                         changed = true;\r
151                     }\r
152                 }\r
153                 return changed;\r
154             },\r
155             remove: function(key) {\r
156                 var d = this.get(key);\r
157                 _.remove(this._area, this._in(key));\r
158                 return d;\r
159             },\r
160             clear: function() {\r
161                 if (!this._ns) {\r
162                     _.clear(this._area);\r
163                 } else {\r
164                     this.each(function(k){ _.remove(this._area, this._in(k)); }, 1);\r
165                 }\r
166                 return this;\r
167             },\r
168             clearAll: function() {\r
169                 var area = this._area;\r
170                 for (var id in _.areas) {\r
171                     if (_.areas.hasOwnProperty(id)) {\r
172                         this._area = _.areas[id];\r
173                         this.clear();\r
174                     }\r
175                 }\r
176                 this._area = area;\r
177                 return this;\r
178             },\r
179 \r
180             // internal use functions\r
181             _in: function(k) {\r
182                 if (typeof k !== "string"){ k = _.stringify(k); }\r
183                 return this._ns ? this._ns + k : k;\r
184             },\r
185             _out: function(k) {\r
186                 return this._ns ?\r
187                     k && k.indexOf(this._ns) === 0 ?\r
188                         k.substring(this._ns.length) :\r
189                         undefined : // so each() knows to skip it\r
190                     k;\r
191             }\r
192         },// end _.storeAPI\r
193         storageAPI: {\r
194             length: 0,\r
195             has: function(k){ return this.items.hasOwnProperty(k); },\r
196             key: function(i) {\r
197                 var c = 0;\r
198                 for (var k in this.items){\r
199                     if (this.has(k) && i === c++) {\r
200                         return k;\r
201                     }\r
202                 }\r
203             },\r
204             setItem: function(k, v) {\r
205                 if (!this.has(k)) {\r
206                     this.length++;\r
207                 }\r
208                 this.items[k] = v;\r
209             },\r
210             removeItem: function(k) {\r
211                 if (this.has(k)) {\r
212                     delete this.items[k];\r
213                     this.length--;\r
214                 }\r
215             },\r
216             getItem: function(k){ return this.has(k) ? this.items[k] : null; },\r
217             clear: function(){ for (var k in this.list){ this.removeItem(k); } },\r
218             toString: function(){ return this.length+' items in '+this.name+'Storage'; }\r
219         }// end _.storageAPI\r
220     };\r
221 \r
222     // setup the primary store fn\r
223     if (window.store){ _.conflict = window.store; }\r
224     var store =\r
225         // safely set this up (throws error in IE10/32bit mode for local files)\r
226         _.Store("local", (function(){try{ return localStorage; }catch(e){}})());\r
227     store.local = store;// for completeness\r
228     store._ = _;// for extenders and debuggers...\r
229     // safely setup store.session (throws exception in FF for file:/// urls)\r
230     store.area("session", (function(){try{ return sessionStorage; }catch(e){}})());\r
231 \r
232     //Expose store to the global object\r
233     window.store = store;\r
234 \r
235     if (typeof define === 'function' && define.amd !== undefined) {\r
236         define(function () {\r
237             return store;\r
238         });\r
239     } else if (typeof module !== 'undefined' && module.exports) {\r
240         module.exports = store;\r
241     }\r
242 \r
243 })(this, null);\r
244 \r
245 // XHook - v1.3.3 - https://github.com/jpillora/xhook\r
246 // Jaime Pillora <dev@jpillora.com> - MIT Copyright 2015\r
247 (function(window,undefined) {\r
248 var AFTER, BEFORE, COMMON_EVENTS, EventEmitter, FIRE, FormData, NativeFormData, NativeXMLHttp, OFF, ON, READY_STATE, UPLOAD_EVENTS, XHookFormData, XHookHttpRequest, XMLHTTP, convertHeaders, depricatedProp, document, fakeEvent, mergeObjects, msie, proxyEvents, slice, xhook, _base,\r
249   __indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };\r
250 \r
251 document = window.document;\r
252 \r
253 BEFORE = 'before';\r
254 \r
255 AFTER = 'after';\r
256 \r
257 READY_STATE = 'readyState';\r
258 \r
259 ON = 'addEventListener';\r
260 \r
261 OFF = 'removeEventListener';\r
262 \r
263 FIRE = 'dispatchEvent';\r
264 \r
265 XMLHTTP = 'XMLHttpRequest';\r
266 \r
267 FormData = 'FormData';\r
268 \r
269 UPLOAD_EVENTS = ['load', 'loadend', 'loadstart'];\r
270 \r
271 COMMON_EVENTS = ['progress', 'abort', 'error', 'timeout'];\r
272 \r
273 msie = parseInt((/msie (\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);\r
274 \r
275 if (isNaN(msie)) {\r
276   msie = parseInt((/trident\/.*; rv:(\d+)/.exec(navigator.userAgent.toLowerCase()) || [])[1]);\r
277 }\r
278 \r
279 (_base = Array.prototype).indexOf || (_base.indexOf = function(item) {\r
280   var i, x, _i, _len;\r
281   for (i = _i = 0, _len = this.length; _i < _len; i = ++_i) {\r
282     x = this[i];\r
283     if (x === item) {\r
284       return i;\r
285     }\r
286   }\r
287   return -1;\r
288 });\r
289 \r
290 slice = function(o, n) {\r
291   return Array.prototype.slice.call(o, n);\r
292 };\r
293 \r
294 depricatedProp = function(p) {\r
295   return p === "returnValue" || p === "totalSize" || p === "position";\r
296 };\r
297 \r
298 mergeObjects = function(src, dst) {\r
299   var k, v;\r
300   for (k in src) {\r
301     v = src[k];\r
302     if (depricatedProp(k)) {\r
303       continue;\r
304     }\r
305     try {\r
306       dst[k] = src[k];\r
307     } catch (_error) {}\r
308   }\r
309   return dst;\r
310 };\r
311 \r
312 proxyEvents = function(events, src, dst) {\r
313   var event, p, _i, _len;\r
314   p = function(event) {\r
315     return function(e) {\r
316       var clone, k, val;\r
317       clone = {};\r
318       for (k in e) {\r
319         if (depricatedProp(k)) {\r
320           continue;\r
321         }\r
322         val = e[k];\r
323         clone[k] = val === src ? dst : val;\r
324       }\r
325       return dst[FIRE](event, clone);\r
326     };\r
327   };\r
328   for (_i = 0, _len = events.length; _i < _len; _i++) {\r
329     event = events[_i];\r
330     if (dst._has(event)) {\r
331       src["on" + event] = p(event);\r
332     }\r
333   }\r
334 };\r
335 \r
336 fakeEvent = function(type) {\r
337   var msieEventObject;\r
338   if (document.createEventObject != null) {\r
339     msieEventObject = document.createEventObject();\r
340     msieEventObject.type = type;\r
341     return msieEventObject;\r
342   } else {\r
343     try {\r
344       return new Event(type);\r
345     } catch (_error) {\r
346       return {\r
347         type: type\r
348       };\r
349     }\r
350   }\r
351 };\r
352 \r
353 EventEmitter = function(nodeStyle) {\r
354   var emitter, events, listeners;\r
355   events = {};\r
356   listeners = function(event) {\r
357     return events[event] || [];\r
358   };\r
359   emitter = {};\r
360   emitter[ON] = function(event, callback, i) {\r
361     events[event] = listeners(event);\r
362     if (events[event].indexOf(callback) >= 0) {\r
363       return;\r
364     }\r
365     i = i === undefined ? events[event].length : i;\r
366     events[event].splice(i, 0, callback);\r
367   };\r
368   emitter[OFF] = function(event, callback) {\r
369     var i;\r
370     if (event === undefined) {\r
371       events = {};\r
372       return;\r
373     }\r
374     if (callback === undefined) {\r
375       events[event] = [];\r
376     }\r
377     i = listeners(event).indexOf(callback);\r
378     if (i === -1) {\r
379       return;\r
380     }\r
381     listeners(event).splice(i, 1);\r
382   };\r
383   emitter[FIRE] = function() {\r
384     var args, event, i, legacylistener, listener, _i, _len, _ref;\r
385     args = slice(arguments);\r
386     event = args.shift();\r
387     if (!nodeStyle) {\r
388       args[0] = mergeObjects(args[0], fakeEvent(event));\r
389     }\r
390     legacylistener = emitter["on" + event];\r
391     if (legacylistener) {\r
392       legacylistener.apply(undefined, args);\r
393     }\r
394     _ref = listeners(event).concat(listeners("*"));\r
395     for (i = _i = 0, _len = _ref.length; _i < _len; i = ++_i) {\r
396       listener = _ref[i];\r
397       listener.apply(undefined, args);\r
398     }\r
399   };\r
400   emitter._has = function(event) {\r
401     return !!(events[event] || emitter["on" + event]);\r
402   };\r
403   if (nodeStyle) {\r
404     emitter.listeners = function(event) {\r
405       return slice(listeners(event));\r
406     };\r
407     emitter.on = emitter[ON];\r
408     emitter.off = emitter[OFF];\r
409     emitter.fire = emitter[FIRE];\r
410     emitter.once = function(e, fn) {\r
411       var fire;\r
412       fire = function() {\r
413         emitter.off(e, fire);\r
414         return fn.apply(null, arguments);\r
415       };\r
416       return emitter.on(e, fire);\r
417     };\r
418     emitter.destroy = function() {\r
419       return events = {};\r
420     };\r
421   }\r
422   return emitter;\r
423 };\r
424 \r
425 xhook = EventEmitter(true);\r
426 \r
427 xhook.EventEmitter = EventEmitter;\r
428 \r
429 xhook[BEFORE] = function(handler, i) {\r
430   if (handler.length < 1 || handler.length > 2) {\r
431     throw "invalid hook";\r
432   }\r
433   return xhook[ON](BEFORE, handler, i);\r
434 };\r
435 \r
436 xhook[AFTER] = function(handler, i) {\r
437   if (handler.length < 2 || handler.length > 3) {\r
438     throw "invalid hook";\r
439   }\r
440   return xhook[ON](AFTER, handler, i);\r
441 };\r
442 \r
443 xhook.enable = function() {\r
444   window[XMLHTTP] = XHookHttpRequest;\r
445   if (NativeFormData) {\r
446     window[FormData] = XHookFormData;\r
447   }\r
448 };\r
449 \r
450 xhook.disable = function() {\r
451   window[XMLHTTP] = xhook[XMLHTTP];\r
452   window[FormData] = NativeFormData;\r
453 };\r
454 \r
455 convertHeaders = xhook.headers = function(h, dest) {\r
456   var header, headers, k, name, v, value, _i, _len, _ref;\r
457   if (dest == null) {\r
458     dest = {};\r
459   }\r
460   switch (typeof h) {\r
461     case "object":\r
462       headers = [];\r
463       for (k in h) {\r
464         v = h[k];\r
465         name = k.toLowerCase();\r
466         headers.push("" + name + ":\t" + v);\r
467       }\r
468       return headers.join('\n');\r
469     case "string":\r
470       headers = h.split('\n');\r
471       for (_i = 0, _len = headers.length; _i < _len; _i++) {\r
472         header = headers[_i];\r
473         if (/([^:]+):\s*(.+)/.test(header)) {\r
474           name = (_ref = RegExp.$1) != null ? _ref.toLowerCase() : void 0;\r
475           value = RegExp.$2;\r
476           if (dest[name] == null) {\r
477             dest[name] = value;\r
478           }\r
479         }\r
480       }\r
481       return dest;\r
482   }\r
483 };\r
484 \r
485 NativeFormData = window[FormData];\r
486 \r
487 XHookFormData = function(form) {\r
488   var entries;\r
489   this.fd = form ? new NativeFormData(form) : new NativeFormData();\r
490   this.form = form;\r
491   entries = [];\r
492   Object.defineProperty(this, 'entries', {\r
493     get: function() {\r
494       var fentries;\r
495       fentries = !form ? [] : slice(form.querySelectorAll("input,select")).filter(function(e) {\r
496         var _ref;\r
497         return ((_ref = e.type) !== 'checkbox' && _ref !== 'radio') || e.checked;\r
498       }).map(function(e) {\r
499         return [e.name, e.type === "file" ? e.files : e.value];\r
500       });\r
501       return fentries.concat(entries);\r
502     }\r
503   });\r
504   this.append = (function(_this) {\r
505     return function() {\r
506       var args;\r
507       args = slice(arguments);\r
508       entries.push(args);\r
509       return _this.fd.append.apply(_this.fd, args);\r
510     };\r
511   })(this);\r
512 };\r
513 \r
514 if (NativeFormData) {\r
515   xhook[FormData] = NativeFormData;\r
516   window[FormData] = XHookFormData;\r
517 }\r
518 \r
519 NativeXMLHttp = window[XMLHTTP];\r
520 \r
521 xhook[XMLHTTP] = NativeXMLHttp;\r
522 \r
523 XHookHttpRequest = window[XMLHTTP] = function() {\r
524   var ABORTED, currentState, emitFinal, emitReadyState, facade, hasError, hasErrorHandler, readBody, readHead, request, response, setReadyState, status, transiting, writeBody, writeHead, xhr;\r
525   ABORTED = -1;\r
526   xhr = new xhook[XMLHTTP]();\r
527   request = {};\r
528   status = null;\r
529   hasError = void 0;\r
530   transiting = void 0;\r
531   response = void 0;\r
532   readHead = function() {\r
533     var key, name, val, _ref;\r
534     response.status = status || xhr.status;\r
535     if (!(status === ABORTED && msie < 10)) {\r
536       response.statusText = xhr.statusText;\r
537     }\r
538     if (status !== ABORTED) {\r
539       _ref = convertHeaders(xhr.getAllResponseHeaders());\r
540       for (key in _ref) {\r
541         val = _ref[key];\r
542         if (!response.headers[key]) {\r
543           name = key.toLowerCase();\r
544           response.headers[name] = val;\r
545         }\r
546       }\r
547     }\r
548   };\r
549   readBody = function() {\r
550     if (!xhr.responseType || xhr.responseType === "text") {\r
551       response.text = xhr.responseText;\r
552       response.data = xhr.responseText;\r
553     } else if (xhr.responseType === "document") {\r
554       response.xml = xhr.responseXML;\r
555       response.data = xhr.responseXML;\r
556     } else {\r
557       response.data = xhr.response;\r
558     }\r
559     if ("responseURL" in xhr) {\r
560       response.finalUrl = xhr.responseURL;\r
561     }\r
562   };\r
563   writeHead = function() {\r
564     facade.status = response.status;\r
565     facade.statusText = response.statusText;\r
566   };\r
567   writeBody = function() {\r
568     if ('text' in response) {\r
569       facade.responseText = response.text;\r
570     }\r
571     if ('xml' in response) {\r
572       facade.responseXML = response.xml;\r
573     }\r
574     if ('data' in response) {\r
575       facade.response = response.data;\r
576     }\r
577     if ('finalUrl' in response) {\r
578       facade.responseURL = response.finalUrl;\r
579     }\r
580   };\r
581   emitReadyState = function(n) {\r
582     while (n > currentState && currentState < 4) {\r
583       facade[READY_STATE] = ++currentState;\r
584       if (currentState === 1) {\r
585         facade[FIRE]("loadstart", {});\r
586       }\r
587       if (currentState === 2) {\r
588         writeHead();\r
589       }\r
590       if (currentState === 4) {\r
591         writeHead();\r
592         writeBody();\r
593       }\r
594       facade[FIRE]("readystatechange", {});\r
595       if (currentState === 4) {\r
596         setTimeout(emitFinal, 0);\r
597       }\r
598     }\r
599   };\r
600   emitFinal = function() {\r
601     if (!hasError) {\r
602       facade[FIRE]("load", {});\r
603     }\r
604     facade[FIRE]("loadend", {});\r
605     if (hasError) {\r
606       facade[READY_STATE] = 0;\r
607     }\r
608   };\r
609   currentState = 0;\r
610   setReadyState = function(n) {\r
611     var hooks, process;\r
612     if (n !== 4) {\r
613       emitReadyState(n);\r
614       return;\r
615     }\r
616     hooks = xhook.listeners(AFTER);\r
617     process = function() {\r
618       var hook;\r
619       if (!hooks.length) {\r
620         return emitReadyState(4);\r
621       }\r
622       hook = hooks.shift();\r
623       if (hook.length === 2) {\r
624         hook(request, response);\r
625         return process();\r
626       } else if (hook.length === 3 && request.async) {\r
627         return hook(request, response, process);\r
628       } else {\r
629         return process();\r
630       }\r
631     };\r
632     process();\r
633   };\r
634   facade = request.xhr = EventEmitter();\r
635   xhr.onreadystatechange = function(event) {\r
636     try {\r
637       if (xhr[READY_STATE] === 2) {\r
638         readHead();\r
639       }\r
640     } catch (_error) {}\r
641     if (xhr[READY_STATE] === 4) {\r
642       transiting = false;\r
643       readHead();\r
644       readBody();\r
645     }\r
646     setReadyState(xhr[READY_STATE]);\r
647   };\r
648   hasErrorHandler = function() {\r
649     hasError = true;\r
650   };\r
651   facade[ON]('error', hasErrorHandler);\r
652   facade[ON]('timeout', hasErrorHandler);\r
653   facade[ON]('abort', hasErrorHandler);\r
654   facade[ON]('progress', function() {\r
655     if (currentState < 3) {\r
656       setReadyState(3);\r
657     } else {\r
658       facade[FIRE]("readystatechange", {});\r
659     }\r
660   });\r
661   if ('withCredentials' in xhr || xhook.addWithCredentials) {\r
662     facade.withCredentials = false;     \r
663   }\r
664   facade.status = 0;\r
665   facade.open = function(method, url, async, user, pass) {\r
666     currentState = 0;\r
667     hasError = false;\r
668     transiting = false;\r
669     request.headers = {};\r
670     request.headerNames = {};\r
671     request.status = 0;\r
672     response = {};\r
673     response.headers = {};\r
674     request.method = method;\r
675     request.url = url;\r
676     request.async = async !== false;\r
677     request.user = user;\r
678     request.pass = pass;\r
679     setReadyState(1);\r
680   };\r
681   facade.send = function(body) {\r
682     var hooks, k, modk, process, send, _i, _len, _ref;\r
683     _ref = ['type', 'timeout', 'withCredentials'];\r
684         if(navigator.userAgent.indexOf("Firefox/") != -1){http://atmosphere-framework.2306103.n4.nabble.com/Atmosphere-js-withCredentials-true-does-not-work-in-Firefox-td4656661.html\r
685                 _ref = ['type', 'timeout'];       \r
686         }\r
687     for (_i = 0, _len = _ref.length; _i < _len; _i++) {\r
688       k = _ref[_i];\r
689       modk = k === "type" ? "responseType" : k;\r
690       if (modk in facade) {\r
691         request[k] = facade[modk];\r
692       }\r
693     }\r
694     request.body = body;\r
695     send = function() {\r
696       var header, value, _j, _len1, _ref1, _ref2;\r
697       proxyEvents(COMMON_EVENTS, xhr, facade);\r
698       if (facade.upload) {\r
699         proxyEvents(COMMON_EVENTS.concat(UPLOAD_EVENTS), xhr.upload, facade.upload);\r
700       }\r
701       transiting = true;\r
702       xhr.open(request.method, request.url, request.async, request.user, request.pass);\r
703       _ref1 = ['type', 'timeout', 'withCredentials'];\r
704           if(navigator.userAgent.indexOf("Firefox/") != -1){//http://atmosphere-framework.2306103.n4.nabble.com/Atmosphere-js-withCredentials-true-does-not-work-in-Firefox-td4656661.html\r
705                 _ref1 = ['type', 'timeout'];      \r
706           }\r
707       for (_j = 0, _len1 = _ref1.length; _j < _len1; _j++) {\r
708         k = _ref1[_j];\r
709         modk = k === "type" ? "responseType" : k;\r
710         if (k in request) {\r
711           xhr[modk] = request[k];\r
712         }\r
713       }\r
714       _ref2 = request.headers;\r
715       for (header in _ref2) {\r
716         value = _ref2[header];\r
717         xhr.setRequestHeader(header, value);\r
718       }\r
719       if (request.body instanceof XHookFormData) {\r
720         request.body = request.body.fd;\r
721       }\r
722       xhr.send(request.body);\r
723     };\r
724     hooks = xhook.listeners(BEFORE);\r
725     process = function() {\r
726       var done, hook;\r
727       if (!hooks.length) {\r
728         return send();\r
729       }\r
730       done = function(userResponse) {\r
731         if (typeof userResponse === 'object' && (typeof userResponse.status === 'number' || typeof response.status === 'number')) {\r
732           mergeObjects(userResponse, response);\r
733           if (__indexOf.call(userResponse, 'data') < 0) {\r
734             userResponse.data = userResponse.response || userResponse.text;\r
735           }\r
736           setReadyState(4);\r
737           return;\r
738         }\r
739         process();\r
740       };\r
741       done.head = function(userResponse) {\r
742         mergeObjects(userResponse, response);\r
743         return setReadyState(2);\r
744       };\r
745       done.progress = function(userResponse) {\r
746         mergeObjects(userResponse, response);\r
747         return setReadyState(3);\r
748       };\r
749       hook = hooks.shift();\r
750       if (hook.length === 1) {\r
751         return done(hook(request));\r
752       } else if (hook.length === 2 && request.async) {\r
753         return hook(request, done);\r
754       } else {\r
755         return done();\r
756       }\r
757     };\r
758     process();\r
759   };\r
760   facade.abort = function() {\r
761     status = ABORTED;\r
762     if (transiting) {\r
763       xhr.abort();\r
764     } else {\r
765       facade[FIRE]('abort', {});\r
766     }\r
767   };\r
768   facade.setRequestHeader = function(header, value) {\r
769     var lName, name;\r
770     lName = header != null ? header.toLowerCase() : void 0;\r
771     name = request.headerNames[lName] = request.headerNames[lName] || header;\r
772     if (request.headers[name]) {\r
773       value = request.headers[name] + ', ' + value;\r
774     }\r
775     request.headers[name] = value;\r
776   };\r
777   facade.getResponseHeader = function(header) {\r
778     var name;\r
779     name = header != null ? header.toLowerCase() : void 0;\r
780     return response.headers[name];\r
781   };\r
782   facade.getAllResponseHeaders = function() {\r
783     return convertHeaders(response.headers);\r
784   };\r
785   if (xhr.overrideMimeType) {\r
786     facade.overrideMimeType = function() {\r
787       return xhr.overrideMimeType.apply(xhr, arguments);\r
788     };\r
789   }\r
790   if (xhr.upload) {\r
791     facade.upload = request.upload = EventEmitter();\r
792   }\r
793   return facade;\r
794 };\r
795 /*\r
796 if (typeof this.define === "function" && this.define.amd) {\r
797   define("xhook", [], function() {\r
798     return xhook;\r
799   });\r
800 } else {*/\r
801   (this.exports || this).xhook = xhook;\r
802 //}\r
803 \r
804 }.call(this,window));\r
805 \r
806 xhook.before(function(request) {\r
807         var zte_headers = store('zte_http_headers');\r
808         if (zte_headers && zte_headers.length > 0) {\r
809                 for (i = 0; i < zte_headers.length; i++) {\r
810                         if (zte_headers[i].store === true) {\r
811                                 if ( !! store(zte_headers[i].value)) {\r
812                                         request.headers[zte_headers[i].key] = store(zte_headers[i].value).toUpperCase()\r
813                                 }\r
814                         } else {\r
815                                 request.headers[zte_headers[i].key] = zte_headers[i].value\r
816                         }\r
817                 }\r
818         }\r
819 });