Sindbad~EG File Manager
var H5P = H5P || {};
H5P.ExportableTextArea = (function ($) {
/**
* Constructor.
*
* @param {object} params Options for this library.
* @param {int} id Content identifier
*/
function C(params, id, contentData) {
this.index = (params.index !== undefined ? params.index : -1);
this.header = (params.label !== undefined ? params.label : '');
this.notSupportedText = params.exportNotSupported;
this.defaultAnswer = (contentData && contentData.previousState ? contentData.previousState.answer : '');
this.contentData = contentData;
var supportsExport = H5P.ExportableTextArea.Exporter.supportsExport();
var labelId = (contentData.subContentId ? contentData.subContentId : id) + '-label';
this.$label = $('<div id="' + labelId + '" class="h5p-eta-label">' + this.header + '</div>');
this.$input = $('<textarea class="h5p-eta-input" aria-labelledby="' + labelId + '" ' + (supportsExport ? '' : 'placeholder="' + this.notSupportedText + '"') + 'data-index="' + this.index + '">' + this.defaultAnswer + '</textarea>');
}
C.prototype.attach = function ($wrapper) {
this.$content = $wrapper.addClass('h5p-eta')
.append(this.$label)
.append(this.$input);
};
C.prototype.onDelete = function (params, slideIndex, elementIndex) {
H5P.ExportableTextArea.CPInterface.onDelete(params, slideIndex, elementIndex, this);
};
C.prototype.onAdd = function (params, slideIndex) {
H5P.ExportableTextArea.CPInterface.onAdd(params, slideIndex, this);
};
C.prototype.exportAnswers = true;
C.prototype.getTitle = function() {
return H5P.createTitle((this.contentData && this.contentData.metadata && this.contentData.metadata.title) ? this.contentData.metadata.title : '');
};
C.prototype.getCurrentState = function () {
var text = this.$input.val();
if (text.trim()) {
return {
answer: text
};
}
};
return C;
})(H5P.jQuery);
/**
* Interface responsible for handling index calculations beeing done when
* adding and removing Answer elements
*
* Implemented as singleton
*/
H5P.ExportableTextArea.CPInterface = (function _eta_cp_interface_internal() {
if ( _eta_cp_interface_internal._singletonInstance ) {
return _eta_cp_interface_internal._singletonInstance;
}
_eta_cp_interface_internal._singletonInstance = this;
this.answerCounter = [];
this.onDelete = function (params, slideIndex, elementIndex, elementInstance) {
// Reorder index on current slide
var filtered = params.slides[slideIndex].elements.filter(function (element, index) {
return element.action && H5P.libraryFromString(element.action.library).machineName === 'H5P.ExportableTextArea';
}).sort(function (a, b) {
return a.action.params.index - b.action.params.index;
});
this.answerCounter[slideIndex] = [];
var $currentSlide = H5P.jQuery('.h5p-slides-wrapper > .h5p-current');
for (var i = 0; i < filtered.length; i++) {
filtered[i].action.params.index = i;
this.answerCounter[slideIndex][i] = true;
var $child = $currentSlide.children('.h5p-eta').has('[data-index=' + i + ']');
if (!$child.length) {
$child = $currentSlide.children('.h5p-eta').has('[data-index=' + (i + 1) + ']');
$child.find('.index').html(i + 1);
$child.find('.h5p-eta-input').attr('data-index', i);
}
}
};
this.onDeleteSlide = function (slideIndex) {
this.answerCounter[slideIndex] = [];
};
this.changeSlideIndex = function(left, right) {
var tmp = this.answerCounter[left];
this.answerCounter[left] = this.answerCounter[right];
this.answerCounter[right] = tmp;
};
this.onAdd = function (params, slideIndex, elementInstance) {
if (this.answerCounter[slideIndex] === undefined) {
this.answerCounter[slideIndex] = [];
}
if (params.action.params.index === undefined) {
params.action.params.index = this.answerCounter[slideIndex].length;
}
this.answerCounter[slideIndex][params.action.params.index] = true;
};
return this;
})();
/**
* Export all Answers
*
* Implemented as singleton
*/
H5P.ExportableTextArea.Exporter = (function _eta_exporter_internal() {
if ( _eta_exporter_internal._singletonInstance ) {
return _eta_exporter_internal._singletonInstance;
}
_eta_exporter_internal._singletonInstance = this;
this.deviceIsIPx = undefined;
this.useFlash = undefined;
this.run = function (slides, elements) {
// Save it as a file:
if (this.useFileSaver()) {
var blob = new Blob([this.createDocContent(slides, elements)], {
type: "application/msword;charset=utf-8"
});
saveAs(blob, 'exported-text.doc');
}
};
this.createDocContent = function (slides, elements) {
var html = '';
for (var i = 0; i < elements.length; i++) {
var slideHtml = [];
// Empty slide
if (!elements[i]) {
continue;
}
for (var j = 0; j < elements[i].length; j++) {
var element = elements[i][j];
if (element.libraryInfo && element.libraryInfo.machineName === 'H5P.ExportableTextArea') {
var params = slides[i].elements[j];
var input = (element.$input !== undefined ? element.$input.val() : '');
slideHtml[element.index] = element.header + '<p>' + input.replace(/(\r\n|\r|\n)/g, '<br>') + '</p>';
if (params.action.params.exportComments !== undefined && params.action.params.exportComments) {
slideHtml[element.index] += params.solution;
}
}
}
if (slideHtml.length) {
if (html) {
html += '<hr/>';
}
html += slideHtml.join('');
}
}
// Create HTML:
// me + ta and other hacks to avoid that new relic injects script...
html = '<ht' + 'ml><he' + 'ad><me' + 'ta charset="UTF-8"></me' + 'ta></he' + 'ad><bo' + 'dy><p><a href="' + document.URL + '">' + document.URL + '</a></p>' + html + '</bo' + 'dy></ht' + 'ml>';
return html;
};
this.createExportButton = function (title) {
var self = this;
if (!H5P.ExportableTextArea.Exporter.supportsExport()) {
return '';
}
if (this.useFileSaver()) {
return '<a href="#" class="h5p-eta-export">' + title + '</a>';
} else {
var $downloadify = H5P.jQuery('<div></div>');
$downloadify.appendTo('body');
$downloadify.downloadify({
filename: function () {
return 'answer-text.doc';
},
data: function () {
return self.createDocContent();
},
onError: function () {
alert('You must put something in the File Contents or there will be nothing to save!');
},
swf: H5P.getLibraryPath('downloadify-1.0') + '/resources/downloadify.swf',
width: 100,
height: 30,
transparent: true,
append: false,
label: title
});
var html = '<a href="#" class="h5p-eta-export flash">' + $downloadify.html() + '</a>';
$downloadify.remove();
return html;
}
};
this.useFileSaver = function () {
if (useFlash === undefined) {
useFlash = (navigator.userAgent.match(/MSIE 8/i) !== null || navigator.userAgent.match(/MSIE 9/i) !== null);
}
return !useFlash;
};
/**
* Check if this device/browser supports download
* at all
*/
this.supportsExport = function () {
if (deviceIsIPx === undefined) {
deviceIsIPx = navigator.userAgent.match(/iPad/i) === null &&
navigator.userAgent.match(/iPhone/i) === null &&
navigator.userAgent.match(/iPod/i) === null;
}
return deviceIsIPx;
};
return this;
})();
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists