(function(context,$) { "use strict"; context.JK = context.JK || {}; context.JK.RecordingFinishedDialog = function(app) { var logger = context.JK.logger; var rest = context.JK.Rest(); var playbackControls = null; var recording = null; // deferred object function resetForm() { // remove all display errors $('#recording-finished-dialog form .error-text').remove() $('#recording-finished-dialog form .error').removeClass("error") } function beforeShow() { if(recording == null) { alert("recording data should not be null"); app.layout.closeDialog('recordingFinished'); return false; } resetForm(); var parentSelector = '#recording-finished-dialog div.genre-selector'; context.JK.GenreSelectorHelper.render(parentSelector); // preset genre from 1st genre in current session var currentOrLastSession = JK.CurrentSessionModel.getCurrentOrLastSession(); if(currentOrLastSession && currentOrLastSession.genres.length > 0) { var genreDescription = currentOrLastSession.genres[0]; context.JK.GenreSelectorHelper.setSelectedGenres(parentSelector, [genreDescription]); } var localResults = context.jamClient.GetLocalRecordingState({recordings: [recording]}); if(localResults['error']) { app.notify({ title : "Unable to Open Recording for Playback", text : localResults['error'], icon_url: "/assets/content/icon_alert_big.png" }); } else { var localResult = localResults.recordings[0]; if(localResult.aggregate_state == 'MISSING') { app.notify({ title : "Unable to Open Recording for Playback", text : "All tracks associated with the recording are missing", icon_url: "/assets/content/icon_alert_big.png" }); } else if(localResult.aggregate_state == 'PARTIALLY_MISSING') { app.notify({ title : "Unable to Open Recording for Playback", text: "Some tracks associated with the recording are missing", icon_url: "/assets/content/icon_alert_big.png" }) } else { // load recording var openRecordingResult = context.jamClient.OpenRecording(recording); logger.debug("OpenRecording response: %o", openRecordingResult); if(openRecordingResult.error) { app.notify({ "title": "Can't Open Recording", "text": openRecordingResult.error, "icon_url": "/assets/content/icon_alert_big.png" }); } playbackControls.startMonitor(); } } } function afterHide() { recording = null; playbackControls.stopMonitor(); context.jamClient.CloseRecording(); } function discardRecording(e) { resetForm(); registerDiscardRecordingHandlers(false); rest.discardRecording({ id: recording.id }) .done(function() { console.error("recording discarded by user. recordingId=%o", recording.id); }) .fail(function(jqXHR){ console.error("recording discard by user failed. recordingId=%o. reason: %o", recording.id, jqXHR.responseText); }) .always(function() { app.layout.closeDialog('recordingFinished') registerDiscardRecordingHandlers(true); }) return false; } function claimRecording(e){ resetForm(); registerClaimRecordingHandlers(false); var name = $('#recording-finished-dialog form input[name=name]').val(); var description = $('#recording-finished-dialog form textarea[name=description]').val(); var genre = $('#recording-finished-dialog form select[name=genre]').val(); var is_public = $('#recording-finished-dialog form input[name=is_public]').is(':checked') var is_downloadable = $('#recording-finished-dialog form input[name=is_downloadable]').is(':checked'); rest.claimRecording({ id : recording.id, name: name, description: description, genre: genre, is_public: is_public, is_downloadable: is_downloadable }) .done(function() { app.layout.closeDialog('recordingFinished'); context.JK.GA.trackMakeRecording(); }) .fail(function(jqXHR) { if(jqXHR.status == 422) { var errors = JSON.parse(jqXHR.responseText); var $name_errors = context.JK.format_errors('name', errors); if($name_errors) $('#recording-finished-dialog form input[name=name]').closest('div.field').addClass('error').end().after($name_errors); var $description_errors = context.JK.format_errors('description', errors); if($description_errors) $('#recording-finished-dialog form input[name=description]').closest('div.field').addClass('error').end().after($description_errors); var $genre_errors = context.JK.format_errors('genre', errors); if($genre_errors) $('#recording-finished-dialog form select[name=genre]').closest('div.field').addClass('error').end().after($genre_errors); var $is_public_errors = context.JK.format_errors('is_public', errors); if($is_public_errors) $('#recording-finished-dialog form input[name=is_public]').closest('div.field').addClass('error').end().after($is_public_errors); var $is_downloadable_errors = context.JK.format_errors('is_downloadable', errors); if($is_downloadable_errors) $('#recording-finished-dialog form input[name=is_downloadable]').closest('div.field').addClass('error').end().after($is_downloadable_errors); var recording_error = context.JK.get_first_error('recording_id', errors); if (recording_error) context.JK.showErrorDialog(app, "Unable to claim recording.", recording_error); } else { logger.error("unable to claim recording %o", arguments); context.JK.showErrorDialog(app, "Unable to claim recording.", jqXHR.responseText); } }) .always(function() { registerClaimRecordingHandlers(true); }); return false; } function registerClaimRecordingHandlers(onOff) { if(onOff) { $('#keep-session-recording').on('click', claimRecording); $('#recording-finished-dialog form').on('submit', claimRecording); } else { $('#keep-session-recording').off('click', claimRecording) $('#recording-finished-dialog form').off('submit', claimRecording); } } function registerDiscardRecordingHandlers(onOff) { if(onOff) { $('#discard-session-recording').on('click', discardRecording); } else { $('#discard-session-recording').off('click', discardRecording); } } function onPause() { logger.debug("calling jamClient.SessionStopPlay"); context.jamClient.SessionStopPlay(); } function onPlay(e, data) { logger.debug("calling jamClient.SessionStartPlay"); context.jamClient.SessionStartPlay(data.playbackMode); } function onChangePlayPosition(e, data) { logger.debug("calling jamClient.SessionTrackSeekMs(" + data.positionMs + ")"); context.jamClient.SessionTrackSeekMs(data.positionMs); } function registerStaticEvents() { registerClaimRecordingHandlers(true); registerDiscardRecordingHandlers(true); $(playbackControls) .on('pause', onPause) .on('play', onPlay) .on('change-position', onChangePlayPosition); } function setRecording(recordingData) { if(recording != null) { //XXX - prevent start/stop recording mashing; protect this dialog logger.error("unable to set recording data over existing recording data. this coudld be due to start/stop recording mashing"); return; } recording = recordingData; } function initialize(){ var dialogBindings = { 'beforeShow' : beforeShow, 'afterHide': afterHide }; app.bindDialog('recordingFinished', dialogBindings); playbackControls = new context.JK.PlaybackControls($('#recording-finished-dialog .recording-controls')); registerStaticEvents(); }; this.initialize = initialize; this.setRecording = setRecording; } return this; })(window,jQuery);