var Jiffy = function (){
this.addBulkLoad = function(_eventName, elapsedTime){
measures.captured[_eventName] = elapsedTime;	
}
this.getUID = function(){
return Math.round(Math.random() * 1000000000000000);
}
this.checkRemoveEvent = function(eventName){
if(eventsForRemoval[eventName] != null){
var captureDetails = eventsForRemoval[eventName];
WPScript.removeEvent(captureDetails.element_id, captureDetails.browser_event, captureDetails.callback_func, true);
}
}
this.addMarksMeasures = function(referenceID, eventName, elapseTime, refTime){
marks_measures.push({name: referenceID, evt:eventName, et:elapseTime, rt:refTime});
}
var eventsForRemoval = {};
var pageTimer = (window.JiffyParams == undefined) ? (new Date()).getTime():(JiffyParams.jsStart != undefined) ? JiffyParams.jsStart:(new Date()).getTime();
var pname = (window.JiffyParams == undefined) ? window.location:(JiffyParams.pname != undefined) ? JiffyParams.pname:window.location;
var sid = (window.JiffyParams == undefined) ? window.location.hostname:(JiffyParams.sid != undefined) ? JiffyParams.sid:window.location.hostname;
var uid = (window.JiffyParams == undefined) ?  getUID():(JiffyParams.uid != undefined) ? JiffyParams.uid:getUID();
var markers = [];
var measures = {
pn:pname,
st:pageTimer,
uid:uid,
sid:sid,
captured:{}
};
var marks_measures = [];
return{
mark : function(referenceID){
var currTime = (new Date()).getTime();
markers[referenceID] = {startTime: currTime, lastTime: currTime}; 
},
measure : function(eventName, referenceID){
if(Jiffy.options.USE_JIFFY == undefined || !Jiffy.options.USE_JIFFY){return};
var _eventName = (typeof eventName == "string" ? eventName : eventName.type); 
var currTime = new Date().getTime();
var refStartTime;
var elapsedTime;
if(referenceID != null && markers[referenceID] != null) {
refStartTime = markers[referenceID].lastTime;
elapsedTime = currTime - refStartTime;
markers[referenceID].lastTime = currTime;
}
else
{
refStartTime = pageTimer;
elapsedTime = currTime - refStartTime;
}
if(referenceID != null) {
addMarksMeasures(referenceID, _eventName, elapsedTime, refStartTime);
}
else{
markers["PageStart"] = {startTime: refStartTime, lastTime: currTime};
addMarksMeasures("PageStart", _eventName, elapsedTime, refStartTime); 
}
if(Jiffy.options.ISBULKLOAD && _eventName != "unload"){
addBulkLoad(_eventName, elapsedTime);
}
else{
var curMeasures = _eventName+":"+elapsedTime;
WPScript.Ajax.get('/rx',{uid:uid,sid:sid,st:pageTimer,pn:pname,ets:curMeasures});
}
checkRemoveEvent(eventName);
},
_bulkLoad: function(){
var bulkmeasures = Jiffy.getMeasures();
var bulkmeasuresCount = bulkmeasures.length;
var measuresStr = "";
for(x=0;x<bulkmeasuresCount;x++){
measuresStr += bulkmeasures[x].evt +":"+ bulkmeasures[x].et+ ",";
}
measuresStr = measuresStr.replace(/\,$/g,'');
WPScript.Ajax.get('/rx',{uid:uid,sid:sud,st:pageTimer,pn:pname,ets:measuresStr});	
},
getMeasures: function(){
return marks_measures;
},
clearMeasures: function() {
marks_measures = [];
markers = [];
},
capture: function(elemID, browserEvent, eventName, isAutoTrigger){
try{
if(measures.pn == "HOME" || measures.pn == "PERS_FORM"){
var el = document.getElementById(elemID);
var callback = function(){Jiffy.measure(eventName)};
WPScript.on(elemID, browserEvent, callback, true);
eventsForRemoval[eventName] = {element_id:elemID, browser_event:browserEvent, callback_func: callback};
el.focus();  
}
}
catch(e){
if(!Jiffy.options.SOFT_ERRORS){
alert(e.message);
}
}
}
} 
}();
Jiffy.options = {
USE_JIFFY:false,
ISBULKLOAD: false,
BROWSER_EVENTS: {"unload":window,"load":window},
SOFT_ERRORS: false,
THROTTLE: 0
};
Jiffy.init = function(){
if(window.JiffyParams != undefined){WPScript.hashMerge(window.JiffyParams, Jiffy.options);}
var target = Math.round(Math.random()*100);
if(Jiffy.options.THROTTLE === undefined || parseInt(Jiffy.options.THROTTLE) < 1){return;} else 
if(target <= parseInt(Jiffy.options.THROTTLE)){Jiffy.options.USE_JIFFY=true;}
if(Jiffy.options.USE_JIFFY == undefined || !Jiffy.options.USE_JIFFY){return;};
var BROWSER_EVENTS = Jiffy.options.BROWSER_EVENTS;
for (var bEvents in BROWSER_EVENTS)
{
var objToBind = BROWSER_EVENTS[bEvents];
if(objToBind){
WPScript.on(objToBind,bEvents, Jiffy.measure);
}
}
if(Jiffy.options.ISBULKLOAD){
WPScript.on(window, "load", Jiffy._bulkLoad);
}
};
Jiffy.init();
