Skip to content
Browse files

Fixed delegation, changed syntax

  • Loading branch information...
1 parent 9637666 commit e28e9ea70f9adb92d0508d9418fc19aa45489d9a @averyvery committed Jan 4, 2012
Showing with 87 additions and 40 deletions.
  1. +5 −5 README.mdown
  2. +17 −9 index.html
  3. +14 −1 test/tests.js
  4. +49 −23 trackiffer.js
  5. +2 −2 trackiffer.min.js
View
10 README.mdown
@@ -1,4 +1,4 @@
-# Trackiffer 0.3
+# Trackiffer 0.3.1
Trackiffer is a dead-simple, yet suprisingly powerful, drop-in script for tracking
[GA events](http://code.google.com/apis/analytics/docs/tracking/eventTrackerGuide.html),
@@ -61,9 +61,9 @@ in the example, we're recording the value of a particular input at the moment th
## Extra Configuration
trackiffer({
- 'a' : {
+ 'body' : {
delay : false,
- delegate : 'body',
+ delegate : 'a',
rule : ['_trackEvent', 'Link', 'Social', '{{text}}', 1]
}
});
@@ -73,8 +73,8 @@ By assigning an object literal to your selector, you get two new options ('rule'
- delay - by setting delay to <code>false</code>, you override trackiffer's default outbound behavior. The event will no longer cancel, and the user
will no longer be forwarded to a new URL after 100ms.
- delegate - setting a <code>delegate</code> option allows you to bind events to DOM elements that might not exist yet on the page.
-Read more about delegate [here](http://api.jquery.com/delegate/). At the moment, these links WILL NOT be highlighted, but you can still
-test them by interacting and reading the console.
+Read more about delegate [here](http://api.jquery.com/delegate/). At the moment, these links WILL NOT be highlighted, but their element you delegate
+from will have a faint highlight. You can still test these elements by interacting with them and reading the console.
## Debug mode
View
26 index.html
@@ -113,24 +113,32 @@
'.delay form' : ['_trackEvent', 'Delayed Link', 'Submit', 'Should submit 100ms after click']
});</pre>
</div>
- <div class="section config">
- <h3>Configuration</h3>
- <p>
- <a href="http://example.com" class="outbound">You can also configure outbound links NOT to delay and forward.</a>
- </p>
+ <div class="section">
+ <div class="config">
+ <h3>Configuration</h3>
+ <p>
+ <a href="http://example.com" class="outbound">You can also configure outbound links NOT to delay and forward.</a>
+ </p>
+ </div>
+ <script type="text/javascript">
+ var delegate_link = '<a href="http://example.com" class="delegated">You can also use \'delegate\' to track links that don\'t exist at execution time.</a>';
+ </script>
<pre>
trackiffer({
'.config a.outbound' : {
delay : false,
rule : ['_trackEvent', 'Not Delayed', 'Click', 'Should _not_ forward user user 100ms after click']
},
- 'a.delegated' : {
- delegate : '.config',
+ '.config' : {
+ delegate : 'a.delegated',
rule : ['_trackEvent', 'Delayed Link', 'Click', 'Should detect links added to the page after execution time']
}
});
-$('.config pre')
- .before('<a href="http://example.com" class="delegated">You can also use \'delegate\' to track links that don\'t exist at execution time.</a>');
+setTimeout(function(){
+ var delegate_link_example =
+ '&lt;a href="http://example.com" class="delegated"&gt;You can also use \'delegate\' to track links that don\'t exist at execution time.&lt;/a&gt;';
+ $('.config p').before(delegate_link);
+}, 1000);
</pre>
</div>
</div>
View
15 test/tests.js
@@ -162,9 +162,14 @@
var $elem = $('<a href="http://example.com"></a>');
spyOn($elem, 'bind').andCallThrough();
T.bindEvent({rule : [], delegate : 'body'}, $elem, 'a');
- window.console && console.log && console.log($elem);
expect($elem.bind.callCount).toEqual(2);
});
+ it('delegates when told', function(){
+ var $body = $('body');
+ spyOn($body, 'delegate').andCallThrough();
+ T.bindEvent({rule : [], delegate : 'a'}, $body, 'body');
+ expect($body.delegate.callCount).toEqual(1);
+ });
});
describe('Debugging', function(){
@@ -242,6 +247,14 @@
T.highlightAllElements();
expect(T.highlightElement.callCount).toEqual(2);
});
+ it('acts on tracked AND delegated objects', function(){
+ spyOn(T, 'actOnTrackedElements');
+ spyOn(T, 'actOnDelegatedElements');
+ T.unHighlightAllElements();
+ T.highlightAllElements();
+ expect(T.actOnTrackedElements.callCount).toEqual(2);
+ expect(T.actOnDelegatedElements.callCount).toEqual(2);
+ });
it('unhighlights all elements', function(){
T.unHighlightAllElements();
T.undebug();
View
72 trackiffer.js
@@ -1,5 +1,5 @@
/*
- * Trackiffer v0.3
+ * Trackiffer v0.3.1
* Easy GA event tracking and debugging
* https://github.com/averyvery/trackiffer
*
@@ -19,7 +19,7 @@
/* @group setup */
- version : '0.3',
+ version : '0.3.1',
is_oldbrowser :
(navigator.userAgent.indexOf('MSIE 6') != -1) ||
@@ -32,6 +32,8 @@
tracked_elems : {},
+ delegated_elems : {},
+
event_types : {
'form' : 'submit',
'select' : 'change'
@@ -218,11 +220,14 @@
},
bindRulesToSelector : function(selector){
- var $elems = jQuery(selector);
- $elems.each(function(i){
- i === 0 && _t.log('| ' + $elems.length + 'x ' + selector);
- _t.bindEvent(_t.rules[selector], jQuery(this), selector);
- });
+ var $elems = jQuery(selector),
+ rule = _t.rules[selector],
+ logAndBind = function(i){
+ i === 0 && _t.log('| ' + $elems.length + 'x ' + selector);
+ _t.bindEvent(rule, jQuery(this), selector);
+ };
+ $elems.each(logAndBind);
+ rule && rule.delegate && logAndBind(0);
},
getEventType : function($elem){
@@ -280,12 +285,12 @@
}
if(event_data.delegate){
- $(event_data.delegate).delegate(selector, event_data.type + '.trackiffer', handler);
+ $elem.delegate(event_data.delegate, event_data.type + '.trackiffer', handler);
} else {
$elem.bind(event_data.type + '.trackiffer', handler);
}
- _t.bindDebugHover($elem, selector);
+ _t.bindDebugHover($elem, selector, event_data.delegate);
},
@@ -298,6 +303,8 @@
debug_outlines : {
'highlight' : 'rgb(0,200,200) 3px solid',
'hover' : 'rgb(250,0,0) 3px solid',
+ 'highlight_delegated' : 'rgba(0,200,200, 0.3) 6px solid',
+ 'hover_delegated' : 'rgba(250,0,0, 0.3) 6px solid'
},
checkHash : function(){
@@ -336,21 +343,31 @@
},
highlightAllElements : function(){
- _t.actOnAllElements(_t.highlightElement);
+ _t.actOnTrackedElements(_t.highlightElement);
+ _t.actOnDelegatedElements(_t.highlightDelegatedElement);
},
unHighlightAllElements : function(){
- _t.actOnAllElements(_t.unHighlightElement);
+ _t.actOnTrackedElements(_t.unHighlightElement);
+ _t.actOnDelegatedElements(_t.unHighlightElement);
},
- actOnAllElements : function(method){
+ actOnTrackedElements : function(method){
for(var rule in _t.tracked_elems){
if (_t.tracked_elems.hasOwnProperty(rule)) {
jQuery.each(_t.tracked_elems[rule], method);
}
}
},
+ actOnDelegatedElements : function(method){
+ for(var rule in _t.delegated_elems){
+ if (_t.delegated_elems.hasOwnProperty(rule)) {
+ jQuery.each(_t.delegated_elems[rule], method);
+ }
+ }
+ },
+
unHighlightElement : function(){
jQuery(this).css(_t.debug_outlines.property, '');
},
@@ -363,17 +380,26 @@
jQuery(this).css(_t.debug_outlines.property, _t.debug_outlines.hover);
},
- bindDebugHover : function($elem, selector){
- var hover_all = function(){
- _t.debugging && _t.tracked_elems[selector].each(_t.hoverElement);
- },
- hover_none = function(){
- _t.debugging && _t.tracked_elems[selector].each(_t.highlightElement);
- };
- if(typeof _t.tracked_elems[selector] === 'undefined'){
- _t.tracked_elems[selector] = jQuery();
- }
- _t.tracked_elems[selector] = _t.tracked_elems[selector].add($elem);
+ highlightDelegatedElement : function(){
+ jQuery(this).css(_t.debug_outlines.property, _t.debug_outlines.highlight_delegated);
+ },
+
+ hoverDelegatedElement : function(){
+ jQuery(this).css(_t.debug_outlines.property, _t.debug_outlines.hover_delegated);
+ },
+
+ bindDebugHover : function($elem, selector, delegated){
+ var elem_list = delegated ? _t.delegated_elems : _t.tracked_elems,
+ hover_all = function(){
+ _t.debugging && elem_list[selector].each(delegated ? _t.hoverDelegatedElement : _t.hoverElement);
+ },
+ hover_none = function(){
+ _t.debugging && elem_list[selector].each(delegated ? _t.highlightDelegatedElement : _t.highlightElement);
+ };
+ if(typeof elem_list[selector] === 'undefined'){
+ elem_list[selector] = jQuery();
+ }
+ elem_list[selector] = elem_list[selector].add($elem);
$elem.hover(hover_all, hover_none);
},
View
4 trackiffer.min.js
@@ -1,5 +1,5 @@
/*
- * Trackiffer v0.2.5
+ * Trackiffer v0.3.1
* Easy GA event tracking and debugging
* https://github.com/averyvery/trackiffer
*
@@ -12,5 +12,5 @@
*/
;
-(function(a,b){"use strict";var c={version:"0.3",is_oldbrowser:navigator.userAgent.indexOf("MSIE 6")!=-1||navigator.userAgent.indexOf("MSIE 7")!=-1,jquery:{min_version:"1.4.0",loaded:false},tracked_elems:{},event_types:{form:"submit",select:"change"},defineGa:function(){b._gaq=b._gaq||[]},init:function(){c.defineGa();c.checkHash();c.checkjQuery()},rules:{},loadScript:function(b){c.log("| loading "+b);var d=a.createElement("script"),e=a.getElementsByTagName("script")[0];d.type="text/javascript";d.src=b;e.parentNode.insertBefore(d,e)},checkjQuery:function(){c.log("");c.log("+ checking for jQuery");if(c.isjQueryVersionHighEnough()===false){c.log("| jQuery version too low");c.loadScript("http://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js");c.polljQueryVersion()}else{c.log("| jQuery present");c.jquery.loaded=true;c.bindRules()}},normalizeVersion:function(a){var b=a+"",c=b.replace(/\./g,"");while(c.length<3){c=c+"0"}return parseInt(c,10)},isjQueryVersionHighEnough:function(){var a=typeof b.jQuery==="function"&&jQuery.fn.jquery||"0",d=c.normalizeVersion(a),e=c.normalizeVersion(c.jquery.min_version),f=d>e;f||c.log("| wrong version: "+a+" (needs to be > "+c.jquery.min_version+")");return f},polljQueryVersion:function(){c.log("| waiting 100ms");c.isjQueryVersionHighEnough()?c.jQueryHasLoaded():setTimeout(c.polljQueryVersion,100)},jQueryHasLoaded:function(){c.log("| loaded jQuery");c.jquery.loaded=true;jQuery.noConflict();c.bindRules()},formatData:function(a,b){var d=a.shift(),e=c.parseTokens(a,b);e.unshift(d);return e},getReplacement:function(a,b){var c;if(a){switch(a){case"{{value}}":c=b.val();break;case"{{text}}":c=b.text();break;default:var d=a.replace(/\{\{/g,"").replace(/\}\}/g,"");c=b.attr(d)}return c}},parseTokens:function(a,b){for(var d=0,e=a.length;d<e;d++){var f=a[d],g,h=typeof f==="string";if(typeof f==="function"){f=f(b)}else if(h){var i=/\{\{.+?\}\}/g,j=f.match(i),k,l;if(j){for(var m=0,n=j.length;m<n;m++){k=c.getReplacement(j[m],b);if(k){l=jQuery.trim(k);f=f.replace(i,l)}}}}g=c.replaceBadCharacters(f);a[d]=g}return a},replaceBadCharacters:function(a){if(a.replace){a=a.replace(/,/g,"\\,");a=a.replace(/"/g,'\\"');a=a.replace(/'/g,"\\'")}return a},executeDelayedAction:function(a,d){var e=d.get(0);if(c.debugging!==true){e.submit&&e.submit();if(a==="click"){b.location=d[0].href}}},delayAction:function(a,b,d){a.preventDefault();var e=function(){c.log("| outbound event - firing after 100ms");c.executeDelayedAction(b,d)};c.debugging||d.unbind(b+".trackiffer");setTimeout(e,100)},trackRules:function(a){c.rules=a;c.jquery.loaded?c.bindRules():c.log("| delaying init until jQuery loads")},bindRules:function(){c.log("");c.log("+ binding rules");for(var a in c.rules){if(c.rules.hasOwnProperty(a)){c.bindRulesToSelector(a)}}c.debugging&&c.highlightAllElements();c.rules={}},bindRulesToSelector:function(a){var b=jQuery(a);b.each(function(d){d===0&&c.log("| "+b.length+"x "+a);c.bindEvent(c.rules[a],jQuery(this),a)})},getEventType:function(a){var b="click";for(var d in c.event_types){if(c.event_types.hasOwnProperty(d)){if(a.is(d)){b=c.event_types[d]}}}return b},isArray:function(a){return a.constructor.toString().indexOf("Array")!==-1},elemHasUrl:function(a){var b=a.attr("action")||a.attr("href"),c=b&&b.slice(0)!=="#";return b&&c},bindEvent:function(a,d,e){var f={delay:true,delegate:false,rule:a,type:c.getEventType(d)},g=function(a){c.log("");c.log("+ "+f.type+" on "+e);var h=c.formatData(f.rule.slice(0),d);c.log("| parsing ",f);c.log("v ");b._gaq.push(h);c.log("^ ");if(f.delay&&c.elemHasUrl(d)){c.log("| outbound event - delaying");c.delayAction(a,f.type,d,g)}else if(c.debugging){return false}};if(c.isArray(a)===false){f=$.extend(f,a)}if(f.delegate){$(f.delegate).delegate(e,f.type+".trackiffer",g)}else{d.bind(f.type+".trackiffer",g)}c.bindDebugHover(d,e)},debugging:false,debug_outlines:{highlight:"rgb(0,200,200) 3px solid",hover:"rgb(250,0,0) 3px solid"},checkHash:function(){c.debugging=b.location.hash==="#trackiffer_debug";c.debugging&&c.debug()},log:function(){if(c.debugging&&typeof console==="object"&&console.log){var a=Array.prototype.slice.call(arguments);a.unshift("");console.log.apply(console,a)}},undefineGa:function(){c.log("| unsetting existing GA");b._gat=undefined;b._gaq=[["_setAccount","UA-00000000-1"]]},debug:function(){c.debugging=true;c.log("+ debug mode");c.undefineGa();c.loadScript("http://www.google-analytics.com/u/ga_debug.js");c.debug_outlines.property=c.is_oldbrowser?"border":"outline";c.highlightAllElements();jQuery(b).keydown(c.leaveDebugIfEsc)},undebug:function(){c.log("+ leaving debug mode");c.debugging=false;c.unHighlightAllElements()},highlightAllElements:function(){c.actOnAllElements(c.highlightElement)},unHighlightAllElements:function(){c.actOnAllElements(c.unHighlightElement)},actOnAllElements:function(a){for(var b in c.tracked_elems){if(c.tracked_elems.hasOwnProperty(b)){jQuery.each(c.tracked_elems[b],a)}}},unHighlightElement:function(){jQuery(this).css(c.debug_outlines.property,"")},highlightElement:function(){jQuery(this).css(c.debug_outlines.property,c.debug_outlines.highlight)},hoverElement:function(){jQuery(this).css(c.debug_outlines.property,c.debug_outlines.hover)},bindDebugHover:function(a,b){var d=function(){c.debugging&&c.tracked_elems[b].each(c.hoverElement)},e=function(){c.debugging&&c.tracked_elems[b].each(c.highlightElement)};if(typeof c.tracked_elems[b]==="undefined"){c.tracked_elems[b]=jQuery()}c.tracked_elems[b]=c.tracked_elems[b].add(a);a.hover(d,e)},leaveDebugIfEsc:function(a){a.keyCode===27&&c.undebug()}};b.trackiffer=function(a){var b=typeof a==="object",d=typeof c[a]==="function",e=c;if(b){c.trackRules(a)}else if(d){e=c[a]()}else if(a){e=c[a]}return e};c.init()})(document,window)
+(function(a,b){"use strict";var c={version:"0.3.1",is_oldbrowser:navigator.userAgent.indexOf("MSIE 6")!=-1||navigator.userAgent.indexOf("MSIE 7")!=-1,jquery:{min_version:"1.4.0",loaded:false},tracked_elems:{},delegated_elems:{},event_types:{form:"submit",select:"change"},defineGa:function(){b._gaq=b._gaq||[]},init:function(){c.defineGa();c.checkHash();c.checkjQuery()},rules:{},loadScript:function(b){c.log("| loading "+b);var d=a.createElement("script"),e=a.getElementsByTagName("script")[0];d.type="text/javascript";d.src=b;e.parentNode.insertBefore(d,e)},checkjQuery:function(){c.log("");c.log("+ checking for jQuery");if(c.isjQueryVersionHighEnough()===false){c.log("| jQuery version too low");c.loadScript("http://ajax.googleapis.com/ajax/libs/jquery/1.6.3/jquery.min.js");c.polljQueryVersion()}else{c.log("| jQuery present");c.jquery.loaded=true;c.bindRules()}},normalizeVersion:function(a){var b=a+"",c=b.replace(/\./g,"");while(c.length<3){c=c+"0"}return parseInt(c,10)},isjQueryVersionHighEnough:function(){var a=typeof b.jQuery==="function"&&jQuery.fn.jquery||"0",d=c.normalizeVersion(a),e=c.normalizeVersion(c.jquery.min_version),f=d>e;f||c.log("| wrong version: "+a+" (needs to be > "+c.jquery.min_version+")");return f},polljQueryVersion:function(){c.log("| waiting 100ms");c.isjQueryVersionHighEnough()?c.jQueryHasLoaded():setTimeout(c.polljQueryVersion,100)},jQueryHasLoaded:function(){c.log("| loaded jQuery");c.jquery.loaded=true;jQuery.noConflict();c.bindRules()},formatData:function(a,b){var d=a.shift(),e=c.parseTokens(a,b);e.unshift(d);return e},getReplacement:function(a,b){var c;if(a){switch(a){case"{{value}}":c=b.val();break;case"{{text}}":c=b.text();break;default:var d=a.replace(/\{\{/g,"").replace(/\}\}/g,"");c=b.attr(d)}return c}},parseTokens:function(a,b){for(var d=0,e=a.length;d<e;d++){var f=a[d],g,h=typeof f==="string";if(typeof f==="function"){f=f(b)}else if(h){var i=/\{\{.+?\}\}/g,j=f.match(i),k,l;if(j){for(var m=0,n=j.length;m<n;m++){k=c.getReplacement(j[m],b);if(k){l=jQuery.trim(k);f=f.replace(i,l)}}}}g=c.replaceBadCharacters(f);a[d]=g}return a},replaceBadCharacters:function(a){if(a.replace){a=a.replace(/,/g,"\\,");a=a.replace(/"/g,'\\"');a=a.replace(/'/g,"\\'")}return a},executeDelayedAction:function(a,d){var e=d.get(0);if(c.debugging!==true){e.submit&&e.submit();if(a==="click"){b.location=d[0].href}}},delayAction:function(a,b,d){a.preventDefault();var e=function(){c.log("| outbound event - firing after 100ms");c.executeDelayedAction(b,d)};c.debugging||d.unbind(b+".trackiffer");setTimeout(e,100)},trackRules:function(a){c.rules=a;c.jquery.loaded?c.bindRules():c.log("| delaying init until jQuery loads")},bindRules:function(){c.log("");c.log("+ binding rules");for(var a in c.rules){if(c.rules.hasOwnProperty(a)){c.bindRulesToSelector(a)}}c.debugging&&c.highlightAllElements();c.rules={}},bindRulesToSelector:function(a){var b=jQuery(a),d=c.rules[a],e=function(e){e===0&&c.log("| "+b.length+"x "+a);c.bindEvent(d,jQuery(this),a)};b.each(e);d&&d.delegate&&e(0)},getEventType:function(a){var b="click";for(var d in c.event_types){if(c.event_types.hasOwnProperty(d)){if(a.is(d)){b=c.event_types[d]}}}return b},isArray:function(a){return a.constructor.toString().indexOf("Array")!==-1},elemHasUrl:function(a){var b=a.attr("action")||a.attr("href"),c=b&&b.slice(0)!=="#";return b&&c},bindEvent:function(a,d,e){var f={delay:true,delegate:false,rule:a,type:c.getEventType(d)},g=function(a){c.log("");c.log("+ "+f.type+" on "+e);var h=c.formatData(f.rule.slice(0),d);c.log("| parsing ",f);c.log("v ");b._gaq.push(h);c.log("^ ");if(f.delay&&c.elemHasUrl(d)){c.log("| outbound event - delaying");c.delayAction(a,f.type,d,g)}else if(c.debugging){return false}};if(c.isArray(a)===false){f=$.extend(f,a)}if(f.delegate){d.delegate(f.delegate,f.type+".trackiffer",g)}else{d.bind(f.type+".trackiffer",g)}c.bindDebugHover(d,e,f.delegate)},debugging:false,debug_outlines:{highlight:"rgb(0,200,200) 3px solid",hover:"rgb(250,0,0) 3px solid",highlight_delegated:"rgba(0,200,200, 0.3) 6px solid",hover_delegated:"rgba(250,0,0, 0.3) 6px solid"},checkHash:function(){c.debugging=b.location.hash==="#trackiffer_debug";c.debugging&&c.debug()},log:function(){if(c.debugging&&typeof console==="object"&&console.log){var a=Array.prototype.slice.call(arguments);a.unshift("");console.log.apply(console,a)}},undefineGa:function(){c.log("| unsetting existing GA");b._gat=undefined;b._gaq=[["_setAccount","UA-00000000-1"]]},debug:function(){c.debugging=true;c.log("+ debug mode");c.undefineGa();c.loadScript("http://www.google-analytics.com/u/ga_debug.js");c.debug_outlines.property=c.is_oldbrowser?"border":"outline";c.highlightAllElements();jQuery(b).keydown(c.leaveDebugIfEsc)},undebug:function(){c.log("+ leaving debug mode");c.debugging=false;c.unHighlightAllElements()},highlightAllElements:function(){c.actOnTrackedElements(c.highlightElement);c.actOnDelegatedElements(c.highlightDelegatedElement)},unHighlightAllElements:function(){c.actOnTrackedElements(c.unHighlightElement);c.actOnDelegatedElements(c.unHighlightElement)},actOnTrackedElements:function(a){for(var b in c.tracked_elems){if(c.tracked_elems.hasOwnProperty(b)){jQuery.each(c.tracked_elems[b],a)}}},actOnDelegatedElements:function(a){for(var b in c.delegated_elems){if(c.delegated_elems.hasOwnProperty(b)){jQuery.each(c.delegated_elems[b],a)}}},unHighlightElement:function(){jQuery(this).css(c.debug_outlines.property,"")},highlightElement:function(){jQuery(this).css(c.debug_outlines.property,c.debug_outlines.highlight)},hoverElement:function(){jQuery(this).css(c.debug_outlines.property,c.debug_outlines.hover)},highlightDelegatedElement:function(){jQuery(this).css(c.debug_outlines.property,c.debug_outlines.highlight_delegated)},hoverDelegatedElement:function(){jQuery(this).css(c.debug_outlines.property,c.debug_outlines.hover_delegated)},bindDebugHover:function(a,b,d){var e=d?c.delegated_elems:c.tracked_elems,f=function(){c.debugging&&e[b].each(d?c.hoverDelegatedElement:c.hoverElement)},g=function(){c.debugging&&e[b].each(d?c.highlightDelegatedElement:c.highlightElement)};if(typeof e[b]==="undefined"){e[b]=jQuery()}e[b]=e[b].add(a);a.hover(f,g)},leaveDebugIfEsc:function(a){a.keyCode===27&&c.undebug()}};b.trackiffer=function(a){var b=typeof a==="object",d=typeof c[a]==="function",e=c;if(b){c.trackRules(a)}else if(d){e=c[a]()}else if(a){e=c[a]}return e};c.init()})(document,window)
;

0 comments on commit e28e9ea

Please sign in to comment.
Something went wrong with that request. Please try again.