forked from buremba/rakam-javascript
-
Notifications
You must be signed in to change notification settings - Fork 0
/
rakam.min.js
2 lines (2 loc) · 40 KB
/
rakam.min.js
1
2
(function umd(require){if("object"==typeof exports){module.exports=require("1")}else if("function"==typeof define&&define.amd){define(function(){return require("1")})}else{this["rakam"]=require("1")}})(function outer(modules,cache,entries){var global=function(){return this}();function require(name,jumped){if(cache[name])return cache[name].exports;if(modules[name])return call(name,require);throw new Error('cannot find module "'+name+'"')}function call(id,require){var m=cache[id]={exports:{}};var mod=modules[id];var name=mod[2];var fn=mod[0];fn.call(m.exports,function(req){var dep=modules[id][1][req];return require(dep?dep:req)},m,m.exports,outer,modules,cache,entries);if(name)cache[name]=cache[id];return cache[id].exports}for(var id in entries){if(entries[id]){global[entries[id]]=require(id)}else{require(id)}}require.duo=true;require.cache=cache;require.modules=modules;return require}({1:[function(require,module,exports){var Rakam=require("./rakam");var old=window.rakam||{};var instance=new Rakam;instance._q=old._q||[];module.exports=instance},{"./rakam":2}],2:[function(require,module,exports){var Cookie=require("./cookie");var JSON=require("json");var language=require("./language");var localStorage=require("./localstorage");var object=require("object");var Request=require("./xhr");var UUID=require("./uuid");var version=require("./version");var User=require("./user");var ifvisible=require("../node_modules/ifvisible.js/src/ifvisible.js");var type=require("./type");var indexOf;if(!Array.prototype.indexOf){indexOf=function(obj,start){for(var i=start||0,j=this.length;i<j;i++){if(this[i]===obj){return i}}return-1}}else{indexOf=Array.prototype.indexOf}var API_VERSION=1;var DEFAULT_OPTIONS={apiEndpoint:"app.rakam.io",eventEndpointPath:"/event/batch",cookieExpiration:365*10,cookieName:"rakam_id",domain:undefined,includeUtm:false,trackForms:false,language:language.language,optOut:false,platform:"Web",savedMaxCount:1e3,saveEvents:true,sessionTimeout:30*60*1e3,unsentKey:"rakam_unsent",uploadBatchSize:100,batchEvents:false,eventUploadThreshold:30,eventUploadPeriodMillis:30*1e3};var LocalStorageKeys={LAST_ID:"rakam_lastEventId",LAST_EVENT_TIME:"rakam_lastEventTime",SESSION_ID:"rakam_sessionId",RETURNING_SESSION:"rakam_returning"};var Rakam=function(){this._unsentEvents=[];this.options=object.merge({},DEFAULT_OPTIONS)};Rakam.prototype._eventId=0;Rakam.prototype._returningUser=false;Rakam.prototype._sending=false;Rakam.prototype._lastEventTime=null;Rakam.prototype._sessionId=null;Rakam.prototype._newSession=false;Rakam.prototype.log=function(s){if(this.options.debug===true){console.log("[Rakam] "+s)}};Rakam.prototype.init=function(apiKey,opt_userId,opt_config,callback){try{if(!apiKey){throw new Error("apiKey is null")}this.options.apiKey=apiKey;var user=new User;user.init(this.options);this.User=function(){return user};if(opt_config){this.options.apiEndpoint=opt_config.apiEndpoint||this.options.apiEndpoint;this.options.debug=opt_config.debug||this.options.debug===true;if(opt_config.saveEvents!==undefined){this.options.saveEvents=!!opt_config.saveEvents}if(opt_config.domain!==undefined){this.options.domain=opt_config.domain}if(opt_config.includeUtm!==undefined){this.options.includeUtm=!!opt_config.includeUtm}if(opt_config.trackClicks!==undefined){this.options.trackClicks=!!opt_config.trackClicks}if(opt_config.trackForms!==undefined){this.options.trackForms=!!opt_config.trackForms}if(opt_config.batchEvents!==undefined){this.options.batchEvents=!!opt_config.batchEvents}this.options.platform=opt_config.platform||this.options.platform;this.options.language=opt_config.language||this.options.language;this.options.sessionTimeout=opt_config.sessionTimeout||this.options.sessionTimeout;this.options.uploadBatchSize=opt_config.uploadBatchSize||this.options.uploadBatchSize;this.options.eventUploadThreshold=opt_config.eventUploadThreshold||this.options.eventUploadThreshold;this.options.savedMaxCount=opt_config.savedMaxCount||this.options.savedMaxCount;this.options.eventUploadPeriodMillis=opt_config.eventUploadPeriodMillis||this.options.eventUploadPeriodMillis;this.options.superProperties=opt_config.superProperties||[]}Cookie.options({expirationDays:this.options.cookieExpiration,domain:this.options.domain});this.options.domain=Cookie.options().domain;_loadCookieData(this);if(opt_config&&opt_config.deviceId!==undefined&&opt_config.deviceId!==null&&opt_config.deviceId||this.options.deviceId){this.options.deviceId=this.options.deviceId}else{this.deviceIdCreatedAt=new Date;this.options.deviceId=UUID()}_saveCookieData(this);this.log("initialized with apiKey="+apiKey);if(this.options.saveEvents){var savedUnsentEventsString=localStorage.getItem(this.options.unsentKey);if(savedUnsentEventsString){try{this._unsentEvents=JSON.parse(savedUnsentEventsString)}catch(e){this.log(e)}}}this._sendEventsIfReady();if(this.options.includeUtm){this._initUtmData()}if(this.options.trackForms){this._initTrackForms()}if(this.options.trackClicks){this._initTrackClicks()}this._lastEventTime=parseInt(localStorage.getItem(LocalStorageKeys.LAST_EVENT_TIME))||null;this._sessionId=parseInt(localStorage.getItem(LocalStorageKeys.SESSION_ID))||null;this._eventId=localStorage.getItem(LocalStorageKeys.LAST_ID)||0;var now=(new Date).getTime();if(!this._sessionId||!this._lastEventTime||now-this._lastEventTime>this.options.sessionTimeout){if(this._sessionId!==null){localStorage.setItem(LocalStorageKeys.RETURNING_SESSION,true);this._returningUser=true}this._sessionId=now;Cookie.remove("_rakam_time");localStorage.setItem(LocalStorageKeys.SESSION_ID,this._sessionId)}else{this._returningUser=localStorage.getItem(LocalStorageKeys.RETURNING_SESSION)==="true"}this._lastEventTime=now;localStorage.setItem(LocalStorageKeys.LAST_EVENT_TIME,this._lastEventTime)}catch(e){this.log(e)}this.setUserId(opt_userId);if(callback&&typeof callback==="function"){setTimeout(function(){callback()},1)}};Rakam.prototype.onEvent=function(callback){this.options.eventCallbacks=this.options.eventCallbacks||[];this.options.eventCallbacks.push(callback)};var transformValue=function(_this,attribute,value,type){if(type!==null){type=type.toLowerCase()}if(type==="long"||type==="time"||type==="timestamp"||type==="date"){value=parseInt(value);if(isNaN(value)||!isFinite(value)){_this.log("ignoring "+attribute+": the value must be a number");value=null}}else if(type==="double"){value=parseFloat(value);if(isNaN(value)||!isFinite(value)){_this.log("ignoring "+attribute+": the value is not double");value=null}}else if(type==="boolean"){if(type==="true"||type==="1"){value=true}else if(type==="false"||type==="0"){value=false}else{_this.log("ignoring "+attribute+": the value is not boolean");value=null}}return value};Rakam.prototype.logInlinedEvent=function(collection,extraProperties,callback){var getAllElementsWithAttribute=function(attribute){if(document.querySelectorAll){return document.querySelectorAll("[rakam-event-attribute]")}var matchingElements=[];var allElements=document.getElementsByTagName("*");for(var i=0,n=allElements.length;i<n;i++){if(allElements[i].getAttribute(attribute)!==null){matchingElements.push(allElements[i])}}return matchingElements};var properties=extraProperties||{};var elements=getAllElementsWithAttribute("rakam-event-attribute");for(var i=0;i<elements.length;i++){var element=elements[i];var attribute=element.getAttribute("rakam-event-attribute");var value=element.getAttribute("rakam-event-attribute-value");var type=element.getAttribute("rakam-event-attribute-type");if(value===null){if(element.tagName==="INPUT"){value=element.value}else if(element.tagName==="SELECT"){var option=element.options[element.selectedIndex];if(option.value!==null&&option.value!==""){var attr=element.getAttribute("rakam-attribute-value");if(attr!=="value"){value=option.value}else{value=option.text}}}else if(element.innerText){value=element.innerText.replace(/^\s+|\s+$/g,"")}else{this.log("Could find value of DOM element.",element)}}if(value!==null&&value!==""){properties[attribute]=transformValue(this,attribute,value,type)}}this.logEvent(collection,properties,callback)};Rakam.prototype.isReturningUser=function(){return this._returningUser};var gapMillis=0;var startTime=(new Date).getTime();var idleTime;Rakam.prototype.startTimer=function(saveOnClose){startTime=(new Date).getTime();ifvisible.on("idle",function(){idleTime=(new Date).getTime()});ifvisible.on("wakeup",function(){gapMillis+=(new Date).getTime()-idleTime;idleTime=null});if(saveOnClose){var func;if(window.onbeforeunload!==null){func=window.onbeforeunload}var _this=this;window.onbeforeunload=function(e){Cookie.set("_rakam_time",_this.getTimeOnPage());if(func){func(e)}}}};Rakam.prototype.getTimeOnPage=function(){return((idleTime>0?idleTime:(new Date).getTime())-startTime-gapMillis)/1e3};Rakam.prototype.getTimeOnPreviousPage=function(){return Cookie.get("_rakam_time")};Rakam.prototype.nextEventId=function(){this._eventId++;return this._eventId};Rakam.prototype._sendEventsIfReady=function(callback){if(this._unsentEvents.length===0){return false}if(!this.options.batchEvents){this.sendEvents(callback);return true}if(this._unsentEvents.length>=this.options.eventUploadThreshold){this.sendEvents(callback);return true}setTimeout(this.sendEvents.bind(this),this.options.eventUploadPeriodMillis);return false};var _loadCookieData=function(scope){var cookieData=Cookie.get(scope.options.cookieName);if(cookieData){if(cookieData.deviceId){scope.options.deviceId=cookieData.deviceId}if(cookieData.userId){scope.options.userId=cookieData.userId}if(cookieData.superProps){scope.options.superProperties=cookieData.superProps}if(cookieData.optOut!==undefined){scope.options.optOut=cookieData.optOut}if(cookieData.deviceIdCreatedAt!==undefined){scope.deviceIdCreatedAt=new Date(parseInt(cookieData.deviceIdCreatedAt))}}};var _saveCookieData=function(scope){Cookie.set(scope.options.cookieName,{deviceId:scope.options.deviceId,deviceIdCreatedAt:scope.deviceIdCreatedAt?scope.deviceIdCreatedAt.getTime():undefined,userId:scope.options.userId,superProps:scope.options.superProperties,optOut:scope.options.optOut})};Rakam._getUtmParam=function(name,query){name=name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");var regex=new RegExp("[\\?&]"+name+"=([^&#]*)");var results=regex.exec(query);return results===null?undefined:decodeURIComponent(results[1].replace(/\+/g," "))};Rakam._getUtmData=function(rawCookie,query){var cookie=rawCookie?"?"+rawCookie.split(".").slice(-1)[0].replace(/\|/g,"&"):"";var fetchParam=function(queryName,query,cookieName,cookie){return Rakam._getUtmParam(queryName,query)||Rakam._getUtmParam(cookieName,cookie)};return{utm_source:fetchParam("utm_source",query,"utmcsr",cookie),utm_medium:fetchParam("utm_medium",query,"utmcmd",cookie),utm_campaign:fetchParam("utm_campaign",query,"utmccn",cookie),utm_term:fetchParam("utm_term",query,"utmctr",cookie),utm_content:fetchParam("utm_content",query,"utmcct",cookie)}};Rakam.prototype._initUtmData=function(queryParams,cookieParams){queryParams=queryParams||location.search;cookieParams=cookieParams||Cookie.get("__utmz");this._utmProperties=Rakam._getUtmData(cookieParams,queryParams)};Rakam.prototype._initTrackForms=function(){var _this=this;document.addEventListener("submit",function(event){var targetElement=event.target||event.srcElement;var collection=targetElement.getAttribute("rakam-event-form");if(targetElement.tagName==="FORM"&&collection){var properties={};var extraAttributes=targetElement.getAttribute("rakam-event-extra");if(extraAttributes!==null){for(var key in JSON.parse(extraAttributes)){if(extraAttributes.hasOwnProperty(key)){properties[key]=extraAttributes[key]}}}for(var i=0;i<targetElement.elements.length;i++){var element=targetElement.elements[i];var type=element.getAttribute("rakam-event-attribute-type");var formElemType;if(element.hasAttribute("type")){formElemType=element.getAttribute("type").toLowerCase()}if(formElemType==="password"){continue}if(type===null&&element.tagName==="INPUT"&&formElemType==="number"){type="long"}if(element.hasAttribute("rakam-event-form-element-ignore")){continue}var attribute;if(element.hasAttribute("rakam-event-attribute")){attribute=element.getAttribute("rakam-event-attribute")}else{attribute=element.getAttribute("name")}if(element.hasAttribute("rakam-event-attribute-value")){properties[attribute]=transformValue(this,attribute,element.getAttribute("rakam-event-attribute-value"),type)}else if(element.tagName==="SELECT"){properties[attribute]=transformValue(this,attribute,element.options[element.selectedIndex].value,type)}else if(element.tagName==="INPUT"||element.tagName==="TEXTAREA"){properties[attribute]=transformValue(this,attribute,element.value,type)}else{_this.log("Couldn't get value of form element: "+attribute)}}_this.logEvent(collection,properties)}})};Rakam.prototype._initTrackClicks=function(){var _this=this;document.addEventListener("click",function(event){var targetElement=event.target||event.srcElement;var collection=targetElement.getAttribute("rakam-event-track");if(targetElement.tagName==="FORM"&&collection){var properties={};var extraAttributes=targetElement.getAttribute("rakam-event-properties");if(extraAttributes!==null){for(var key in JSON.parse(extraAttributes)){if(extraAttributes.hasOwnProperty(key)){properties[key]=extraAttributes[key]}}}_this.logEvent(collection,properties)}})};Rakam.prototype.saveEvents=function(){try{localStorage.setItem(this.options.unsentKey,JSON.stringify(this._unsentEvents))}catch(e){this.log(e)}};Rakam.prototype.setDomain=function(domain){try{Cookie.options({domain:domain});this.options.domain=Cookie.options().domain;_loadCookieData(this);_saveCookieData(this);this.log("set domain="+domain)}catch(e){this.log(e)}};Rakam.prototype.setUserId=function(userId){try{var previousId=this.options.deviceId;this.options.userId=userId!==undefined&&userId!==null&&""+userId||null;if(userId!==null&&userId!==""&&userId!==undefined&&(this._eventId>0&&(previousId===null||previousId===undefined)||previousId!==null&&previousId!==undefined)){var _this=this;this.User()._merge(previousId,this.deviceIdCreatedAt,function(){_this.deviceIdCreatedAt=null;_saveCookieData(_this)})}_saveCookieData(this);this.log("set userId="+userId)}catch(e){this.log(e)}};Rakam.prototype.setUserProperties=function(parameters){try{return(new this.User).set(parameters)}catch(e){this.log(e)}};Rakam.prototype.getUserId=function(){return this.options.userId};Rakam.prototype.getDeviceId=function(){return this._eventId>0?this.options.deviceId:null};Rakam.prototype.setOptOut=function(enable){try{this.options.optOut=enable;_saveCookieData(this);this.log("set optOut="+enable)}catch(e){this.log(e)}};Rakam.prototype.setDeviceId=function(deviceId){try{if(deviceId){this.options.deviceId=""+deviceId;_saveCookieData(this)}}catch(e){this.log(e)}};Rakam.prototype.setSuperProperties=function(eventProps,opt_replace){try{this.options.superProperties=this.options.superProperties||{};for(var property in eventProps){if(eventProps.hasOwnProperty(property)){if(opt_replace===false&&this.options.superProperties[property]!==undefined){continue}this.options.superProperties[property]=eventProps[property]}}_saveCookieData(this);this.log("set super properties="+JSON.stringify(eventProps))}catch(e){this.log(e)}};Rakam.prototype.setVersionName=function(versionName){try{this.options.versionName=versionName;this.log("set versionName="+versionName)}catch(e){this.log(e)}};Rakam.prototype._logEvent=function(eventType,eventProperties,apiProperties,callback){if(typeof callback!=="function"){callback=null}if(!eventType||this.options.optOut){if(callback){callback(0,"No request sent")}return}try{var eventTime=(new Date).getTime();var eventId=this.nextEventId();if(!this._sessionId||!this._lastEventTime||eventTime-this._lastEventTime>this.options.sessionTimeout){this._sessionId=eventTime;localStorage.setItem(LocalStorageKeys.SESSION_ID,this._sessionId)}this._lastEventTime=eventTime;localStorage.setItem(LocalStorageKeys.LAST_EVENT_TIME,this._lastEventTime);localStorage.setItem(LocalStorageKeys.LAST_ID,eventId);apiProperties=apiProperties||{};eventProperties=eventProperties||{};object.merge(eventProperties,this._utmProperties);var event={collection:eventType,properties:{_device_id:this.options.deviceId,_user:this.options.userId,_time:parseInt(eventTime/1e3)*1e3,_session_id:this._sessionId||-1,_platform:this.options.platform,_language:this.options.language}};object.merge(event.properties,this.options.superProperties);object.merge(event.properties,apiProperties);object.merge(event.properties,eventProperties);this.log("logged eventType="+eventType+", properties="+JSON.stringify(eventProperties));this._unsentEvents.push({id:eventId,event:event});if(this._unsentEvents.length>this.options.savedMaxCount){this._unsentEvents.splice(0,this._unsentEvents.length-this.options.savedMaxCount)}if(this.options.saveEvents){this.saveEvents()}if(!this._sendEventsIfReady(callback)&&callback){callback(0,"No request sent")}return eventId}catch(e){this.log(e)}};Rakam.prototype.logEvent=function(eventType,eventProperties,callback){return this._logEvent(eventType,eventProperties,null,callback)};Rakam.prototype.removeEvents=function(maxEventId,errors){var filteredEvents=[];var errorList=errors||[];for(var i=0;i<this._unsentEvents.length;i++){var id=this._unsentEvents[i].id;if(errorList.indexOf(id)>-1||id>maxEventId){filteredEvents.push(this._unsentEvents[i])}}this._unsentEvents=filteredEvents};Rakam.prototype.sendEvents=function(callback){var _this=this;if(!this._sending&&!this.options.optOut&&this._unsentEvents.length>0){this._sending=true;var url=("https:"===window.location.protocol?"https":"http")+"://"+this.options.apiEndpoint+this.options.eventEndpointPath;var numEvents=Math.min(this._unsentEvents.length,this.options.uploadBatchSize);var maxEventId=this._unsentEvents[numEvents-1].id;this._unsentEvents.slice(0,numEvents);var events=this._unsentEvents.slice(0,numEvents).map(function(e){return e.event});var upload_time=(new Date).getTime();var api={upload_time:upload_time,api_version:API_VERSION,api_key:this.options.apiKey};var scope=this;new Request(url,{api:api,events:events}).send(function(status,response,headers){scope._sending=false;try{if(status===200||status===409){_this.log("successful upload");scope.removeEvents(maxEventId,status===409?JSON.parse(response):null);if(scope.options.saveEvents){scope.saveEvents()}if(!scope._sendEventsIfReady(callback)&&callback){callback(status,response)}}else if(status===413){_this.log("request too large");if(scope.options.uploadBatchSize===1){scope.removeEvents(maxEventId)}scope.options.uploadBatchSize=Math.ceil(numEvents/2);scope.sendEvents(callback)}else if(callback){callback(status,response)}}catch(e){_this.log("failed upload")}if(scope.options.eventCallbacks){try{for(var i=0;i<scope.options.eventCallbacks.length;i++){scope.options.eventCallbacks[i](status,response,headers)}}catch(e){_this.log("callback throws an exception",e)}}})}else if(callback){callback(0,"No request sent")}};Rakam.prototype.onload=function(callback){var _this=this;setTimeout(function(){callback();_this.log("executed callback",callback)},1)};Rakam.prototype.runQueuedFunctions=function(){for(var i=0;i<this._q.length;i++){var fn=this[this._q[i][0]];if(fn&&type(fn)==="function"){fn.apply(this,this._q[i].slice(1))}}this._q=[]};Rakam.prototype.__VERSION__=version;module.exports=Rakam},{"./cookie":3,json:4,"./language":5,"./localstorage":6,object:7,"./xhr":8,"./uuid":9,"./version":10,"./user":11,"../node_modules/ifvisible.js/src/ifvisible.js":12,"./type":13}],3:[function(require,module,exports){var Base64=require("./base64");var JSON=require("json");var topDomain=require("top-domain");var _options={expirationDays:undefined,domain:undefined};var reset=function(){_options={}};var options=function(opts){if(arguments.length===0){return _options}opts=opts||{};_options.expirationDays=opts.expirationDays;var domain=opts.domain!==undefined?opts.domain:"."+topDomain(window.location.href);var token=Math.random();_options.domain=domain;set("rakam_test",token);var stored=get("rakam_test");if(!stored||stored!==token){domain=null}remove("rakam_test");_options.domain=domain};var _domainSpecific=function(name){var suffix="";if(_options.domain){suffix=_options.domain.charAt(0)==="."?_options.domain.substring(1):_options.domain}return name+suffix};var get=function(name){try{var nameEq=_domainSpecific(name)+"=";var ca=document.cookie.split(";");var value=null;for(var i=0;i<ca.length;i++){var c=ca[i];while(c.charAt(0)===" "){c=c.substring(1,c.length)}if(c.indexOf(nameEq)===0){value=c.substring(nameEq.length,c.length);break}}if(value){return JSON.parse(Base64.decode(value))}return null}catch(e){return null}};var set=function(name,value){try{_set(_domainSpecific(name),Base64.encode(JSON.stringify(value)),_options);return true}catch(e){return false}};var _set=function(name,value,opts){var expires=value!==null?opts.expirationDays:-1;if(expires){var date=new Date;date.setTime(date.getTime()+expires*24*60*60*1e3);expires=date}var str=name+"="+value;if(expires){str+="; expires="+expires.toUTCString()}str+="; path=/";if(opts.domain){str+="; domain="+opts.domain}document.cookie=str};var remove=function(name){try{_set(_domainSpecific(name),null,_options);return true}catch(e){return false}};module.exports={reset:reset,options:options,get:get,set:set,remove:remove}},{"./base64":14,json:4,"top-domain":15}],14:[function(require,module,exports){var UTF8=require("./utf8");var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(input){try{if(window.btoa&&window.atob){return window.btoa(unescape(encodeURIComponent(input)))}}catch(e){}return Base64._encode(input)},_encode:function(input){var output="";var chr1,chr2,chr3,enc1,enc2,enc3,enc4;var i=0;input=UTF8.encode(input);while(i<input.length){chr1=input.charCodeAt(i++);chr2=input.charCodeAt(i++);chr3=input.charCodeAt(i++);enc1=chr1>>2;enc2=(chr1&3)<<4|chr2>>4;enc3=(chr2&15)<<2|chr3>>6;enc4=chr3&63;if(isNaN(chr2)){enc3=enc4=64}else if(isNaN(chr3)){enc4=64}output=output+Base64._keyStr.charAt(enc1)+Base64._keyStr.charAt(enc2)+Base64._keyStr.charAt(enc3)+Base64._keyStr.charAt(enc4)}return output},decode:function(input){try{if(window.btoa&&window.atob){return decodeURIComponent(escape(window.atob(input)))}}catch(e){}return Base64._decode(input)},_decode:function(input){var output="";var chr1,chr2,chr3;var enc1,enc2,enc3,enc4;var i=0;input=input.replace(/[^A-Za-z0-9\+\/\=]/g,"");while(i<input.length){enc1=Base64._keyStr.indexOf(input.charAt(i++));enc2=Base64._keyStr.indexOf(input.charAt(i++));enc3=Base64._keyStr.indexOf(input.charAt(i++));enc4=Base64._keyStr.indexOf(input.charAt(i++));chr1=enc1<<2|enc2>>4;chr2=(enc2&15)<<4|enc3>>2;chr3=(enc3&3)<<6|enc4;output=output+String.fromCharCode(chr1);if(enc3!==64){output=output+String.fromCharCode(chr2)}if(enc4!==64){output=output+String.fromCharCode(chr3)}}output=UTF8.decode(output);return output}};module.exports=Base64},{"./utf8":16}],16:[function(require,module,exports){var UTF8={encode:function(s){var utftext="";for(var n=0;n<s.length;n++){var c=s.charCodeAt(n);if(c<128){utftext+=String.fromCharCode(c)}else if(c>127&&c<2048){utftext+=String.fromCharCode(c>>6|192);utftext+=String.fromCharCode(c&63|128)}else{utftext+=String.fromCharCode(c>>12|224);utftext+=String.fromCharCode(c>>6&63|128);utftext+=String.fromCharCode(c&63|128)}}return utftext},decode:function(utftext){var s="";var i=0;var c=0,c1=0,c2=0;while(i<utftext.length){c=utftext.charCodeAt(i);if(c<128){s+=String.fromCharCode(c);i++}else if(c>191&&c<224){c1=utftext.charCodeAt(i+1);s+=String.fromCharCode((c&31)<<6|c1&63);i+=2}else{c1=utftext.charCodeAt(i+1);c2=utftext.charCodeAt(i+2);s+=String.fromCharCode((c&15)<<12|(c1&63)<<6|c2&63);i+=3}}return s}};module.exports=UTF8},{}],4:[function(require,module,exports){var json=window.JSON||{};var stringify=json.stringify;var parse=json.parse;module.exports=parse&&stringify?JSON:require("json-fallback")},{"json-fallback":17}],17:[function(require,module,exports){(function(){"use strict";var JSON=module.exports={};function f(n){return n<10?"0"+n:n}if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(){return this.valueOf()}}var cx,escapable,gap,indent,meta,rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key)}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==="[object Array]"){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||"null"}v=partial.length===0?"[]":gap?"[\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"]":"["+partial.join(",")+"]";gap=mind;return v}if(rep&&typeof rep==="object"){length=rep.length;for(i=0;i<length;i+=1){if(typeof rep[i]==="string"){k=rep[i];v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}else{for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}v=partial.length===0?"{}":gap?"{\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"}":"{"+partial.join(",")+"}";gap=mind;return v}}if(typeof JSON.stringify!=="function"){escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;meta={"\b":"\\b"," ":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"};JSON.stringify=function(value,replacer,space){var i;gap="";indent="";if(typeof space==="number"){for(i=0;i<space;i+=1){indent+=" "}}else if(typeof space==="string"){indent=space}rep=replacer;if(replacer&&typeof replacer!=="function"&&(typeof replacer!=="object"||typeof replacer.length!=="number")){throw new Error("JSON.stringify")}return str("",{"":value})}}if(typeof JSON.parse!=="function"){cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==="object"){for(k in value){if(Object.prototype.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof reviver==="function"?walk({"":j},""):j}throw new SyntaxError("JSON.parse")}}})()},{}],15:[function(require,module,exports){var parse=require("url").parse;module.exports=domain;var regexp=/[a-z0-9][a-z0-9\-]*[a-z0-9]\.[a-z\.]{2,6}$/i;function domain(url){var host=parse(url).hostname;var match=host.match(regexp);return match?match[0]:""}},{url:18}],18:[function(require,module,exports){exports.parse=function(url){var a=document.createElement("a");a.href=url;return{href:a.href,host:a.host||location.host,port:"0"===a.port||""===a.port?port(a.protocol):a.port,hash:a.hash,hostname:a.hostname||location.hostname,pathname:a.pathname.charAt(0)!="/"?"/"+a.pathname:a.pathname,protocol:!a.protocol||":"==a.protocol?location.protocol:a.protocol,search:a.search,query:a.search.slice(1)}};exports.isAbsolute=function(url){return 0==url.indexOf("//")||!!~url.indexOf("://")};exports.isRelative=function(url){return!exports.isAbsolute(url)};exports.isCrossDomain=function(url){url=exports.parse(url);var location=exports.parse(window.location.href);return url.hostname!==location.hostname||url.port!==location.port||url.protocol!==location.protocol};function port(protocol){switch(protocol){case"http:":return 80;case"https:":return 443;default:return location.port}}},{}],5:[function(require,module,exports){var getLanguage=function(){return navigator&&(navigator.languages&&navigator.languages[0]||navigator.language||navigator.userLanguage)||undefined};module.exports={language:getLanguage()}},{}],6:[function(require,module,exports){var localStorage;function windowLocalStorageAvailable(){var uid=new Date;var result;try{window.localStorage.setItem(uid,uid);result=window.localStorage.getItem(uid)===String(uid);window.localStorage.removeItem(uid);return result}catch(e){}return false}if(windowLocalStorageAvailable()){localStorage=window.localStorage}else if(window.globalStorage){try{localStorage=window.globalStorage[window.location.hostname]}catch(e){}}else{var div=document.createElement("div"),attrKey="localStorage";div.style.display="none";document.getElementsByTagName("head")[0].appendChild(div);if(div.addBehavior){div.addBehavior("#default#userdata");localStorage={length:0,setItem:function(k,v){div.load(attrKey);if(!div.getAttribute(k)){this.length++}div.setAttribute(k,v);div.save(attrKey)},getItem:function(k){div.load(attrKey);return div.getAttribute(k)},removeItem:function(k){div.load(attrKey);if(div.getAttribute(k)){this.length--}div.removeAttribute(k);div.save(attrKey)},clear:function(){div.load(attrKey);var i=0;var attr;while(attr=div.XMLDocument.documentElement.attributes[i++]){div.removeAttribute(attr.name)}div.save(attrKey);this.length=0},key:function(k){div.load(attrKey);return div.XMLDocument.documentElement.attributes[k]}};div.load(attrKey);localStorage.length=div.XMLDocument.documentElement.attributes.length}else{}}if(!localStorage){localStorage={length:0,setItem:function(k,v){},getItem:function(k){},removeItem:function(k){},clear:function(){},key:function(k){}}}module.exports=localStorage},{}],7:[function(require,module,exports){var has=Object.prototype.hasOwnProperty;exports.keys=Object.keys||function(obj){var keys=[];for(var key in obj){if(has.call(obj,key)){keys.push(key)}}return keys};exports.values=function(obj){var vals=[];for(var key in obj){if(has.call(obj,key)){vals.push(obj[key])}}return vals};exports.merge=function(a,b){for(var key in b){if(has.call(b,key)){a[key]=b[key]}}return a};exports.length=function(obj){return exports.keys(obj).length};exports.isEmpty=function(obj){return 0==exports.length(obj)}},{}],8:[function(require,module,exports){var JSON=require("json");var Request=function(url,data,headers){this.url=url;this.data=data||{};this.headers=headers||{}};function parseResponseHeaders(headerStr){var headers={};if(!headerStr){return headers}var headerPairs=headerStr.split("\r\n");for(var i=0;i<headerPairs.length;i++){var headerPair=headerPairs[i];var index=headerPair.indexOf(": ");if(index>0){var key=headerPair.substring(0,index);var val=headerPair.substring(index+2);headers[key]=val}}return headers}Request.prototype.send=function(callback){var isIE=window.XDomainRequest?true:false;if(isIE){var xdr=new window.XDomainRequest;xdr.open("POST",this.url,true);xdr.onload=function(){callback(xdr.responseText)};xdr.send(JSON.stringify(this.data))}else{var xhr=new XMLHttpRequest;xhr.withCredentials="true";xhr.open("POST",this.url,true);xhr.onreadystatechange=function(){if(xhr.readyState===4){callback(xhr.status,xhr.responseText,parseResponseHeaders(xhr.getAllResponseHeaders()))}};xhr.setRequestHeader("Content-Type","text/plain");for(var key in this.headers){
if(this.headers.hasOwnProperty(key)){xhr.setRequestHeader(key,this.headers[key])}}xhr.send(JSON.stringify(this.data))}};module.exports=Request},{json:4}],9:[function(require,module,exports){var uuid=function(a){return a?(a^Math.random()*16>>a/4).toString(16):([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g,uuid)};module.exports=uuid},{}],10:[function(require,module,exports){module.exports="undefined"},{}],11:[function(require,module,exports){var type=require("./type");var Request=require("./xhr");var API_VERSION=1;var wrapCallback=function(operation,props,callback){return function(status,response,headers){if(callback!==undefined){callback(status,response,headers)}}};var getUrl=function(options){return("https:"===window.location.protocol?"https":"http")+"://"+options.apiEndpoint+"/user"};var User=function(){};User.prototype.init=function(options){this.options=options};User.prototype.set=function(properties,callback){new Request(getUrl(this.options)+"/set_properties",{api:{api_version:API_VERSION,api_key:this.options.apiKey},id:this.options.userId,properties:properties}).send(wrapCallback("set_properties",properties,callback));return this};User.prototype._merge=function(deviceId,createdAt,callback){new Request(getUrl(this.options)+"/merge",{api:{api_version:API_VERSION,api_key:this.options.apiKey,upload_time:(new Date).getTime()},anonymous_id:deviceId,id:this.options.userId,created_at:createdAt?createdAt.getTime():null,merged_at:(new Date).getTime()}).send(wrapCallback("merge",null,callback));return this};User.prototype.setOnce=function(properties,callback){new Request(getUrl(this.options)+"/set_properties_once",{api:{api_version:API_VERSION,api_key:this.options.apiKey},id:this.options.userId,properties:properties}).send(wrapCallback("set_properties_once",properties,callback));return this};User.prototype.increment=function(property,value,callback){new Request(getUrl(this.options)+"/increment_property",{api:{api_version:API_VERSION,api_key:this.options.apiKey},id:this.options.userId,property:property,value:value}).send(wrapCallback("increment_property",property+" by "+value,callback));return this};User.prototype.unset=function(properties,callback){new Request(getUrl(this.options)+"/unset_properties",{api:{api_version:API_VERSION,api_key:this.options.apiKey},id:this.options.userId,properties:type(properties)==="array"?properties:[properties]}).send(wrapCallback("unset_properties",properties,callback));return this};module.exports=User},{"./type":13,"./xhr":8}],13:[function(require,module,exports){var toString=Object.prototype.toString;module.exports=function(val){switch(toString.call(val)){case"[object Date]":return"date";case"[object RegExp]":return"regexp";case"[object Arguments]":return"arguments";case"[object Array]":return"array";case"[object Error]":return"error"}if(val===null){return"null"}if(val===undefined){return"undefined"}if(val!==val){return"nan"}if(val&&val.nodeType===1){return"element"}if(typeof Buffer!=="undefined"&&Buffer.isBuffer(val)){return"buffer"}val=val.valueOf?val.valueOf():Object.prototype.valueOf.apply(val);return typeof val}},{}],12:[function(require,module,exports){(function(){(function(root,factory){if(typeof define==="function"&&define.amd){return define(function(){return factory()})}else if(typeof exports==="object"){return module.exports=factory()}else{return root.ifvisible=factory()}})(this,function(){var addEvent,customEvent,doc,fireEvent,hidden,idleStartedTime,idleTime,ie,ifvisible,init,initialized,status,trackIdleStatus,visibilityChange;ifvisible={};doc=document;initialized=false;status="active";idleTime=6e4;idleStartedTime=false;customEvent=function(){var S4,addCustomEvent,cgid,fireCustomEvent,guid,listeners,removeCustomEvent;S4=function(){return((1+Math.random())*65536|0).toString(16).substring(1)};guid=function(){return S4()+S4()+"-"+S4()+"-"+S4()+"-"+S4()+"-"+S4()+S4()+S4()};listeners={};cgid="__ceGUID";addCustomEvent=function(obj,event,callback){obj[cgid]=undefined;if(!obj[cgid]){obj[cgid]="ifvisible.object.event.identifier"}if(!listeners[obj[cgid]]){listeners[obj[cgid]]={}}if(!listeners[obj[cgid]][event]){listeners[obj[cgid]][event]=[]}return listeners[obj[cgid]][event].push(callback)};fireCustomEvent=function(obj,event,memo){var ev,j,len,ref,results;if(obj[cgid]&&listeners[obj[cgid]]&&listeners[obj[cgid]][event]){ref=listeners[obj[cgid]][event];results=[];for(j=0,len=ref.length;j<len;j++){ev=ref[j];results.push(ev(memo||{}))}return results}};removeCustomEvent=function(obj,event,callback){var cl,i,j,len,ref;if(callback){if(obj[cgid]&&listeners[obj[cgid]]&&listeners[obj[cgid]][event]){ref=listeners[obj[cgid]][event];for(i=j=0,len=ref.length;j<len;i=++j){cl=ref[i];if(cl===callback){listeners[obj[cgid]][event].splice(i,1);return cl}}}}else{if(obj[cgid]&&listeners[obj[cgid]]&&listeners[obj[cgid]][event]){return delete listeners[obj[cgid]][event]}}};return{add:addCustomEvent,remove:removeCustomEvent,fire:fireCustomEvent}}();addEvent=function(){var setListener;setListener=false;return function(el,ev,fn){if(!setListener){if(el.addEventListener){setListener=function(el,ev,fn){return el.addEventListener(ev,fn,false)}}else if(el.attachEvent){setListener=function(el,ev,fn){return el.attachEvent("on"+ev,fn,false)}}else{setListener=function(el,ev,fn){return el["on"+ev]=fn}}}return setListener(el,ev,fn)}}();fireEvent=function(element,event){var evt;if(doc.createEventObject){return element.fireEvent("on"+event,evt)}else{evt=doc.createEvent("HTMLEvents");evt.initEvent(event,true,true);return!element.dispatchEvent(evt)}};ie=function(){var all,check,div,undef,v;undef=void 0;v=3;div=doc.createElement("div");all=div.getElementsByTagName("i");check=function(){return div.innerHTML="<!--[if gt IE "+ ++v+"]><i></i><![endif]-->",all[0]};while(check()){continue}if(v>4){return v}else{return undef}}();hidden=false;visibilityChange=void 0;if(typeof doc.hidden!=="undefined"){hidden="hidden";visibilityChange="visibilitychange"}else if(typeof doc.mozHidden!=="undefined"){hidden="mozHidden";visibilityChange="mozvisibilitychange"}else if(typeof doc.msHidden!=="undefined"){hidden="msHidden";visibilityChange="msvisibilitychange"}else if(typeof doc.webkitHidden!=="undefined"){hidden="webkitHidden";visibilityChange="webkitvisibilitychange"}trackIdleStatus=function(){var timer,wakeUp;timer=false;wakeUp=function(){clearTimeout(timer);if(status!=="active"){ifvisible.wakeup()}idleStartedTime=+new Date;return timer=setTimeout(function(){if(status==="active"){return ifvisible.idle()}},idleTime)};wakeUp();addEvent(doc,"mousemove",wakeUp);addEvent(doc,"keyup",wakeUp);addEvent(window,"scroll",wakeUp);ifvisible.focus(wakeUp);return ifvisible.wakeup(wakeUp)};init=function(){var blur;if(initialized){return true}if(hidden===false){blur="blur";if(ie<9){blur="focusout"}addEvent(window,blur,function(){return ifvisible.blur()});addEvent(window,"focus",function(){return ifvisible.focus()})}else{addEvent(doc,visibilityChange,function(){if(doc[hidden]){return ifvisible.blur()}else{return ifvisible.focus()}},false)}initialized=true;return trackIdleStatus()};ifvisible={setIdleDuration:function(seconds){return idleTime=seconds*1e3},getIdleDuration:function(){return idleTime},getIdleInfo:function(){var now,res;now=+new Date;res={};if(status==="idle"){res.isIdle=true;res.idleFor=now-idleStartedTime;res.timeLeft=0;res.timeLeftPer=100}else{res.isIdle=false;res.idleFor=now-idleStartedTime;res.timeLeft=idleStartedTime+idleTime-now;res.timeLeftPer=(100-res.timeLeft*100/idleTime).toFixed(2)}return res},focus:function(callback){if(typeof callback==="function"){return this.on("focus",callback)}status="active";customEvent.fire(this,"focus");customEvent.fire(this,"wakeup");return customEvent.fire(this,"statusChanged",{status:status})},blur:function(callback){if(typeof callback==="function"){return this.on("blur",callback)}status="hidden";customEvent.fire(this,"blur");customEvent.fire(this,"idle");return customEvent.fire(this,"statusChanged",{status:status})},idle:function(callback){if(typeof callback==="function"){return this.on("idle",callback)}status="idle";customEvent.fire(this,"idle");return customEvent.fire(this,"statusChanged",{status:status})},wakeup:function(callback){if(typeof callback==="function"){return this.on("wakeup",callback)}status="active";customEvent.fire(this,"wakeup");return customEvent.fire(this,"statusChanged",{status:status})},on:function(name,callback){init();return customEvent.add(this,name,callback)},off:function(name,callback){init();return customEvent.remove(this,name,callback)},onEvery:function(seconds,callback){var paused,t;init();paused=false;if(callback){t=setInterval(function(){if(status==="active"&&paused===false){return callback()}},seconds*1e3)}return{stop:function(){return clearInterval(t)},pause:function(){return paused=true},resume:function(){return paused=false},code:t,callback:callback}},now:function(check){init();return status===(check||"active")}};return ifvisible})}).call(this)},{}]},{},{1:""}));