Файл: ajax.js
Строк: 1401
<?php
//##############################################
// MONSTA FTP by MONSTA APPS
//##############################################
//
// This file is part of Monsta FTP. Please see index.php for copyright,
// license and support details.
//##############################################
// AJAX NOTES
//##############################################
//
// The "multiple" attribute for select lists is not supported.
// Javascript file include and function calls must be included *after* the form html.
// Javascript that is returned from the AJAX request cannot be executed by the browser.
//##############################################
// START AJAX
//##############################################
function ajaxStart() {
var xmlhttp;
if (window.XMLHttpRequest) {
xmlhttp=new XMLHttpRequest();
} else {
alert(lang_no_xmlhttp);
}
return xmlhttp;
}
// ###########################################
// DETECT BROWSER
// ###########################################
var globalBrowser;
function detectBrowser() {
var userAgent = navigator.userAgent.toLowerCase()
// IE version check (IE10+ supports file input onChange and drag & drop uploads)
if (userAgent.indexOf("msie") !=-1) {
if (parseFloat((userAgent.match(/.*(?:rv|ie)[/: ](.+?)([ );]|$)/) || [])[1]) >= 10)
globalBrowser = "ie10+";
else
globalBrowser = "ie9-";
}
// Other browsers
if (userAgent.indexOf("firefox") !=-1)
globalBrowser = "firefox";
if (userAgent.indexOf("safari") !=-1)
globalBrowser = "safari";
if (userAgent.indexOf("chrome") !=-1)
globalBrowser = "chrome"; // Chrome check must follow Safari as userAgent for Chrome includes "Safari"
if (userAgent.indexOf("opera") !=-1)
globalBrowser = "opera";
}
// ###########################################
// DETECT OS
// ###########################################
var globalOs;
function detectOs() {
if (navigator.appVersion.indexOf("Win")!=-1) globalOs = "win";
if (navigator.appVersion.indexOf("Mac")!=-1) globalOs = "mac";
}
//##############################################
// INITIALISE EVENT LISTENERS (DRAG & DROP)
//##############################################
function listenDropFiles() {
// Set the drag & drop div ID
var dropFilesDiv = document.getElementById("ajaxContentWindow");
var dropFilesCheckDiv = document.getElementById("dropFilesCheckDiv");
var xmlhttp = new XMLHttpRequest();
// Check if upload is supported
if (xmlhttp.upload) {
// Add listener to file drop div
dropFilesDiv.addEventListener("dragover", stopBrowserActions, false);
dropFilesDiv.addEventListener("dragleave", stopBrowserActions, false);
dropFilesDiv.addEventListener("drop", captureDropFiles, false);
// D&D supported message
//dropFilesCheckDiv.innerHTML = lang_support_drop;
//dropFilesCheckDiv.className = 'dropFilesCheckPassColor';
} else {
// D&D unsupported message
//dropFilesCheckDiv.innerHTML = lang_no_support_drop;
//dropFilesCheckDiv.className = 'dropFilesCheckFailColor';
}
}
//###############################################
// INITIALISE EVENT LISTENERS (HIDE CONTEXT MENU)
//###############################################
function listenContextMenu() {
if (globalBrowser == "ie")
document.attachEvent("onclick", hideFileContextMenu);
else
document.addEventListener("click", hideFileContextMenu, true);
}
//##############################################
// CAPTURE DROPPED FILES
//##############################################
function captureDropFiles(e) {
stopBrowserActions(e);
// Get the dropped files
var globalFiles = e.target.files || e.dataTransfer.files; // firefox/safari || chrome
// Upload files
if (globalFiles.length > 0)
processFileUploads(e,1,0,globalFiles);
}
//##############################################
// PROCESS FILE UPLOADS
//##############################################
var globalFileUploadPreCount;
var globalFileUploadCount;
var globalFileUploadTotal;
var globalFiles = new Array();
var globalPaths = new Array();
function processFileUploads(e,isDrop,isFolder,globalFiles) {
var xmlhttp = ajaxStart();
// Check upload is supported
if (xmlhttp.upload) {
// Turn off repeat button
if (isDrop == 1 || isFolder == 1)
hideRepeatButton();
// CHROME - DRAG & DROP FOLDER
if (globalBrowser == "chrome" && isDrop == 1) {
//globalFileUploadCount=0;
var items = e.dataTransfer.items;
// Check there is at least 1 file
if (items.length > 0) {
// Resize file listing window
setFileWindowSize("ajaxContentWindow",0,360);
// Count files to upload
globalFileUploadPreCount=0;
for (var i=0; i<items.length; i++) {
var item = items[i].webkitGetAsEntry();
traverseFileTree(item,"");
}
// The uploading of files needs a slight delay to allow the
// traverseFileTree() function to start counting the files to upload
setTimeout( function() { uploadFilesChrome() }, 500);
}
}
// CHROME - SELECT FOLDER
if (isFolder == 1) {
// Reset arrays
globalFiles = [];
globalPaths = [];
// Process the files
var folderContents = e.target.files;
// Check there is at least 1 file
if (folderContents.length > 0) {
// Resize file listing window
setFileWindowSize("ajaxContentWindow",0,360);
for (var i=0, j=0, file, filePath, fileName; file=folderContents[i]; i++) {
// Check file is not a folder (represented by a dot)
if (file.name != ".") {
fileName = file.webkitRelativePath;
displayTransferWindow(file,fileName,j); // display file in transfer window
filePath = fileName.replace(file.name,"");
globalFiles[j] = file; // record file to array
globalPaths[j] = encodeURIComponent(filePath); // record path to array
j++;
}
}
// Upload the folder
uploadFoldersChrome(globalFiles);
}
}
// OTHER BROWSERS - DRAG & DROP (OR SELECT FILE/S (ALSO CHROME))
if (globalBrowser != "chrome" || (isFolder == 0 && isDrop == 0)) {
// Reset this value for Chrome folder drops
globalFileUploadPreCount=0;
// Set the files input field if not drag & drop
if (globalFiles == '')
globalFiles = document.getElementById('uploadFile').files;
// Check there is at least 1 file
if (globalFiles.length > 0) {
// Resize file listing window
setFileWindowSize("ajaxContentWindow",0,360);
// Open transfer window
for (var i=0, file; file=globalFiles[i]; i++) {
displayTransferWindow(file,file.name,i);
}
// Display indicator icon
showIndicatorDiv();
// Upload first file (subsequent files upload as each one finishes)
globalFileUploadCount=0;
globalFileUploadTotal = globalFiles.length;
fileUploader(globalFiles,"",globalFileUploadCount,0,isDrop);
}
}
} else {
// Submit to iframe if AJAX upload not supported
submitToIframe("&ftpAction=iframe_upload");
}
}
//##############################################
// UPLOAD FILES (CHROME DRAG & DROP)
//##############################################
function uploadFilesChrome(globalFolders) {
globalFileUploadCount=0; // must be set as a var
var filePath = globalPaths[0]; // parse the first path
fileUploader(globalFiles,filePath,globalFileUploadCount,0,1);
}
//##############################################
// UPLOAD FOLDER (CHROME)
//##############################################
function uploadFoldersChrome(globalFiles) {
// This function exists parallel to uploadFilesChrome() because the
// value of globalFiles gets reset between processFileUploads() and
// uploadFilesChrome().
globalFileUploadCount=0; // must be set as a var
globalFileUploadTotal = globalFiles.length;
var filePath = globalPaths[0]; // parse the first path
fileUploader(globalFiles,filePath,globalFileUploadCount,1,0);
}
//##############################################
// TRAVERSE FILE TREE (CHROME)
//##############################################
function traverseFileTree(item,filePath) {
// If File
if (item.isFile) {
item.file(function(file) {
var fileName = filePath + file.name;
displayTransferWindow(file,fileName,globalFileUploadPreCount); // display file in transfer window
globalFiles[globalFileUploadPreCount] = file; // record file to array
globalPaths[globalFileUploadPreCount] = encodeURIComponent(filePath); // record path to array
globalFileUploadPreCount++;
});
}
// If Directory
if (item.isDirectory) {
var dirReader = item.createReader();
// Read list of files/folders and call this function on each
dirReader.readEntries(function(entries) {
for (var i=0; i<entries.length; i++) {
traverseFileTree(entries[i], filePath + item.name + "/");
}
});
}
}
//##############################################
// DISPLAY TRANSFER WINDOW
//##############################################
function displayTransferWindow(file,fileName,rowID) {
rowID++; // Add 1 for table headers
showPopUp('uploadProgressDiv');
// Append a table row to transfer div
var table = document.getElementById("uploadProgressTable");
var row = table.insertRow(rowID);
row.id = "row"+rowID;
var cell1 = row.insertCell(0); // blank
var cell2 = row.insertCell(1);
cell2.innerHTML = formatStrLen(fileName,65,1); // file name
var cell3 = row.insertCell(2);
cell3.innerHTML = formatFileSize(file.size); // file size
var cell4 = row.insertCell(3);
cell4.innerHTML = '<div class="floatLeft" id="progressParent'+rowID+'">'+lang_transfer_pending+'</div><div class="progressBar" id="percent'+rowID+'"></div>'; // progress bar
var cell5 = row.insertCell(4);
cell5.innerHTML = '<div id="timeE'+rowID+'"></div>'; // time elapsed
var cell6 = row.insertCell(5);
cell6.innerHTML = '<div id="uploaded'+rowID+'"></div>'; // size uploaded
var cell7 = row.insertCell(6);
cell7.innerHTML = '<div id="rate'+rowID+'"></div>'; // transfer rate
var cell8 = row.insertCell(7);
cell8.innerHTML = '<div id="timeR'+rowID+'"></div>'; // time remaining
var cell9 = row.insertCell(8);
cell9.innerHTML = '<div id="close'+rowID+'"></div>'; // close button (for rejects)
// Set background color of even-numbered rows
if (rowID%2 == 0)
row.className='trBg1';
else
row.className='trBg0';
}
//##############################################
// FILE UPLOADER
//##############################################
function fileUploader(globalFiles,filePath,rowID,isFolder,isDrop) {
showIndicatorDiv();
// Get file from array
file = globalFiles[rowID];
rowID++; // Add 1 for table headers
// Check the file size doesn't exceed allowed limit
if (file.size > upload_limit) {
// Change progress to error message
document.getElementById('progressParent'+rowID).innerHTML = '<span class="sizeErrorSpan">'+lang_file_size_error+'</span>' // status
// Add close button to row
document.getElementById('close'+rowID).innerHTML = '<span class="progressClose" onclick="deleteProgressRow('+rowID+')">x</span>' // status
// Start next transfer
globalFileUploadCount++;
// Check if another file needs uploading
if (globalFileUploadCount < globalFileUploadTotal || globalFileUploadCount < globalFileUploadPreCount) {
// Set path (if exists)
if (globalPaths[globalFileUploadCount] != undefined)
filePath = globalPaths[globalFileUploadCount]
fileUploader(globalFiles,filePath,globalFileUploadCount,isFolder,isDrop);
} else {
// Reset arrays
globalFiles = [];
globalPaths = [];
// Display repeat button
if (isDrop == 0 && isFolder == 0)
showRepeatButton();
// Reset form for Chrome
if (isFolder == 1) {
resetForm();
}
// Hide indicator icon
hidePopUp('indicatorDiv');
}
} else {
// File size accepted
var xmlhttp = ajaxStart();
// Set action for change of state (listener)
xmlhttp.onreadystatechange = function stateChanged() {
// Check if upload has completed
if(xmlhttp.readyState==4) {
// Set the values of the progress fields to max (finished)
document.getElementById('progress'+rowID).value = 100; // progress bar
document.getElementById('percent'+rowID).innerHTML = '100%'; // percent
document.getElementById('timeR'+rowID).innerHTML = formatSecondsToTime(0); // time remaining
document.getElementById('progressParent'+rowID).innerHTML = '<span class="transferringSpan">'+lang_transferring_to_ftp+'</span>' // status
document.getElementById('percent'+rowID).innerHTML = ""; // percent
document.getElementById('timeE'+rowID).innerHTML = ""; // time elapsed
//document.getElementById('uploaded'+rowID).innerHTML = formatFileSize(file.size); (commented out because by the time the function returns, the value has already been cleared)
document.getElementById('uploaded'+rowID).innerHTML = ""; // uploaded
document.getElementById('rate'+rowID).innerHTML = ""; // transfer rate
document.getElementById('timeR'+rowID).innerHTML = ""; // time remaining
// Refresh open folder (delay half second to complete progress display)
setTimeout(function(){ openThisFolder(globalOpenFolder,0) },500)
// Delete the progress row from table (delay half second to complete progress display)
setTimeout(function(){ deleteProgressRow(rowID) },500)
// Start next transfer
globalFileUploadCount++;
// Check if another file needs uploading
if (globalFileUploadCount < globalFileUploadTotal || globalFileUploadCount < globalFileUploadPreCount) {
// Set path (if exists)
if (globalPaths[globalFileUploadCount] != undefined)
filePath = globalPaths[globalFileUploadCount]
fileUploader(globalFiles,filePath,globalFileUploadCount,isFolder,isDrop);
} else {
// Reset arrays
globalFiles = [];
globalPaths = [];
// Display repeat button
if (isDrop == 0 && isFolder == 0)
showRepeatButton();
// Reset form for Chrome
if (isFolder == 1) {
resetForm();
}
}
}
}
// Create the progress bar
document.getElementById('progressParent'+rowID).innerHTML = '<progress id="progress'+rowID+'"min="0" max="100" value="0"></progress>';
var start = new Date().getTime(), elapsed = '0.0';
var time=0;
var elapsed=0;
var bytesPerSecond=0;
var timeToUpload=0;
var progress=0;
var progressBar;
// Update progress info
xmlhttp.upload.onprogress = function(e) {
if (e.lengthComputable) {
// Get elapsed time
time = new Date().getTime() - start;
elapsed = Math.floor(time / 1000);
// Set the elapsed time
document.getElementById('timeE'+rowID).innerHTML = formatSecondsToTime(elapsed);
// Set the uploaded amount
document.getElementById('uploaded'+rowID).innerHTML = formatFileSize(e.loaded);
// Get the transfer rate
if (elapsed == 0)
bytesPerSecond = e.loaded; // if less than 1s set xfer rate to file size
else
bytesPerSecond = e.loaded/elapsed;
// Set the transfer rate
document.getElementById('rate'+rowID).innerHTML = formatFileSize(bytesPerSecond) + '/s';
// Get remaining time
timeToUpload = Math.round((e.total - e.loaded) / bytesPerSecond);
// Set the remaining time
document.getElementById('timeR'+rowID).innerHTML = formatSecondsToTime(timeToUpload);
// Get the progress
progressBar = document.getElementById('progress'+rowID);
progressBar.value = (e.loaded / e.total) * 100;
// Set the progress bar
//progressBar.innerHTML = Math.round(progressBar.value)+'%'; // Display % for unsupported browsers
// Display %age complete
document.getElementById('percent'+rowID).innerHTML = Math.round(progressBar.value) + '%';
}
};
// Post form
xmlhttp.open("POST", "?ftpAction=upload&filePath="+filePath, true);
xmlhttp.setRequestHeader("Cache-Control", "no-cache");
xmlhttp.setRequestHeader("X-Filename", file.name);
xmlhttp.setRequestHeader("X-Requested-With", "XMLHttpRequest");
xmlhttp.setRequestHeader("X-File-Size", file.size);
xmlhttp.setRequestHeader("X-File-Type", file.type);
xmlhttp.setRequestHeader("Content-Type", "multipart/form-data");
xmlhttp.send(file);
}
}
//##############################################
// STOP BROWSER ACTIONS
//##############################################
function stopBrowserActions(e) {
e.stopPropagation();
e.preventDefault();
}
//##############################################
// PROCESS FORM ONCLICK
//##############################################
function processForm(vars) {
// Display indicator icon
showIndicatorDiv();
var xmlhttp = ajaxStart();
// Get form data
vars = vars + generateVars();
// Add window dimensions
vars = vars + "&windowWidth=" + window.innerWidth;
vars = vars + "&windowHeight=" + window.innerHeight;
// Return HTML from AJAX to div (when complete)
xmlhttp.onreadystatechange = function stateChanged() {
if(xmlhttp.readyState==4) {
document.getElementById("ajaxContentWindow").innerHTML=xmlhttp.responseText;
}
}
// Post form
xmlhttp.open("POST","?",true);
xmlhttp.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
//xmlhttp.setRequestHeader("Content-length", vars.length); // Commented out as not neccessary (Browsers can determine this themselves)
//xmlhttp.setRequestHeader("Connection", "close"); // Commented out as not neccessary
xmlhttp.send(vars);
// Hide indicator icon
hidePopUp('indicatorDiv');
}
//##############################################
// CREATE URL POST VARS
//##############################################
function generateVars() {
var theForm = document.getElementById('ftpActionForm');
var vars = '';
for(i=0;i<theForm.elements.length; i++){
if(theForm.elements[i].type == "text" || theForm.elements[i].type == "textarea" || theForm.elements[i].type == "checkbox" || theForm.elements[i].type == "select-one" || theForm.elements[i].type == "radio" || theForm.elements[i].type == "hidden" || theForm.elements[i].type == "password" || theForm.elements[i].type == "button") {
// Text, Texarea, Hidden, Password, Button
if(theForm.elements[i].type == "text" || theForm.elements[i].type == "textarea" || theForm.elements[i].type == "hidden"|| theForm.elements[i].type == "password" || theForm.elements[i].type == "button"){
vars += "&";
vars += theForm.elements[i].name;
vars += "=";
vars += encodeURIComponent(theForm.elements[i].value);
}
// Checkbox
if(theForm.elements[i].type == "checkbox"){
vars += "&";
vars += theForm.elements[i].name;
vars += "=";
if (theForm.elements[i].checked == true)
vars += theForm.elements[i].value;
}
// Radio
if(theForm.elements[i].type == "radio"){
if (theForm.elements[i].checked == true) {
vars += "&";
vars += theForm.elements[i].name;
vars += "=";
vars += theForm.elements[i].value;
}
}
// Select (single only - multiple not supported)
if(theForm.elements[i].type == "select-one"){
vars += "&";
vars += theForm.elements[i].name;
vars += "=";
if (theForm.elements[i].options[theForm.elements[i].selectedIndex].value != "")
vars += encodeURIComponent(theForm.elements[i].options[theForm.elements[i].selectedIndex].value);
else
vars += encodeURIComponent(theForm.elements[i].options[theForm.elements[i].selectedIndex].text);
}
}
}
return vars;
}
//##############################################
// MAKE POP-UP VISIBLE
//##############################################
function showPopUp(windowID) {
var theWin = document.getElementById(windowID);
theWin.style.visibility = 'visible';
theWin.style.display = '';
// Change cursor to progress
document.getElementById("ajaxContentWindow").style.cursor = 'progress';
}
//##############################################
// MAKE POP-UP HIDDEN
//##############################################
function hidePopUp(windowID) {
var theWin = document.getElementById(windowID);
theWin.style.visibility = 'hidden';
theWin.style.display = 'none';
// Change cursor from progress to default
document.getElementById("ajaxContentWindow").style.cursor = 'default';
}
//##############################################
// CENTER POP-UP
//##############################################
function centerPopUp(windowID,popUpWidth,popUpHeight) {
var popUpLeft;
var popUpTop;
popUpLeft = (window.innerWidth - popUpWidth) / 2;
popUpTop = (window.innerHeight - popUpHeight) / 2;
var theWin = document.getElementById(windowID);
theWin.style.position = 'absolute';
theWin.style.left = popUpLeft +'px';
theWin.style.top = popUpTop + 'px';
theWin.style.width = popUpWidth +'px';
theWin.style.height = popUpHeight +'px';
}
//##############################################
// WRITE INDICATOR
//##############################################
function showIndicatorDiv() {
showPopUp('indicatorDiv');
centerPopUp('indicatorDiv',32,32);
}
//##############################################
// CHECKBOX SELECT ALL
//##############################################
function checkboxSelectAll() {
// Determine if "select all" checkbox is checked
if (document.getElementById("checkboxSelector").checked == true) {
var isChecked=1;
activateActionButtons(1,0);
} else {
var isChecked=0;
activateActionButtons(0,0);
}
// Go through each checkbox
var theForm = document.getElementById('ftpActionForm');
for(i=0;i<theForm.elements.length; i++){
if(theForm.elements[i].type == "checkbox") {
if (isChecked == 1)
theForm.elements[i].checked = true;
else
theForm.elements[i].checked = false;
}
}
}
//##############################################
// SET FILE LISTING WINDOW SIZE
//##############################################
var globalEditorDefaultSize = 170;
function setFileWindowSize(divID,height,dedn) {
if (dedn == 0)
dedn = globalEditorDefaultSize;
if (height == 0) {
var screenHeight = window.innerHeight;
var height = screenHeight - dedn;
}
document.getElementById("ajaxContentWindow").style.height = height+'px';
}
//##############################################
// UPLOAD FILE CHECK
//##############################################
function uploadFileCheck(e) {
if (document.getElementById("uploadFile").value == "")
alert(lang_no_file_selected);
else
processFileUploads(e,0,0,'')
}
//##############################################
// REFRESH FILE LISTING
//##############################################
function refreshListing() {
openThisFolder(globalOpenFolder,0);
}
//##############################################
// OPEN FOLDER
//##############################################
var globalOpenFolder;
function openThisFolder(folder,hideRepeatBtn) {
if (folder == undefined)
folder = "";
else
globalOpenFolder = folder;
// Submit form
processForm('&ftpAction=openFolder&openFolder='+folder);
// Hide Repeat Upload button
if (hideRepeatBtn == 1) {
hideRepeatButton();
resetForm();
}
}
//##############################################
// SHOW REPEAT BUTTON
//##############################################
function showRepeatButton() {
// Files do not upload properly in Firefox
if (globalBrowser != "firefox") {
document.getElementById("repeatUploadDiv").style.visibility = 'visible';
document.getElementById("repeatUploadDiv").style.display = '';
}
}
//##############################################
// HIDE REPEAT BUTTON
//##############################################
function hideRepeatButton() {
document.getElementById("repeatUploadDiv").style.visibility = 'hidden';
document.getElementById("repeatUploadDiv").style.display = 'none';
}
//##############################################
// CHECK FILES ARE SELECTED
//##############################################
function checkFilesSelected() {
// Go through each checkbnox
var theForm = document.getElementById('ftpActionForm');
var isChecked = 0;
for(i=0;i<theForm.elements.length; i++){
if(theForm.elements[i].type == "checkbox") {
if (theForm.elements[i].checked == true)
isChecked=1;
}
}
if (isChecked == 0) {
alert(lang_none_selected);
return 0;
} else {
return 1;
}
}
//##############################################
// CHECK SINGLE FILE/FOLDER CHECKED
//##############################################
function checkFileChecked() {
var isChecked=0;
// Go through each checkbox for a tick
var theForm = document.getElementById('ftpActionForm');
for(i=0;i<theForm.elements.length; i++){
if(theForm.elements[i].type == "checkbox" && theForm.elements[i].checked == true)
isChecked = 1;
}
// If at least one box is ticked, activate action buttons
if (isChecked == 1) {
activateActionButtons(1,0);
} else {
activateActionButtons(0,0);
}
}
//##############################################
// ACTIVATE ACTION BUTTONS
//##############################################
function activateActionButtons(active,paste) {
// Paste button
if (paste == 1 || globalClipboardAction == 'copy')
document.getElementById('actionButtonPaste').disabled = false;
else
document.getElementById('actionButtonPaste').disabled = true;
// All other buttons
if (active == 1) {
document.getElementById('actionButtonCut').disabled = false; // cut
document.getElementById('actionButtonCopy').disabled = false; // copy
document.getElementById('actionButtonRename').disabled = false; // rename
document.getElementById('actionButtonDelete').disabled = false; // delete
if (document.getElementById('actionButtonChmod'))
document.getElementById('actionButtonChmod').disabled = false; // chmod
} else {
document.getElementById('actionButtonCut').disabled = true;
document.getElementById('actionButtonCopy').disabled = true;
document.getElementById('actionButtonRename').disabled = true;
document.getElementById('actionButtonDelete').disabled = true;
if (document.getElementById('actionButtonChmod'))
document.getElementById('actionButtonChmod').disabled = true;
}
}
//##############################################
// ALERT COPY WARNING
//##############################################
function alertCopyWarning() {
// This function is not active by default, but can
// be activated on the actionFunctionCopy() function
alert('WARNING: As files cannot be copied on the remote server they n will be downloaded to the client server and uploaded to the n destination folder. Depending on the size and number of files n being copied, this may take several minutes.');
}
//##############################################
// SET CLIPBOARD ACTION
//##############################################
var globalClipboardAction;
function setClipboard(type) {
globalClipboardAction = type;
}
//##############################################
// PARSE ERROR TO PARENT
//##############################################
function parseDownloadError(error) {
processForm('&ftpAction=openFolder&error='+error);
}
//##############################################
// UPDATE CHMOD NUMBER FROM CHECKBOXES
//##############################################
function updateChmodNum(cbId,n) {
var c = document.getElementById("chmodNum").value;
if (c == "")
c=0;
if (document.getElementById(cbId).checked == true)
c = parseInt(c) + n;
else
c = c - n;
document.getElementById("chmodNum").value = c;
}
//##############################################
// DISPLAY FILE CONTEXT MENU
//##############################################
function displayContextMenu(e,file,folder,isLin) {
stopBrowserActions(e);
showFileContextMenu(e,file,folder,isLin);
}
//##############################################
// HIDE CONTEXT MENU
//##############################################
function hideFileContextMenu() {
document.getElementById("contextMenu").style.visibility = 'hidden';
document.getElementById("contextMenu").style.display = 'none';
}
//##############################################
// SHOW CONTEXT MENU
//##############################################
var globalContextHeight;
function showFileContextMenu(e,file,folder,isLin) {
globalContextHeight=12; // top and bottom padding
// Format folder
folder = encodeURIComponent(folder);
// Set function for paste
if (file == "" && (globalClipboardAction == "cut" || globalClipboardAction == "copy"))
var pasteOnclick = "actionFunctionPaste('"+folder+"')";
else
var pasteOnclick = "";
var menuHTML="";
// Open folder or Download file
if (folder != "")
menuHTML += createContextMenuItem(lang_context_open,"openThisFolder('"+folder+"',1)",1);
if (file != "")
menuHTML += createContextMenuItem(lang_context_download,"window.location='?dl="+file+"'",1);
if (folder != "" || file != "") {
// Check if file is editable
if (file != "") {
var extension = file.substring(file.lastIndexOf('.')+1);
if (editableExts.indexOf(extension) > -1)
menuHTML += createContextMenuItem(lang_context_edit,"actionFunctionEdit('"+file+"')",1);
}
menuHTML += createContextMenuItem(lang_context_cut,"actionFunctionCut('"+file+"','"+folder+"')",0);
menuHTML += createContextMenuItem(lang_context_copy,"actionFunctionCopy('"+file+"','"+folder+"')",0);
menuHTML += createContextMenuItem(lang_context_paste,pasteOnclick,0);
menuHTML += createContextMenuItem(lang_context_rename,"actionFunctionRename('"+file+"','"+folder+"')",0);
menuHTML += createContextMenuItem(lang_context_delete,"actionFunctionDelete('"+file+"','"+folder+"')",isLin);
// Include "Chmod" if Linux
if (isLin == 1)
menuHTML += createContextMenuItem(lang_context_chmod,"actionFunctionChmod('"+file+"','"+folder+"')",0);
} else {
menuHTML += createContextMenuItem(lang_context_cut,"",0);
menuHTML += createContextMenuItem(lang_context_copy,"",0);
menuHTML += createContextMenuItem(lang_context_paste,pasteOnclick,0);
}
// Load the menu HTML into the menu DIV
document.getElementById("contextMenu").innerHTML = menuHTML;
// Position div to cursor
positionDivToCursor(e,"contextMenu");
}
//##############################################
// CREATE CONTEXT MENU ITEM
//##############################################
function createContextMenuItem(label,onclick,divider) {
if (onclick == "")
var menuHTML = '<div class="contextMenuDivInactive" class="contextMenuInactive">'+label+'</div>';
else
var menuHTML = '<div class="contextMenuDiv" onclick="'+onclick+'" onmouseover="this.className='contextMenuDivMouseOver';" onmouseout="this.className='contextMenuDiv';">'+label+'</div>';
// Add horizontal divider
if (divider == 1) {
menuHTML += '<div class="contextMenuDivider"></div>';
globalContextHeight = parseInt(globalContextHeight) + 12;
}
// Set height of the menu
globalContextHeight = parseInt(globalContextHeight) + 29;
return menuHTML;
}
//##############################################
// ACTION FUNCTION - EDIT
//##############################################
function actionFunctionEdit(file) {
var vars = '&ftpAction=edit&file='+file;
processForm(vars);
}
//##############################################
// ACTION FUNCTION - CUT
//##############################################
function actionFunctionCut(file,folder) {
var vars = '&ftpAction=cut&folderSingle='+folder+'&fileSingle='+file;
// Check if a file or folder is set or 1+ checkboxes selected
if (file != '' || folder != '' || checkFilesSelected() == 1) {
processForm(vars);
setClipboard('cut');
activateActionButtons(0,1);
}
}
//##############################################
// ACTION FUNCTION - COPY
//##############################################
function actionFunctionCopy(file,folder) {
var vars = '&ftpAction=copy&folderSingle='+folder+'&fileSingle='+file;
// Check if a file or folder is set or 1+ checkboxes selected
if (file != '' || folder != '' || checkFilesSelected() == 1) {
//alertCopyWarning();
processForm(vars);
setClipboard('copy');
activateActionButtons(0,1);
}
}
//##############################################
// ACTION FUNCTION - PASTE
//##############################################
function actionFunctionPaste(folder) {
var vars = '&ftpAction=paste';
// Check if a folder has been right-clicked on for paste
if (folder != "")
vars += '&rightClickFolder='+folder;
processForm(vars);
activateActionButtons(0,0);
// Reset clipboard action for cut
if (globalClipboardAction == "cut")
globalClipboardAction = "";
}
//##############################################
// ACTION FUNCTION - RENAME
//##############################################
function actionFunctionRename(file,folder) {
var vars = '&ftpAction=rename&folderSingle='+folder+'&fileSingle='+file;
// Check if a file or folder is set or 1+ checkboxes selected
if (file != '' || folder != '' || checkFilesSelected() == 1) {
processForm(vars);
}
}
//##############################################
// ACTION FUNCTION - DELETE
//##############################################
function actionFunctionDelete(file,folder) {
var vars = '&ftpAction=delete';
if (file != '' || folder != '')
vars += '&folderSingle='+folder+'&fileSingle='+file;
// Check if a file or folder is set or 1+ checkboxes selected
if (file != '' || folder != '' || checkFilesSelected() == 1) {
processForm(vars);
activateActionButtons(0,0);
}
}
//##############################################
// ACTION FUNCTION - CHMOD
//##############################################
function actionFunctionChmod(file,folder) {
var vars = '&ftpAction=chmod&folderSingle='+folder+'&fileSingle='+file;
// Check if a file or folder is set or 1+ checkboxes selected
if (file != '' || folder != '' || checkFilesSelected() == 1) {
processForm(vars);
}
}
//##############################################
// ACTION FUNCTION - LOGOUT
//##############################################
function actionFunctionLogout() {
document.location.href='?logout=1'
}
//##############################################
// SELECT FILE (ADD BORDER)
//##############################################
// IE adds a dotted border around a link that has been clicked, other browsers
// do not. This function adds a border to identify which link has been right-
// clicked on.
function selectFile(theId,checkIE) {
if (checkIE == 0 || (checkIE == 1 && globalBrowser != "ie")) {
// Remove any existing borders
unselectFiles();
// Add border to item
document.getElementById(theId).style.border = '1px dotted gray';
document.getElementById(theId).style.marginLeft = '-1px';
document.getElementById(theId).style.marginRight = '-1px';
}
}
//##############################################
// UNSELECT FOLDER
//##############################################
function unselectFolder(folder) {
var href = document.getElementById(folder);
href.style.border='';
href.style.marginLeft = '0px';
href.style.marginRight = '0px';
}
//##############################################
// UNSELECT FILES
//##############################################
function unselectFiles() {
// Go through each <a> tag and remove any borders
var hrefs = document.getElementsByTagName("A");
for (var i = 0; i < hrefs.length; i++) {
hrefs[i].style.border='';
hrefs[i].style.marginLeft = '0px';
hrefs[i].style.marginRight = '0px';
}
}
//##############################################
// SET DRAG FILE
//##############################################
var globalDragFile;
function setDragFile(file,folder) {
if (file != "")
globalDragFile = file;
if (folder != "")
globalDragFile = folder;
}
//##############################################
// DRAG FILE
//##############################################
function dragFile(e) {
stopBrowserActions(e);
}
//##############################################
// DROP FILE
//##############################################
function dropFile(folder) {
var vars = '&ftpAction=dragDrop&dragFile='+globalDragFile+'&dropFolder='+encodeURIComponent(folder);
processForm(vars);
activateActionButtons(0,0);
}
//##############################################
// POSITION DIV TO CURSOR
//##############################################
function positionDivToCursor(e,divId) {
var mousex = e.clientX;
var mousey = e.clientY;
var innerHeight = window.innerHeight;
// Adjust Y for IE
if (globalBrowser != "ie")
mousey = parseInt(mousey) + 15;
// Adjust height
if ((parseInt(mousey) + globalContextHeight) > innerHeight)
mousey = mousey - globalContextHeight;
// Set coordinates for context menu and display
document.getElementById(divId).style.left = mousex + 'px';
document.getElementById(divId).style.top = mousey + 'px';
document.getElementById(divId).style.visibility = 'visible';
document.getElementById(divId).style.display = '';
}
//##############################################
// FORMAT FILE SIZE
//##############################################
function formatFileSize(size) {
if (size < 1024) {
size = Math.round(size)+' '+lang_size_b;
} else if (size < (1024*1024)) {
size = Math.round(size/1024)+' '+lang_size_kb;
} else if (size < (1024*1024*1024)) {
size = ((size/1024)/1024).toFixed(1)+' '+lang_size_mb;
} else if (size < (1024*1024*1024*1024)) {
size = (((size/1024)/1024)/1024).toFixed(1)+' '+lang_size_gb;
}
return size;
}
//##############################################
// FORMAT SECONDS TO TIME (00:00:00)
//##############################################
function formatSecondsToTime(s) {
var time='';
var h = Math.floor(s / 3600);
if (h > 0)
s = s - (h * 3600);
var m = Math.floor(s / 60);
if (m > 0)
s = s - (m * 60);
if (h < 10)
time += '0';
time += h + ':';
if (m < 10)
time += '0';
time += m + ':';
if (s < 10)
time += '0';
time += s;
return time;
}
//##############################################
// FORMAT STRING TO LENGTH
//##############################################
function formatStrLen(str,n,elipse) {
if (str.length > n) {
str = str.substr(0,n);
if (elipse == 1)
str = str + '...';
}
return str;
}
//##############################################
// DELETE ROW FROM UPLOAD PROGRESS TABLE
//##############################################
function deleteProgressRow(rowID) {
// Delete the row
var row = document.getElementById("row"+rowID);
row.parentNode.removeChild(row);
// Check if transfer table can be closed
var rowCount = document.getElementById("uploadProgressTable").rows.length;
if (rowCount == 1) {
hidePopUp("uploadProgressDiv");
setFileWindowSize("ajaxContentWindow",0,0);
}
}
//##############################################
// CHOOSE FILE TO UPLOAD (ONCLICK)
//##############################################
function fileChoose(e) {
document.getElementById("uploadFile").click();
}
//##############################################
// CHOOSE FOLDER TO UPLOAD (ONCLICK)
//##############################################
function dirChoose(e) {
document.getElementById("uploadDir").click();
}
//##############################################
// RESET FORM
//##############################################
function resetForm() {
// Required for file onChange to work in Chrome
document.ftpActionForm.reset();
}
//##############################################
// CLOSE EDITOR
//##############################################
function submitToIframe(vars) {
var theForm = document.forms["ftpActionForm"];
// Submit the form post to the iframe
theForm.target = 'ajaxIframe';
theForm.action = '?'+vars;
theForm.submit();
// Reset values
theForm.target = '';
theForm.action = '?';
}
//##############################################
// DISPLAY UPLOAD BUTTONS
//##############################################
function displayUploadButtons() {
var html="";
html += '<div class="floatLeft10">';
// IE Upload File (for < IE9)
if (globalBrowser == "ie9-") {
html += '<input type="file" name="uploadFile" id="uploadFile" multiple onChange="processFileUploads(event,0,0,'')"> ';
html += '<input type="button" value="'+lang_btn_upload_file+'" onClick="uploadFileCheck(event)" class="'+adjustButtonWidth(lang_btn_upload_file)+'">';
}
// Non-IE9 Upload File
if (globalBrowser != "ie9-") {
html += '<input type="button" value="'+lang_btn_upload_files+'" onClick="fileChoose(event)" class="'+adjustButtonWidth(lang_btn_upload_files)+'">';
}
html += '</div>';
// Repeat Button
html += '<div id="repeatUploadDiv" style="visibility: hidden; display: none">';
html += '<div class="floatLeft10">';
html += '<input type="button" value="'+lang_btn_upload_repeat+'" onclick="processFileUploads(event,0,0,'')" class="'+adjustButtonWidth(lang_btn_upload_repeat)+'">';
html += '</div>';
html += '</div>';
// Chrome Upload Folder
if (globalBrowser == "chrome") {
html += '<div class="floatLeft">';
html += '<input type="button" value="'+lang_btn_upload_folder+'" onClick="dirChoose(event)" class="'+adjustButtonWidth(lang_btn_upload_folder)+'">';
html += '<div class="uploadHiddenDiv">';
html += '<input type="file" name="uploadDir" id="uploadDir" onChange="processFileUploads(event,0,1,'')" webkitdirectory directory>';
html += '</div>';
html += '</div>';
}
// Non-IE9 Upload File Setter (hidden)
if (globalBrowser != "ie9-") {
html += '<div class="uploadHiddenDiv">';
html += '<input type="file" name="uploadFile" id="uploadFile" onChange="processFileUploads(event,0,0,'')"';
// Check for Win/Safari combo, as multiple not supported
if (globalOs == "win" && globalBrowser == "safari") {
} else {
html += " multiple";
}
html += '>';
html += '</div>';
}
// Write the HTML to the div
document.getElementById("uploadButtonsDiv").innerHTML = html;
}
//##############################################
// ADJUST BUTTON WIDTH (FOR LANGUAGES)
//##############################################
function adjustButtonWidth(str) {
if (str.length > 12)
return 'inputButtonNf';
else
return "inputButton";
}
//##############################################
// EXECUTE FUNCTIONS ON LOAD
//##############################################
detectBrowser();
detectOs();
listenDropFiles();
listenContextMenu();
setFileWindowSize("ajaxContentWindow",0,0);
displayUploadButtons();
?>