123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479 |
- // use this to isolate the scope
- (function() {
- if(!$axure.document.configuration.showRecordPlay) { return; }
- $(window.document).ready(function() {
- $axure.player.createPluginHost({
- id: 'recordPlayHost',
- context: 'interface',
- title: 'Recording'
- });
- _generateRecordPlay();
- $('#recordButton').click(_recordClick);
- $('#playButton').click(_playClick);
- $('#stopButton').click(_stopClick);
- $('#deleteButton').click(_deleteClick);
- // bind to the page load
- $axure.page.bind('load.page_notes', function() {
-
- $.ajax({
- type: "POST",
- url: '/RecordController/ListRecordings',
- success: function(response) {
- $('#recordNameHeader').html("");
- $('#recordPlayContent').html("");
- //populate the notes
-
- axRecordingList = [];
- if(!eventList) {
- recordingIndex = 0;
- eventList = [];
- recordingStartTime = 0;
- bulkEventElement = "";
- lastBulkEvent = {};
- }
- for(var idx in response.recordingList) {
- getOneRecording(response.recordingList[idx]);
- }
- return false;
- },
- // dataType: 'json'
- });
- });
- });
-
- var nameMatcher = new RegExp("^axRecording[0-9]{4}$", "i");
- var indexMatcher = new RegExp("[0-9]{4}$", "i");
- var convertFromJson = function(oneRecording) {
-
- if(nameMatcher.exec(oneRecording.recordingName)) {
- var myArray = indexMatcher.exec(oneRecording.recordingName);
- var currIdx = parseInt(myArray);
- if(recordingIndex < currIdx) {
- recordingIndex = currIdx;
- }
- }
-
- for(var idx in oneRecording.eventList) {
- var thisEvent = oneRecording.eventList[idx];
- thisEvent.eventInfo = {};
- thisEvent.eventInfo.srcElement = thisEvent.elementID;
- // TODO: check that this is correct.
- if(isBulkMouse(thisEvent.eventType)) {
- thisEvent.eventInfo.mousePositions = [];
- thisEvent.eventInfo.mousePositions = thisEvent.mousePositions;
- thisEvent.timeStamp = thisEvent.mousePositions[0].timeStamp;
- }
- if(isSingleMouse(thisEvent.eventType)) {
- thisEvent.eventInfo.cursor = {};
- thisEvent.eventInfo.cursor = thisEvent.cursor;
-
- }
- if(thisEvent.eventType === 'OnDrag') {
- thisEvent.eventInfo.dragInfo = {};
- thisEvent.eventInfo.dragInfo = thisEvent.dragInfo;
- thisEvent.timeStamp = thisEvent.dragInfo.startTime;
- }
- }
- return oneRecording;
- };
- var getOneRecording = function(recordingItem) {
- $.ajax({
- type: "POST",
- url: '/RecordController/GetRecording',
- data: { 'recordingId': recordingItem.recordingId },
- success: function(response) {
- axRecordingList[axRecordingList.length] = convertFromJson(response);
- var axRecordingContainer = $('#recordingContainer').find('li').filter('.recordingRootNode');
- axRecordingContainer.append(_formAxRecordingBranch(response));
- _attachEventTriggers(response);
- }, // dataType: 'json'
- });
- };
-
- var axRecordingList;
- var eventList;
- var recordingIndex;
- var recordingStartTime;
- var recordingId;
- var recordingName;
- var leadingZeros = function(number, digits) { // because this thing doesn't have string.format (or does it?)
- var recurseLeadingZeros = function(number, digitsLeft) {
- if(digitsLeft > 0) {
- return recurseLeadingZeros("0" + number, digitsLeft - 1);
- } else {
- return number;
- }
- };
- return recurseLeadingZeros(number, digits - String(number).length);
- };
-
- var generateRecordingName = function() {
- return "axRecording" + leadingZeros(recordingIndex, 4);
- };
- var isSingleMouse = function(eventType) {
- return (eventType === 'OnClick' ||
- eventType === 'OnMouseUp' ||
- eventType === 'OnMouseDown' ||
- eventType === 'OnMouseOver' ||
- eventType === 'OnKeyUp' ||
- eventType === 'OnSelectedChange' ||
- eventType === 'OnSelect' ||
- eventType === 'OnUnselect' ||
- eventType === 'OnTextChange' ||
- eventType === 'OnMouseOut');
- };
- var isBulkMouse = function(eventType) {
- return (eventType === 'OnMouseHover' ||
- eventType === 'OnMouseMove');
- };
- var bulkEventElement;
- var lastBulkEvent;
- $axure.messageCenter.addMessageListener(function(message, eventData) {
- var lastEvent, lastBulkData;
-
- if(message === 'logEvent') {
-
- if(bulkEventElement !== eventData.elementID) {
- lastBulkEvent = {};
- bulkEventElement = eventData.elementID;
- }
-
- if(isBulkMouse(eventData.eventType)) {
- lastEvent = lastBulkEvent[eventData.eventType];
- if(lastEvent) {
- // this is the second or third or whatever onmousemove in a row
- lastBulkData = lastEvent.eventInfo.mousePositions;
- lastBulkData[lastBulkData.length] = {
- cursor: eventData.eventInfo.cursor,
- timeStamp: eventData.timeStamp
- };
- } else {
- eventData.eventInfo.mousePositions = [];
- eventData.eventInfo.mousePositions[0] = {
- cursor: eventData.eventInfo.cursor,
- timeStamp: eventData.timeStamp
- };
- eventList[eventList.length] = eventData;
- lastBulkEvent[eventData.eventType] = eventData;
- }
- } else {
- var z = true;
- }
-
- if(isSingleMouse(eventData.eventType) ) {
- eventList[eventList.length] = eventData;
- lastBulkEvent = {};
- bulkEventElement = eventData.elementID;
- }
- if(eventData.eventType === 'OnDrag') {
- lastEvent = lastBulkEvent[eventData.eventType];
-
- if (lastEvent) {
- // this is the second or third or whatever onmousemove in a row
- lastBulkData = lastEvent.eventInfo.mousePositions;
- lastBulkData[lastBulkData.length] = {
- dragInfo: eventData.eventInfo.dragInfo,
- timeStamp: eventData.timeStamp
- };
- } else {
- eventData.eventInfo.mousePositions = [];
- eventData.eventInfo.mousePositions[0] = {
- dragInfo: eventData.eventInfo.dragInfo,
- timeStamp: eventData.timeStamp
- };
- eventList[eventList.length] = eventData;
- lastBulkEvent[eventData.eventType] = eventData;
- }
- }
- // if(eventData.eventType === 'OnKeyUp') {
- // transmissionFields.eventInfo = eventData.eventInfo;
- // $.ajax({
- // type: "POST",
- // url: '/RecordController/LogMouseClick',
- // data: transmissionFields,
- // });
- // }
- }
- });
-
-
- var _recordClick = function(event) {
- $('#recordButton').addClass('recordPlayButtonSelected');
- recordingIndex++;
- // $axure.recording.startRecord();
- recordingStartTime = new Date().getTime();
- $.ajax({
- type: "POST",
- url: '/RecordController/CreateRecording',
- data: {
- 'recordingName': generateRecordingName(),
- timeStamp: recordingStartTime
- },
- success: function(response) {
- recordingId = response.recordingId;
- recordingName = response.recordingName;
- $axure.messageCenter.postMessage('startRecording', {'recordingId' : recordingId, 'recordingName': recordingName});
- },
- // dataType: 'json'
- });
-
- };
- var _playClick = function(event) {
- $('#playButton').addClass('recordPlayButtonSelected');
- };
- var _stopClick = function(event) {
- var axRecording, axObjectDictionary, axRecordingContainer, transmissionFields;
- $('#sitemapLinksContainer').toggle();
- if($('#recordButton').is('.recordPlayButtonSelected')) {
- $('#recordButton').removeClass('recordPlayButtonSelected');
- // $axure.recording.stopRecord();
- axRecording = {
- 'recordingId' : recordingId,
- 'recordingName': recordingName,
- 'eventList': eventList
- };
-
- axRecordingList[axRecordingList.length] = axRecording;
- axRecordingContainer = $('#recordingContainer').find('li').filter('.recordingRootNode');
- axRecordingContainer.append(_formAxRecordingBranch(axRecording));
- _attachEventTriggers(axRecording);
- lastBulkEvent = {};
- var recordingStepList = [];
- for(var eventListIdx in eventList) {
- var eventListItem = eventList[eventListIdx];
- if(eventListItem.eventType === 'OnDrag') {
- var lastDrag = eventListItem.eventInfo.mousePositions[eventListItem.eventInfo.mousePositions.length - 1].dragInfo;
- eventListItem.eventInfo.dragInfo.currentX = lastDrag.currentX;
- eventListItem.eventInfo.dragInfo.currentY = lastDrag.currentY;
- eventListItem.eventInfo.dragInfo.currentTime = lastDrag.currentTime;
- eventListItem.eventInfo.dragInfo.xDelta = eventListItem.eventInfo.dragInfo.currentX - eventListItem.eventInfo.dragInfo.lastX;
- eventListItem.eventInfo.dragInfo.yDelta = eventListItem.eventInfo.dragInfo.currentY - eventListItem.eventInfo.dragInfo.lastY;
- transmissionFields = {};
- transmissionFields = tackItOn(transmissionFields, eventListItem, ['eventType', 'elementID', 'path']);
- transmissionFields = tackItOn(transmissionFields, eventListItem.eventInfo, ['dragInfo']);
- transmissionFields.recordingId = recordingId;
- }
- if(isSingleMouse(eventListItem.eventType)) {
- transmissionFields = {};
- transmissionFields = tackItOn(transmissionFields, eventListItem, ['timeStamp', 'eventType', 'elementID', 'path']);
- transmissionFields = tackItOn(transmissionFields, eventListItem.eventInfo, ['cursor']);
- transmissionFields.recordingId = recordingId;
- }
- if(isBulkMouse(eventListItem.eventType)) {
- transmissionFields = {};
- transmissionFields = tackItOn(transmissionFields, eventListItem, ['eventType', 'elementID', 'path']);
- transmissionFields = tackItOn(transmissionFields, eventListItem.eventInfo, ['mousePositions']);
- transmissionFields.recordingId = recordingId;
- }
- recordingStepList[recordingStepList.length] = transmissionFields;
- }
- eventList = [];
- $axure.messageCenter.postMessage('stopRecording', axObjectDictionary);
- var jsonText = {
- 'recordingName': recordingName,
- 'recordingId': recordingId,
- recordingStart: new Date().getTime(),
- recordingEnd: recordingStartTime,
- 'eventList': recordingStepList
- };
- $.ajax({
- type: "POST",
- url: '/RecordController/StopRecording',
- data: { 'jsonText': JSON.stringify(jsonText) }
-
- });
- }
- if($('#playButton').is('.recordPlayButtonSelected')) {
- $('#playButton').removeClass('recordPlayButtonSelected');
- }
- };
-
- var _deleteClick = function(event) {
- $.ajax({
- type: "POST",
- url: '/RecordController/DeleteRecordings',
- success: function(response) {
- var x = true;
- }, // dataType: 'json'
- });
- };
- var tackItOn = function(destination, source, fields) {
- for(var idx in fields) {
- destination[fields[idx]] = source[fields[idx]];
- }
- return destination;
- };
- var makeFirstLetterLower = function(eventName) {
- return eventName.substr(0, 1).toLowerCase() + eventName.substr(1);
- };
- var _attachEventTriggers = function(axRecording) {
- for(var eventIdx in axRecording.eventList) {
- var eventObject = axRecording.eventList[eventIdx];
- var eventID = axRecording['recordingId'] + '_' + eventObject.timeStamp;
- currentEvent = eventID;
- $('#' + eventID).click(_triggerEvent(axRecording['recordingId'], eventObject.timeStamp));
- // $('#' + eventID).click(event.trigger);
- }
- };
- var _formAxRecordingBranch = function(axRecording) {
- var eventObject, eventID, RDOID;
- var recordPlayUi = '<ul class="recordingTree">';
- recordPlayUi += "<li class='recordingNode recordingExpandableNode'>";
- recordPlayUi += '<div class="recordingContainer" style="margin-left:15px">';
- recordPlayUi += '<a class="recordingPlusMinusLink"><span class="recordingMinus"></span></a>';
- recordPlayUi += '<a class="recordingPageLink" nodeurl="home.html">';
- recordPlayUi += '<span class="recordingPageIcon"></span>';
- recordPlayUi += '<span class="recordingPageName">' + axRecording['recordingName'] + '</span>';
- recordPlayUi += '</a>';
- recordPlayUi += '<ul>';
- for(eventID in axRecording.eventList) {
- eventObject = axRecording.eventList[eventID];
- recordPlayUi += '<li class="recordingNode recordingLeafNode">';
- recordPlayUi += '<div class="recordingEventContainer" style="margin-left:44px">';
- var eventID = axRecording['recordingId'] + '_' + eventObject.timeStamp;
- recordPlayUi += '<a id="' + eventID + '" class="sitemapPageLink">';
- recordPlayUi += 'Event ID: ' + eventID + '<br/>';
- recordPlayUi += '<span class="sitemapPageIcon"></span>';
- recordPlayUi += '<span class="sitemapPageName">';
- recordPlayUi += 'elementID: ' + eventObject.elementID + '<br/>';
- recordPlayUi += 'eventType: ' + eventObject.eventType + '<br/>';
- // recordPlayUi += 'cursor: ' + eventObject.eventInfo.cursor.x + ',' + eventObject.eventInfo.cursor.y + '<br/>';
- for(RDOID in eventObject.path) {
- recordPlayUi += '/' + eventObject.path[RDOID];
- }
- recordPlayUi += '<br/>';
- recordPlayUi += '</span>';
- recordPlayUi += '</a>';
- recordPlayUi += '</div>';
- recordPlayUi += '</li>';
- }
- recordPlayUi += '</ul>';
- recordPlayUi += '</div>';
- recordPlayUi += "</li>";
- recordPlayUi += "</ul>";
- return recordPlayUi;
- };
- var currentEvent = '';
- var _triggerEvent = function(axRecording, timeStamp) {
- // $axure.messageCenter.postMessage('triggerEvent', false);
- for(var axRecordingIdx in axRecordingList) {
- if(axRecordingList[axRecordingIdx].recordingId === axRecording) {
- for(var eventIdx in axRecordingList[axRecordingIdx].eventList) {
- if(axRecordingList[axRecordingIdx].eventList[eventIdx].timeStamp === timeStamp) {
- var thisEvent = axRecordingList[axRecordingIdx].eventList[eventIdx];
- // thisEvent.trigger();
- var thisEventInfo, lowerEventType;
- lowerEventType = thisEvent.eventType.toLowerCase();
- if(lowerEventType === 'onclick' || lowerEventType === 'onmousein') {
- thisEventInfo = {};
- thisEventInfo = tackItOn(thisEventInfo, thisEvent.eventInfo, ['cursor', 'timeStamp', 'srcElement']);
- if(thisEvent.eventInfo.inputType) {
- thisEventInfo = tackItOn(thisEventInfo, thisEvent.eventInfo, ['inputType', 'inputValue']);
- }
- } else {
- thisEventInfo = thisEvent.eventInfo;
- }
- var thisParameters = {
- 'element': thisEvent.elementID,
- 'eventInfo': thisEventInfo,
- // 'axEventObject': thisEvent.eventObject,
- 'eventType': thisEvent.eventType
- };
- return function() {
- $axure.messageCenter.postMessage('playEvent', thisParameters);
- };
- }
- }
- }
- }
- };
- var _generateRecordPlay = function() {
- var recordPlayUi = "<div id='recordPlayContainer'>";
- recordPlayUi += "<div id='recordPlayToolbar'>";
- recordPlayUi += "<div style='height:30px;'>";
- recordPlayUi += "<a id='recordButton' title='Start a Recording' class='recordPlayButton'></a>";
- recordPlayUi += "<a id='playButton' title='Play Back a Recording' class='recordPlayButton'></a>";
- recordPlayUi += "<a id='stopButton' title='Stop' class='recordPlayButton'></a>";
- recordPlayUi += "<a id='deleteButton' title='Delete All Recordings' class='recordPlayButton'></a>";
- recordPlayUi += "</div>";
- recordPlayUi += "<div id='recordingContainer'><li class='recordingNode recordingRootNode'></li></div>";
- recordPlayUi += "</div>";
- $('#recordPlayHost').html(recordPlayUi);
- };
- })();
|