c6a858a0be5df59f1c0524b90bf4b4d66d380cd3
[platform/framework/web/crosswalk-tizen.git] /
1 'use strict';
2
3 var forEach    = require('es5-ext/object/for-each')
4   , validValue = require('es5-ext/object/valid-object')
5
6   , push = Array.prototype.apply, defineProperty = Object.defineProperty
7   , create = Object.create, hasOwnProperty = Object.prototype.hasOwnProperty
8   , d = { configurable: true, enumerable: false, writable: true };
9
10 module.exports = function (e1, e2) {
11         var data;
12         (validValue(e1) && validValue(e2));
13         if (!hasOwnProperty.call(e1, '__ee__')) {
14                 if (!hasOwnProperty.call(e2, '__ee__')) {
15                         d.value = create(null);
16                         defineProperty(e1, '__ee__', d);
17                         defineProperty(e2, '__ee__', d);
18                         d.value = null;
19                         return;
20                 }
21                 d.value = e2.__ee__;
22                 defineProperty(e1, '__ee__', d);
23                 d.value = null;
24                 return;
25         }
26         data = d.value = e1.__ee__;
27         if (!hasOwnProperty.call(e2, '__ee__')) {
28                 defineProperty(e2, '__ee__', d);
29                 d.value = null;
30                 return;
31         }
32         if (data === e2.__ee__) return;
33         forEach(e2.__ee__, function (listener, name) {
34                 if (!data[name]) {
35                         data[name] = listener;
36                         return;
37                 }
38                 if (typeof data[name] === 'object') {
39                         if (typeof listener === 'object') push.apply(data[name], listener);
40                         else data[name].push(listener);
41                 } else if (typeof listener === 'object') {
42                         listener.unshift(data[name]);
43                         data[name] = listener;
44                 } else {
45                         data[name] = [data[name], listener];
46                 }
47         });
48         defineProperty(e2, '__ee__', d);
49         d.value = null;
50 };