diff --git a/ajax/loadfile.php b/ajax/loadfile.php
new file mode 100644
index 00000000..1919d641
--- /dev/null
+++ b/ajax/loadfile.php
@@ -0,0 +1,44 @@
+getSession()->close();
+
+// Set the session key for the file we are about to edit.
+$dir = isset($_GET['dir']) ? $_GET['dir'] : '';
+$filename = isset($_GET['file']) ? $_GET['file'] : '';
+$token = isset($_GET['token']) ? $_GET['token'] : '';
+if(!empty($filename))
+{
+ header('Content-Type: application/pdf');
+
+ if(!empty($token))
+ {
+ $linkItem = \OC::$server->getShareManager()->getShareByToken($token);
+ $owner = $linkItem->getShareOwner();
+ \OC\Files\Filesystem::init($owner, '/' . $owner . '/files');
+ $dir = '/' . \OC\Files\Filesystem::getPath($linkItem->getNodeId());
+ $dir = rtrim($dir, '/');
+ }
+
+ $path = $dir.'/'.$filename;
+ $filecontents = \OC\Files\Filesystem::file_get_contents($path);
+
+ if($filecontents)
+ {
+ echo $filecontents;
+ }
+ else
+ {
+ \OCP\Util::writeLog('files_pdfviewer', 'Error when opening PDF ' . $path, \OCP\Util::ERROR);
+ OCP\JSON::error(['data' => ['message' => 'A problem occoured while loading the PDF']]);
+ }
+ return;
+
+}
+else
+{
+ OCP\JSON::error(['data' => ['message' => 'Invalid file path supplied.']]);
+}
diff --git a/ajax/loadpublicfile.php b/ajax/loadpublicfile.php
new file mode 100644
index 00000000..8328bc5a
--- /dev/null
+++ b/ajax/loadpublicfile.php
@@ -0,0 +1,38 @@
+getSession()->close();
+
+// Set the session key for the file we are about to edit.
+$token = isset($_GET['token']) ? $_GET['token'] : '';
+if(!empty($token))
+{
+ header('Content-Type: application/pdf');
+
+ $linkItem = \OC::$server->getShareManager()->getShareByToken($token);
+ $owner = $linkItem->getShareOwner();
+
+ \OC\Files\Filesystem::tearDown();
+ \OC\Files\Filesystem::init($owner, '/' . $owner . '/files');
+
+ $path = '/' . \OC\Files\Filesystem::getPath($linkItem->getNodeId());
+
+ $filecontents = \OC\Files\Filesystem::file_get_contents($path);
+
+ if($filecontents)
+ {
+ echo $filecontents;
+ }
+ else
+ {
+ \OCP\Util::writeLog('files_nbviewer', 'Error while opening PDF ' . $path, \OCP\Util::ERROR);
+ OCP\JSON::error(['data' => ['message' => 'A problem occoured while loading the PDF']]);
+ }
+ return;
+
+} else {
+ OCP\JSON::error(['data' => ['message' => 'Invalid file path supplied.']]);
+}
\ No newline at end of file
diff --git a/appinfo/app.php b/appinfo/app.php
new file mode 100644
index 00000000..6b8e999b
--- /dev/null
+++ b/appinfo/app.php
@@ -0,0 +1,4 @@
+
+
+ files_nbviewer
+ CERNBox NB Viewer
+ This application integrates the IPython/Jupyter Notebook framework into CERNBox files application
+ AGPL
+ Nadir Roman Guerrero
+ 8.2.0
+ true
+
+
diff --git a/appinfo/routes.php b/appinfo/routes.php
new file mode 100644
index 00000000..2b72baf5
--- /dev/null
+++ b/appinfo/routes.php
@@ -0,0 +1,7 @@
+create('files_pdfviewer_load', '/ajax/loadfile.php')
+ ->actionInclude('files_pdfviewer/ajax/loadfile.php');
+
+$this->create('files_pdfviewer_loadpublic', '/ajax/loadpublicfile.php')
+ ->actionInclude('files_pdfviewer/ajax/loadpublicfile.php');
\ No newline at end of file
diff --git a/appinfo/version b/appinfo/version
new file mode 100644
index 00000000..d3827e75
--- /dev/null
+++ b/appinfo/version
@@ -0,0 +1 @@
+1.0
diff --git a/js/app.js b/js/app.js
new file mode 100644
index 00000000..186aebfc
--- /dev/null
+++ b/js/app.js
@@ -0,0 +1,153 @@
+function PDF_closePublicFileCallback()
+{
+ $('#imgframe').empty();
+ $('#imgframe').text('Reloading...');
+ window.location.reload();
+}
+
+function PDF_loadFile(file, dir)
+{
+ var urlD = OC.filePath('files_pdfviewer', 'ajax', 'loadfile.php') + "?file=" + encodeURIComponent(file)
+ + "&dir=" + encodeURIComponent(dir) + "&requesttoken=" + encodeURIComponent(oc_requesttoken);
+
+ if($('#isPublic').attr('value') == '1')
+ {
+ urlD = urlD + "&token=" + encodeURIComponent($('#sharingToken').attr('value'));
+ }
+
+ $('#pdfviewer-loader').remove();
+
+ var frame = $('#pdfviewer-frame');
+ frame.attr('type', 'application/pdf');
+ frame.attr('src', urlD);
+ frame.contents().find('title').html(file);
+ frame.on('load', function()
+ {
+ document.title = file;
+ });
+}
+
+function PDF_loadPublicFile(token)
+{
+ var urlD = OC.filePath('files_pdfviewer', 'ajax', 'loadpublicfile.php') + "?token=" + encodeURIComponent(token)
+ + "&requesttoken=" + encodeURIComponent(oc_requesttoken);
+
+ $('#pdfviewer-loader').remove();
+
+ var frame = $('#pdfviewer-frame');
+ frame.attr('type', 'application/pdf');
+ frame.attr('src', urlD);
+}
+
+/**
+ * Set up all html elements needed to display the notebook
+ */
+function PDF_setUpEditor(closeCallBack)
+{
+ isPDFViewerOpen = true;
+ var mainDiv = $('#pdfviewer');
+ if(mainDiv.length < 1)
+ {
+ mainDiv = $('
');
+ mainDiv.css('position', 'absolute');
+ mainDiv.css('top', '0');
+ mainDiv.css('left', '0');
+ mainDiv.css('width', '100%');
+ mainDiv.css('height', '100%');
+ mainDiv.css('z-index', '200');
+ mainDiv.css('background-color', '#fff');
+
+ var frame = $('');
+ frame.css('position', 'absolute');
+ frame.css('top', '0');
+ frame.css('left', '0');
+ frame.css('width', '100%');
+ frame.css('height', '100%');
+
+ mainDiv.append(frame);
+ $('#content').append(mainDiv);
+ }
+
+ var loadingImg = $('');
+ loadingImg.css('position', 'absolute');
+ loadingImg.css('top', '50%');
+ loadingImg.css('left', '50%');
+ loadingImg.css('width', 'auto');
+ loadingImg.css('height', 'auto');
+ var img = OC.imagePath('core', 'loading-dark.gif');
+ var imgContent = $('
');
+ imgContent.attr('src',img);
+ loadingImg.append(imgContent);
+
+ var closeButton = $('');
+ closeButton.css('position', 'absolute');
+ closeButton.css('top', '0');
+ closeButton.css('left', '95%');
+ closeButton.css('width', 'auto');
+ closeButton.css('height', 'auto');
+ closeButton.css('z-index', '200');
+ closeButton.css('background-color', '#f00');
+ var closeImg = OC.imagePath('core', 'actions/close.svg');
+ var closeImgContent = $('
');
+ closeImgContent.attr('src', closeImg);
+ closeButton.append(closeImgContent);
+
+ closeButton.click(function() { PDF_closeFile(closeCallBack); });
+
+ $('#app-navigation').hide();
+ $('#app-content').hide();
+
+ mainDiv.append(loadingImg);
+ mainDiv.append(closeButton);
+}
+
+/**
+ * Open the notebook viewer and displays the notebook given the directory where it belongs and it's name
+ * @param directory
+ * @param file
+ */
+function PDF_openFile(directory, file)
+{
+ PDF_setUpEditor();
+ PDF_loadFile(file, directory);
+}
+
+/**
+ * Open the notebook viewer and displays the notebook given by a publically shared by link
+ * @param token
+ */
+function PDF_openPublicFile(token)
+{
+ PDF_setUpEditor(closePublicFileCallback);
+ PDF_loadPublicFile(token);
+}
+
+
+function PDF_closeFile(callback)
+{
+ if(isPDFViewerOpen)
+ {
+ $('#pdfviewer').remove();
+ $('#app-navigation').show();
+ $('#app-content').show();
+ isPDFViewerOpen = false;
+
+ if(callback)
+ {
+ callback();
+ }
+ }
+}
+
+var isPDFViewerOpen = false;
+$(document).ready(function ()
+{
+ if (typeof FileActions !== 'undefined')
+ {
+ FileActions.setDefault('application/pdf', 'Edit');
+ OCA.Files.fileActions.register('application/pdf', 'Edit', OC.PERMISSION_READ, '', function (filename)
+ {
+ PDF_openFile(FileList.getCurrentDirectory(), filename);
+ });
+ }
+});
\ No newline at end of file
diff --git a/js/pdfobject.min.js b/js/pdfobject.min.js
new file mode 100644
index 00000000..026b4d26
--- /dev/null
+++ b/js/pdfobject.min.js
@@ -0,0 +1,8 @@
+/*
+ PDFObject v2.0.201604172
+ https://github.com/pipwerks/PDFObject
+ Copyright (c) 2008-2016 Philip Hutchison
+ MIT-style license: http://pipwerks.mit-license.org/
+ UMD module pattern from https://github.com/umdjs/umd/blob/master/templates/returnExports.js
+*/
+(function(root,factory){if(typeof define==="function"&&define.amd){define([],factory)}else if(typeof module==="object"&&module.exports){module.exports=factory()}else{root.PDFObject=factory()}})(this,function(){"use strict";if(typeof window==="undefined"||typeof navigator==="undefined"){return false}var pdfobjectversion="2.0.201604172",supportsPDFs,createAXO,isIE,supportsPdfMimeType=typeof navigator.mimeTypes["application/pdf"]!=="undefined",supportsPdfActiveX,buildFragmentString,log,embedError,embed,getTargetElement,generatePDFJSiframe,isIOS=function(){return/iphone|ipad|ipod/i.test(navigator.userAgent.toLowerCase())}(),generateEmbedElement;createAXO=function(type){var ax;try{ax=new ActiveXObject(type)}catch(e){ax=null}return ax};isIE=function(){return!!(window.ActiveXObject||"ActiveXObject"in window)};supportsPdfActiveX=function(){return!!(createAXO("AcroPDF.PDF")||createAXO("PDF.PdfCtrl"))};supportsPDFs=supportsPdfMimeType||isIE()&&supportsPdfActiveX();buildFragmentString=function(pdfParams){var string="",prop;if(pdfParams){for(prop in pdfParams){if(pdfParams.hasOwnProperty(prop)){string+=encodeURIComponent(prop)+"="+encodeURIComponent(pdfParams[prop])+"&"}}if(string){string="#"+string;string=string.slice(0,string.length-1)}}return string};log=function(msg){if(typeof console!=="undefined"&&console.log){console.log("[PDFObject] "+msg)}};embedError=function(msg){log(msg);return false};getTargetElement=function(targetSelector){var targetNode=document.body;if(typeof targetSelector==="string"){targetNode=document.querySelector(targetSelector)}else if(typeof jQuery!=="undefined"&&targetSelector instanceof jQuery&&targetSelector.length){targetNode=targetSelector.get(0)}else if(typeof targetSelector.nodeType!=="undefined"&&targetSelector.nodeType===1){targetNode=targetSelector}return targetNode};generatePDFJSiframe=function(targetNode,url,pdfOpenFragment,PDFJS_URL,id){var fullURL=PDFJS_URL+"?file="+encodeURIComponent(url)+pdfOpenFragment;var scrollfix=isIOS?"-webkit-overflow-scrolling: touch; overflow-y: scroll; ":"overflow: hidden; ";var iframe="";targetNode.className+=" pdfobject-container";targetNode.style.position="relative";targetNode.style.overflow="auto";targetNode.innerHTML=iframe;return targetNode.getElementsByTagName("iframe")[0]};generateEmbedElement=function(targetNode,targetSelector,url,pdfOpenFragment,width,height,id){var style="";if(targetSelector&&targetSelector!==document.body){style="width: "+width+"; height: "+height+";"}else{style="position: absolute; top: 0; right: 0; bottom: 0; left: 0; width: 100%; height: 100%;"}targetNode.className+=" pdfobject-container";targetNode.innerHTML="";return targetNode.getElementsByTagName("embed")[0]};embed=function(url,targetSelector,options){if(typeof url!=="string"){return embedError("URL is not valid")}targetSelector=typeof targetSelector!=="undefined"?targetSelector:false;options=typeof options!=="undefined"?options:{};var id=options.id&&typeof options.id==="string"?"id='"+options.id+"'":"",page=options.page?options.page:false,pdfOpenParams=options.pdfOpenParams?options.pdfOpenParams:{},fallbackLink=typeof options.fallbackLink!=="undefined"?options.fallbackLink:true,width=options.width?options.width:"100%",height=options.height?options.height:"100%",forcePDFJS=typeof options.forcePDFJS==="boolean"?options.forcePDFJS:false,PDFJS_URL=options.PDFJS_URL?options.PDFJS_URL:false,targetNode=getTargetElement(targetSelector),fallbackHTML="",pdfOpenFragment="",fallbackHTML_default="This browser does not support inline PDFs. Please download the PDF to view it: Download PDF
";if(!targetNode){return embedError("Target element cannot be determined")}if(page){pdfOpenParams.page=page}pdfOpenFragment=buildFragmentString(pdfOpenParams);if(forcePDFJS&&PDFJS_URL){return generatePDFJSiframe(targetNode,url,pdfOpenFragment,PDFJS_URL,id)}else if(supportsPDFs){return generateEmbedElement(targetNode,targetSelector,url,pdfOpenFragment,width,height,id)}else{if(PDFJS_URL){return generatePDFJSiframe(targetNode,url,pdfOpenFragment,PDFJS_URL,id)}else if(fallbackLink){fallbackHTML=typeof fallbackLink==="string"?fallbackLink:fallbackHTML_default;targetNode.innerHTML=fallbackHTML.replace(/\[url\]/g,url)}return embedError("This browser does not support embedded PDFs")}};return{embed:function(a,b,c){return embed(a,b,c)},pdfobjectversion:function(){return pdfobjectversion}(),supportsPDFs:function(){return supportsPDFs}()}});
\ No newline at end of file