-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcommon.handler.js
More file actions
103 lines (96 loc) · 2.95 KB
/
common.handler.js
File metadata and controls
103 lines (96 loc) · 2.95 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
ExceptionHandler = (function() {// function to catch all exceptions and track events
var logHandlerArr = new Array();
var analyticsHandlerArr = new Array();
function getType(value) {
if (value === null) {
return "Null"; // special case
} else {
return Object.prototype.toString.call(value).match(
/^\[object (.*)\]$/)[1];
}
}
function log(msg, error) { // internal log handler
for ( var k = 0; k < analyticsHandlerArr.length; k++) {
analyticsHandlerArr[k].log(msg, error);
}
}
function track(elem, type) { // internal analytics handler
for ( var k = 0; k < logHandlerArr.length; k++) {
logHandlerArr[k].trackEventWrapper(elem, type);
}
}
function wrap(context, value) {
var type = getType(value); //getType function is defined above
if (type == "Function") {
return gaurd(value, context);
} else if (type == "Object") {
if (value.hasOwnProperty("target") // code to track the events
|| value.hasOwnProperty("selector")) {
if (value.hasOwnProperty("target")) {
if (value.hasOwnProperty("originalEvent")
&& !value.hasOwnProperty("genericAttr")) {
track(value.target, value.type); // call to internal analytics handler
Object.defineProperty(value, "genericAttr", {
value : "set"
});
}
}
return value;
} else {
for ( var key in value) { // iterating all the values of an object
value[key] = wrap(value, value[key]);
}
}
}
return value;
}
function guard(fnOrObj, context) {
var extraArgs = new Array();
if (arguments.length > 2) {
extraArgs = Array.prototype.slice.call(arguments, 2);
}
var type = getType(fnOrObj); //getType function is defined above
if (type == "Function") {
return function() {
// capture the arguments and functions
var wrapArgsFn = wrap.bind(null, context);
var args = extraArgs.concat(
Array.prototype.slice.call(arguments)).map(wrapArgsFn);
// exception handler blocks
try {
var returnObj = fnOrObj.apply(context, args);
// check for the return object
if (typeof returnObj == "undefined") {
return returnObj;
} else {
return wrap(context, returnObj);
}
} catch (e) {
log("Exception on executing guard on function", e); // call to internal log handler
}
};
} else if (type == "Object") {
try {
return wrap(fnOrObj, fnOrObj);
} catch (e) {
log("Exception on executing guard on object", e); // call to internal log handler
}
} else {
return fnOrObj;
}
}
var api = { //set of public methods which are exposed
proxy : function(fnOrObj, context) {
return guard.apply(context, arguments);
},
// analytics handlers are passed using this function
initializeAnalyticsHandler : function(analyticsHandler) {
analyticsHandlerArr.push(analyticsHandler);
},
// log handlers are passed using this function
initializeLogHandler : function(logHandler) {
logHandlerArr.push(logHandler);
}
};
return api;
})();