// Copyright 2008 Cloud Engines

if(!CE)var CE={};CE.CERPC=function(serviceurl)
{var that=this;this.serviceurl=(serviceurl?serviceurl:'/svc/api/');this.excessivedebugging=true;function callf(f,req,data,path){if(typeof(f)=='function'){var obj;try{obj=eval('('+req.responseText+')');}catch(e){obj={};}
try{obj.responseText=req.responseText;obj.httpStatus=req.status;}catch(e){obj.responseText='Exception';obj.httpStatus=0;}
try{f(obj,data,path);}catch(e){var message='';if(CE.CEU.user&&CE.CEU.user.email)message+='User: '+CE.CEU.user.email+'\n\n';if(e.name)message+='Name: '+e.name+'\n\n';if(e.fileName)message+='Filename: '+e.fileName+'\n\n';if(e.message)message+='Message: '+e.message+'\n\n';if(e.stack)message+='Stack: '+e.stack+'\n\n';var args=['subject','PROBLEM: Javascript','message',message];that.asyncRPC('POST','logProblem',args);}}}
this.g_lastRequest=null;this.cancelLastRPC=function(){if(that.g_lastRequest){that.g_lastRequest.abort();that.g_lastRequest=null;}}
this.simpleAsync=function(method,path,success,failure,data){var req;if(window.XMLHttpRequest){req=new XMLHttpRequest();}else{req=new ActiveXObject('Msxml2.XMLHTTP');}
if(typeof(req.onload)!='undefined'){req.onload=function(e){var reqStatus=req.status;if(reqStatus>=200&&reqStatus<=299){success(req,data,path);}else{failure(req,data,path);}};req.onerror=function(e){failure(req,data,path);};}else{req.onreadystatechange=function(){var readyState=0;var reqStatus=0;try{readyState=req.readyState;if(readyState==4){reqStatus=req.status;}}catch(e){if(failure){return failure(e,data);}};if(readyState!=4){return;}
if(reqStatus>=200&&reqStatus<=299){success(req,data,path);}else{failure(failure,req,data,path);}};}
req.open(method,path,true);req.send('');return req;}
this.asyncRPC=function(method,path,args,success,failure,data,rawData){var req;var svcpfx=that.serviceurl;if(method=='PRINT'&&svcpfx.indexOf('svc/api')!=-1){method='POST';svcpfx=svcpfx.replace('svc/api','svc/print');}
if(path.indexOf('/')==0){var idx=path.lastIndexOf('/');svcpfx=path.substring(0,idx+1);path=path.substring(idx+1);}
if(window.XMLHttpRequest){req=new XMLHttpRequest();}else{req=new ActiveXObject('Msxml2.XMLHTTP');}
if(typeof(req.onload)!='undefined'){req.onload=function(e){var reqStatus=req.status;that.g_lastRequest=null;if(reqStatus>=200&&reqStatus<=299){if(that.excessivedebugging)CE.CEDBG.println('CERPC: '+path+' response: '+
reqStatus+' - '+req.responseText);callf(success,req,data,path);}else{if(that.excessivedebugging)CE.CEDBG.println('CERPC: '+path+' FAILURE: '+
reqStatus+' - '+req.responseText);callf(failure,req,data,path);}};req.onerror=function(e){that.g_lastRequest=null;callf(failure,req,data,path);};}else{req.onreadystatechange=function(){var readyState=0;var reqStatus=0;try{readyState=req.readyState;if(readyState==4){reqStatus=req.status;}}catch(e){if(failure){return failure(e,data);}};if(readyState!=4){return;}
that.g_lastRequest=null;if(reqStatus>=200&&reqStatus<=299){if(that.excessivedebugging)CE.CEDBG.println('CERPC: '+path+' response: '+
reqStatus+' - '+req.responseText);callf(success,req,data,path);}else{if(that.excessivedebugging)CE.CEDBG.println('CERPC: '+path+' FAILURE: '+
reqStatus+' - '+req.responseText);callf(failure,req,data,path);}};}
if(method=='GET'){if(args){if(args.length>0){path+='?';}
for(var i=0;i<args.length;i+=2){path+=args[i]+'='+encodeURIComponent(args[i+1]);if(i+2<args.length){path+='&';}}}
if(that.excessivedebugging){var getTextEscaped=path.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;");CE.CEDBG.println('CERPC: GET: '+getTextEscaped);}
req.open(method,svcpfx+path,true);req.send('');}else if(method=='POST'){var postText='<soapenv:Envelope><soapenv:Body><'+path+'>';if(args){for(var i=0;i<args.length;i+=2){if(args[i]){postText+='<'+args[i]+'>';if(args[i+1]){if(typeof args[i+1]=='object'&&args[i+1].length){var subname=args[i];if(subname.length>0&&subname.substr(subname.length-1)=='s')
subname=subname.substr(0,subname.length-1);for(var j=0;j<args[i+1].length;++j){postText+='<'+subname+'>';for(var k=0;k<args[i+1][j].length;k+=2){if(args[i+1][j][k]){postText+='<'+args[i+1][j][k]+'>';if(args[i+1][j][k+1]){var str=""+args[i+1][j][k+1];postText+=str.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');}
postText+='</'+args[i+1][j][k]+'>';}}
postText+='</'+subname+'>';}}else{var str=""+args[i+1];postText+=str.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');}}
postText+='</'+args[i]+'>';}}}
postText+='</'+path+'></soapenv:Body></soapenv:Envelope>';req.open(method,svcpfx+"json/"+path,true);if(that.excessivedebugging){var postTextEscaped=postText.split("&").join("&amp;").split("<").join("&lt;").split(">").join("&gt;");CE.CEDBG.println('CERPC: POST: '+postTextEscaped);}
req.send(postText);}else if(method=='PUT'){if(!rawData){var putText='<put>';if(args){for(var i=0;i<args.length;i+=2){if(args[i]){putText+='<'+args[i]+'>';if(args[i+1]){var str=""+args[i+1];putText+=str.replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;');}
putText+='</'+args[i]+'>';}}}
putText+="</put>";req.open(method,path,true);req.send(putText);}else{req.open(method,svcpfx+path,true);req.setRequestHeader("Content-type","application/octet-stream");req.setRequestHeader("Content-length",rawData.length);req.send(rawData);}}
that.g_lastRequest=req;return req;}
this.getVersion=function(success,failure,data){that.asyncRPC('POST','getVersion',null,success,failure,data);};this.loginUser=function(email,password,success,failure,data){that.asyncRPC('POST','loginUser',['email',email,'password',password],success,failure,data);};this.createUser=function(email,screenname,password,success,failure,data){var args=[],argi=0;args[argi++]="email";args[argi++]=email;if(screenname){args[argi++]="screenname";args[argi++]=screenname;}
args[argi++]="password";args[argi++]=password;that.asyncRPC('POST','createUser',args,success,failure,data);};this.createFile=function(spaceid,parentid,filename,type,success,failure){var args=[];var i=0;if(spaceid){args[i++]="spaceid";args[i++]=spaceid;}
if(parentid){args[i++]="parentid";args[i++]=parentid;}
if(filename){args[i++]="filename";args[i++]=filename;}
if(type){args[i++]="type";args[i++]=""+type;}
that.asyncRPC("POST","createFile",args,success,failure);}
this.getUser=function(success,failure,data){that.asyncRPC('POST','getUser',null,success,failure,data);}
this.updateUser=function(email,prefs,screenname,success,failure){var params=[];if(email){params.push('email');params.push(email);}
if(screenname){params.push('screenname');params.push(screenname);}
if(prefs){for(var k in prefs){params.push(k);params.push(prefs[k]);}}
that.asyncRPC('POST','updateUser',params,success,failure);}
this.listSpaces=function(valtoken,isowner,sortColumn,isAscending,pageIndex,numPerPage,success,failure,data){var params=['pageoffset',pageIndex,'maxcount',numPerPage,'isowner',isowner,'showmembers',1,'showthumbnail',1,'sort',(isAscending?('+'+sortColumn):('-'+sortColumn))];that.asyncRPC('POST','listSpaces',params,success,failure,data);};this.listFiles=function(spaceid,folderid,pageIndex,numPerPage,success,failure,data){var params=[],i=0;params[i++]='spaceid';params[i++]=spaceid;if(folderid!==null&&folderid!=""){params[i++]='parentid';params[i++]=folderid;}
params[i++]='pageoffset';params[i++]=pageIndex;params[i++]='maxcount';params[i++]=numPerPage;that.asyncRPC('POST','listFiles',params,success,failure,data);};this.reportError=function(userid,action,message,spacename,uiversion,svcversion,pluginversion,clientversion,clientstatus,clienterror,machineid,spaceid,fileid,success,failure,data){var params=[];var index=0;if(userid){params[index++]="userid";params[index++]=''+userid;}
if(action){params[index++]="action";params[index++]=''+action;}
if(message){params[index++]="message";params[index++]=''+message;}
if(spacename){params[index++]="spacename";params[index++]=''+spacename;}
if(uiversion){params[index++]="uiversion";params[index++]=''+uiversion;}
if(svcversion){params[index++]="svcversion";params[index++]=''+svcversion;}
if(pluginversion){params[index++]="pluginversion";params[index++]=''+pluginversion;}
if(clientversion){params[index++]="clientversion";params[index++]=''+clientversion;}
if(clientstatus){params[index++]="clientstatus";params[index++]=''+clientstatus;}
if(clienterror){params[index++]="clienterror";params[index++]=''+clienterror;}
if(machineid){params[index++]="machineid";params[index++]=''+machineid;}
if(spaceid){params[index++]="spaceid";params[index++]=''+spaceid;}
if(fileid){params[index++]="fileid";params[index++]=''+fileid;}
that.asyncRPC('POST','reportError',params,success,failure,data);};this.removeFile=function(spaceid,fileid,success,failure,data){var args=[];var i=0;args[i++]='spaceid';args[i++]=spaceid;if(fileid){args[i++]='fileid';args[i++]=fileid;}
that.asyncRPC('POST','removeFile',args,success,failure,data);};this.moveFile=function(fileid,newparentid,newname,success,failure){var args=[];var i=0;args[i++]='fileid';args[i++]=fileid;if(newparentid){args[i++]='parentid';args[i++]=newparentid;}
if(newname){args[i++]="filename";args[i++]=newname;}
that.asyncRPC("POST","moveFile",args,success,failure);};this.uploadProgress=function(fileid,success,failure){that.asyncRPC("POST","uploadProgress",["fileid",fileid],success,failure);};this.createAlbum=function(name,success,failure){that.asyncRPC("POST","createAlbum",["name",name],success,failure);};this.deleteAlbum=function(albumid,success,failure){that.asyncRPC("POST","deleteAlbum",["albumid",albumid],success,failure);};this.shareAlbum=function(albumid,email,success,failure){that.asyncRPC("POST","addAlbumShare",["albumid",albumid,"email",email],success,failure);};this.unshareAlbum=function(albumid,email,success,failure){that.asyncRPC("POST","removeAlbumShare",["albumid",albumid,"email",email],success,failure);};this.listOwnedAlbums=function(offset,count,success,failure){that.asyncRPC("POST","listOwnerAlbums",[],success,failure);};this.listSharedAlbums=function(email,offset,count,success,failure){that.asyncRPC("POST","listSharedAlbums",[],success,failure);};this.addAlbumFile=function(albumid,deviceid,serviceid,fileid,success,failure){var args=[];args.push("albumid");args.push(albumid);if(deviceid){args.push("deviceid");args.push(deviceid);}
if(serviceid){args.push("serviceid");args.push(serviceid);}
args.push("fileid");args.push(fileid);that.asyncRPC("POST","addAlbumFile",args,success,failure);};this.removeAlbumFile=function(albumid,deviceid,serviceid,fileid,success,failure){var args=[];args.push("albumid");args.push(albumid);if(deviceid){args.push("deviceid");args.push(deviceid);}
if(serviceid){args.push("serviceid");args.push(serviceid);}
args.push("fileid");args.push(fileid);that.asyncRPC("POST","removeAlbumFile",args,success,failure);};this.listAlbumFiles=function(albumid,offset,count,success,failure){var args=[];args.push("albumid");args.push(albumid);if(offset){args.push("offset");args.push(offset);}
if(count){args.push("count");args.push(count);}
that.asyncRPC("POST","listAlbumFiles",args,success,failure);};}