1
0
mirror of https://github.com/elisspace/FileMiner.git synced 2026-08-29 15:43:59 +00:00
Files
FileMiner/index.html
Jasper Gregory 851beffb28 api key
2016-05-19 18:59:46 +07:00

1728 lines
50 KiB
HTML

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>Duplicate File Finder, Cleaner for Drive</title>
<meta name="description" content="You probably have a few dozen duplicate files, chiefly MP3 and photos in the Google Drive. This is a handy tool that scans selected directories and finds any duplicate files inside Google Drive. It also provides Shared File (owned by me) Finder, Orphaned File Finder (Not have a parent folder).">
<meta name="keywords" content="duplicate file finder, duplicate file cleaner, cleaner for google drive, online duplicate file finder, duplicate file remover, delete duplicate file, orphaned file finder, orphaned file finder for drive, drive utility, cloud utility">
<meta property="og:title" content="Duplicate File Finder, Cleaner for Drive">
<meta property="og:description" content="You probably have a few dozen duplicate files, chiefly MP3 and photos in the Google Drive. This is a handy tool that scans selected directories and finds any duplicate files inside Google Drive. It also provides Shared File (owned by me) Finder, Orphaned File Finder (Not have a parent folder).">
<meta property="og:type" content="website">
<meta property="og:url" content="http://drivecleaner.softgateon.net/">
<meta property="og:image" content="http://drivecleaner.softgateon.net/img/logo128.png">
<link rel="shortcut icon" href="./favicon.ico">
<head>
<style>
body,table,td,span,select,input,textarea{
font-size:14px;
font-family: Verdana, Arial, Helvetica, sans-serif;
}
button{
font-size:14px;
font-family: Verdana, Arial, Helvetica, sans-serif;
}
body{
background:#e3e3e3;
}
A:link {color:#0860A8;text-decoration:none;}
A:visited {color:#0860A8;text-decoration:none;}
A:active {color:#0860A8;text-decoration:underline;}
A:hover {color:#0860A8;text-decoration:underline;}
.divopt{
-webkit-box-shadow: 0 0 10px #999;
-moz-box-shadow: 0 0 10px #999;
box-shadow: 0 0 10px #999;
}
.menulink{
font-size:15px;
}
.input{
width:630px;
}
.small{
font-size:13px;
}
.shadow{border:0px solid silver;-webkit-box-shadow: 0 0 10px #999; -moz-box-shadow: 0 0 10px #999; box-shadow: 0 0 10px #999;}
</style>
<script src="js/common2.js" type="text/javascript"></script>
<script>
function init(){
window.onunload=function(){
proc_saveopt();
}
}
</script>
</head>
<body onload="init()">
<table align=center>
<tr><td height=10>
</table>
<table id="maintable" width=833 border=0 align=center class="divopt" style="background-color:white;padding:6px 6px 6px 6px;border: 0px solid #2E79DB;">
<tr><td>
<center>
<script type="text/javascript">
google_ad_client = "ca-pub-1113541014872557";
google_ad_slot = "5540699905";
google_ad_width = 728;
google_ad_height = 15;
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</center>
<table width=100%><tr>
<td><img src="img/logo65.png" width=65>
<td>
<td><a id="toptitle" href="./" title="Go Home" style="color:#1667A0"><span style="font-size:27px;font-family:Verdana, Arial;white-space:nowrap;">Duplicate File Finder, Cleaner for Drive</span></a>
<div style="margin-left:2px">
You probably have a few dozen duplicate files, chiefly MP3 and photos in the Google Drive.<br>
This is a handy tool that scans selected directories and finds any duplicate files inside them.
The app works with all sorts of files and can also be configured to scan sub-folders within a given directory.
You can make judgement yourself if you want to trash by selecting them.<br>
Supports IE10+, Chrome, Firefox... Provides connect with Google Drive. You can directly scan duplicate files with your drive.
</div>
</table>
<center>
<script type="text/javascript">
google_ad_client = "ca-pub-1113541014872557";
google_ad_slot = "4063966706";
google_ad_width = 728;
google_ad_height = 90;
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</center>
<tr><td>
<script>
function o_menu_change(){
var v=_getid('o_menu').value;
var a=_getid('alog4');
var b=_getid('btn_unshareall');
var c=_getid('btn_checkall2');
var d=_getid('btn_moveall');
d.style.display='none';
var e=_getid('btn_open');
e.disabled=false;
if(v==0){
a.innerHTML='Duplicate File Results';
b.style.display='none';
c.style.display='';
}else if(v==1){
a.innerHTML='Shared File Results';
b.style.display='';
c.style.display='none';
}else if(v==2){
a.innerHTML='Orphaned File Results';
b.style.display='none';
c.style.display='none';
d.style.display='';
e.disabled=true;
}
}
function proc_saveopt(){
var b=[];
var c;
var obj=_getid("optcontainer");
var a=obj.getElementsByTagName('INPUT');
for(var i = 0; i < a.length; i++){
if(a[i].type=='checkbox'){
c={};
c.name=a[i].name;
c.type=a[i].type;
c.checked=a[i].checked;
b.push(c);
}else if(a[i].type=='text'){
c={};
c.name=a[i].name;
c.type=a[i].type;
c.value=a[i].value || '';
b.push(c);
}
}
var a=obj.getElementsByTagName('SELECT');
for(var i = 0; i < a.length; i++){
if(a[i].form && a[i].form.name){
c={};
c.name=a[i].name;
c.type='select';
c.value=a[i].value || '';
b.push(c);
}
}
if(window.JSON) setstorage('c_opt',JSON.stringify(b));
}
function proc_loadopt(){
var s=getstorage('c_opt');
var b=[];
try{
b=JSON.parse(s);
}catch(err){
b=[];
}
if(!b) b=[];
var c;
for(var i = 0; i < b.length; i++){
if(b[i].type=='checkbox'){
c=document.optcontainer[b[i].name];
if(c) c.checked=b[i].checked;
}else if(b[i].type=='select' || b[i].type=='text'){
c=document.optcontainer[b[i].name];
if(c) c.value=b[i].value;
}
}
var a=_getid("optcontainer").getElementsByTagName('*');
for(var i = 0; i < a.length; i++){
if(a[i].id=='o_menu')continue;
if(a[i].tagName=='SELECT'){
a[i].onchange=proc_saveopt;
}else if(a[i].type=='checkbox'){
//if(a[i].name=='o_remove'){
//}else{
a[i].onclick=proc_saveopt;
//}
}
}
}
function proc_show(name){
var a=_getid(name);
if(!a)return;
if(a.style.display=='') a.style.display='none';
else a.style.display='';
}
function proc_switchlog(id,f){
for(var i = 1; i <= 7; i++){
var a=_getid("log"+i);
if(a) a.style.display='none';
}
var a=_getid("log"+id);
a.style.display='';
var a=_getid("logtab").getElementsByTagName('A');
for(var i = 0; i < a.length; i++){
a[i].style.fontWeight="normal";
}
f.style.fontWeight="bold";
return false;
}
</script>
<style>
.uploaded{color:green;}
.error{color:#8A0808;}
.welcome{color:#45616D;}
.bold1{color:green;}
.log{
width:100%; height:460px;
}
.big1{
font-size:17px;
}
#logtab a{
font-size:14px;
}
#gd_progress{width:650px;white-space:nowrap;overflow:hidden;border:0px solid red;}
#gd_progress2{width:610px;white-space:nowrap;overflow:hidden;border:0px solid red;}
.filename{width:420px;white-space:nowrap;overflow:hidden;border:0px solid red;}
.folder{width:450px;white-space:nowrap;overflow:hidden;border:0px solid red;}
.oname{width:190px;white-space:nowrap;overflow:hidden;border:0px solid red;}
</style>
<table width=100%>
<tr><td>
<button type="button" id='btn_open' onclick="gd_open_picker()" title="Select files and folders from Google Drive" class=big1><img src="images/gdrive/product16.png" width=16 align="absmiddle"> Select files, folders from Google Drive</button>
<button type="button" onclick="proc_selroot()">Scan the entire drive</button>
&nbsp;&nbsp;<button type="button" id="btn_last" disabled onclick="proc_scanlast()" style="color:green">Scan last task again</button>
<tr><td>
<div id="downlink" style="margin-bottom:2px">Select files, folders to scan.</div>
<select id='attachment' style="display:none;width:100%;height:200px" multiple=true onchange="attachment_onchange(this)" onclick="attachment_onchange(this)"></select>
<div id="desc" style="display:none;margin-top:2px;color:green;width:700px;white-space:nowrap;overflow:hidden;border:0px solid red"></div>
<!--<font style="font-size:13px">*Unknown Size: Google Document Formats.</font>//-->
<tr><td>
<form id="optcontainer" name="optcontainer" style="display:inline" onsubmit="return false">
<table>
<tr><td>Scan Type <select id="o_menu" onchange="o_menu_change()" style="width:320px;font-weight:bold">
<option value=0>Duplicate, Large File Finder
<option value=1>Shared File (owned by me) Finder
<option value=2>Orphaned File Finder (Not have a parent folder)
</select>
&nbsp;<label><input type=checkbox name="o_subfolder" checked> Scan sub-folders within a given directory</label>
<tr><td>Search Word (in filename): <input type=text name="o_title" style="width:160px"> ex) xls, zip, png...
&nbsp;&nbsp;File Type: <select name="o_ftype">
<option value="">All types (Default)
<option value="pdf">PDFs
<option value="image">Images, Photos
<option value="audio">Audios
<option value="video">Videos
</select>
<tr><td>Search Period: <input type=text name="o_mdstart" style="width:150px"> < Modified Date < <input type=text name="o_mdend" style="width:150px"> ex) 2015-01-01, 2013-12-31..
<br>(If you do not want to apply a search filter, leave the empty value)
</table>
</form>
<tr><td align=center>
<button onclick="proc_move()" id="btn_moveall"><b>Move to specified folder</b></button>
<button onclick="proc_trashall('unshare')" id="btn_unshareall"><b>UnShare All</b></button>
<button onclick="proc_trashall('trash')" id="btn_trashall">Trash All</button>
<button onclick="proc_checkall(true)">Check All</button>
<button onclick="proc_checkall(true,true)" id="btn_checkall2">Check All (except 1st)</button>
<button onclick="proc_checkall(false)">UnCheck All</button>
<span style="background-color:#E0ECF8;padding:4px;font-size:13px">Trash Success</span> <span style="background-color:#F8E0E0;padding:4px;font-size:13px">Trash Failed</span>
<tr><td>
<div id="logtab">
<a href="#" id="alog4" onclick="return proc_switchlog(4,this)" style="font-weight:bold">Duplicate File Results</a> &nbsp;&nbsp;<a href="#" id="alog5" onclick="return proc_switchlog(5,this)">View Error Log</a>
</div>
<tr><td>
<div id="downlink2" style="margin-bottom:2px"></div>
<div id="log4" class="log" style="overflow-y:scroll;"></div>
<div id="log5" class="log" style="overflow-y:scroll;display:none"></div>
</table>
<tr><td>
<tr><td align=center>
<script type="text/javascript">
google_ad_client = "ca-pub-1113541014872557";
google_ad_slot = "4063966706";
google_ad_width = 728;
google_ad_height = 90;
</script>
<script type="text/javascript"
src="//pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
</table>
<script>
var ischrome=false;
if (navigator.userAgent.indexOf("Chrome")>=0) ischrome=true;
function init_load(){
proc_loadopt();
o_menu_change();
var sw=1000;//_getid('log4').offsetWidth;
for(var i = 1; i <= 7; i++){
var a=_getid("log"+i);
if(a){
if(ischrome) a.setAttribute("readonly", "true");
a.setAttribute("spellcheck", "false");
a.setAttribute("wrap", "off");
a.style.width=sw+'px';
}
}
}
init_load();
</script>
<table align=center style="margin-top:10px"><tr>
<td><span id="bottomtitle">ⓒ 2016, Duplicate File Finder, Cleaner for Drive</span>
</table>
<br>
<style>
.gd_div{background-color:#FFFFE1;position:absolute;overflow:hidden;-webkit-box-shadow: 0 0 25px #999;-moz-box-shadow: 0 0 25px #999;box-shadow: 0 0 25px #999;}
</style>
<div id="layer_message" class="gd_div" style="z-index:10001;display:none;"></div>
<div id="gd_window" class="gd_div" style="z-index:10000001;display:none;"></div>
<div id="gd_btn_login" class="gd_div" style="z-index:10000000;display:none;">
<table>
<tr><td align=center><button onclick="gd_login_manual()" style="font-size:20px"><img src="images/gdrive/product20.png" align="absmiddle"> Login & Authorize</button> <button onclick="gd_login_close()" style="font-size:20px">Close</button>
<tr><td>To use this app, Please login to the Google Drive and authorize this app or website.
<br>(Note: If your browser block or disable the third-party cookies, this login does not work correctly.)
</table>
</div>
<script>
var CLIENT_ID = '694533054135-uoa3k63qr3i9mnd64df2u53ifudo4rg1.apps.googleusercontent.com';
var SCOPES = [
'https://www.googleapis.com/auth/drive.install',
'https://www.googleapis.com/auth/drive'
];
var gd_developerKey='AIzaSyAizqnqmXXVZbG5CGOVeEVclm5Q2IfiecU';
var gd_mimetype="";
var gd_export_extension=[];
var gd_state='';
var gd_picker,gd_picker2,gd_loaded,gd_pickerloaded,gd_lastprogress,gd_issupported,gd_isdownloading,gd_load_timer,gd_bloburl,gd_state2;
var gd_loginexp=0;
var gd_callback;
var ismsie=false;
if(navigator.appName!="Netscape"){
if(navigator.userAgent.indexOf("MSIE")>=0) ismsie=true;
}
function gd_btn_login2(e,callback){
var sl=getScrollLeft();
var st=getScrollTop();
var w=getWindowWidth();
var h=getWindowHeight();
function go(a){
if(a && a.style.display==''){
var x=sl+((w-a.clientWidth) / 2);
var y=st+((h-a.clientHeight) / 2);
a.style["border"]="1px solid #000000";
a.style["padding"]="10px";
a.style.left=x+"px";
a.style.top=y+"px";
}
}
function go2(){
var a=_getid("gviewer");
if(a.style.display!='')return;
var dy=40;
var dy2=15;
var dr=0.07;
if(a.getAttribute("data")=="small"){
dy2=parseInt(h*0.08); //dr=0.15;
}
//a.style.left=(sl+parseInt(w*dr))+'px';
//a.style.width=(w-(parseInt(w*dr)*2))+'px';
var dw=600;
a.style.left=(sl+((w-dw)/2))+'px';
a.style.width=dw+'px';
a.style.top=(st+dy)+'px';
a.style.height=(h-dy-dy2)+'px';
var b=_getid("btn_gvclose");
b.style.display='';
var x=sl+((w-b.offsetWidth) / 2);
var y=st+(dy-b.offsetHeight);
b.style.left=x+'px';
b.style.top=y+'px';
}
go(_getid("gd_btn_login"));
go(_getid("gd_window"));
setTimeout(function(){
go(_getid("gd_btn_login"));
go(_getid("gd_window"));
if(callback)callback();
},10);
go2();
}
function gd_btn_login(isshow){
var a=_getid("gd_btn_login");
if(isshow){
a.style.display='';
gd_btn_login2();
}else{
a.style.display='none';
}
}
function gd_login_close(){
gd_btn_login(false);
gd_state='';
}
function gd_login_manual(){
var p={'client_id': CLIENT_ID, 'scope': SCOPES.join(' '), 'immediate': false};
if(gd_userId){p['login_hint']=gd_userId;p['authuser']=-1;}
gapi.auth.authorize(p, function (authResult){
if (authResult && !authResult.error){
gd_loginexp=(new Date()).getTime()+parseInt(authResult.expires_in*0.7*1000);
gd_btn_login(false);gd_info();
show_message("Login ok!!");
if(gd_callback) gd_callback(true);
else gd_open_state(true);
}else{
gd_btn_login(true);
show_message("Login failed!!");
}
});
}
function gd_login(callback,react){
if(gd_loginexp==0 || gd_loginexp<(new Date()).getTime()){
}else{
callback(true);
return;
}
var p={'client_id': CLIENT_ID, 'scope': SCOPES.join(' '), 'immediate': true};
if(gd_userId){p['login_hint']=gd_userId;p['authuser']=-1;}
gapi.auth.authorize(p, function (authResult){
if (authResult && !authResult.error){
gd_loginexp=(new Date()).getTime()+parseInt(authResult.expires_in*0.7*1000);
gd_btn_login(false);gd_info();
callback(true);
}else{
show_message("Login failed!!");
gd_btn_login(true);
callback(false);
if(react) gd_callback=callback;
else gd_callback=null;
}
});
}
function gd_checklogin(callback){
gd_login(function(result){
if(result)callback();
},true);
}
function gd_loadpicker() {
gapi.load('picker',{'callback': function(){
gd_pickerloaded=true;
}
});
}
function gd_createpicker() {
var access_token=gapi.auth.getToken().access_token;
if(!access_token){
alert('Error!! No access token.');
return;
}
if(!gd_picker){
var view2 = new google.picker.DocsView(google.picker.ViewId.DOCS);
if(gd_mimetype) view2.setMimeTypes(gd_mimetype);
var view4 = new google.picker.DocsView();
view4.setIncludeFolders(true);
view4.setSelectFolderEnabled(true);
view4.setParent("root");
view4.setMimeTypes(gd_mimetype);
var view5 = new google.picker.View(google.picker.ViewId.RECENTLY_PICKED);
gd_picker = new google.picker.PickerBuilder()
//.enableFeature(google.picker.Feature.NAV_HIDDEN)
.enableFeature(google.picker.Feature.MULTISELECT_ENABLED)
.setLocale("en")
.setTitle('Select files and folders')
.setOAuthToken(access_token)
//.addView(view2)
.addView(view4)
.addView(view5)
//.addView(new google.picker.DocsUploadView())
.setDeveloperKey(gd_developerKey)
.setCallback(gd_pickercallback)
.build();
}
gd_picker.setVisible(true);
}
function gd_pickercallback(data) {
if (data.action == google.picker.Action.PICKED) {
if(data.docs && data.docs.length>0){
gd_loadfiles(data.docs);
}
}
}
function getsize(fileSize){
if(!fileSize) return 'Unknown';
function humanFileSize(bytes){
var thresh = 1024;
if(bytes < thresh) return bytes + ' B';
var units = ['kB','MB','GB','TB','PB','EB','ZB','YB'];
var u = -1;
do {
bytes /= thresh;
++u;
} while(bytes >= thresh);
return bytes.toFixed(1)+' '+units[u];
}
return humanFileSize(fileSize);
}
function proc_info(f,id){
if(!gd_files[id] || !gd_files[id].resp)return;
var resp=gd_files[id].resp;
var title=resp.title || '';
var obj=_getid("gd_progress2") || _getid("downlink2");
obj.innerHTML='<font class=welcome>Get share info...</font>';
var request = gapi.client.drive.permissions.list({
'fileId': resp.id
});
request.execute(function(resp){
obj.innerHTML='<font class=welcome>Share info completed.</font>';
if(!resp || !resp.items){
obj.innerHTML='<font class=welcome>Error!! '+henc(title)+'</font>';
return;
}
var s='<div style="margin-left:2px"><b>Permissions Information</b><div class=filename>'+henc(title)+'</div></div><table>';
var a,b;
for(var i = 0; i <= resp.items.length-1; i++){
s+='<tr><td colspan=2 style="border-bottom:1px solid black">';
a=resp.items[i];
if(a.name){
s+='<tr><td>';
if(a.photoLink) s+='<img src="'+a.photoLink+'" width=50>';
else s+='<img src="images/profile-img.jpg" width=50>';
s+='<td>Name: '+henc(a.name)+'<br>';
s+='Role: '+(a.role || '')+'<br>';
s+=henc('Email: '+(a.emailAddress || '')+', Domain: '+(a.domain || ''));
}else{
s+='<tr><td><td>Name: '+a.type+' ('+a.id+')<br>';
s+='Role: '+(a.role || '');
}
}
s+='<tr><td colspan=2 style="border-bottom:1px solid black">';
s+='<tr><td align=center colspan=2><a href="#" onclick="hide_message();return false">Close</a></table>';
show_message(s,'','','',1000*60*60);
});
}
function proc_trash(f,id){
if(!gd_files[id] || !gd_files[id].resp)return;
var resp=gd_files[id].resp;
var tname=f.getAttribute('data4');
var title=resp.title || '';
var obj=_getid("gd_progress2") || _getid("downlink2");
obj.innerHTML='<font class=welcome>Trashing...</font>';
function tcallback(resp){
var n=f.parentNode.parentNode;
if(resp.result && !resp.message){
obj.innerHTML='<font class=welcome>Trash completed. '+henc(title)+'</font>';
n.style.backgroundColor='#E0ECF8';
var a=n.getElementsByTagName('INPUT');
for(var i=a.length-1;i>=0;i--){
if(a[i].type=='checkbox'){
a[i].parentNode.removeChild(a[i]);
}
}
}else{
var s='<font class=error>Trash failed. '+henc(resp.message+' '+title)+'</font>';
obj.innerHTML=s;
n.style.backgroundColor='#F8E0E0';
_log("log5",s,"error",true);
}
}
if(tname=='Delete'){
}else{
var request = gapi.client.drive.files.trash({
'fileId': resp.id
});
}
request.execute(tcallback);
}
function proc_checkall(checked,exfirst){
var obj=_getid('log4');
var a=obj.getElementsByTagName('INPUT');
for(var i = 0; i < a.length; i++){
if(a[i].type=='checkbox'){
if(exfirst){
if(a[i].getAttribute("data3")==0) a[i].checked=false;
else a[i].checked=true;
}else{
a[i].checked=checked;
}
}
}
}
function proc_move(){
function go(){
var access_token=gapi.auth.getToken().access_token;
if(!access_token){
alert('Error!! No access token.');
return;
}
if(!gd_picker2){
var docsView = new google.picker.DocsView()
.setIncludeFolders(true)
.setParent("root")
.setMimeTypes('application/vnd.google-apps.folder')
.setSelectFolderEnabled(true);
var docsView2 = new google.picker.DocsView()
.setIncludeFolders(true)
.setMimeTypes('application/vnd.google-apps.folder')
.setSelectFolderEnabled(true);
var view5 = new google.picker.View(google.picker.ViewId.RECENTLY_PICKED);
gd_picker2 = new google.picker.PickerBuilder()
.setLocale("en")
.setOAuthToken(access_token)
.setDeveloperKey(gd_developerKey)
.setTitle("Select Target Folder to move")
.addView(docsView)
.addView(docsView2)
.addView(view5)
.build();
}
gd_picker2.setCallback(function(data){
if (data.action == google.picker.Action.PICKED) {
if(data.docs && data.docs.length>0){
if(data.docs[0].type!="folder"){
alert("It's not a folder.");
return;
}
proc_trashall('move',data.docs[0].id);
}
}
});
gd_picker2.setVisible(true);
}
gd_login(function(result){
if(!result) return;
go();
});
}
function proc_trashall(kind,param1){
var tname='Trash';
if(kind=='unshare') tname='Unshare';
else if(kind=='move') tname='Move';
if(gd_isdownloading){
alert("It's working... Please try again in a few minutes. or Cancel the current job.");
return;
}
var answer=confirm(tname+" all that you select."+"\n\n"+"Are you sure?");
if(!answer) return;
function end(){
gd_isdownloading=false;
_getid("downlink2").innerHTML='Completed.';
show_message("Completed.");
}
var canceled=false;
_getid("downlink2").innerHTML="<table><tr><td><img src='images/wait.gif' align='absmiddle'><td><a href='#' id='gd_cancel2'>Cancel</a><td><div id='gd_progress2'>"+tname+"ing...</div></table>";
_getid('gd_cancel2').onclick=function(){
canceled=true;
return false;
}
gd_isdownloading=true;
_getid('log5').innerHTML='';
var id,data;
var files=[];
var obj=_getid('log4');
var a=obj.getElementsByTagName('INPUT');
for(var i = 0; i < a.length; i++){
if(a[i].type=='checkbox' && a[i].checked){
id=a[i].getAttribute('data');
if(id){
data={};
data.id=id;
data.title=unescape(a[i].getAttribute('data2') || '');
data.control=a[i];
data.tname2=a[i].getAttribute('data4');
files.push(data);
}
}
}
function complete(){
}
var joblist=[];
var jobtimer;
function getentryidx(){
for(var i = 0; i <= files.length-1; i++){
if(!files[i].done){
files[i].done=true;
return i;
}
}
return null;
}
function checkjoblist(){
if(joblist.length==0)return;
for(var i = 0; i <= joblist.length-1; i++){
if(!joblist[i].complete)return;
}
clearInterval(jobtimer);
end();
complete();
}
function get(jobidx){
function _call(){
var a=joblist[jobidx];
a.func(jobidx)
}
var idx=getentryidx();
if(idx==null || canceled){
joblist[jobidx].complete=true;
return;
}
function _progress(s){
var a=_getid("gd_progress2");
if(a) a.innerHTML='('+(idx+1)+'/'+files.length+') '+s;
}
var fileId=files[idx].id;
var title=files[idx].title;
var f=files[idx].control;
var tname2=files[idx].tname2;
_progress(tname+'ing... '+fileId);
function tcallback(resp){
var n=f.parentNode.parentNode.parentNode;
if(resp.result && !resp.message){
_progress('<font class=welcome>'+tname+' completed. '+henc(title)+'</font>');
n.style.backgroundColor='#E0ECF8';
var a=n.getElementsByTagName('INPUT');
for(var i=a.length-1;i>=0;i--){
if(a[i].type=='checkbox'){
a[i].parentNode.removeChild(a[i]);
}
}
}else{
var s='<font class=error>'+tname+' failed. '+henc(resp.message+' '+title)+'</font>';
_progress(s);
n.style.backgroundColor='#F8E0E0';
_log("log5",s,"error",true);
}
_call();
}
function tcallback2(resp){
var n=f.parentNode.parentNode.parentNode;
if(resp.result && !resp.message){
_progress('<font class=welcome>'+tname+' completed. '+henc(title)+'</font>');
if(resp.parents && resp.parents[0] && resp.parents[0].id){
var a=n.getElementsByClassName('newfolder');
if(a && a[0]){
a[0].innerHTML='<a href="'+gd_weburl()+'#folders/'+resp.parents[0].id+'" target="_blank" title="Show folder">Folder</a>&nbsp;';
}
}
}else{
var s='<font class=error>'+tname+' failed. '+henc(resp.message+' '+title)+'</font>';
_progress(s);
_log("log5",s,"error",true);
}
_call();
}
if(kind=='unshare'){
var request = gapi.client.drive.permissions.list({
'fileId': fileId
});
request.execute(function(resp) {
if(!resp || !resp.items){
var s='<font class=error>'+tname+' failed. '+henc(title)+'</font>';
_progress(s);
_log("log5",s,"error",true);
}else{
for(var i = 0; i <= resp.items.length-1; i++){
if(resp.items[i].role!='owner'){
var request = gapi.client.drive.permissions['delete']({
'fileId': fileId,
'permissionId': resp.items[i].id
});
request.execute(function(resp){
});
}
}
}
_call();
});
}else if(kind=='move'){
var body = {'parents': [{"id":param1}]};
var request = gapi.client.drive.files.patch({
'fileId': fileId,
'resource': body
});
request.execute(tcallback2);
}else{
if(tname2=='Delete'){
tcallback({'message':'It can not be trashed. Move to the specified folder and delete it manually.'});
_call();
return;
}else{
var request = gapi.client.drive.files.trash({
'fileId': fileId
});
}
request.execute(tcallback);
}
}
if(files.length==0){
end();return;
}
gd_login(function(result){
if(!result) return;
gapi.client.load('drive', 'v2', function(){
jobtimer=setInterval(checkjoblist,200);
for(var i = 0; i < 3; i++){
var a={};
a.func=get;
a.complete=false;
joblist.push(a);
a.func(i);
}
});
});
}
function _getfrmdoc(ifrm){
return (ifrm.contentWindow) ? ifrm.contentWindow : (ifrm.contentDocument.document) ? ifrm.contentDocument.document : ifrm.contentDocument;
}
var showopt=true;
function proc_gview(f,id){
if(!gd_files[id] || !gd_files[id].resp)return;
var resp=gd_files[id].resp;
var a=_getid("gviewer");
var s;
if(false && resp.embedLink && resp.videoMediaMetadata && resp.videoMediaMetadata.width && resp.videoMediaMetadata.height){
s=resp.embedLink;
if(resp.email || gd_email) s+='&authuser='+encodeURIComponent(resp.email || gd_email);
s='video.php?embedLink='+encodeURIComponent(s)+'&autoplay=1&width='+resp.videoMediaMetadata.width+'&height='+resp.videoMediaMetadata.height+'&id='+encodeURIComponent(resp.id);
if(showopt){
showopt=false;
s+='&showopt=1';
}
a.setAttribute("data","small");
}else{
s='https://drive.google.com/file/d/'+resp.id+'/preview';
if(resp.alternateLink){
var p1=resp.alternateLink.lastIndexOf("/");
if(p1>=0) s=resp.alternateLink.substr(0,p1)+'/preview';
}
a.setAttribute("data","");
}
a.style.display='';
var ifrm2 = _getfrmdoc(a);
ifrm2.location.replace(s);
gd_btn_login2();
}
function proc_rssclose(){
var a=_getid("gviewer");
if(a && a.style.display==''){
a.style.display="none";
_getid("btn_gvclose").style.display="none";
try{
var ifrm2 = _getfrmdoc(a);
if(ifrm2) ifrm2.location.replace('about:blank');
}catch(err){}
}
}
var body=document.documentElement || document.body;
if(body){
body.onmouseup=function(e){
proc_rssclose();
}
body.onkeydown=function(e){
if(!e)e=window.event;
if(!e)return;
var code=e.keyCode;
if(code==27){
proc_rssclose();
}
}
}
function proc_scanlast(){
if(!g_lastdocs){
alert('No files, folders that you select.');
return;
}
gd_checklogin(function(){
gd_loadfiles(g_lastdocs);
});
}
function proc_selroot(){
gd_checklogin(function(){
var docs=[];
var a={};
a.id='root';
a.name='My Drive';
a.entire=true;
docs.push(a);
gd_loadfiles(docs);
});
}
function proc_loadimg(){
var c=_getid('log4');
var dt=c.scrollTop;
var db=c.scrollTop+c.offsetHeight;
var dy;
var a=c.getElementsByTagName('IMG');
for(var i = 0; i < a.length; i++){
if(a[i].src)continue;
//$(a[i]).css({ opacity: 0 });
var b=a[i];
dy=0;
while(b){
if(isNaN(b.offsetTop)) break;
dy+=b.offsetTop;
if(b.parentNode && b.parentNode.tagName=='FONT'){
break;
}
b=b.offsetParent;
}
if (dy>=dt && dy<=db){
var b=a[i].getAttribute('data');
if(b){
//a[i].onload=function(){$(this).animate({ opacity: 1 },'fast');}
a[i].src=b;
}
}
}
}
var gd_files=[];
var gd_files_count=0;
var g_lastdocs;
function gd_loadfiles(docs,isstart){
if(gd_isdownloading){
alert("It's working... Please try again in a few minutes. or Cancel the current job.");
return;
}
var scandesc;
function end(){
gd_isdownloading=false;
clearTimeout(messagetimer);
hide_message();
var a=_getid("downlink");
if(a.innerHTML && a.innerHTML.indexOf("adownlink")<0){
_getid("downlink").innerHTML="Select files, folders to scan.";
}
}
var canceled=false;
_getid("downlink").innerHTML="<table><tr><td><img src='images/wait.gif' align='absmiddle'><td><a href='#' id='gd_cancel'>Cancel</a><td><div id='gd_progress'>Scanning file information...</div></table>";
_getid('gd_cancel').onclick=function(){
canceled=true;
g_retcancel=true;
return false;
}
gd_isdownloading=true;
if(!docs){
end();return;
}
var a=_getid("attachment");
for(var i=a.options.length-1;i>=0;i--) a.remove(i);
gd_files=[];
gd_files_count=0;
_getid('log4').innerHTML='';
_getid('log5').innerHTML='';
var o_menu=_getid('o_menu').value;
var o_subfolder=document.optcontainer['o_subfolder'].checked;
if(docs[0] && docs[0].entire) o_subfolder=true;
var o_ftype=document.optcontainer['o_ftype'].value;
var o_title=trim(document.optcontainer['o_title'].value);
var o_mdstart=trim(document.optcontainer['o_mdstart'].value);
var o_mdend=trim(document.optcontainer['o_mdend'].value);
var rootid;
g_lastdocs=docs;
_getid('btn_last').disabled=false;
if(o_menu==2){
docs=[{id:'root',name:'My Drive'}];
}
var files=[];var files2=[];
for(var i = 0; i <= docs.length-1; i++){
if(!docs[i].id)continue;
var d={};
d.id=docs[i].id;
d.name=docs[i].name;
d.done=false;
files.push(d);
files2.push(d);
}
function clean1(s){
return s.replace(/\"/g,' ');
}
function sortuniq(){
var results=gd_files;
results.sort(function(a,b){
var a1=a.resp.id || '';
var b1=b.resp.id || '';
if(b1>a1) return 1;
else if(b1<a1) return -1;
else return 0;
});
var ret = [results[0]];
for (var i = 1; i < results.length; i++) {
if (results[i-1].resp.id !== results[i].resp.id) {
ret.push(results[i]);
}
}
//alert(results.length);
gd_files=ret;
//alert(gd_files.length);
}
function sortall(stype){
var results=gd_files;
results.sort(function(a,b){
var a1=a.resp.fileSize || 0;
var b1=b.resp.fileSize || 0;
return b1-a1;
});
var oldsize=-1;
var size,resp,flag,s2,arr2,md5,old;
var arr=[];
var s1='<table style="white-space:nowrap"><tr><td>Menu<td><td><td>Filename';
s1+=' &nbsp;<select id="sel_0" style="width:250px"><option value=0>Sort by Complete Duplicate File (Same Size, Checksum)<option value=2>Sort by Duplicate File (Same Size)<option value=1>Sort by Large File</select>';
s1+='<td>Size<td>Folder Path<td>';
function display(){
if(stype==0){
arr2=[];old='';
arr.sort(function(a,b){
var a1=a.resp.md5Checksum;
var b1=b.resp.md5Checksum;
if(a1>b1) return -1;else if(a1<b1) return 1;else return 0;
});
for(var i = 0; i <= arr.length-1; i++){
md5=arr[i].resp.md5Checksum;
if(md5 && old==md5){
if(arr2.length==0) arr2.push(arr[i-1]);
arr2.push(arr[i]);
}
old=md5;
}
if(arr2.length==0)return;
arr=arr2;
}
s1+='<tr><td colspan=100 style="border-bottom:1px solid black">';
for(var i = 0; i <= arr.length-1; i++){
resp=arr[i].resp;
s1+='<tr>';
s1+='<td><a href="#" onclick="proc_trash(this,'+arr[i].idx2+');return false">Trash</a>&nbsp;';
s1+='<td><label><input type=checkbox data="'+resp.id+'" data2="'+escape(resp.title)+'" data3="'+i+'">&nbsp;&nbsp; </label>';
s1+='<td height=25 align=center>';
if(resp.thumbnailLink) s1+='<img data="'+resp.thumbnailLink.replace(/=s(.*)$/,'=s30')+'" width=30 height=25 align="absmiddle">';
else if(resp.iconLink) s1+='<img data="'+resp.iconLink+'" align="absmiddle">';
s1+='<td><div class=filename title="'+clean1(resp.title)+'\nID: '+resp.id+'\nMD5 Checksum: '+(resp.md5Checksum || '')+'"><a href="#" onclick="proc_gview(this,'+arr[i].idx2+');return false">'+henc(resp.title)+'</a></div><td>'+number_format(resp.fileSize)+'<td>';
if(arr[i].parent && resp.parents && resp.parents[0] && resp.parents[0].id){
s1+='<div class=folder><a href="'+gd_weburl()+'#folders/'+resp.parents[0].id+'" target="_blank" title="'+clean1(arr[i].parent)+'">'+henc(arr[i].parent)+'</a></div>';
}
}
}
for(var i = 0; i <= results.length-1; i++){
if(!results[i])continue;
if(stype==0 || stype==2){
size=results[i].resp.fileSize;
if(size==oldsize){
if(arr.length==0){
results[i-1].idx2=i-1;
arr.push(results[i-1]);
}
results[i].idx2=i;
arr.push(results[i]);
}else{
if(arr.length>0){
flag=true;
display();
}
arr=[];
}
oldsize=size;
}else{
arr.push(results[i]);
if(arr.length>=150)break;
}
}
if(flag || arr.length>0){
if(arr.length>0) display();
s1+='<tr><td colspan=100 style="border-bottom:1px solid black">';
}else{
s1='&nbsp;<select id="sel_0"><option value=0>Sort by Duplicate File<option value=1>Sort by Large File</select>';
if(stype==0 || stype==2) s1=_noresult('No Found Duplicate Files.'+s1);
else s1=_noresult('No Files Found.'+s1);
}
_bottom(s1);
var a=_getid('sel_0');
if(a){
a.value=stype;
a.onchange=function(){
_getid('log4').innerHTML='';
sortall(this.value);
}
}
}
function _noresult(msg){
var s1='<table><tr><td colspan=100><font color=green>'+msg+'</font>';
if(o_title)s1+='<br>Search Word (in filename): '+henc(o_title);
if(o_ftype)s1+='<br>File Type: '+o_ftype;
if(o_mdstart)s1+='<br>'+henc(o_mdstart)+' < Modified Date';
if(o_mdend){
if(!o_mdstart)s1+='<br>Modified Date';
s1+=' < '+henc(o_mdend)+'';
}
return s1;
}
function _bottom(s1){
if(scandesc)s1='<div style="color:green;margin-left:2px;font-size:13px">Scan results for '+henc(scandesc)+'...</div>'+s1;
s1+='</table>';
var a=_getid('log4');
a.onscroll=null;
_log("log4",s1,'',true);
a.scrollTop=0;
proc_loadimg();
a.onscroll=function(){
proc_loadimg();
}
proc_switchlog(4,_getid('alog4'));
}
function sortall1(){
var arr=gd_files;
var s1='<table style="white-space:nowrap">';
if(o_menu==1) s1+='<tr><td>Menu<td><td><td><td>Shared Filename</font><td>Size<td>Folder Path<td>';
else s1+='<tr><td>Menu<td><td><td><td>Orphaned Filename</font><td>Size<td>Folder&nbsp;<td>Owner Name<td>Role';
s1+='<tr><td colspan=100 style="border-bottom:1px solid black">';
var resp,flag,s2;
for(var i = 0; i <= arr.length-1; i++){
if(!arr[i])continue;
flag=true;
resp=arr[i].resp;
s1+='<tr>';
if(o_menu==1){
s1+='<td><a href="#" onclick="proc_trash(this,'+i+');return false">Trash</a>&nbsp;';
s1+='<td><label><input type=checkbox data="'+resp.id+'" data2="'+escape(resp.title)+'" data3="'+i+'">&nbsp;&nbsp; </label>';
}else if(o_menu==2){
if(resp.userPermission && resp.userPermission.id=='me' && resp.userPermission.role!='owner'){
s2='Delete';
s1+='<td><font style="text-decoration:line-through">Trash</font>&nbsp;';
}else{
s2='Trash';
s1+='<td><a href="#" onclick="proc_trash(this,'+i+');return false" data4="'+s2+'">Trash</a>&nbsp;';
}
s1+='<td><label><input type=checkbox data="'+resp.id+'" data2="'+escape(resp.title)+'" data3="'+i+'" data4="'+s2+'">&nbsp;&nbsp; </label>';
}
s1+='<td><a href="#" onclick="proc_info(this,'+i+');return false" title="Share Permissions Information">Info</a>';
s1+='<td height=25 align=center>';
if(resp.thumbnailLink) s1+='<img data="'+resp.thumbnailLink.replace(/=s(.*)$/,'=s30')+'" width=30 height=25 align="absmiddle">';
else if(resp.iconLink) s1+='<img data="'+resp.iconLink+'" align="absmiddle">';
s1+='<td><div class=filename title="'+clean1(resp.title)+'\n('+resp.id+')">';
if(resp.mimeType=='application/vnd.google-apps.folder'){
s1+='<font color=green>(Folder)</font> <a href="'+gd_weburl()+'#folders/'+resp.id+'" target="_blank">'+henc(resp.title)+'</a>';
}else{
s1+='<a href="#" onclick="proc_gview(this,'+i+');return false">'+henc(resp.title)+'</a>';
}
s1+='</div>';
s1+='<td>'+number_format(resp.fileSize)+'<td>';
if(o_menu==1){
if(arr[i].parent && resp.parents && resp.parents[0] && resp.parents[0].id)
s1+='<div class=folder><a href="'+gd_weburl()+'#folders/'+resp.parents[0].id+'" target="_blank" title="'+clean1(arr[i].parent)+'">'+henc(arr[i].parent)+'</a></div>';
}else if(o_menu==2){
s1+='<div class=newfolder></div><td>';
if(resp.owners && resp.owners[0] && resp.owners[0].displayName) s1+='<div class=oname>'+resp.owners[0].displayName+'</div>';
s1+='<td>';
if(resp.userPermission && resp.userPermission.role) s1+='<div class=oname>'+resp.userPermission.role+' ('+resp.userPermission.id+')</div>';
}
}
if(!flag){
if(o_menu==1) s1=_noresult('No Found Shared Files.');
else s1=_noresult('No Found Orphaned Files.');
}
_bottom(s1);
}
function complete(){
var d,s,size;
var a=_getid("attachment");
for(var i = 0; i <= files2.length-1; i++){
d=files2[i];
if(!d.resp || !d.resp.title)continue;
if(o_menu==1){
if(!d.resp.shared)continue;
if(d.resp.userPermission && d.resp.userPermission.id=='me' && d.resp.userPermission.role!='owner')continue;
}else if(o_menu==0){
if(d.resp.mimeType=='application/vnd.google-apps.folder')continue;
if(d.resp.exportLinks)continue;
size=d.resp.fileSize;
if(!size && size!=0)continue;
}else if(o_menu==2){
if(d.id=='root')continue;
}
gd_files_count++;
d.idx=gd_files_count;
gd_files.push(files2[i]);
}
sortuniq();
if(o_menu==1) sortall1();
else if(o_menu==0) sortall(0);
else if(o_menu==2) sortall1();
attachment_count();
}
var joblist=[];
var jobtimer;
function getentryidx(){
for(var i = 0; i <= files.length-1; i++){
if(!files[i].done){
files[i].done=true;
return i;
}
}
return null;
}
function checkjoblist(){
if(joblist.length==0)return;
for(var i = 0; i <= joblist.length-1; i++){
if(!joblist[i].complete)return;
}
clearInterval(jobtimer);
end();
complete();
}
function get(jobidx){
function _call(){
var a=joblist[jobidx];
a.func(jobidx)
}
var idx=getentryidx();
if(idx==null || canceled){
joblist[jobidx].complete=true;
return;
}
if(files[idx].resp){
_call();
return;
}
function _progress(s){
var a=_getid("gd_progress");
if(a) a.innerHTML='('+(idx+1)+'/'+files.length+') '+henc(s);
}
var folderlist;
var progressret;
function getfolder(folderidx){
if(folderidx>folderlist.length-1 || canceled){
_call();
return;
}
_progress('Scanning files in the folder... '+folderlist[folderidx].name);
g_retcancel=false;
var cfolderid=folderlist[folderidx].id;
var query="('"+cfolderid+"' in parents) and (trashed=false) and ('me' in owners)";
if(o_menu==2){
query="(trashed=false)";
}
progressret=function(len){
_progress('Scanning files in the folder... '+folderlist[folderidx].name+' ('+len+')');
}
var query2='';
if(o_mdstart) query2+=" and (modifiedDate > '"+o_mdstart+"T12:00:00')";
if(o_mdend) query2+=" and (modifiedDate < '"+o_mdend+"T12:00:00')";
if(o_ftype) query2+=" and (mimeType contains '"+o_ftype+"')";
if(o_title) query2+=" and (title contains '"+o_title.replace(/(\'|\")/g,'')+"')";
if(query2){
query+=" and (("+query2.replace(/ and /,'')+") or (mimeType = 'application/vnd.google-apps.folder'))";
}
retrieveAllFiles(query, progressret, function(results){
//console.log(results);
var parent=folderlist[folderidx].parent || '';
if(parent) parent+='/';
parent+=folderlist[folderidx].name || '';
var p;
for(var i = 0; i <= results.length-1; i++){
if(!results[i])continue;
if(o_menu==1 && results[i].userPermission && results[i].userPermission.id=='me' && results[i].userPermission.role!='owner')continue;
if(o_menu==1 && !results[i].shared && results[i].mimeType!='application/vnd.google-apps.folder')continue;
if(o_menu==2){
p=results[i].parents;
if(p && p.length>0)continue;
}
var d={};
d.id=results[i].id;
d.name=results[i].title;
d.resp=results[i];
if(cfolderid=='root'){
p=results[i].parents;
if(rootid && p && p.length>0 && rootid!=p[0].id){
d.parent=p[0].id;
}else{
d.parent=parent;
}
}else{
d.parent=parent;
}
d.done=true;
files2.push(d);
if(d.resp.mimeType=='application/vnd.google-apps.folder'){
if(o_menu==1){
if(o_subfolder && !results[i].shared) folderlist.push(d);
}else if(o_menu==0){
if(o_subfolder) folderlist.push(d);
}
}
}
folderidx++;
getfolder(folderidx);
});
}
var fileId=files[idx].id;
_progress('Scanning file info...');
var request = gapi.client.drive.files.get({
'fileId': fileId
});
request.execute(function(resp){
//console.log(resp);
if(resp.error){
var s='Error. ';
if(files[idx].name) s+=files[idx].name+' ';
if(resp.error.message) s+=resp.error.message+' ';
if(resp.error.code==401) s+='Login or Authorize Error.';
_log("log4",s,"error");
}
if(fileId=='root'){
rootid=resp.id;
}
files[idx].resp=resp;
if(!files[idx].name) files[idx].name=resp.title;
if(!scandesc) scandesc=files[idx].resp.title;
if(files[idx].resp.mimeType=='application/vnd.google-apps.folder'){
var flag;
if(o_menu==1){
if(!resp.shared) flag=true;
}else{
flag=true;
}
if(flag){
folderlist=[];
folderlist.push(files[idx]);
getfolder(0);
return;
}
}
_call();
});
}
if(files.length==0){
end();return;
}
gapi.client.load('drive', 'v2', function(){
jobtimer=setInterval(checkjoblist,200);
for(var i = 0; i < 3; i++){
var a={};
a.func=get;
a.complete=false;
joblist.push(a);
a.func(i);
}
});
}
var g_retcancel=false;
function retrieveAllFiles(query,progressret,callback) {
var retrievePageOfFiles = function(request, result) {
request.execute(function(resp) {
//console.log(resp);
result = result.concat(resp.items);
var nextPageToken = resp.nextPageToken;
if (!g_retcancel && nextPageToken) {
request = gapi.client.drive.files.list({
'q': query,'maxResults':200,'pageToken': nextPageToken,
});
if(progressret) progressret(result.length);
retrievePageOfFiles(request, result);
} else {
callback(result);
}
});
}
var initialRequest = gapi.client.drive.files.list({
'q': query,'maxResults':200
});
retrievePageOfFiles(initialRequest, []);
}
function proc_logincheck(){
_getid("log4").innerHTML='';
_getid("log5").innerHTML='';
var b=_getid("gd_progress2");
if(b) b.innerHTML='';
_log("log4",'Login checking...','welcome');
}
var g_logcount=0;
function _log(name,s,state,noenc){
function proc_log(s){
var obj=_getid(name);
/*if(obj.style.display!='') obj.style.display='';
if(g_logcount>200){
g_logcount=0;
obj.innerHTML='';
}*/
var a=document.createElement("div");
a.setAttribute('style','display:block;');
if(!state) state='';
var s1=s; if(!noenc) s1=henc(s1);
s='<font class="'+state+'">'+s1+'</font>';
a.innerHTML=s;
obj.appendChild(a);
obj.scrollTop=obj.scrollHeight;
g_logcount++;
}
if(name=='log4' || name=='log5' || name=='log6'){
proc_log(s);
return;
}
var a=_getid(name);
var s1=a.value;
if(s1) s1+='\n';
a.value=s1+s;
a.scrollTop=a.scrollHeight;
}
function regex_decode(str){
str = str.replace(/\\/gi, "\\\\");
str = str.replace(/\^/gi, "\\^");
str = str.replace(/\$/gi, "\\$");
str = str.replace(/\*/gi, "\\*");
str = str.replace(/\+/gi, "\\+");
str = str.replace(/\?/gi, "\\?");
str = str.replace(/\./gi, "\\.");
str = str.replace(/\(/gi, "\\(");
str = str.replace(/\)/gi, "\\)");
str = str.replace(/\|/gi, "\\|");
str = str.replace(/\{/gi, "\\{");
str = str.replace(/\}/gi, "\\}");
str = str.replace(/\[/gi, "\\[");
str = str.replace(/\]/gi, "\\]");
return str;
}
function attach_delete(){
function remove(idx){
for(var i = 0; i <= gd_files.length-1; i++){
if(gd_files[i].idx==idx){
gd_files.splice(i,1);
return;
}
}
}
var a=_getid("attachment");
var k=-1;
for(var i=a.options.length-1;i>=0;i--){
if(a.options[i].selected){
remove(a.options[i].value);
a.remove(i);
k=i;
}
}
if (k>a.options.length-1) k=a.options.length-1;
if (k>=0){
a.selectedIndex=k;
}
attachment_count();
}
function attach_clear(){
var a=_getid("attachment");
for(var i=a.options.length-1;i>=0;i--) a.remove(i);
gd_files=[];
gd_files_count=0;
attachment_count();
}
function attachment_onchange(f){
function find(idx){
for(var i = 0; i <= gd_files.length-1; i++){
if(gd_files[i].idx==idx){
var s=gd_files[i].resp.title;
var link=gd_files[i].resp.alternateLink || gd_files[i].resp.webContentLink;
if(link) s='<a href="'+link+'" target="_blank" title="View this file">'+henc(s)+'</a>';
s+=' ('+getsize(gd_files[i].resp.fileSize)+')';
_getid("desc").innerHTML=s;
return;
}
}
}
var a=_getid("attachment");
for(var i=a.options.length-1;i>=0;i--){
if(a.options[i].selected){
find(a.options[i].value);
break;
}
}
}
function attachment_count(){
_getid("downlink").innerHTML="Select files, folders to scan. ("+gd_files.length+" files scanned)";
}
function gd_open_picker(){
if(!gd_issupported){
alert("This browser does not support.");
return;
}
if(!gd_loaded || !gd_pickerloaded){
if(!gd_load_timer) gd_loadscript(gd_open_picker);
else alert('Not loaded library. Please try again in a few minutes.');
return;
}
gd_checklogin(function(){
gd_createpicker();
});
}
function gd_getparam(s,name){
name=name+"=";
name=name.toLowerCase();
var p1=s.toLowerCase().indexOf(name);
if (p1<0) return "";
s=s.substr(p1+name.length);
var p2=s.toLowerCase().indexOf("&");
if (p2>=0) {
return s.substr(0,p2);
} else {
return s;
}
}
function gd_open_state(force){
var s=gd_state;
if(s){
if(!gd_issupported){
gd_state='';
alert("This browser does not support.");
return;
}
s=decodeURIComponent(s);
try{
var a=JSON.parse(s);
var ids=[];
function find(b){
if(!b)return;
for(var i=0; i <= b.length-1; i++){
if(b[i]){
var cc={};
cc.id=b[i];
ids.push(cc);
}
}
}
find(a.ids);
find(a.exportIds);
if(ids.length>0){
gd_login(function(result){
if(gd_open2 && !force)return;
gd_open2=true;
if(!result) return;
//_getid('gd_btn_reopen').style.display='';
gd_state='';
gd_loadfiles(ids,true);
});
}
}catch(err){
}
}
}
function gd_clientload(){
gd_loaded=true;
if (window.addEventListener){
window.addEventListener("resize", gd_btn_login2, false);
}else if (window.attachEvent){
window.attachEvent("onresize", gd_btn_login2);
}
gd_open_state();
}
var gd_open2;
function gd_open_state2(){
setTimeout(function(){
if(!gd_open2)gd_open_state();
}, 1000);
}
function gd_loadscript(callback){
function inject(s){
var o = document.createElement('scri' + 'pt');
o.setAttribute('src', s);
o.setAttribute('type', 'text/javascript');
document.body.appendChild(o);
}
if(gd_load_timer)return;
if(gd_loaded && gd_pickerloaded)return;
gd_load_timer=setInterval(function(){
if(gd_loaded && gd_pickerloaded){
clearInterval(gd_load_timer);
if(callback) callback();
}
},100);
inject('https://apis.google.com/js/client.js?onload=gd_clientload');
inject('https://apis.google.com/js/api.js?onload=gd_loadpicker');
}
function gd_dblclick(){
function dblclick(){
try{
if(gd_picker)gd_picker.setVisible(false);
}catch(err){}
}
function keydown(e){
if(!e)e=window.event;
if(e && e.keyCode==27) dblclick();
}
if(window.addEventListener){
document.addEventListener("dblclick", dblclick, false);
document.addEventListener("keydown", keydown, false);
}else if(window.attachEvent){
document.attachEvent("ondblclick", dblclick);
document.attachEvent("onkeydown", keydown);
}
}
var gd_userId,gd_email;
function gd_weburl(){
var s;
if(gd_email) s='https://drive.google.com/?authuser='+gd_email;
else s='https://drive.google.com/';
return s;
}
function gd_info(){
if(gd_email)return;
gapi.client.load('drive', 'v2', function(){
var request = gapi.client.drive.about.get();
request.execute(function(resp) {
if(resp && resp.user){
if(gd_email)return;
gd_email=resp.user.emailAddress;
if(gd_email){
var a=_getid('btn_open');
var b=_getid('gd_btn_reopen');
if(a)a.title=a.title+' ('+gd_email+')';
if(b)b.title=b.title+' ('+gd_email+')';
}
}
});
});
}
function gd_init(){
gd_dblclick();
gd_state2=gd_state;
if(!window.XMLHttpRequest){//!window.FileReader || !window.URL ||
}else{
gd_issupported=true;
if(gd_state){
try{
var a=JSON.parse(gd_state);
gd_userId=a.userId;
if(a.ids || a.exportIds){
_getid("downlink").innerHTML="<table><tr><td><div id='gd_progress'>Ready...</div></table>";
}
}catch(err){}
if(window.addEventListener) window.addEventListener("load", gd_open_state2, false);
else if (window.attachEvent) window.attachEvent("onload", gd_open_state2);
}
gd_loadscript();
}
}
gd_init();
</script>
<button type="button" id="btn_gvclose" style="position:absolute;font-size:20px;padding:4px 25px;display:none;white-space:nowrap"><img src="images/close.png" width=14 align="absmiddle"> Close</button>
<iframe id="gviewer" src="" style="position:absolute;display:none;background-color:white" class="shadow" frameborder=0 allowfullscreen="true"></iframe>
</body>
</html>