| 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);    };})();   
 |