diff options
author | Robin <robin@Amaya.(none)> | 2010-03-24 16:35:24 +0100 |
---|---|---|
committer | Robin <robin@Amaya.(none)> | 2010-03-24 16:35:24 +0100 |
commit | ba9c95621bccddc8c83689906643a080e1671f22 (patch) | |
tree | 0bf3686caccf70312aaa039d50b4cd7e662d964c /js | |
parent | 3f88fb9f14d330e7454edcfecfdf6d39a589949c (diff) | |
download | nextcloud-server-ba9c95621bccddc8c83689906643a080e1671f22.tar.gz nextcloud-server-ba9c95621bccddc8c83689906643a080e1671f22.zip |
ajax interface
Diffstat (limited to 'js')
-rw-r--r-- | js/ajax.js | 28 | ||||
-rw-r--r-- | js/lib_ajax.js | 55 | ||||
-rw-r--r-- | js/lib_files.js | 306 | ||||
-rw-r--r-- | js/lib_xmlloader.js | 150 |
4 files changed, 539 insertions, 0 deletions
diff --git a/js/ajax.js b/js/ajax.js new file mode 100644 index 00000000000..6c0185c6592 --- /dev/null +++ b/js/ajax.js @@ -0,0 +1,28 @@ +/** +* ownCloud - ajax frontend +* +* @author Robin Appelman +* @copyright 2010 Robin Appelman icewind1991@gmail.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +var dir='' +var loc=document.location.toString(); +if(loc.indexOf('#')!=-1){ + dir=loc.substring(loc.indexOf('#')+1); +} + +OC_onload.add(new function(){OC_FILES.showbrowser(dir)});
\ No newline at end of file diff --git a/js/lib_ajax.js b/js/lib_ajax.js new file mode 100644 index 00000000000..99979422511 --- /dev/null +++ b/js/lib_ajax.js @@ -0,0 +1,55 @@ +/** +* ownCloud - ajax frontend +* +* @author Robin Appelman +* @copyright 2010 Robin Appelman icewind1991@gmail.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +//The callBack object provides an easy way to pass a member of an object as callback parameter and makes sure that the 'this' is always set correctly when called. +callBack=function(func,obj){ + this.func=func; + this.obj=obj; +} + +callBack.prototype=function(arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10){ + this.call(false,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10); +} +callBack.prototype.func=false; +callBack.prototype.obj=false; +callBack.prototype.call=function(dummy,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10){ + //the dummy is just to provide compatibility with the normal call function and isn't used + this.func.call(this.obj,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8,arg9,arg10); +} +callBack.prototype.apply=function(dummy,arguments){ + //the dummy is just to provide compatibility with the normal call function and isn't used + this.apply(this.obj,arguments); +} + +//provide a simple way to add things to the onload +OC_onload=new Object(); + +OC_onload.items=new Array(); +OC_onload.add=function(callback){ + OC_onload.items[OC_onload.items.length]=callback; +} +OC_onload.run=function(){ + for(index in OC_onload.items){ + if(OC_onload.items[index].call){ + OC_onload.items[index].call(); + } + } +}
\ No newline at end of file diff --git a/js/lib_files.js b/js/lib_files.js new file mode 100644 index 00000000000..8d1039a3b0d --- /dev/null +++ b/js/lib_files.js @@ -0,0 +1,306 @@ +/** +* ownCloud - ajax frontend +* +* @author Robin Appelman +* @copyright 2010 Robin Appelman icewind1991@gmail.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +OC_FILES=new Object(); +OC_FILES.xmlloader=new OCXMLLoader(); + +OC_FILES.getdirectorycontent_parse=function(req){ + var files=new Array(); + var response=req.responseXML; + if(response){ + var fileElements=response.getElementsByTagName('file'); + if(fileElements.length>0){ + for(index in fileElements){ + var file=new Array(); + var attributes=Array('size','name','type','directory','date'); + for(i in attributes){ + var name=attributes[i]; + file[name]=fileElements.item(index).getAttribute(name); + } + files[file.name]=file; + } + } + if(OC_FILES.getdirectorycontent_callback){ + OC_FILES.getdirectorycontent_callback(files); + } + } +} + +OC_FILES.getdirectorycontent=function(dir,callback){ + if(callback){ + OC_FILES.getdirectorycontent_callback=callback; + } + OC_FILES.xmlloader.setCallBack(OC_FILES.getdirectorycontent_parse); + OC_FILES.xmlloader.load('files/get_files.php?dir='+dir); +} + +OC_FILES.showicon=function(filetype){ + var td=document.createElement('td'); + var img=document.createElement('img'); + td.appendChild(img); + img.setAttribute('width',16); + img.setAttribute('height',16); + if(filetype=='dir'){ + img.src=WEBROOT+'/img/icons/folder.png'; + }else{ + img.src=WEBROOT+'/img/icons/other.png'; + } + return td; +} + +OC_FILES.dir=''; +OC_FILES.browser=null; +OC_FILES.showbrowser=function(dir){ + dir=(dir)?dir:''; + OC_FILES.dir=dir; + OC_FILES.getdirectorycontent(dir,OC_FILES.showbrowser_callback); +} + +OC_FILES.showbrowser_callback=function(content){ + var dir=OC_FILES.dir + var dirs=dir.split('/'); + var tr=null; + var td=null; + var img=null; + + //remove current content; + var contentNode=document.getElementById('content'); + if(contentNode.hasChildNodes()){ + while(contentNode.childNodes.length >=1){ + contentNode.removeChild(contentNode.firstChild); + } + } + + // breadcrumb + if(dirs.length>0) { + var breadcrumb=document.createElement('div'); + breadcrumb.className='center'; + var table=document.createElement('table'); + breadcrumb.appendChild(table); + table.setAttribute('cellpadding',2); + table.setAttribute('cellspacing',0); + var tbody=document.createElement('tbody');//some IE versions need this + table.appendChild(tbody); + tr=document.createElement('tr'); + tbody.appendChild(tr); + td=document.createElement('td'); + tr.appendChild(td); + td.className='nametext'; + var a=document.createElement('a'); + td.appendChild(a); + a.setAttribute('href','#'); + a.setAttribute('onclick','OC_FILES.showbrowser()'); + a.appendChild(document.createTextNode('Home')); + var currentdir=''; + for(index in dirs) { + d=dirs[index]; + currentdir+='/'+d; + if(d!=''){ + td=document.createElement('td'); + tr.appendChild(td); + td.className='nametext'; + a=document.createElement('a'); + td.appendChild(a); + a.setAttribute('href','#'+currentdir); + a.setAttribute('onclick','OC_FILES.showbrowser("'+currentdir+'")'); + img=document.createElement('img'); + a.appendChild(img); + img.src=WEBROOT+'/img/arrow.png'; + a.appendChild(document.createTextNode(' ' +d)); + } + } + contentNode.appendChild(breadcrumb); + } + + // files and directories + var files=document.createElement('div'); + OC_FILES.browser=files; + files.className='center'; + var table=document.createElement('table'); + files.appendChild(table); + table.setAttribute('cellpadding',6); + table.setAttribute('cellspacing',0); + table.className='browser'; + var tbody=document.createElement('tbody');//some IE versions need this + table.appendChild(tbody); + var filesfound=false; + var sizeTd=null; + if(content){ + for(index in content){ + file=content[index]; + if(file.name){ + tr=document.createElement('tr'); + tbody.appendChild(tr); + tr.className='browserline'; + tr.appendChild(OC_FILES.showicon(file['type'])); + td=document.createElement('td'); + tr.appendChild(td); + td.className='nametext'; + td.setAttribute('name',file['name']); + a=document.createElement('a'); + td.appendChild(a); + a.appendChild(document.createTextNode(file['name'])) + if(file['type']=='dir'){ + a.setAttribute('onclick','OC_FILES.showbrowser("'+dir+file['name']+'")'); + td.setAttribute('colspan',2); + a.setAttribute('href','#'+dir+file['name']); + }else{ + a.setAttribute('href',WEBROOT+'/?dir=/'+dir+'&file='+file['name']); + sizeTd=document.createElement('td'); + tr.appendChild(sizeTd); + sizeTd.className='sizetext'; + sizeTd.appendChild(document.createTextNode(file['size']+' bytes')); + } + a=document.createElement('a'); + img=document.createElement('img'); + td.appendChild(img); + img.className='rename'; + img.alt='rename' + img.title='rename'; + img.src=WEBROOT+'/img/icons/rename.png'; + img.style.height='16px' + img.style.width='16px' + img.setAttribute('onclick','OC_FILES.rename(\''+dir+'\',\''+file['name']+'\')') + td=document.createElement('td'); + tr.appendChild(td); + td.className='sizetext'; + td.appendChild(document.createTextNode(file['date'])); + if(file['type']!='dir'){ + td=document.createElement('td'); + tr.appendChild(td); + img=document.createElement('img'); + td.appendChild(img); + img.className='delete'; + img.alt='delete' + img.title='delete'; + img.src=WEBROOT+'/img/icons/delete.png'; + img.style.height='16px' + img.style.width='16px' + img.setAttribute('onclick','OC_FILES.remove(\''+dir+'\',\''+file['name']+'\')') + } + } + } + } + tr=document.createElement('tr'); + tbody.appendChild(tr); + td=document.createElement('td'); + tr.appendChild(td); + td.className='upload'; + td.setAttribute('colspan','5'); + this.showuploader(dir,td); + contentNode.appendChild(files); +} + +OC_FILES.showuploader=function(dir,parent){ + this.uploadForm=document.createElement('form'); + this.uploadForm.setAttribute('target','uploadIFrame'); + this.uploadForm.setAttribute('action','files/upload.php?dir='+dir); + this.uploadForm.method='post'; + this.uploadForm.setAttribute('enctype','multipart/form-data'); + this.uploadIFrame=document.createElement('iframe'); + this.uploadIFrame.className='hidden'; + this.uploadIFrame.name='uploadIFrame'; + parent.appendChild(this.uploadIFrame); + var file=document.createElement('input'); + file.name='file'; + file.setAttribute('type','file'); + file.setAttribute('onchange','OC_FILES.upload("'+dir+'")'); + this.uploadForm.appendChild(document.createTextNode('Upload file: ')); + this.uploadForm.appendChild(file); + parent.appendChild(this.uploadForm); +} + +OC_FILES.upload=function(dir){ + OC_FILES.uploadIFrame.setAttribute('onload',"OC_FILES.upload_callback.call(OC_FILES,'"+dir+"')"); + OC_FILES.uploadForm.submit(); +} + +OC_FILES.upload_callback=function(dir){ + this.showbrowser(dir); +} + +OC_FILES.rename=function(dir,file){ + var item=document.getElementsByName(file).item(0); + item.oldContent=new Array(); + if(item.hasChildNodes()){ + while(item.childNodes.length >=1){ + item.oldContent[item.oldContent.length]=item.firstChild; + item.removeChild(item.firstChild); + } + } + var form=document.createElement('form'); + form.setAttribute('onsubmit','return OC_FILES.do_rename(\''+dir+'\',\''+file+'\')') + var input=document.createElement('input'); + input.setAttribute('type','text'); + input.setAttribute('name','newname'); + input.setAttribute('value',file); + input.setAttribute('id',file+'_newname') + input.setAttribute('onblur','OC_FILES.rename_cancel(\''+file+'\')'); + form.appendChild(input); + item.appendChild(form); + input.focus(); +} + +OC_FILES.do_rename=function(dir,file){ + var item=document.getElementById(file+'_newname'); + var newname=item.value; + if(newname==''){ + return false; + }else if(file==newname){ + OC_FILES.showbrowser(OC_FILES.dir); + return false; + } + xmlloader=new OCXMLLoader(); + xmlloader.setCallBack(OC_FILES.rename_callback); + xmlloader.load('files/rename.php?dir='+dir+'&file='+file+'&newname='+newname); + return false; +} + +OC_FILES.rename_callback=function(req){ + OC_FILES.showbrowser(OC_FILES.dir); +} + +OC_FILES.rename_cancel=function(file){ + var item=document.getElementsByName(file).item(0); + if(item.hasChildNodes()){ + while(item.childNodes.length >=1){ + item.removeChild(item.firstChild); + } + } + for(index in item.oldContent){ + if(item.oldContent[index].nodeType){ + item.appendChild(item.oldContent[index]); + } + } +} + +OC_FILES.remove=function(dir,file){ + remove=confirm('remove file \''+file+'\'?'); + if(remove){ + xmlloader=new OCXMLLoader(); + xmlloader.setCallBack(OC_FILES.remove_callback); + xmlloader.load('files/delete.php?dir='+dir+'&file='+file); + } +} + +OC_FILES.remove_callback=function(req){ + OC_FILES.showbrowser(OC_FILES.dir); +}
\ No newline at end of file diff --git a/js/lib_xmlloader.js b/js/lib_xmlloader.js new file mode 100644 index 00000000000..14fd3ee8af1 --- /dev/null +++ b/js/lib_xmlloader.js @@ -0,0 +1,150 @@ +/** +* ownCloud - ajax frontend +* +* @author Robin Appelman +* @copyright 2010 Robin Appelman icewind1991@gmail.com +* +* This library is free software; you can redistribute it and/or +* modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE +* License as published by the Free Software Foundation; either +* version 3 of the License, or any later version. +* +* This library is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU AFFERO GENERAL PUBLIC LICENSE for more details. +* +* You should have received a copy of the GNU Lesser General Public +* License along with this library. If not, see <http://www.gnu.org/licenses/>. +* +*/ + +var READY_STATE_UNINITIALIZED=0; +var READY_STATE_LOADING=1; +var READY_STATE_LOADED=2; +var READY_STATE_INTERACTIVE=3; +var READY_STATE_COMPLETE=4; + +/** +* Class for loaded browser independant xml loading +*/ +OCXMLLoader=function(){ + this.errorCallBack=this.defaultError; +} + +OCXMLLoader.prototype={ + contentType:'', + method:'GET', + request:'', + callBack:null, + async:true, + + /** + * Loads an XML document + * @param string url + * @param string request + * @none + */ + load:function(url,request){ + request=(request)?request:""; + method=this.method; + contentType=(!this.contentType && method=="POST")?"application/x-www-form-urlencoded":this.contentType; + if(window.XDomainRequest){ + req=new XDomainRequest(); + }else if(window.XMLHttpRequest){ + req=new XMLHttpRequest(); + }else if(window.ActiveXObject){ + req=new ActiveXObject('Microsoft.XMLHTTP') + } + if (req){ + try{ + var loader=this; + req.onreadystatechange=function(){ + loader.onReadyState.call(loader,req) + } + req.open(method,url,this.async); + if (contentType){ + req.setRequestHeader("Content-Type",contentType); + } + if(method=="POST"){ + req.setRequestHeader("Content-length", request.length); + req.setRequestHeader("Connection", "close"); + } + req.send(request); + }catch (err){ + this.errorCallBack(req); + } + } + }, + onReadyState:function(req){ + var ready=req.readyState; + if (ready==READY_STATE_COMPLETE){ + var HttpStatus=req.status; + if (HttpStatus==200 || HttpStatus==0){ + //alert("response: "+this.req.responseText); + this.callBack(req); + }else{ + this.errorCallBack(req); + } + } + }, + defaultError:function(req){ + alert("Error fetching data!" + +"\n\n<br/><br/>ReadyState: "+req.readyState + +"\n<br/>Status: "+req.status + +"\n<br/>Headers: "+req.getAllResponseHeaders() + +"\n<br/>File: "+req.url + +"\n<br/>Response: "+req.responseText); + }, + /** + * Sets the request method + * @param string method + * @none + */ + setMethod:function(method){ + this.method=method; + }, + /** + * Sets the content type + * @param string type + * @none + */ + setType:function(type){ + this.type=type; + }, + /** + * Sets the callback function + * @param function callBack + * @none + */ + setCallBack:function(callBack){ + this.callBack=callBack; + }, + /** + * Sets the error callback function + * @param function errorCallBack + * @none + */ + setErrorCallBack:function(errorCallBack){ + this.errorCallBack=errorCallBack; + } +} + +testClass=function(){ +} + +testClass.prototype={ + testFunc:function(){ + this.test="test"; + test=new OCXMLLoader(this); + test.setCallBack(this.callBack); + test.load(parseUri('%root%/data/sites/index.xml')); + }, + callBack:function(req){ + alert(this.test); + alert(req.responseText); + } +} +test=new testClass() +test.testFunc +// mainLoadStack.append(test.testFunc,test); |