Removed greeno theme
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 6.7 KiB |
|
Before Width: | Height: | Size: 927 B |
|
Before Width: | Height: | Size: 888 B |
|
Before Width: | Height: | Size: 308 B |
|
Before Width: | Height: | Size: 701 B |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 313 B |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 587 B |
@@ -1,713 +0,0 @@
|
||||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
|
||||
<html>
|
||||
<head>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=9" />
|
||||
<title>Backup</title>
|
||||
|
||||
<link href='https://fonts.googleapis.com/css?family=Source+Sans+Pro' rel='stylesheet' type='text/css'>
|
||||
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/green-theme/jquery-ui-1.10.3.min.css" />
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/common.css" />
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/jstree/style.css" />
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/main.css" />
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/editdialog.css" />
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/restoredialog.css" />
|
||||
<link rel="stylesheet" type="text/css" href="stylesheets/logwindow.css" />
|
||||
<link rel="stylesheet" type="text/css" href="../oem/greeno/stylesheets/oem.css" />
|
||||
<link rel="stylesheet" type="text/css" href="../customized/customized.css" />
|
||||
|
||||
|
||||
<!--[if lt IE 9]>
|
||||
<script type="text/javascript" src="scripts/jquery-1.11.0.min.js"></script>
|
||||
<![endif]-->
|
||||
<script type="text/javascript" src="scripts/jquery-2.0.3.min.js"></script>
|
||||
<script type="text/javascript" src="scripts/jquery-ui-1.10.3.min.js"></script>
|
||||
<script type="text/javascript" src="scripts/jquery.tmpl.min.js"></script>
|
||||
<script type="text/javascript" src="scripts/jquery.watermark.min.js"></script>
|
||||
<script type="text/javascript" src="scripts/jstree.min.js"></script>
|
||||
<script type="text/javascript" src="scripts/json2.js"></script>
|
||||
<script type="text/javascript" src="scripts/oldbrowsersupport.js"></script>
|
||||
<script type="text/javascript" src="scripts/config.js"></script>
|
||||
<script type="text/javascript" src="scripts/app.js"></script>
|
||||
<script type="text/javascript" src="scripts/editdialog.js"></script>
|
||||
<script type="text/javascript" src="scripts/edituri.js"></script>
|
||||
<script type="text/javascript" src="scripts/restoredialog.js"></script>
|
||||
<script type="text/javascript" src="scripts/folderbrowser.js"></script>
|
||||
<script type="text/javascript" src="scripts/logwindow.js"></script>
|
||||
<script type="text/javascript" src="scripts/plugins.js"></script>
|
||||
<script type="text/javascript" src="scripts/hideShowPassword.min.js"></script>
|
||||
<script type="text/javascript" src="scripts/jquery.timeago.js"></script>
|
||||
<script type="text/javascript" src="scripts/jquery.noty.packaged.min.js"></script>
|
||||
<script type="text/javascript" src="scripts/zxcvbn.js"></script>
|
||||
<script type="text/javascript" src="scripts/cryptojs.js"></script>
|
||||
<script type="text/javascript" src="../oem/greeno/scripts/oem.js"></script>
|
||||
<script type="text/javascript" src="../customized/customized.js"></script>
|
||||
|
||||
|
||||
<script id="backup-item-template" type="text/x-jquery-tmpl">
|
||||
<div id="backup-${Backup.ID}" class="main-backup-entry">
|
||||
|
||||
<div id="backup-control-${Backup.ID}" class="main-backup-control">
|
||||
</div>
|
||||
|
||||
<div class="caption-text">${Backup.Name}</div>
|
||||
<ul class="hint-text last-run-time" style="display: none" >
|
||||
<li class="hint-text-caption">Last successful run:</li>
|
||||
<li class="backup-last-run" alt="${Backup.Metadata.LastBackupStarted}">${$.timeago($.parseDate(Backup.Metadata.LastBackupStarted))}</li>
|
||||
</ul>
|
||||
<ul class="hint-text next-run-time" style="display: none">
|
||||
<li class="hint-text-caption">Next run:</li>
|
||||
<li class="backup-next-run"></li>
|
||||
</ul>
|
||||
|
||||
<ul class="hint-text last-run-source-size">
|
||||
<li class="hint-text-caption">Source:</li>
|
||||
<li class="source-size">${Backup.Metadata.SourceSizeString || 'No data'}</li>
|
||||
</ul>
|
||||
<ul class="hint-text last-run-target-size">
|
||||
<li class="hint-text-caption">Backup:</li>
|
||||
<li class="target-size">${Backup.Metadata.TargetSizeString || 'No data'}</li>
|
||||
</ul>
|
||||
</div>
|
||||
</script>
|
||||
<script id="backup-option-template" type="text/x-jquery-tmpl">
|
||||
<div class="backup-option ${Deprecated}">
|
||||
<div>
|
||||
<a id="${Name}" class="action-link backup-option-name backup-option-link">${Name}</a> : <div class="backup-option-short">${ShortDescription}</div>
|
||||
</div>
|
||||
<div class="backup-option-summary">
|
||||
<div class="backup-option-type">Type: ${Type}</div>,
|
||||
<div class="backup-option-default">Default value: ${DefaultValue}</div>
|
||||
</div>
|
||||
<div class="backup-option-long">${LongDescription}</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script id="log-data-template" type="text/x-jquery-tmpl">
|
||||
<div class="log-entry">
|
||||
<div class="log-backupid">${BackupID}</div>
|
||||
<div class="log-timestamp" title="${Timestamp*1000}">${Timestamp*1000}</div>
|
||||
<div class="log-message">${Message}</div>
|
||||
<div class="log-exception">${Exception}</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script id="live-log-data-template" type="text/x-jquery-tmpl">
|
||||
<div class="log-entry">
|
||||
<div class="log-id">${BackupID}</div>
|
||||
<div class="log-timestamp" title="${When}">${When}</div>
|
||||
<div class="log-message">${Message}</div>
|
||||
<div class="log-exception">${Exception}</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script id="log-backup-general-template" type="text/x-jquery-tmpl">
|
||||
<div class="log-entry">
|
||||
<div class="log-operationid">${BackupID}</div>
|
||||
<div class="log-timestamp" title="${Timestamp*1000}">${Timestamp*1000}</div>
|
||||
<div class="log-type">${Type}</div>
|
||||
<div class="log-message">${Message}</div>
|
||||
<div class="log-exception">${Exception}</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script id="log-backup-remote-template" type="text/x-jquery-tmpl">
|
||||
<div class="log-entry">
|
||||
<div class="log-operationid">${OperationID}</div>
|
||||
<div class="log-timestamp" title="${Timestamp*1000}">${Timestamp*1000}</div>
|
||||
<div class="log-type">${Operation}</div>
|
||||
<div class="log-path">${Path}</div>
|
||||
<div class="log-data">${Data}</div>
|
||||
</div>
|
||||
</script>
|
||||
|
||||
<script id="about-dialog-template" type="text/x-jquery-tmpl">
|
||||
<li class="about-library-entry">
|
||||
<div class="about-library-name"><a href="${link}" target="blank">${name}</a></div>
|
||||
<div class="about-library-description">${description}.</div>
|
||||
<div class="about-library-license"> <a href="${licenselink}">${license} licensed.</a></div>
|
||||
<div class="about-library-notes"></div>
|
||||
</li>
|
||||
</script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<div id="click-intercept"></div>
|
||||
<div id="main-topbar">
|
||||
<div class="content-wrap padded">
|
||||
<div id="main-appname">Duplicati</div>
|
||||
|
||||
<ul class="main-shortcuts">
|
||||
<li id="main-donate" class="main-icon-donate" style="display: none"></li>
|
||||
<li id="main-control" class="main-icon-pause"></li>
|
||||
<li id="main-settings" class="main-icon-settings"></li>
|
||||
</ul>
|
||||
|
||||
<ul id="main-control-menu" class="menu">
|
||||
<li id="main-control-menu-settings"><a>Settings...</a></li>
|
||||
<li>-</li>
|
||||
<li><a>Pause</a>
|
||||
<ul id="main-control-menu-pause-submenu" class="menu">
|
||||
<li id="main-control-menu-pause-submenu-5m"><a>5 minutes</a></li>
|
||||
<li id="main-control-menu-pause-submenu-10m"><a>10 minutes</a></li>
|
||||
<li id="main-control-menu-pause-submenu-15m"><a>15 minutes</a></li>
|
||||
<li id="main-control-menu-pause-submenu-30m"><a>30 minutes</a></li>
|
||||
<li id="main-control-menu-pause-submenu-1h"><a>1 hour</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li id="main-control-menu-throttle"><a>Throttle ...</a></li>
|
||||
<li>-</li>
|
||||
<li id="main-control-menu-import"><a>Import backup job...</a></li>
|
||||
<li id="main-control-menu-restore-direct"><a>Restore from target ...</a></li>
|
||||
<li>-</li>
|
||||
<li id="main-control-menu-updates"><a>Check for updates</a></li>
|
||||
<li id="main-control-menu-check-updates"><a>Check for updates</a></li>
|
||||
<li id="main-control-menu-log"><a>Show log ...</a></li>
|
||||
<li id="main-control-menu-options"><a>Options ...</a></li>
|
||||
<li id="main-control-menu-about"><a>About ...</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="main-status-area-outer">
|
||||
<div class="content-wrap padded">
|
||||
<div id="main-status-area">
|
||||
<div id="main-status-area-text">
|
||||
My Important Backup
|
||||
</div>
|
||||
<div id="main-status-area-cancel-button"></div>
|
||||
<div id="main-status-area-progress-outer">
|
||||
<div id="main-status-area-progress-bar" class="">
|
||||
</div>
|
||||
<div id="main-status-area-progress-text">
|
||||
Processing 123456 files ...
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</header>
|
||||
<section>
|
||||
<ul id="backup-context-menu" class="context-popup-menu menu" style="display: none">
|
||||
<li><u><b>Operations</b></u></li>
|
||||
<li id="backup-details-run"><a>Run backup now!</a></li>
|
||||
<li id="backup-details-restore"><a>Restore files ...</a></li>
|
||||
<li>-</li>
|
||||
<li><u><b>Configuration</b></u></li>
|
||||
<li id="backup-details-edit"><a>Edit ...</a></li>
|
||||
<!-- <li id="backup-details-copy"><a>Copy</a></li> -->
|
||||
<li id="backup-details-export"><a>Export ...</a></li>
|
||||
<li id="backup-details-delete"><a>Delete</a></li>
|
||||
<li>-</li>
|
||||
<li><u><b>Advanced</b></u></li>
|
||||
<li id="backup-details-delete-local"><a>Delete local database</a></li>
|
||||
<!-- <li id="backup-details-delete-remote"><a>Delete remote data</a></li> -->
|
||||
<li id="backup-details-repair"><a>Repair local database</a></li>
|
||||
<li id="backup-details-verify"><a>Verify backup files</a></li>
|
||||
<li>-</li>
|
||||
<li><u><b>Reporting</b></u></li>
|
||||
<li id="backup-details-show-log"><a>Show log ...</a></li>
|
||||
<li id="backup-details-send-report"><a>Create bug report ...</a></li>
|
||||
</ul>
|
||||
|
||||
<div id="main-list">
|
||||
<div id="main-list-container" class="content-wrap padded">
|
||||
<div id="main-newbackup" class="main-backup-action-buttons">
|
||||
<div class="main-backup-control main-icon-plus"></div>
|
||||
<div class="caption-text">Add new backup</div>
|
||||
</div>
|
||||
<div id="main-restorebackup" class="main-backup-action-buttons">
|
||||
<div class="main-backup-control main-icon-restore"></div>
|
||||
<div class="caption-text">Restore from target</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="loading-dialog" class="modal-dialog" title="Loading...">
|
||||
<div id="main-list-loader-icon" class="large-loader-icon"></div>
|
||||
</div>
|
||||
|
||||
<div id="connection-lost-dialog" class="modal-dialog" title="Server connection lost">
|
||||
<div id="connection-lost-dialog-text"></div>
|
||||
<div id="connection-lost-dialog-error"></div>
|
||||
</div>
|
||||
|
||||
<div id="edit-dialog" class="modal-dialog tabs edit-dialog" title="Edit backup">
|
||||
<ul>
|
||||
<li><a href="#edit-tab-general">General</a></li>
|
||||
<li><a href="#edit-tab-sourcedata">Source Data</a></li>
|
||||
<li><a href="#edit-tab-schedule">Schedule</a></li>
|
||||
<li><a href="#edit-tab-options">Options</a></li>
|
||||
</ul>
|
||||
|
||||
<form id="edit-dialog-form">
|
||||
<div id="edit-tab-general">
|
||||
<div class="input-block">
|
||||
<div class="edit-dialog-label" title="Choose a descriptive name for your backup job">Name</div>
|
||||
<input type="text" name="backup-name" id="backup-name" class="ui-corner-all" />
|
||||
</div>
|
||||
<!--
|
||||
<div class="input-block">
|
||||
<div class="edit-dialog-label">Backup labels</div>
|
||||
<input type="text" name="backup-labels" id="backup-labels" class="ui-corner-all" />
|
||||
</div>
|
||||
-->
|
||||
<div class="input-block">
|
||||
<div class="edit-dialog-label action-link" id="backup-uri-label" title="The destination where the backup data is stored is supplied in the form of a URI. Click the link here to edit the individual parts of the connection URI.">Backup to…</div>
|
||||
<div class="field-group">
|
||||
<textarea type="text" name="backup-uri" id="backup-uri" value="" class="ui-corner-all" rows="3"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="encryption-area">
|
||||
<div class="input-block">
|
||||
<div class="edit-dialog-label" title="It is recommended to encrypt all backups stored on remote servers">Encryption</div>
|
||||
<div class="field-group">
|
||||
<select type="text" name="encryption-method" id="encryption-method" class="ui-corner-all">
|
||||
<option>AES 256 bit</option>
|
||||
<option>GNU Privacy Guard</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="encryption-password-area">
|
||||
<div class="input-block">
|
||||
<div class="edit-dialog-label">Passphrase</div>
|
||||
<div class="field-group">
|
||||
<input type="password" name="encryption-password" id="encryption-password" value="" class="ui-corner-all" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="input-block">
|
||||
<div class="edit-dialog-label" id="repeat-password-label">Repeat passphrase</div>
|
||||
<div class="field-group">
|
||||
<input type="password" name="repeat-password" id="repeat-password" value="" class="ui-corner-all" />
|
||||
<ul class="inline-links">
|
||||
<li><div id="toggle-show-password" class="action-link">Show</div></li>
|
||||
<li><div id="generate-password" class="action-link">Generate</div></li>
|
||||
<li><div id="backup-password-strength" class="" title="Time it takes to break this password">Strength: unknown</div></li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="edit-tab-sourcedata">
|
||||
|
||||
<!-- <div class="input-wrapper">
|
||||
<div class="edit-dialog-label" title="Choose if the backup configuration should be stored">Store configuration</div>
|
||||
<select id="store-task-config" name="store-task-config">
|
||||
<option value="false">Don't store setup</option>
|
||||
<option value="true">Store this backup job setup</option>
|
||||
<option value="all">Store all backup job setups</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div> -->
|
||||
|
||||
<div id="source-folder-paths" class="empty">
|
||||
<div id="source-folder-droptarget"></div>
|
||||
<div id="source-folder-paths-hint" class="hint-text">Click the "Add" button to add folders</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<input id="source-folder-list" name="source-folder-list" type="hidden" />
|
||||
<div id="source-folder-entry">
|
||||
<input id="source-folder-path-text" type="text" />
|
||||
<div id="source-folder-path-add" class="button">Browse</div>
|
||||
</div>
|
||||
|
||||
<div id="source-folder-filter-area">
|
||||
<div id="source-folder-filter-label" title="Enter filters, one per line. Lines starting with a plus are inclusions, lines starting with a minus are exclusions. Regular expression are entered inside hard brackets."><a href="https://github.com/duplicati/duplicati/wiki/How-do-filters-work%3F" target="_blank">Source data filters<div class="ui-icon ui-icon-info ui-icon-inline"></div></a></div>
|
||||
<textarea type="text" name="source-filters" id="source-filters" value="" class="ui-corner-all pre-style-text" rows="3"></textarea>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<div id="edit-tab-schedule">
|
||||
<input id="use-scheduled-run" type="checkbox" />
|
||||
<div>Run regularly at the specified times</div>
|
||||
|
||||
<div id="use-scheduled-run-details">
|
||||
<div class="hint-line-last">If a date was missed, the job will run as soon as possible.</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div class="edit-dialog-label" title="The next time the backup is started">Next time</div>
|
||||
<div class="input-wrapper">
|
||||
<input type="time" id="next-run-time" name="next-run-time"/>
|
||||
<input type="date" id="next-run-date" name="next-run-date" />
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div class="edit-dialog-label" title="How often the backup is repeated">Run again every</div>
|
||||
<div class="input-wrapper">
|
||||
<input type="number" id="repeat-run-number" name="repeat-run-number"/>
|
||||
<select id="repeat-run-multiplier" name="repeat-run-multiplier">
|
||||
<option value="h">hours</option>
|
||||
<option value="D">days</option>
|
||||
<option value="W">weeks</option>
|
||||
<option value="M">months</option>
|
||||
<option value="Y">years</option>
|
||||
<option value="">custom</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div class="edit-dialog-label">Allowed days</div>
|
||||
<div class="input-wrapper">
|
||||
<input type="checkbox" class="simple-checkbox" id="allow-day-mon" name="allow-day-mon" />
|
||||
<div class="days-label">Mon</div>
|
||||
<input type="checkbox" class="simple-checkbox" id="allow-day-tue" name="allow-day-tue" />
|
||||
<div class="days-label">Tue</div>
|
||||
<input type="checkbox" class="simple-checkbox" id="allow-day-wed" name="allow-day-wed" />
|
||||
<div class="days-label">Wed</div>
|
||||
<input type="checkbox" class="simple-checkbox" id="allow-day-thu" name="allow-day-thu" />
|
||||
<div class="days-label">Thu</div>
|
||||
<input type="checkbox" class="simple-checkbox" id="allow-day-fri" name="allow-day-fri" />
|
||||
<div class="days-label">Fri</div>
|
||||
<input type="checkbox" class="simple-checkbox" id="allow-day-sat" name="allow-day-sat" />
|
||||
<div class="days-label">Sat</div>
|
||||
<input type="checkbox" class="simple-checkbox" id="allow-day-sun" name="allow-day-sun" />
|
||||
<div class="days-label">Sun</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="edit-tab-options">
|
||||
|
||||
<div class="input-block">
|
||||
<div class="edit-dialog-label" title="Duplicati splits backups into smaller files. A smaller size (e.g. 10MB) is recommended for slow and unstable connections. A larger size (e.g. 200MB) is recommended in LAN environments.">Max backup file size<div class="ui-icon ui-icon-info ui-icon-inline"></div></div>
|
||||
<div class="input-wrapper">
|
||||
<input type="number" id="dblock-size-number" name="dblock-size-number" />
|
||||
<select id="dblock-size-multiplier" name="dblock-size-multiplier">
|
||||
<option value="kb">KByte</option>
|
||||
<option value="mb">MByte</option>
|
||||
<option value="gb">GByte</option>
|
||||
<option value="tb">TByte</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div class="input-block">
|
||||
|
||||
<div class="edit-dialog-label" title="Define how many backups you want to keep stored. Old backups are removed if Duplicati can free a significant amount of space. This is done during compacting.">Keep backups<div class="ui-icon ui-icon-info ui-icon-inline"></div></div>
|
||||
<div class="input-wrapper">
|
||||
<select id="keep-time-type" name="keep-time-type">
|
||||
<option value="">forever</option>
|
||||
<option value="keep-time">for a specific time</option>
|
||||
<option value="keep-versions">a specific number</option>
|
||||
</select>
|
||||
<input type="number" id="keep-time-number" name="keep-time-number" />
|
||||
<select id="keep-time-multiplier" name="keep-time-multiplier">
|
||||
<option value="D">Days</option>
|
||||
<option value="W">Weeks</option>
|
||||
<option value="M">Months</option>
|
||||
<option value="Y">Years</option>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div class="edit-dialog-label" id="backup-options-link" title="Advanced options can be specified command-line style. One option per line like --option=value. Click here to see a list of options"><a class="action-link">Options<div class="ui-icon ui-icon-info ui-icon-inline"></div></a></div>
|
||||
|
||||
<textarea id="backup-options" rows="4" class="pre-style-text" name="backup-options"></textarea>
|
||||
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="connection-uri-dialog" class="modal-dialog edit-dialog" style="display: none" title="Connection URI">
|
||||
<form id="edit-uri-form">
|
||||
<div class="edit-dialog-label">Target Type</div>
|
||||
<div class="field-group">
|
||||
<select id="backend-type" name="backend-type"></select>
|
||||
<input type="checkbox" id="server-use-ssl" name="server-use-ssl" value="use-ssl"/><div class="checkbox-label" id="server-use-ssl-label" >Use SSL</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div class="edit-dialog-label" id="server-name-and-port-label">Server & Port</div>
|
||||
<div class="field-group" id="server-name-and-port">
|
||||
<input type="text" name="server-name" id="server-name" value="" class="text ui-widget-content ui-corner-all" />
|
||||
<input type="text" name="server-port" id="server-port" value="" class="text ui-widget-content ui-corner-all" />
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div class="edit-dialog-label" id="server-path-label">Path on server</div>
|
||||
<input type="text" name="server-path" id="server-path" class="text ui-widget-content ui-corner-all" />
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div id="server-username-and-password">
|
||||
<div id="server-username-label" class="edit-dialog-label">Username</div>
|
||||
<input type="text" name="server-username" id="server-username" class="text ui-widget-content ui-corner-all" />
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div id="server-password-label" class="edit-dialog-label">Password</div>
|
||||
<input type="password" name="server-password" id="server-password" class="text ui-widget-content ui-corner-all" />
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div class="edit-dialog-label" id="server-options-label" title="Advanced options can be specified command-line style. One option per line like --option=value. Click here to see a list of options"><a class="action-link">Options<div class="ui-icon ui-icon-info"></div></a></div>
|
||||
<textarea id="server-options" class="pre-style-text" name="server-options"></textarea>
|
||||
|
||||
<div id="edit-dialog-extensions"></div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="restore-dialog" class="modal-dialog restore-dialog" title="Restore files & folders">
|
||||
<form id="restore-form">
|
||||
<div id="restore-files-page">
|
||||
<div id="restore-search-section">
|
||||
<input type="search" id="restore-search" /><div id="restore-search-loader" class="small-loader-icon"></div>
|
||||
|
||||
<select id="restore-version">
|
||||
<option value="0">Latest</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div id="restore-files-tree"></div>
|
||||
</div>
|
||||
|
||||
<div id="restore-path-page">
|
||||
<div id="restore-hint-target" class="hint-text">Where do you want to restore the files to?</div>
|
||||
<div><input id="restore-overwrite-target-original" type="radio" name="restore-target" value="original" />Original location</div>
|
||||
<div><input id="restore-overwrite-target-other" type="radio" name="restore-target" value="other" />Pick a new location</div>
|
||||
|
||||
<div id="restore-target-path-area">
|
||||
<input type="text" id="restore-target-path" /><input type="button" id="restore-target-path-browse" class="browse-button" value="..." />
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div id="restore-hint-overwrite" class="hint-text">How do you want to handle existing files?</div>
|
||||
<div><input id="restore-overwrite-overwrite" type="radio" name="restore-overwrite" value="overwrite" />Overwrite</div>
|
||||
<div><input id="restore-overwrite-keep" type="radio" name="restore-overwrite" value="keep" />Save different versions with timestamp in file name</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div id="restore-hint-metadata" class="hint-text">Permissions</div>
|
||||
|
||||
<div><input id="restore-metadata-permissions" type="checkbox" name="restore-metadata" value="permissions" />Restore read/write permissions</div>
|
||||
</div>
|
||||
|
||||
<div id="restore-complete-page">
|
||||
<div class="hint-text">Your files and folders have been restored successfully.</div>
|
||||
<div id="restore-hint-donate" class="hint-text">Did we help save your files? If so, please consider supporting Duplicati with a donation. We suggest 10€ for private use and 100€ for commercial use.</div>
|
||||
<div id="restore-hint-paypal" class="hint-text"><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=paypal%40hexad%2edk&item_name=Duplicati%20Donation&no_shipping=2&no_note=1&tax=0¤cy_code=EUR&bn=PP%2dDonationsBF&charset=UTF%2d8&lc=US" target="blank">VISA, Mastercard, ... via Paypal</div>
|
||||
<div id="restore-hint-bitcoin" class="hint-text"><a href="bitcoin:1L74qa1n5SFKwwyHhECTHBJgcf6WT2rJKf" target="blank">Bitcoin: 1L74qa1n5SFKwwyHhECTHBJgcf6WT2rJKf</a></div>
|
||||
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="backup-options-dialog" class="modal-dialog" title="Available options"></div>
|
||||
|
||||
<div id="folder-browse-dialog" class="modal-dialog" title="Choose folder"></div>
|
||||
|
||||
<div id="log-dialog" class="modal-dialog" title="Log data">
|
||||
<ul>
|
||||
<li><a href="#log-tab-stored">Stored</a></li>
|
||||
<li><a href="#log-tab-live">Live</a></li>
|
||||
</ul>
|
||||
|
||||
<div id="log-tab-stored">
|
||||
</div>
|
||||
|
||||
<div id="log-tab-live">
|
||||
<div>Select a log level and see the live message while a backup is running.</div>
|
||||
<select id="log-tab-live-level"></select>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="backup-log-dialog" class="modal-dialog" title="Log data">
|
||||
<ul>
|
||||
<li><a href="#backup-log-tab-general">General</a></li>
|
||||
<li><a href="#backup-log-tab-remote">Remote</a></li>
|
||||
</ul>
|
||||
|
||||
<div id="backup-log-tab-general">
|
||||
</div>
|
||||
|
||||
<div id="backup-log-tab-remote">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="about-dialog" class="modal-dialog" title="About">
|
||||
<ul>
|
||||
<li><a href="#about-dialog-tab-general">General</a></li>
|
||||
<li><a href="#about-dialog-tab-changelog">Changelog</a></li>
|
||||
<li><a href="#about-dialog-tab-libraries">Libraries</a></li>
|
||||
</ul>
|
||||
|
||||
<div id="about-dialog-tab-general">
|
||||
Duplicati was primarily developed by <a href="mailto:kenneth@duplicati.com">Kenneth Skovhede</a> and <a href="mailto:rene@duplicati.com">Rene Stach</a>. Duplicati can be downloaded from <a href="http://www.duplicati.com" target="blank">duplicati.com</a>. Duplicati is licensed under the <a href="https://www.gnu.org/licenses/lgpl.html">GNU Lesser General Public License</a>.
|
||||
|
||||
<div id="about-dialog-current">You are currently running Duplicati <p id="about-dialog-current-version">unknown</p></div>
|
||||
|
||||
<div id="about-dialog-tab-general-acknowledgements">
|
||||
Loading ...
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="about-dialog-tab-changelog">
|
||||
Loading ...
|
||||
</div>
|
||||
|
||||
<div id="about-dialog-tab-libraries">
|
||||
Duplicati is using the following third party libraries:
|
||||
<ul id="about-dialog-tab-thirdparty-list">
|
||||
<li>Loading ...</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="export-dialog" class="modal-dialog" title="Export ...">
|
||||
<form>
|
||||
<input type="radio" name="export-type" id="export-type-commandline" value="commandline" /><div class="export-dialog-label">As Command-line</div><br/>
|
||||
<input type="radio" name="export-type" id="export-type-file" value="file" /><div class="export-dialog-label">To File</div><br/>
|
||||
<input type="checkbox" name="use-encryption" id="export-use-encryption" /><div class="export-dialog-label">Encrypt with</div>
|
||||
<input type="password" name="encryption-password" id="export-encryption-password">
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="import-dialog" class="modal-dialog" title="Import ...">
|
||||
<form id="import-dialog-form" enctype="multipart/form-data" method="POST">
|
||||
<div class="import-dialog-label">Configuration file: </div>
|
||||
<input type="file" name="config" id="import-dialog-file"></br></br>
|
||||
|
||||
<div class="import-dialog-label">Passphrase (if encrypted):</div>
|
||||
<input type="password" name="passphrase" id="import-encryption-password">
|
||||
|
||||
<input type="hidden" name="action" value="import-backup">
|
||||
<input type="hidden" name="callback" id="import-dialog-callback" value="">
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="global-advanced-options-dialog" class="modal-dialog" title="Available options"></div>
|
||||
|
||||
<div id="options-dialog" class="modal-dialog" title="Options">
|
||||
<div>
|
||||
<div class="options-header options-header-first">Access to user interface</div>
|
||||
<div>
|
||||
<div class="options-items">
|
||||
<input type="checkbox" id="webservice-password-enabled"/>
|
||||
<div id="webservice-password-label">Password</div>
|
||||
<input type="password" id="webservice-password" name="webservice-password"/>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div class="options-items">
|
||||
<input type="checkbox" id="webservice-remote-access-enabled"/>
|
||||
<div>Allow remote access (requires restart)</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div class="options-header" title="To grant all processes and the network some time to recover after a startup or hibernation, you can delay backup jobs a little">Pause after startup or hibernation<div class="ui-icon ui-icon-info ui-icon-inline"></div></div>
|
||||
<div class="options-items">
|
||||
<div class="edit-dialog-label">Pause</div>
|
||||
<select id="global-delay-startup-value">
|
||||
<option value="1">1</option>
|
||||
<option value="2">2</option>
|
||||
<option value="3">3</option>
|
||||
<option value="4">4</option>
|
||||
<option value="5">5</option>
|
||||
<option value="10">10</option>
|
||||
<option value="15">15</option>
|
||||
<option value="30">30</option>
|
||||
<option value="45">45</option>
|
||||
</select>
|
||||
<select id="global-delay-startup-multiplier">
|
||||
<option value="s">Seconds</option>
|
||||
<option value="m">Minutes</option>
|
||||
<option value="h">Hours</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="clearfix"></div>
|
||||
|
||||
<div class="options-header">Advanced options</div>
|
||||
<div class="options-items">
|
||||
<div class="edit-dialog-label" id="global-options-link" title="Advanced options can be specified command-line style. One option per line like --option=value. Click here to see a list of options"><a class="action-link">Options<div class="ui-icon ui-icon-info ui-icon-inline"></div></a></div>
|
||||
|
||||
<textarea id="global-advanced-options" rows="4" class="pre-style-text" name="global-advanced-options"></textarea>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div id="restore-direct-options-dialog" class="modal-dialog" title="Available options"></div>
|
||||
|
||||
|
||||
|
||||
<div id="restore-direct-dialog" class="modal-dialog tabs edit-dialog" title="Restore files">
|
||||
|
||||
<form id="restore-direct-dialog-form">
|
||||
<div class="input-block">
|
||||
<div class="edit-dialog-label action-link" id="restore-direct-uri-label" title="The destination where the backup data is stored is supplied in the form of a URI. Click the link here to edit the individual parts of the connection URI.">Restore from…</div>
|
||||
<div class="field-group">
|
||||
<textarea type="text" name="restore-direct-uri" id="restore-direct-uri" value="" class="ui-corner-all" rows="3"></textarea>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="input-block">
|
||||
<div class="edit-dialog-label">Passphrase</div>
|
||||
<div class="field-group">
|
||||
<input type="password" name="restore-direct-encryption-password" id="restore-direct-encryption-password" value="" class="ui-corner-all" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="options-items">
|
||||
<div class="edit-dialog-label" id="restore-direct-options-link" title="Advanced options can be specified command-line style. One option per line like --option=value. Click here to see a list of options"><a class="action-link">Advanced Options<div class="ui-icon ui-icon-info ui-icon-inline"></div></a></div>
|
||||
|
||||
<textarea id="restore-direct-advanced-options" rows="4" class="pre-style-text" name="restore-direct-advanced-options"></textarea>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
</div>
|
||||
</section>
|
||||
<footer>
|
||||
<div class="box-duplicati-copy">
|
||||
© 2015 | <a class="link_extern" href="http://www.duplicati.com/" target="_blank">Duplicati</a>
|
||||
</div>
|
||||
<div class="box-duplicati-copy">
|
||||
<a class="link_extern" href="../theme.html" target="_self">Change theme</a>
|
||||
</div>
|
||||
<div class="box-visit-us">
|
||||
<div>
|
||||
Visit <a class="link_extern" href="https://github.com/duplicati/duplicati" target="_blank">GitHub</a> for reporting bugs or feature request!
|
||||
</div>
|
||||
<div>
|
||||
Visit us on <a class="link_extern" href="http://www.facebook.com/pages/Duplicati/105118456272281" target="_blank">Facebook</a> or on <a class="link_extern" href="https://plus.google.com/105271984558189185842" target="_blank">Google+</a>!
|
||||
</div>
|
||||
<div>
|
||||
We accept donations via <a class="link_extern" href="https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business=paypal%40hexad%2edk&item_name=Duplicati%20Donation&no_shipping=2&no_note=1&tax=0¤cy_code=EUR&bn=PP%2dDonationsBF&charset=UTF%2d8&lc=US" target="_blank">PayPal</a> and <a class="link_extern" href="bitcoin:1HnWb5wLhwa9UREZCxKyNfzkKiR3b6RCPX?amount=0.1&message=Duplicati">Bitcoin</a>.
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -1,10 +0,0 @@
|
||||
/*
|
||||
* The basic client config
|
||||
*/
|
||||
|
||||
APP_CONFIG = {
|
||||
server_url: '/control.cgi',
|
||||
login_url: '/login.html',
|
||||
branded_name: 'Duplicati',
|
||||
branded_subtitle: ''
|
||||
};
|
||||
@@ -1,27 +0,0 @@
|
||||
/*
|
||||
CryptoJS v3.1.2
|
||||
code.google.com/p/crypto-js
|
||||
(c) 2009-2013 by Jeff Mott. All rights reserved.
|
||||
code.google.com/p/crypto-js/wiki/License
|
||||
Combined: sha256 + core + enc-base64
|
||||
*/
|
||||
var CryptoJS=CryptoJS||function(h,r){var k={},l=k.lib={},n=function(){},f=l.Base={extend:function(a){n.prototype=this;var b=new n;a&&b.mixIn(a);b.hasOwnProperty("init")||(b.init=function(){b.$super.init.apply(this,arguments)});b.init.prototype=b;b.$super=this;return b},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
|
||||
j=l.WordArray=f.extend({init:function(a,b){a=this.words=a||[];this.sigBytes=b!=r?b:4*a.length},toString:function(a){return(a||s).stringify(this)},concat:function(a){var b=this.words,d=a.words,c=this.sigBytes;a=a.sigBytes;this.clamp();if(c%4)for(var e=0;e<a;e++)b[c+e>>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((c+e)%4);else if(65535<d.length)for(e=0;e<a;e+=4)b[c+e>>>2]=d[e>>>2];else b.push.apply(b,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,b=this.sigBytes;a[b>>>2]&=4294967295<<
|
||||
32-8*(b%4);a.length=h.ceil(b/4)},clone:function(){var a=f.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var b=[],d=0;d<a;d+=4)b.push(4294967296*h.random()|0);return new j.init(b,a)}}),m=k.enc={},s=m.Hex={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++){var e=b[c>>>2]>>>24-8*(c%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c+=2)d[c>>>3]|=parseInt(a.substr(c,
|
||||
2),16)<<24-4*(c%8);return new j.init(d,b/2)}},p=m.Latin1={stringify:function(a){var b=a.words;a=a.sigBytes;for(var d=[],c=0;c<a;c++)d.push(String.fromCharCode(b[c>>>2]>>>24-8*(c%4)&255));return d.join("")},parse:function(a){for(var b=a.length,d=[],c=0;c<b;c++)d[c>>>2]|=(a.charCodeAt(c)&255)<<24-8*(c%4);return new j.init(d,b)}},t=m.Utf8={stringify:function(a){try{return decodeURIComponent(escape(p.stringify(a)))}catch(b){throw Error("Malformed UTF-8 data");}},parse:function(a){return p.parse(unescape(encodeURIComponent(a)))}},
|
||||
q=l.BufferedBlockAlgorithm=f.extend({reset:function(){this._data=new j.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=t.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var b=this._data,d=b.words,c=b.sigBytes,e=this.blockSize,f=c/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;c=h.min(4*a,c);if(a){for(var g=0;g<a;g+=e)this._doProcessBlock(d,g);g=d.splice(0,a);b.sigBytes-=c}return new j.init(g,c)},clone:function(){var a=f.clone.call(this);
|
||||
a._data=this._data.clone();return a},_minBufferSize:0});l.Hasher=q.extend({cfg:f.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){q.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(b,d){return(new a.init(d)).finalize(b)}},_createHmacHelper:function(a){return function(b,d){return(new u.HMAC.init(a,
|
||||
d)).finalize(b)}}});var u=k.algo={};return k}(Math);
|
||||
var CryptoJS=CryptoJS||function(h,s){var f={},t=f.lib={},g=function(){},j=t.Base={extend:function(a){g.prototype=this;var c=new g;a&&c.mixIn(a);c.hasOwnProperty("init")||(c.init=function(){c.$super.init.apply(this,arguments)});c.init.prototype=c;c.$super=this;return c},create:function(){var a=this.extend();a.init.apply(a,arguments);return a},init:function(){},mixIn:function(a){for(var c in a)a.hasOwnProperty(c)&&(this[c]=a[c]);a.hasOwnProperty("toString")&&(this.toString=a.toString)},clone:function(){return this.init.prototype.extend(this)}},
|
||||
q=t.WordArray=j.extend({init:function(a,c){a=this.words=a||[];this.sigBytes=c!=s?c:4*a.length},toString:function(a){return(a||u).stringify(this)},concat:function(a){var c=this.words,d=a.words,b=this.sigBytes;a=a.sigBytes;this.clamp();if(b%4)for(var e=0;e<a;e++)c[b+e>>>2]|=(d[e>>>2]>>>24-8*(e%4)&255)<<24-8*((b+e)%4);else if(65535<d.length)for(e=0;e<a;e+=4)c[b+e>>>2]=d[e>>>2];else c.push.apply(c,d);this.sigBytes+=a;return this},clamp:function(){var a=this.words,c=this.sigBytes;a[c>>>2]&=4294967295<<
|
||||
32-8*(c%4);a.length=h.ceil(c/4)},clone:function(){var a=j.clone.call(this);a.words=this.words.slice(0);return a},random:function(a){for(var c=[],d=0;d<a;d+=4)c.push(4294967296*h.random()|0);return new q.init(c,a)}}),v=f.enc={},u=v.Hex={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++){var e=c[b>>>2]>>>24-8*(b%4)&255;d.push((e>>>4).toString(16));d.push((e&15).toString(16))}return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b+=2)d[b>>>3]|=parseInt(a.substr(b,
|
||||
2),16)<<24-4*(b%8);return new q.init(d,c/2)}},k=v.Latin1={stringify:function(a){var c=a.words;a=a.sigBytes;for(var d=[],b=0;b<a;b++)d.push(String.fromCharCode(c[b>>>2]>>>24-8*(b%4)&255));return d.join("")},parse:function(a){for(var c=a.length,d=[],b=0;b<c;b++)d[b>>>2]|=(a.charCodeAt(b)&255)<<24-8*(b%4);return new q.init(d,c)}},l=v.Utf8={stringify:function(a){try{return decodeURIComponent(escape(k.stringify(a)))}catch(c){throw Error("Malformed UTF-8 data");}},parse:function(a){return k.parse(unescape(encodeURIComponent(a)))}},
|
||||
x=t.BufferedBlockAlgorithm=j.extend({reset:function(){this._data=new q.init;this._nDataBytes=0},_append:function(a){"string"==typeof a&&(a=l.parse(a));this._data.concat(a);this._nDataBytes+=a.sigBytes},_process:function(a){var c=this._data,d=c.words,b=c.sigBytes,e=this.blockSize,f=b/(4*e),f=a?h.ceil(f):h.max((f|0)-this._minBufferSize,0);a=f*e;b=h.min(4*a,b);if(a){for(var m=0;m<a;m+=e)this._doProcessBlock(d,m);m=d.splice(0,a);c.sigBytes-=b}return new q.init(m,b)},clone:function(){var a=j.clone.call(this);
|
||||
a._data=this._data.clone();return a},_minBufferSize:0});t.Hasher=x.extend({cfg:j.extend(),init:function(a){this.cfg=this.cfg.extend(a);this.reset()},reset:function(){x.reset.call(this);this._doReset()},update:function(a){this._append(a);this._process();return this},finalize:function(a){a&&this._append(a);return this._doFinalize()},blockSize:16,_createHelper:function(a){return function(c,d){return(new a.init(d)).finalize(c)}},_createHmacHelper:function(a){return function(c,d){return(new w.HMAC.init(a,
|
||||
d)).finalize(c)}}});var w=f.algo={};return f}(Math);
|
||||
(function(h){for(var s=CryptoJS,f=s.lib,t=f.WordArray,g=f.Hasher,f=s.algo,j=[],q=[],v=function(a){return 4294967296*(a-(a|0))|0},u=2,k=0;64>k;){var l;a:{l=u;for(var x=h.sqrt(l),w=2;w<=x;w++)if(!(l%w)){l=!1;break a}l=!0}l&&(8>k&&(j[k]=v(h.pow(u,0.5))),q[k]=v(h.pow(u,1/3)),k++);u++}var a=[],f=f.SHA256=g.extend({_doReset:function(){this._hash=new t.init(j.slice(0))},_doProcessBlock:function(c,d){for(var b=this._hash.words,e=b[0],f=b[1],m=b[2],h=b[3],p=b[4],j=b[5],k=b[6],l=b[7],n=0;64>n;n++){if(16>n)a[n]=
|
||||
c[d+n]|0;else{var r=a[n-15],g=a[n-2];a[n]=((r<<25|r>>>7)^(r<<14|r>>>18)^r>>>3)+a[n-7]+((g<<15|g>>>17)^(g<<13|g>>>19)^g>>>10)+a[n-16]}r=l+((p<<26|p>>>6)^(p<<21|p>>>11)^(p<<7|p>>>25))+(p&j^~p&k)+q[n]+a[n];g=((e<<30|e>>>2)^(e<<19|e>>>13)^(e<<10|e>>>22))+(e&f^e&m^f&m);l=k;k=j;j=p;p=h+r|0;h=m;m=f;f=e;e=r+g|0}b[0]=b[0]+e|0;b[1]=b[1]+f|0;b[2]=b[2]+m|0;b[3]=b[3]+h|0;b[4]=b[4]+p|0;b[5]=b[5]+j|0;b[6]=b[6]+k|0;b[7]=b[7]+l|0},_doFinalize:function(){var a=this._data,d=a.words,b=8*this._nDataBytes,e=8*a.sigBytes;
|
||||
d[e>>>5]|=128<<24-e%32;d[(e+64>>>9<<4)+14]=h.floor(b/4294967296);d[(e+64>>>9<<4)+15]=b;a.sigBytes=4*d.length;this._process();return this._hash},clone:function(){var a=g.clone.call(this);a._hash=this._hash.clone();return a}});s.SHA256=g._createHelper(f);s.HmacSHA256=g._createHmacHelper(f)})(Math);
|
||||
(function(){var h=CryptoJS,j=h.lib.WordArray;h.enc.Base64={stringify:function(b){var e=b.words,f=b.sigBytes,c=this._map;b.clamp();b=[];for(var a=0;a<f;a+=3)for(var d=(e[a>>>2]>>>24-8*(a%4)&255)<<16|(e[a+1>>>2]>>>24-8*((a+1)%4)&255)<<8|e[a+2>>>2]>>>24-8*((a+2)%4)&255,g=0;4>g&&a+0.75*g<f;g++)b.push(c.charAt(d>>>6*(3-g)&63));if(e=c.charAt(64))for(;b.length%4;)b.push(e);return b.join("")},parse:function(b){var e=b.length,f=this._map,c=f.charAt(64);c&&(c=b.indexOf(c),-1!=c&&(e=c));for(var c=[],a=0,d=0;d<
|
||||
e;d++)if(d%4){var g=f.indexOf(b.charAt(d-1))<<2*(d%4),h=f.indexOf(b.charAt(d))>>>6-2*(d%4);c[a>>>2]|=(g|h)<<24-8*(a%4);a++}return j.create(c,a)},_map:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="}})();
|
||||
|
||||
@@ -1,636 +0,0 @@
|
||||
/*
|
||||
* Edituri app code
|
||||
*/
|
||||
|
||||
BACKEND_STATE = null;
|
||||
EDIT_URI = null;
|
||||
|
||||
|
||||
$(document).ready(function() {
|
||||
|
||||
EDIT_URI = {
|
||||
URL_REGEXP_FIELDS: ['source_uri', 'backend-type', '--auth-username', '--auth-password', 'server-name', 'server-port', 'server-path', 'querystring'],
|
||||
URL_REGEXP: /([^:]+)\:\/\/(?:(?:([^\:]+)(?:\:?:([^@]*))?\@))?(?:([^\/\?\:]*)(?:\:(\d+))?)(?:\/([^\?]*))?(?:\?(.+))?/,
|
||||
QUERY_REGEXP: /(?:^|&)([^&=]*)=?([^&]*)/g,
|
||||
|
||||
createFieldset: function(config) {
|
||||
var outer = $('<div></div>');
|
||||
var label = config.label ? $('<div></div>').addClass('edit-dialog-label ' + (config.labelclass || '')).html(config.label) : null;
|
||||
var field;
|
||||
if (config.type == 'link') {
|
||||
field = config.field === false ? null :
|
||||
$('<a />').text(config.title)
|
||||
.attr('id', (config.name || ''))
|
||||
.addClass('action-link ' + (config.fieldclass || ''))
|
||||
.attr('href', config.href || '#')
|
||||
.attr('target', config.target || '_blank');
|
||||
|
||||
} else {
|
||||
field = config.field === false ? null :
|
||||
$('<input type="' + (config.type || 'text') + '" name="' + (config.name || '') + '" />')
|
||||
.attr('id', (config.name || ''))
|
||||
.addClass('text ui-widget-content ui-corner-all ' + (config.fieldclass || ''));
|
||||
|
||||
if (field && config.value !== undefined)
|
||||
config.attr('value', config.value);
|
||||
}
|
||||
|
||||
var checklabel = config.checklabel ? $('<div></div>').addClass('checkbox-label ' + (config.labelclass || '')).html(config.checklabel) : null;
|
||||
|
||||
outer.append(label, field, checklabel);
|
||||
|
||||
var r = {
|
||||
outer: outer,
|
||||
label: label,
|
||||
field: field,
|
||||
checklabel: checklabel
|
||||
};
|
||||
|
||||
if (config.title)
|
||||
for(var k in r)
|
||||
if (r[k])
|
||||
r[k].attr('title', config.title);
|
||||
|
||||
if (config.watermark && field != null)
|
||||
field.watermark(config.watermark);
|
||||
|
||||
BACKEND_STATE.fieldset_cleanup.push(outer);
|
||||
|
||||
if (config.after)
|
||||
outer.insertAfter(config.after);
|
||||
else if (config.before)
|
||||
outer.insertBefore(config.before);
|
||||
else if (config.append)
|
||||
config.append(outer);
|
||||
else
|
||||
$('#edit-dialog-extensions').append(outer);
|
||||
|
||||
return r;
|
||||
},
|
||||
|
||||
validate_input: function(values, validateOptions) {
|
||||
if (!BACKEND_STATE.current_state.hideserverandport) {
|
||||
if (values['server-name'] == '')
|
||||
return EDIT_URI.validation_error($('server-name'), 'You must fill in the server name');
|
||||
} else {
|
||||
values['server-name'] = '';
|
||||
}
|
||||
|
||||
if (!BACKEND_STATE.current_state.optionalauth) {
|
||||
if (values['--auth-username'] == '')
|
||||
return EDIT_URI.validation_error($('server-username'), 'You must fill in a username');
|
||||
if (!BACKEND_STATE.current_state.optionalpassword)
|
||||
if (values['--auth-password'] == '')
|
||||
return EDIT_URI.validation_error($('server-password'), 'You must fill in a password');
|
||||
}
|
||||
|
||||
if (validateOptions) {
|
||||
var validOptions = BACKEND_STATE.module_lookup[values['backend-type']].Options.concat(BACKEND_STATE.extra_options);
|
||||
var validOptionsDict = {};
|
||||
var names = [];
|
||||
for (var n in validOptions) {
|
||||
validOptionsDict[validOptions[n].Name] = validOptions[n];
|
||||
names.push(n.Name);
|
||||
if (n.Aliases != null)
|
||||
for (var i in n.Aliases) {
|
||||
validOptionsDict[i] = n;
|
||||
names.push(i);
|
||||
}
|
||||
}
|
||||
|
||||
for(var k in values) {
|
||||
if (k.length > 2 && k.substr(0, 2) == '--') {
|
||||
var opt = validOptionsDict[k.substr(2)];
|
||||
|
||||
if (!opt) {
|
||||
return EDIT_URI.validation_error($('#server-options'), 'Invalid option: ' + k.substr(2));
|
||||
}
|
||||
|
||||
if (opt.Deprecated) {
|
||||
alert('Warning', 'The option ' + opt.Name + ' is deprecated :' + opt.DeprecationMessage);
|
||||
}
|
||||
|
||||
var val = values[k];
|
||||
|
||||
if (opt.Typename == 'Boolean') {
|
||||
if (!APP_UTIL.isValidBoolOption(val))
|
||||
return EDIT_URI.validation_error($('#server-options'), 'Invalid value for ' + k.substr(2) + ': ' + val + ' is not a valid boolean value');
|
||||
|
||||
} else if (opt.Typename == 'Password') {
|
||||
|
||||
} else if (opt.Typename == 'Integer') {
|
||||
if ((parseInt(val) + '') != val) {
|
||||
return EDIT_URI.validation_error($('#server-options'), 'Invalid value for ' + k.substr(2) + ': ' + val + ' is not an integer');
|
||||
}
|
||||
} else if (opt.Typename == 'Size') {
|
||||
//TODO
|
||||
} else if (opt.Typename == 'Timespan') {
|
||||
//TODO
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
validation_error: function(el, message) {
|
||||
alert(message);
|
||||
window.setTimeout( function() { el.focus(); }, 500);
|
||||
return false;
|
||||
},
|
||||
|
||||
parse_extra_options: function(el, dict) {
|
||||
return APP_UTIL.parseOptionStrings(el.val(), dict, function(d, k, v) {
|
||||
if (d['--' + k] !== undefined)
|
||||
return EDIT_URI.validation_error(el, 'Duplicate option ' + k);
|
||||
|
||||
return true;
|
||||
}) != null;
|
||||
},
|
||||
build_uri: function(cfg) {
|
||||
var url = cfg['backend-type'];
|
||||
if (APP_UTIL.parseBoolOption(cfg['--use-ssl'], false))
|
||||
url += 's';
|
||||
|
||||
url += '://';
|
||||
url += cfg['server-name'];
|
||||
if (cfg['server-port'])
|
||||
url += ':' + cfg['server-port'];
|
||||
|
||||
if (cfg['server-path'] != '')
|
||||
{
|
||||
if(url[url.length - 1] != '/')
|
||||
url += '/';
|
||||
|
||||
url += cfg['server-path'];
|
||||
}
|
||||
|
||||
var opts = [];
|
||||
|
||||
if (cfg['--auth-username'] && cfg['--auth-username'] != '')
|
||||
opts.push('auth-username=' + encodeURIComponent(cfg['--auth-username']));
|
||||
|
||||
if (cfg['--auth-password'] && cfg['--auth-password'] != '')
|
||||
opts.push('auth-password=' + encodeURIComponent(cfg['--auth-password']));
|
||||
|
||||
for(var k in cfg)
|
||||
if (k.substr(0, 2) == '--' && k != '--auth-password' && k != '--auth-username' && k != '--use-ssl' && cfg[k] !== false && cfg[k] != '')
|
||||
opts.push(encodeURIComponent(k.substr(2)) + '=' + encodeURIComponent(cfg[k]));
|
||||
|
||||
if (opts.length > 0) {
|
||||
url += '?';
|
||||
url += opts.join('&');
|
||||
}
|
||||
|
||||
return url;
|
||||
},
|
||||
|
||||
decode_uri: function(uri) {
|
||||
|
||||
var i = EDIT_URI.URL_REGEXP_FIELDS.length + 1;
|
||||
var res = {};
|
||||
|
||||
var m = EDIT_URI.URL_REGEXP.exec(uri);
|
||||
|
||||
// Invalid URI
|
||||
if (!m)
|
||||
return res;
|
||||
|
||||
while (i--) {
|
||||
res[EDIT_URI.URL_REGEXP_FIELDS[i]] = m[i] || "";
|
||||
}
|
||||
|
||||
res.querystring.replace(EDIT_URI.QUERY_REGEXP, function(str, key, val) {
|
||||
if (key)
|
||||
res['--' + key] = decodeURIComponent(val);
|
||||
});
|
||||
|
||||
var scheme = res['backend-type'];
|
||||
|
||||
if (scheme && scheme[scheme.length - 1] == 's' && !APP_DATA.plugins.backend[scheme] && APP_DATA.plugins.backend[scheme.substr(0, scheme.length-1)]) {
|
||||
res['backend-type'] = scheme.substr(0, scheme.length-1);
|
||||
res['--use-ssl'] = true;
|
||||
}
|
||||
|
||||
return res;
|
||||
},
|
||||
|
||||
find_scheme: function(uri) {
|
||||
if (!uri || uri.length == 0)
|
||||
return null;
|
||||
|
||||
uri = uri.trim().toLowerCase();
|
||||
var ix = uri.indexOf('://');
|
||||
if (ix <= 0) {
|
||||
if (BACKEND_STATE.module_lookup['file'])
|
||||
return 'file';
|
||||
return BACKEND_STATE.modules[0];
|
||||
}
|
||||
|
||||
return (EDIT_URI.decode_uri(uri)['backend-type'] || '').toLowerCase()
|
||||
},
|
||||
|
||||
read_form: function(form) {
|
||||
var map = EDIT_URI.fill_dict_map;
|
||||
|
||||
var values = APP_UTIL.read_form(form, map);
|
||||
if (BACKEND_STATE.current_state.fill_dict_map)
|
||||
values = APP_UTIL.read_form(form, BACKEND_STATE.current_state.fill_dict_map, values);
|
||||
|
||||
return values;
|
||||
},
|
||||
|
||||
fill_form_map: {
|
||||
'--auth-username': 'server-username',
|
||||
'--auth-password': 'server-password',
|
||||
'--use-ssl': 'server-use-ssl',
|
||||
'backend-type': function() {},
|
||||
},
|
||||
|
||||
fill_dict_map: {
|
||||
'server-username': '--auth-username',
|
||||
'server-password': '--auth-password',
|
||||
'server-use-ssl': '--use-ssl'
|
||||
},
|
||||
|
||||
fill_form: function(form, values) {
|
||||
var found = {};
|
||||
|
||||
var map = EDIT_URI.fill_form_map;
|
||||
APP_UTIL.fill_form($('#edit-uri-form'), values, map);
|
||||
if (BACKEND_STATE.current_state.fill_form_map) {
|
||||
map = $.extend(true, {}, map);
|
||||
for(var k in map)
|
||||
map[k] = false;
|
||||
|
||||
$.extend(true, map, BACKEND_STATE.current_state.fill_form_map);
|
||||
|
||||
APP_UTIL.fill_form($('#edit-uri-form'), values, map);
|
||||
}
|
||||
|
||||
var opttext = '';
|
||||
for(var k in values) {
|
||||
if (map[k] === undefined && k.indexOf('--') == 0) {
|
||||
opttext += k + '=' + decodeURIComponent(values[k] || '') + '\n';
|
||||
}
|
||||
}
|
||||
|
||||
form.find('#server-options').val(opttext);
|
||||
}
|
||||
};
|
||||
|
||||
var resetform = function() {
|
||||
$('#server-name').watermark('example.com');
|
||||
$('#server-port').watermark('8801');
|
||||
$('#server-path').watermark('mybackup');
|
||||
$('#server-username').watermark('Username for authentication');
|
||||
$('#server-password').watermark('Password for authentication');
|
||||
$('#server-options').watermark('Enter connection options here');
|
||||
$('#server-username-label').text('Username');
|
||||
$('#server-password-label').text('Password');
|
||||
|
||||
if (BACKEND_STATE != null) {
|
||||
if (BACKEND_STATE.fieldset_cleanup != null)
|
||||
for(var i in BACKEND_STATE.fieldset_cleanup)
|
||||
BACKEND_STATE.fieldset_cleanup[i].remove();
|
||||
|
||||
if (BACKEND_STATE && BACKEND_STATE.current_state && BACKEND_STATE.current_state.cleanup )
|
||||
BACKEND_STATE.current_state.cleanup($('#connection-uri-dialog'), $('#edit-dialog-extensions'));
|
||||
BACKEND_STATE.current_state = null;
|
||||
BACKEND_STATE.fieldset_cleanup = [];
|
||||
}
|
||||
$('#edit-dialog-extensions').empty();
|
||||
};
|
||||
|
||||
var uriel = null;
|
||||
|
||||
$('#connection-uri-dialog').on( "dialogclose", function( event, ui ) {
|
||||
uriel = null;
|
||||
resetform();
|
||||
});
|
||||
|
||||
|
||||
|
||||
$('#connection-uri-dialog').on( "setup-dialog", function( event, el ) {
|
||||
uriel = $(el);
|
||||
|
||||
BACKEND_STATE = {};
|
||||
$('#edit-uri-form').each(function(i, e) { e.reset(); });
|
||||
|
||||
APP_DATA.getServerConfig(function(serverdata) {
|
||||
var drop = $('#backend-type');
|
||||
drop.empty();
|
||||
|
||||
BACKEND_STATE.modules = serverdata['BackendModules'];
|
||||
BACKEND_STATE.module_lookup = {};
|
||||
BACKEND_STATE.extra_options = [];
|
||||
for(var i in serverdata['ConnectionModules'])
|
||||
BACKEND_STATE.extra_options = BACKEND_STATE.extra_options.concat(serverdata['ConnectionModules'][i].Options);
|
||||
|
||||
var group_basic = $('<optgroup label="Standard protocols"></optgroup>');
|
||||
var group_local = $('<optgroup label="Local storage"></optgroup>');
|
||||
var group_prop = $('<optgroup label="Proprietary"></optgroup>');
|
||||
var group_others = $('<optgroup label="Others"></optgroup>');
|
||||
|
||||
for (var i = 0; i < BACKEND_STATE.modules.length; i++) {
|
||||
BACKEND_STATE.module_lookup[BACKEND_STATE.modules[i].Key] = BACKEND_STATE.modules[i];
|
||||
}
|
||||
|
||||
var used = {};
|
||||
|
||||
for(var i in {'ftp':0, 'ssh':0, 'webdav':0, 'aftp':0}) {
|
||||
if (BACKEND_STATE.module_lookup[i]) {
|
||||
used[i] = true;
|
||||
group_basic.append($("<option></option>").attr("value", i).text(BACKEND_STATE.module_lookup[i].DisplayName));
|
||||
}
|
||||
}
|
||||
|
||||
if (BACKEND_STATE.module_lookup['s3']) {
|
||||
used['s3'] = true;
|
||||
group_basic.append($("<option></option>").attr("value", 's3').text('S3 compatible'));
|
||||
}
|
||||
|
||||
if (BACKEND_STATE.module_lookup['openstack']) {
|
||||
used['openstack'] = true;
|
||||
group_basic.append($("<option></option>").attr("value", 'openstack').text('OpenStack Object Storage/ Swift'));
|
||||
}
|
||||
|
||||
for(var i in {'file':0}) {
|
||||
if (BACKEND_STATE.module_lookup[i]) {
|
||||
used[i] = true;
|
||||
group_local.append($("<option></option>").attr("value", i).text(BACKEND_STATE.module_lookup[i].DisplayName));
|
||||
}
|
||||
}
|
||||
|
||||
for (var i in { 's3': 0, 'azure': 0, 'googledrive': 0, 'onedrive': 0, 'cloudfiles': 0, 'gcs': 0, 'openstack': 0, 'hubic': 0, 'amzcd': 0, 'b2': 0, 'mega': 0, 'od4b': 0, 'mssp': 0 }) {
|
||||
if (BACKEND_STATE.module_lookup[i]) {
|
||||
used[i] = true;
|
||||
group_prop.append($("<option></option>").attr("value", i).text(BACKEND_STATE.module_lookup[i].DisplayName));
|
||||
}
|
||||
}
|
||||
|
||||
for (var i = 0; i < BACKEND_STATE.modules.length; i++) {
|
||||
var k = BACKEND_STATE.modules[i].Key;
|
||||
if (!used[k]) {
|
||||
group_others.append($("<option></option>").attr("value", k).text(BACKEND_STATE.module_lookup[k].DisplayName));
|
||||
}
|
||||
}
|
||||
|
||||
if (group_basic.children().length > 0)
|
||||
drop.append(group_basic);
|
||||
if (group_local.children().length > 0)
|
||||
drop.append(group_local);
|
||||
if (group_prop.children().length > 0)
|
||||
drop.append(group_prop);
|
||||
if (group_others.children().length > 0)
|
||||
drop.append(group_others);
|
||||
|
||||
|
||||
BACKEND_STATE.orig_uri = uriel.val();
|
||||
BACKEND_STATE.orig_cfg = EDIT_URI.decode_uri(BACKEND_STATE.orig_uri);
|
||||
var scheme = BACKEND_STATE.orig_cfg['backend-type'];
|
||||
|
||||
if (scheme == null && (BACKEND_STATE.orig_uri.indexOf('://') < 0 || BACKEND_STATE.orig_uri.indexOf('file://') == 0))
|
||||
scheme = 'file';
|
||||
|
||||
if (scheme && APP_DATA.plugins.backend[scheme] && APP_DATA.plugins.backend[scheme].decode_uri) {
|
||||
BACKEND_STATE.orig_cfg = APP_DATA.plugins.backend[scheme].decode_uri(BACKEND_STATE.orig_uri);
|
||||
}
|
||||
|
||||
BACKEND_STATE.first_setup = true;
|
||||
if (scheme && BACKEND_STATE.module_lookup[scheme])
|
||||
drop.val(scheme);
|
||||
|
||||
drop.change();
|
||||
},
|
||||
function() {
|
||||
alert('Failed to get server setup...')
|
||||
});
|
||||
});
|
||||
|
||||
$('#server-use-ssl').change(function() {
|
||||
if (BACKEND_STATE.current_state.defaultportssl) {
|
||||
if ($('#server-use-ssl').is(':checked')) {
|
||||
$('#server-port').watermark(BACKEND_STATE.current_state.defaultportssl + '');
|
||||
} else {
|
||||
$('#server-port').watermark(BACKEND_STATE.current_state.defaultport + '');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
$('#backend-type').change(function() {
|
||||
var k = $('#backend-type').val();
|
||||
var m = null;
|
||||
var hasssl = false;
|
||||
|
||||
var cfg = APP_DATA.plugins.backend[k] || {};
|
||||
|
||||
// Auto-detect for SSL
|
||||
if (cfg.hasssl === undefined) {
|
||||
var m = BACKEND_STATE.module_lookup[k];
|
||||
|
||||
if (m && m.Options)
|
||||
for(var i in m.Options)
|
||||
if (m.Options[i].Name == 'use-ssl')
|
||||
cfg.hasssl = true;
|
||||
}
|
||||
|
||||
resetform();
|
||||
|
||||
// Simple config changes through properties
|
||||
$('#server-use-ssl').toggle(cfg.hasssl == true);
|
||||
$('#server-use-ssl-label').toggle(cfg.hasssl == true);
|
||||
|
||||
$('#server-name-and-port-label').toggle(cfg.hideserverandport != true);
|
||||
$('#server-name-and-port').toggle(cfg.hideserverandport != true);
|
||||
|
||||
$('#server-port').toggle(cfg.hideport != true);
|
||||
$('#server-username-and-password').toggle(cfg.hideusernameandpassword != true);
|
||||
|
||||
if (cfg.usernamelabel)
|
||||
$('#server-username-label').text(cfg.usernamelabel + '');
|
||||
if (cfg.passwordlabel)
|
||||
$('#server-password-label').text(cfg.passwordlabel + '');
|
||||
if (cfg.serverandportlabel)
|
||||
$('#server-name-and-port-label').text(cfg.serverandportlabel + '');
|
||||
if (cfg.serverpathlabel)
|
||||
$('#server-path').text(cfg.serverpathlabel + '');
|
||||
if (cfg.usernamewatermark)
|
||||
$('#server-username-label').watermark(cfg.usernamewatermark + '');
|
||||
if (cfg.passwordwatermark)
|
||||
$('#server-password-label').watermark(cfg.passwordwatermark + '');
|
||||
if (cfg.defaultport)
|
||||
$('#server-port').watermark(cfg.defaultport + '');
|
||||
|
||||
|
||||
BACKEND_STATE.current_state = cfg;
|
||||
|
||||
// Specialized setup
|
||||
if (cfg.setup != null)
|
||||
cfg.setup($('#connection-uri-dialog'), $('#edit-dialog-extensions'));
|
||||
|
||||
if (!cfg.hasssl)
|
||||
$('#server-use-ssl').attr('checked', false);
|
||||
$('#server-use-ssl').change();
|
||||
|
||||
if (BACKEND_STATE.first_setup) {
|
||||
|
||||
if (cfg.hideserverandport) {
|
||||
var hostname = BACKEND_STATE.orig_cfg['server-name'];
|
||||
if (hostname != '' && hostname != null) {
|
||||
if (hostname[hostname.length - 1] != '/' && BACKEND_STATE.orig_cfg['server-path'] != '')
|
||||
hostname += '/';
|
||||
BACKEND_STATE.orig_cfg['server-name'] = '';
|
||||
BACKEND_STATE.orig_cfg['server-path'] = hostname + BACKEND_STATE.orig_cfg['server-path'];
|
||||
}
|
||||
}
|
||||
|
||||
BACKEND_STATE.first_setup = false;
|
||||
if (cfg.fill_form)
|
||||
cfg.fill_form($('#edit-uri-form'), BACKEND_STATE.orig_cfg);
|
||||
else
|
||||
EDIT_URI.fill_form($('#edit-uri-form'), BACKEND_STATE.orig_cfg);
|
||||
}
|
||||
});
|
||||
|
||||
var validate_and_return_uri = function() {
|
||||
var values = EDIT_URI.read_form($('#edit-uri-form'));
|
||||
|
||||
if (!EDIT_URI.parse_extra_options($('#server-options'), values))
|
||||
return null;
|
||||
|
||||
if (!BACKEND_STATE.current_state.hasssl && values['--use-ssl'] !== undefined)
|
||||
delete values['--use-ssl'];
|
||||
|
||||
|
||||
if (BACKEND_STATE.current_state.validate)
|
||||
{
|
||||
if (!BACKEND_STATE.current_state.validate($('#connection-uri-dialog'), values))
|
||||
return null;
|
||||
} else {
|
||||
if (!EDIT_URI.validate_input(values, true))
|
||||
return null;
|
||||
}
|
||||
|
||||
var uri = null;
|
||||
if (BACKEND_STATE.current_state.build_uri) {
|
||||
uri = BACKEND_STATE.current_state.build_uri($('#connection-uri-dialog'), values);
|
||||
} else {
|
||||
uri = EDIT_URI.build_uri(values);
|
||||
}
|
||||
|
||||
return uri;
|
||||
};
|
||||
|
||||
$('#connection-uri-dialog').dialog({
|
||||
modal: true,
|
||||
minWidth: 320,
|
||||
width: $('body').width > 600 ? 320 : 600,
|
||||
autoOpen: false,
|
||||
closeOnEscape: true,
|
||||
buttons: [
|
||||
{text: 'Cancel', click: function() { $( this ).dialog( "close" ); } },
|
||||
{text: 'Test connection', click: function() {
|
||||
var selfbtn = $(this).parent().find('.ui-dialog-buttonpane').find('.ui-button').first().next();
|
||||
|
||||
var hasTriedCreate = false;
|
||||
var hasTriedCert = false;
|
||||
|
||||
var testConnection = null;
|
||||
|
||||
var handleError = function(data, success, message) {
|
||||
selfbtn.button('option', 'disabled', false);
|
||||
selfbtn.button('option', 'label', 'Test connection');
|
||||
|
||||
if (!hasTriedCreate && message == 'missing-folder')
|
||||
{
|
||||
if (confirm('The folder ' + $('#server-path').val() + ' does not exist\nCreate it now?')) {
|
||||
createFolder();
|
||||
}
|
||||
}
|
||||
else if (!hasTriedCert && message.indexOf('incorrect-cert:') == 0)
|
||||
{
|
||||
var hash = message.substr('incorrect-cert:'.length);
|
||||
if (confirm('The server certificate could not be validated.\nDo you want to approve the SSL certificate with the hash: ' + hash + '?' )) {
|
||||
|
||||
hasTriedCert = true;
|
||||
$('#server-options').val($('#server-options').val() + '--accept-specified-ssl-hash=' + hash);
|
||||
|
||||
testConnection();
|
||||
}
|
||||
}
|
||||
else
|
||||
alert('Failed to connect: ' + message);
|
||||
}
|
||||
|
||||
testConnection = function() {
|
||||
selfbtn.button('option', 'disabled', true);
|
||||
selfbtn.button('option', 'label', 'Testing ...');
|
||||
|
||||
APP_DATA.callServer({action: 'test-backend', url: uri}, function(data) {
|
||||
selfbtn.button('option', 'disabled', false);
|
||||
selfbtn.button('option', 'label', 'Test connection');
|
||||
alert('Connection worked!');
|
||||
}, handleError);
|
||||
};
|
||||
|
||||
var createFolder = function() {
|
||||
hasTriedCreate = true;
|
||||
selfbtn.button('option', 'disabled', true);
|
||||
selfbtn.button('option', 'label', 'Creating folder ...');
|
||||
|
||||
APP_DATA.callServer(
|
||||
{action: 'create-remote-folder', url: uri},
|
||||
testConnection,
|
||||
handleError
|
||||
);
|
||||
};
|
||||
|
||||
var uri = validate_and_return_uri();
|
||||
if (uri != null) {
|
||||
testConnection();
|
||||
}
|
||||
} },
|
||||
{text: 'Create URI', click: function() {
|
||||
|
||||
var uri = validate_and_return_uri();
|
||||
if (uri != null) {
|
||||
uriel.val(uri);
|
||||
$( this ).dialog( "close" );
|
||||
}
|
||||
} }
|
||||
]
|
||||
});
|
||||
|
||||
$('#server-options-label').click(function() {
|
||||
$('#backup-options-dialog').dialog('open');
|
||||
|
||||
var k = $('#backend-type').val();
|
||||
var m = BACKEND_STATE.module_lookup[k];
|
||||
|
||||
if (m && m.Options) {
|
||||
$('#backup-options-dialog').trigger('configure', { Options: m.Options.concat(BACKEND_STATE.extra_options), callback: function(id) {
|
||||
$('#backup-options-dialog').dialog('close');
|
||||
|
||||
var txt = $('#server-options').val().trim();
|
||||
if (txt.length > 0)
|
||||
txt += '\n';
|
||||
|
||||
var defaultvalue = '';
|
||||
for(var o in m.Options)
|
||||
if (m.Options[o].Name == id) {
|
||||
defaultvalue = m.Options[o].DefaultValue;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
txt += '--' + id + '=' + defaultvalue;
|
||||
$('#server-options').val('').val(txt);
|
||||
$('#server-options').focus();
|
||||
|
||||
}});
|
||||
}
|
||||
});
|
||||
});
|
||||
@@ -1,139 +0,0 @@
|
||||
$(document).ready(function() {
|
||||
$.browseForFolder = function(config) {
|
||||
var self = {};
|
||||
|
||||
var select_node = function(node) {
|
||||
if (node != null && node.original != null && node.original.filepath != null) {
|
||||
var path = node.original.filepath;
|
||||
if (self.resolvePath && node.original.resolvedpath)
|
||||
path = node.original.resolvedpath;
|
||||
|
||||
config.callback(path, node.text);
|
||||
self.rootel.dialog('close');
|
||||
}
|
||||
}
|
||||
|
||||
self.rootel = $('<div class="modal-dialog folder-browser-dialog"></div>')
|
||||
self.treeel = $('<div></div>');
|
||||
|
||||
self.rootel.append(self.treeel);
|
||||
|
||||
self.rootel.attr('title', config.title);
|
||||
self.resolvePath = config.resolvePath;
|
||||
self.multiSelect = config.multiSelect;
|
||||
|
||||
self.loadData = function(path, callback) {
|
||||
$.ajax({
|
||||
'url': APP_CONFIG.server_url,
|
||||
'data': {
|
||||
'action': 'get-folder-contents',
|
||||
'onlyfolders': true,
|
||||
'path': path
|
||||
},
|
||||
headers: {'X-XSRF-Token': APP_DATA.xsrf_token},
|
||||
'dataType': 'json'
|
||||
}).done(function(data, status, xhr) {
|
||||
for(var i = 0; i < data.length; i++) {
|
||||
var o = data[i];
|
||||
o.children = !o.leaf;
|
||||
o.filepath = o.id;
|
||||
|
||||
//o.icon = o.iconCls;
|
||||
delete o.id;
|
||||
delete o.iconCls;
|
||||
delete o.leaf;
|
||||
}
|
||||
|
||||
if (path == "/") {
|
||||
var usernode = {
|
||||
text: 'User data',
|
||||
leaf: false,
|
||||
state: {opened: true},
|
||||
children: []
|
||||
};
|
||||
|
||||
var systemnode = {
|
||||
text: 'Computer',
|
||||
leaf: false,
|
||||
state: {opened: true},
|
||||
children: []
|
||||
};
|
||||
|
||||
var roots = [
|
||||
usernode,
|
||||
systemnode
|
||||
];
|
||||
|
||||
for(var i = 0; i < data.length; i++) {
|
||||
if (data[i].filepath.indexOf('%') == 0)
|
||||
usernode.children.push(data[i]);
|
||||
else
|
||||
systemnode.children.push(data[i]);
|
||||
}
|
||||
|
||||
data = roots;
|
||||
}
|
||||
|
||||
|
||||
callback(data)
|
||||
}).fail(function() {
|
||||
callback(null);
|
||||
});
|
||||
};
|
||||
|
||||
self.treeel.jstree({
|
||||
'core': {
|
||||
'data': function(node, callback){
|
||||
if (node.id === '#') {
|
||||
self.loadData('/', callback);
|
||||
} else {
|
||||
self.loadData(node.original.filepath, callback);
|
||||
}
|
||||
},
|
||||
'multiple' : self.multiSelect
|
||||
},
|
||||
'dnd': { copy: false },
|
||||
'checkbox' : { visible: self.multiSelect, three_state: self.multiSelect },
|
||||
'plugins': ["checkbox"]
|
||||
});
|
||||
|
||||
self.rootel.dialog({
|
||||
minWidth: 320,
|
||||
width: $('body').width > 600 ? 320 : 600,
|
||||
minHeight: 480,
|
||||
height: 500,
|
||||
modal: true,
|
||||
autoOpen: true,
|
||||
closeOnEscape: true,
|
||||
buttons: [
|
||||
{ text: 'Close', disabled: false, click: function(event, ui) {
|
||||
self.rootel.dialog('close');
|
||||
}},
|
||||
{ text: 'OK', disabled: true, click: function(event, ui) {
|
||||
select_node(self.selected_node);
|
||||
}}
|
||||
]
|
||||
});
|
||||
|
||||
self.dlg_buttons = self.rootel.parent().find('.ui-dialog-buttonpane').find('.ui-button');
|
||||
|
||||
self.rootel.on('dialogclose', function() {
|
||||
self.rootel.remove();
|
||||
});
|
||||
|
||||
self.treeel.bind("dblclick.jstree", function (event) {
|
||||
var node = self.treeel.jstree().get_node($(event.target).closest("li"));
|
||||
select_node(node);
|
||||
});
|
||||
|
||||
self.treeel.bind('select_node.jstree', function (event, data) {
|
||||
if (data.node.original.filepath)
|
||||
self.selected_node = data.node;
|
||||
else
|
||||
self.selected_node = null;
|
||||
self.dlg_buttons.last().button('option', 'disabled', self.selected_node == null);
|
||||
});
|
||||
|
||||
|
||||
};
|
||||
});
|
||||
@@ -1 +0,0 @@
|
||||
!function(factory,global){if(typeof define==="function"&&define.amd){define(["jquery"],factory)}else{factory(global.jQuery||global.Zepto)}}(function($,undef){var dataKey="plugin_hideShowPassword",defaults={show:"infer",innerToggle:false,hideToggleUntil:false,touchSupport:false,toggleEvent:"click",toggleTouchEvent:"touchstart mousedown",wrapperClass:"hideShowPassword-wrapper",wrapperWidth:true,toggleClass:"hideShowPassword-toggle",states:{shown:{inputClass:"hideShowPassword-shown",eventName:"passwordShown",toggleClass:"hideShowPassword-toggle-hide",toggleText:"Hide",attr:{type:"text",autocapitalize:"off",autocomplete:"off",autocorrect:"off",spellcheck:"false"}},hidden:{inputClass:"hideShowPassword-hidden",eventName:"passwordHidden",toggleClass:"hideShowPassword-toggle-show",toggleText:"Show",attr:{type:"password"}}},widthMethod:$.fn.outerWidth===undef?"width":"outerWidth",heightMethod:$.fn.outerHeight===undef?"height":"outerHeight"};function HideShowPassword(element,options){this.element=$(element);this.init(options)}HideShowPassword.prototype={init:function(options){this.update(options,defaults,this.element.prop("type")==="password");if(this.options.innerToggle){this.initInnerToggle(this.element,this.options)}},update:function(options,base,toggleFallback){base=base||this.options;toggleFallback=toggleFallback||!this.options.show;if(typeof options!=="object"){options={show:options}}this.options=$.extend(true,{},base,options);if(this.options.show==="toggle"){this.options.show=toggleFallback}if(this.options.show==="infer"){this.options.show=this.element.prop("type")!=="password"}this.ifCurrentOrNot($.proxy(function(state){$.each(state.attr,$.proxy(function(key,value){this.element.prop(key,value)},this));this.element.addClass(state.inputClass).trigger(state.eventName)},this),$.proxy(function(state){this.element.removeClass(state.inputClass)},this))},toggle:function(){this.update("toggle")},currentStateKey:function(){return this.options.show?"shown":"hidden"},ifCurrentOrNot:function(ifCurrent,ifNot){var currentKey=this.currentStateKey();$.each(this.options.states,function(thisKey,state){(currentKey===thisKey?ifCurrent:ifNot)(state)})},initInnerToggle:function(el,options){var attachment=el.css("direction")==="rtl"?"left":"right",elWidth=el[options.widthMethod](),wrapperCSS={position:"relative",display:el.css("display"),verticalAlign:el.css("verticalAlign"),marginTop:el.css("marginTop"),marginRight:el.css("marginRight"),marginBottom:el.css("marginBottom"),marginLeft:el.css("marginLeft")},toggleCSS={position:"absolute",top:"50%",mozUserSelect:"none",webkitUserSelect:"none",msUserSelect:"none",userSelect:"none"},elCSS={marginTop:0,marginRight:0,marginBottom:0,marginLeft:0},eventName="",wrapper,toggle;el.wrap($("<div />").addClass(options.wrapperClass).css(wrapperCSS));wrapper=el.parent();if(options.wrapperWidth===true&&wrapper[options.widthMethod]()!==elWidth){wrapper.css("width",elWidth)}else if(options.wrapperWidth!==false&&options.wrapperWidth!==null){wrapper.css("width",options.wrapperWidth)}toggle=$("<div />").addClass(options.toggleClass);this.updateInnerToggle(toggle,this.currentStateKey(),options.states);toggleCSS[attachment]=0;toggle.css(toggleCSS);toggle.appendTo(wrapper);toggle.css("marginTop",toggle[options.heightMethod]()/-2);elCSS["padding"+attachment.replace(/./,function(m){return m[0].toUpperCase()})]=toggle[options.widthMethod]();el.css(elCSS);if(options.touchSupport){toggle.css("pointerEvents","none");el.on(options.toggleTouchEvent,$.proxy(function(event){var toggleX=toggle.offset().left,eventX,lesser,greater;if(toggleX){eventX=event.pageX||event.originalEvent.pageX;if(attachment==="left"){toggleX+=toggle[options.widthMethod]();lesser=eventX;greater=toggleX}else{lesser=toggleX;greater=eventX}if(greater>=lesser){event.preventDefault();this.toggle()}}},this))}else{toggle.on(options.toggleEvent,$.proxy(function(){this.toggle()},this))}$.each(options.states,function(key,state){eventName+=state.eventName+" "});el.on(eventName,$.proxy(function(){this.updateInnerToggle(toggle,this.currentStateKey(),options.states)},this));if(options.hideToggleUntil){toggle.hide();el.one(options.hideToggleUntil,function(){toggle.show()})}},updateInnerToggle:function(el,currentKey,states){this.ifCurrentOrNot(function(state){el.addClass(state.toggleClass).text(state.toggleText)},function(state){el.removeClass(state.toggleClass)})}};$.fn.hideShowPassword=function(options){return this.each(function(){var $this=$(this),data=$this.data(dataKey);if(data){data.update(options)}else{$this.data(dataKey,new HideShowPassword(this,options))}})};$.each({show:true,hide:false,toggle:"toggle"},function(verb,showVal){$.fn[verb+"Password"]=function(options){return this.hideShowPassword($.extend({},options,{show:showVal}))}})},this);
|
||||
@@ -1,214 +0,0 @@
|
||||
/**
|
||||
* Timeago is a jQuery plugin that makes it easy to support automatically
|
||||
* updating fuzzy timestamps (e.g. "4 minutes ago" or "about 1 day ago").
|
||||
*
|
||||
* @name timeago
|
||||
* @version 1.4.0
|
||||
* @requires jQuery v1.2.3+
|
||||
* @author Ryan McGeary
|
||||
* @license MIT License - http://www.opensource.org/licenses/mit-license.php
|
||||
*
|
||||
* For usage and examples, visit:
|
||||
* http://timeago.yarp.com/
|
||||
*
|
||||
* Copyright (c) 2008-2013, Ryan McGeary (ryan -[at]- mcgeary [*dot*] org)
|
||||
*/
|
||||
|
||||
(function (factory) {
|
||||
if (typeof define === 'function' && define.amd) {
|
||||
// AMD. Register as an anonymous module.
|
||||
define(['jquery'], factory);
|
||||
} else {
|
||||
// Browser globals
|
||||
factory(jQuery);
|
||||
}
|
||||
}(function ($) {
|
||||
$.timeago = function(timestamp) {
|
||||
if (timestamp instanceof Date) {
|
||||
return inWords(timestamp);
|
||||
} else if (typeof timestamp === "string") {
|
||||
return inWords($.timeago.parse(timestamp));
|
||||
} else if (typeof timestamp === "number") {
|
||||
return inWords(new Date(timestamp));
|
||||
} else {
|
||||
return inWords($.timeago.datetime(timestamp));
|
||||
}
|
||||
};
|
||||
var $t = $.timeago;
|
||||
|
||||
$.extend($.timeago, {
|
||||
settings: {
|
||||
refreshMillis: 60000,
|
||||
allowPast: true,
|
||||
allowFuture: false,
|
||||
localeTitle: false,
|
||||
cutoff: 0,
|
||||
strings: {
|
||||
prefixAgo: null,
|
||||
prefixFromNow: null,
|
||||
suffixAgo: "ago",
|
||||
suffixFromNow: "from now",
|
||||
inPast: 'any moment now',
|
||||
seconds: "less than a minute",
|
||||
minute: "about a minute",
|
||||
minutes: "%d minutes",
|
||||
hour: "about an hour",
|
||||
hours: "about %d hours",
|
||||
day: "a day",
|
||||
days: "%d days",
|
||||
month: "about a month",
|
||||
months: "%d months",
|
||||
year: "about a year",
|
||||
years: "%d years",
|
||||
wordSeparator: " ",
|
||||
numbers: []
|
||||
}
|
||||
},
|
||||
|
||||
inWords: function(distanceMillis) {
|
||||
if(!this.settings.allowPast && ! this.settings.allowFuture) {
|
||||
throw 'timeago allowPast and allowFuture settings can not both be set to false.';
|
||||
}
|
||||
|
||||
var $l = this.settings.strings;
|
||||
var prefix = $l.prefixAgo;
|
||||
var suffix = $l.suffixAgo;
|
||||
if (this.settings.allowFuture) {
|
||||
if (distanceMillis < 0) {
|
||||
prefix = $l.prefixFromNow;
|
||||
suffix = $l.suffixFromNow;
|
||||
}
|
||||
}
|
||||
|
||||
if(!this.settings.allowPast && distanceMillis >= 0) {
|
||||
return this.settings.strings.inPast;
|
||||
}
|
||||
|
||||
var seconds = Math.abs(distanceMillis) / 1000;
|
||||
var minutes = seconds / 60;
|
||||
var hours = minutes / 60;
|
||||
var days = hours / 24;
|
||||
var years = days / 365;
|
||||
|
||||
function substitute(stringOrFunction, number) {
|
||||
var string = $.isFunction(stringOrFunction) ? stringOrFunction(number, distanceMillis) : stringOrFunction;
|
||||
var value = ($l.numbers && $l.numbers[number]) || number;
|
||||
return string.replace(/%d/i, value);
|
||||
}
|
||||
|
||||
var words = seconds < 45 && substitute($l.seconds, Math.round(seconds)) ||
|
||||
seconds < 90 && substitute($l.minute, 1) ||
|
||||
minutes < 45 && substitute($l.minutes, Math.round(minutes)) ||
|
||||
minutes < 90 && substitute($l.hour, 1) ||
|
||||
hours < 24 && substitute($l.hours, Math.round(hours)) ||
|
||||
hours < 42 && substitute($l.day, 1) ||
|
||||
days < 30 && substitute($l.days, Math.round(days)) ||
|
||||
days < 45 && substitute($l.month, 1) ||
|
||||
days < 365 && substitute($l.months, Math.round(days / 30)) ||
|
||||
years < 1.5 && substitute($l.year, 1) ||
|
||||
substitute($l.years, Math.round(years));
|
||||
|
||||
var separator = $l.wordSeparator || "";
|
||||
if ($l.wordSeparator === undefined) { separator = " "; }
|
||||
return $.trim([prefix, words, suffix].join(separator));
|
||||
},
|
||||
|
||||
parse: function(iso8601) {
|
||||
var s = $.trim(iso8601);
|
||||
s = s.replace(/\.\d+/,""); // remove milliseconds
|
||||
s = s.replace(/-/,"/").replace(/-/,"/");
|
||||
s = s.replace(/T/," ").replace(/Z/," UTC");
|
||||
s = s.replace(/([\+\-]\d\d)\:?(\d\d)/," $1$2"); // -04:00 -> -0400
|
||||
s = s.replace(/([\+\-]\d\d)$/," $100"); // +09 -> +0900
|
||||
return new Date(s);
|
||||
},
|
||||
datetime: function(elem) {
|
||||
var iso8601 = $t.isTime(elem) ? $(elem).attr("datetime") : $(elem).attr("title");
|
||||
return $t.parse(iso8601);
|
||||
},
|
||||
isTime: function(elem) {
|
||||
// jQuery's `is()` doesn't play well with HTML5 in IE
|
||||
return $(elem).get(0).tagName.toLowerCase() === "time"; // $(elem).is("time");
|
||||
}
|
||||
});
|
||||
|
||||
// functions that can be called via $(el).timeago('action')
|
||||
// init is default when no action is given
|
||||
// functions are called with context of a single element
|
||||
var functions = {
|
||||
init: function(){
|
||||
var refresh_el = $.proxy(refresh, this);
|
||||
refresh_el();
|
||||
var $s = $t.settings;
|
||||
if ($s.refreshMillis > 0) {
|
||||
this._timeagoInterval = setInterval(refresh_el, $s.refreshMillis);
|
||||
}
|
||||
},
|
||||
update: function(time){
|
||||
var parsedTime = $t.parse(time);
|
||||
$(this).data('timeago', { datetime: parsedTime });
|
||||
if($t.settings.localeTitle) $(this).attr("title", parsedTime.toLocaleString());
|
||||
refresh.apply(this);
|
||||
},
|
||||
updateFromDOM: function(){
|
||||
$(this).data('timeago', { datetime: $t.parse( $t.isTime(this) ? $(this).attr("datetime") : $(this).attr("title") ) });
|
||||
refresh.apply(this);
|
||||
},
|
||||
dispose: function () {
|
||||
if (this._timeagoInterval) {
|
||||
window.clearInterval(this._timeagoInterval);
|
||||
this._timeagoInterval = null;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$.fn.timeago = function(action, options) {
|
||||
var fn = action ? functions[action] : functions.init;
|
||||
if(!fn){
|
||||
throw new Error("Unknown function name '"+ action +"' for timeago");
|
||||
}
|
||||
// each over objects here and call the requested function
|
||||
this.each(function(){
|
||||
fn.call(this, options);
|
||||
});
|
||||
return this;
|
||||
};
|
||||
|
||||
function refresh() {
|
||||
var data = prepareData(this);
|
||||
var $s = $t.settings;
|
||||
|
||||
if (!isNaN(data.datetime)) {
|
||||
if ( $s.cutoff == 0 || distance(data.datetime) < $s.cutoff) {
|
||||
$(this).text(inWords(data.datetime));
|
||||
}
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
function prepareData(element) {
|
||||
element = $(element);
|
||||
if (!element.data("timeago")) {
|
||||
element.data("timeago", { datetime: $t.datetime(element) });
|
||||
var text = $.trim(element.text());
|
||||
if ($t.settings.localeTitle) {
|
||||
element.attr("title", element.data('timeago').datetime.toLocaleString());
|
||||
} else if (text.length > 0 && !($t.isTime(element) && element.attr("title"))) {
|
||||
element.attr("title", text);
|
||||
}
|
||||
}
|
||||
return element.data("timeago");
|
||||
}
|
||||
|
||||
function inWords(date) {
|
||||
return $t.inWords(distance(date));
|
||||
}
|
||||
|
||||
function distance(date) {
|
||||
return (new Date().getTime() - date.getTime());
|
||||
}
|
||||
|
||||
// fix for IE6 suckage
|
||||
document.createElement("abbr");
|
||||
document.createElement("time");
|
||||
}));
|
||||
@@ -1,8 +0,0 @@
|
||||
/*
|
||||
Watermark v3.1.4 (August 13, 2012) plugin for jQuery
|
||||
http://jquery-watermark.googlecode.com/
|
||||
Copyright (c) 2009-2012 Todd Northrop
|
||||
http://www.speednet.biz/
|
||||
Dual licensed under the MIT or GPL Version 2 licenses.
|
||||
*/
|
||||
(function(n,t,i){var g="TEXTAREA",d="function",nt="password",c="maxLength",v="type",r="",u=!0,rt="placeholder",h=!1,tt="watermark",s=tt,o="watermarkClass",w="watermarkFocus",a="watermarkSubmit",b="watermarkMaxLength",e="watermarkPassword",f="watermarkText",l=/\r/g,ft=/^(button|checkbox|hidden|image|radio|range|reset|submit)$/i,it="input:data("+s+"),textarea:data("+s+")",p=":watermarkable",k=["Page_ClientValidate"],y=h,ut=rt in document.createElement("input");n.watermark=n.watermark||{version:"3.1.4",runOnce:u,options:{className:tt,useNative:u,hideBeforeUnload:u},hide:function(t){n(t).filter(it).each(function(){n.watermark._hide(n(this))})},_hide:function(n,i){var a=n[0],w=(a.value||r).replace(l,r),h=n.data(f)||r,p=n.data(b)||0,y=n.data(o),s,u;h.length&&w==h&&(a.value=r,n.data(e)&&(n.attr(v)||r)==="text"&&(s=n.data(e)||[],u=n.parent()||[],s.length&&u.length&&(u[0].removeChild(n[0]),u[0].appendChild(s[0]),n=s)),p&&(n.attr(c,p),n.removeData(b)),i&&(n.attr("autocomplete","off"),t.setTimeout(function(){n.select()},1))),y&&n.removeClass(y)},show:function(t){n(t).filter(it).each(function(){n.watermark._show(n(this))})},_show:function(t){var p=t[0],g=(p.value||r).replace(l,r),i=t.data(f)||r,k=t.attr(v)||r,d=t.data(o),h,s,a;g.length!=0&&g!=i||t.data(w)?n.watermark._hide(t):(y=u,t.data(e)&&k===nt&&(h=t.data(e)||[],s=t.parent()||[],h.length&&s.length&&(s[0].removeChild(t[0]),s[0].appendChild(h[0]),t=h,t.attr(c,i.length),p=t[0])),(k==="text"||k==="search")&&(a=t.attr(c)||0,a>0&&i.length>a&&(t.data(b,a),t.attr(c,i.length))),d&&t.addClass(d),p.value=i)},hideAll:function(){y&&(n.watermark.hide(p),y=h)},showAll:function(){n.watermark.show(p)}},n.fn.watermark=n.fn.watermark||function(i,y){var tt="string";if(!this.length)return this;var k=h,b=typeof i==tt;return b&&(i=i.replace(l,r)),typeof y=="object"?(k=typeof y.className==tt,y=n.extend({},n.watermark.options,y)):typeof y==tt?(k=u,y=n.extend({},n.watermark.options,{className:y})):y=n.watermark.options,typeof y.useNative!=d&&(y.useNative=y.useNative?function(){return u}:function(){return h}),this.each(function(){var et="dragleave",ot="dragenter",ft=this,h=n(ft),st,d,tt,it;if(h.is(p)){if(h.data(s))(b||k)&&(n.watermark._hide(h),b&&h.data(f,i),k&&h.data(o,y.className));else{if(ut&&y.useNative.call(ft,h)&&(h.attr("tagName")||r)!==g){b&&h.attr(rt,i);return}h.data(f,b?i:r),h.data(o,y.className),h.data(s,1),(h.attr(v)||r)===nt?(st=h.wrap("<span>").parent(),d=n(st.html().replace(/type=["']?password["']?/i,'type="text"')),d.data(f,h.data(f)),d.data(o,h.data(o)),d.data(s,1),d.attr(c,i.length),d.focus(function(){n.watermark._hide(d,u)}).bind(ot,function(){n.watermark._hide(d)}).bind("dragend",function(){t.setTimeout(function(){d.blur()},1)}),h.blur(function(){n.watermark._show(h)}).bind(et,function(){n.watermark._show(h)}),d.data(e,h),h.data(e,d)):h.focus(function(){h.data(w,1),n.watermark._hide(h,u)}).blur(function(){h.data(w,0),n.watermark._show(h)}).bind(ot,function(){n.watermark._hide(h)}).bind(et,function(){n.watermark._show(h)}).bind("dragend",function(){t.setTimeout(function(){n.watermark._show(h)},1)}).bind("drop",function(n){var i=h[0],t=n.originalEvent.dataTransfer.getData("Text");(i.value||r).replace(l,r).replace(t,r)===h.data(f)&&(i.value=t),h.focus()}),ft.form&&(tt=ft.form,it=n(tt),it.data(a)||(it.submit(n.watermark.hideAll),tt.submit?(it.data(a,tt.submit),tt.submit=function(t,i){return function(){var r=i.data(a);n.watermark.hideAll(),r.apply?r.apply(t,Array.prototype.slice.call(arguments)):r()}}(tt,it)):(it.data(a,1),tt.submit=function(t){return function(){n.watermark.hideAll(),delete t.submit,t.submit()}}(tt))))}n.watermark._show(h)}})},n.watermark.runOnce&&(n.watermark.runOnce=h,n.extend(n.expr[":"],{data:n.expr.createPseudo?n.expr.createPseudo(function(t){return function(i){return!!n.data(i,t)}}):function(t,i,r){return!!n.data(t,r[3])},watermarkable:function(n){var t,i=n.nodeName;return i===g?u:i!=="INPUT"?h:(t=n.getAttribute(v),!t||!ft.test(t))}}),function(t){n.fn.val=function(){var u=this,e=Array.prototype.slice.call(arguments),o;return u.length?e.length?(t.apply(u,e),n.watermark.show(u),u):u.data(s)?(o=(u[0].value||r).replace(l,r),o===(u.data(f)||r)?r:o):t.apply(u):e.length?u:i}}(n.fn.val),k.length&&n(function(){for(var u,r,i=k.length-1;i>=0;i--)u=k[i],r=t[u],typeof r==d&&(t[u]=function(t){return function(){return n.watermark.hideAll(),t.apply(null,Array.prototype.slice.call(arguments))}}(r))}),n(t).bind("beforeunload",function(){n.watermark.options.hideBeforeUnload&&n.watermark.hideAll()}))})(jQuery,window);
|
||||
@@ -1,489 +0,0 @@
|
||||
/*
|
||||
json2.js
|
||||
2014-02-04
|
||||
|
||||
Public Domain.
|
||||
|
||||
NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
|
||||
|
||||
See http://www.JSON.org/js.html
|
||||
|
||||
|
||||
This code should be minified before deployment.
|
||||
See http://javascript.crockford.com/jsmin.html
|
||||
|
||||
USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
|
||||
NOT CONTROL.
|
||||
|
||||
|
||||
This file creates a global JSON object containing two methods: stringify
|
||||
and parse.
|
||||
|
||||
JSON.stringify(value, replacer, space)
|
||||
value any JavaScript value, usually an object or array.
|
||||
|
||||
replacer an optional parameter that determines how object
|
||||
values are stringified for objects. It can be a
|
||||
function or an array of strings.
|
||||
|
||||
space an optional parameter that specifies the indentation
|
||||
of nested structures. If it is omitted, the text will
|
||||
be packed without extra whitespace. If it is a number,
|
||||
it will specify the number of spaces to indent at each
|
||||
level. If it is a string (such as '\t' or ' '),
|
||||
it contains the characters used to indent at each level.
|
||||
|
||||
This method produces a JSON text from a JavaScript value.
|
||||
|
||||
When an object value is found, if the object contains a toJSON
|
||||
method, its toJSON method will be called and the result will be
|
||||
stringified. A toJSON method does not serialize: it returns the
|
||||
value represented by the name/value pair that should be serialized,
|
||||
or undefined if nothing should be serialized. The toJSON method
|
||||
will be passed the key associated with the value, and this will be
|
||||
bound to the value
|
||||
|
||||
For example, this would serialize Dates as ISO strings.
|
||||
|
||||
Date.prototype.toJSON = function (key) {
|
||||
function f(n) {
|
||||
// Format integers to have at least two digits.
|
||||
return n < 10 ? '0' + n : n;
|
||||
}
|
||||
|
||||
return this.getUTCFullYear() + '-' +
|
||||
f(this.getUTCMonth() + 1) + '-' +
|
||||
f(this.getUTCDate()) + 'T' +
|
||||
f(this.getUTCHours()) + ':' +
|
||||
f(this.getUTCMinutes()) + ':' +
|
||||
f(this.getUTCSeconds()) + 'Z';
|
||||
};
|
||||
|
||||
You can provide an optional replacer method. It will be passed the
|
||||
key and value of each member, with this bound to the containing
|
||||
object. The value that is returned from your method will be
|
||||
serialized. If your method returns undefined, then the member will
|
||||
be excluded from the serialization.
|
||||
|
||||
If the replacer parameter is an array of strings, then it will be
|
||||
used to select the members to be serialized. It filters the results
|
||||
such that only members with keys listed in the replacer array are
|
||||
stringified.
|
||||
|
||||
Values that do not have JSON representations, such as undefined or
|
||||
functions, will not be serialized. Such values in objects will be
|
||||
dropped; in arrays they will be replaced with null. You can use
|
||||
a replacer function to replace those with JSON values.
|
||||
JSON.stringify(undefined) returns undefined.
|
||||
|
||||
The optional space parameter produces a stringification of the
|
||||
value that is filled with line breaks and indentation to make it
|
||||
easier to read.
|
||||
|
||||
If the space parameter is a non-empty string, then that string will
|
||||
be used for indentation. If the space parameter is a number, then
|
||||
the indentation will be that many spaces.
|
||||
|
||||
Example:
|
||||
|
||||
text = JSON.stringify(['e', {pluribus: 'unum'}]);
|
||||
// text is '["e",{"pluribus":"unum"}]'
|
||||
|
||||
|
||||
text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
|
||||
// text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
|
||||
|
||||
text = JSON.stringify([new Date()], function (key, value) {
|
||||
return this[key] instanceof Date ?
|
||||
'Date(' + this[key] + ')' : value;
|
||||
});
|
||||
// text is '["Date(---current time---)"]'
|
||||
|
||||
|
||||
JSON.parse(text, reviver)
|
||||
This method parses a JSON text to produce an object or array.
|
||||
It can throw a SyntaxError exception.
|
||||
|
||||
The optional reviver parameter is a function that can filter and
|
||||
transform the results. It receives each of the keys and values,
|
||||
and its return value is used instead of the original value.
|
||||
If it returns what it received, then the structure is not modified.
|
||||
If it returns undefined then the member is deleted.
|
||||
|
||||
Example:
|
||||
|
||||
// Parse the text. Values that look like ISO date strings will
|
||||
// be converted to Date objects.
|
||||
|
||||
myData = JSON.parse(text, function (key, value) {
|
||||
var a;
|
||||
if (typeof value === 'string') {
|
||||
a =
|
||||
/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
|
||||
if (a) {
|
||||
return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
|
||||
+a[5], +a[6]));
|
||||
}
|
||||
}
|
||||
return value;
|
||||
});
|
||||
|
||||
myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
|
||||
var d;
|
||||
if (typeof value === 'string' &&
|
||||
value.slice(0, 5) === 'Date(' &&
|
||||
value.slice(-1) === ')') {
|
||||
d = new Date(value.slice(5, -1));
|
||||
if (d) {
|
||||
return d;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
});
|
||||
|
||||
|
||||
This is a reference implementation. You are free to copy, modify, or
|
||||
redistribute.
|
||||
*/
|
||||
|
||||
/*jslint evil: true, regexp: true */
|
||||
|
||||
/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply,
|
||||
call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
|
||||
getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
|
||||
lastIndex, length, parse, prototype, push, replace, slice, stringify,
|
||||
test, toJSON, toString, valueOf
|
||||
*/
|
||||
|
||||
|
||||
// Create a JSON object only if one does not already exist. We create the
|
||||
// methods in a closure to avoid creating global variables.
|
||||
|
||||
if (typeof JSON !== 'object') {
|
||||
JSON = {};
|
||||
}
|
||||
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
function f(n) {
|
||||
// Format integers to have at least two digits.
|
||||
return n < 10 ? '0' + n : n;
|
||||
}
|
||||
|
||||
if (typeof Date.prototype.toJSON !== 'function') {
|
||||
|
||||
Date.prototype.toJSON = function () {
|
||||
|
||||
return isFinite(this.valueOf())
|
||||
? this.getUTCFullYear() + '-' +
|
||||
f(this.getUTCMonth() + 1) + '-' +
|
||||
f(this.getUTCDate()) + 'T' +
|
||||
f(this.getUTCHours()) + ':' +
|
||||
f(this.getUTCMinutes()) + ':' +
|
||||
f(this.getUTCSeconds()) + 'Z'
|
||||
: null;
|
||||
};
|
||||
|
||||
String.prototype.toJSON =
|
||||
Number.prototype.toJSON =
|
||||
Boolean.prototype.toJSON = function () {
|
||||
return this.valueOf();
|
||||
};
|
||||
}
|
||||
|
||||
var cx,
|
||||
escapable,
|
||||
gap,
|
||||
indent,
|
||||
meta,
|
||||
rep;
|
||||
|
||||
|
||||
function quote(string) {
|
||||
|
||||
// If the string contains no control characters, no quote characters, and no
|
||||
// backslash characters, then we can safely slap some quotes around it.
|
||||
// Otherwise we must also replace the offending characters with safe escape
|
||||
// sequences.
|
||||
|
||||
escapable.lastIndex = 0;
|
||||
return escapable.test(string) ? '"' + string.replace(escapable, function (a) {
|
||||
var c = meta[a];
|
||||
return typeof c === 'string'
|
||||
? c
|
||||
: '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||
}) + '"' : '"' + string + '"';
|
||||
}
|
||||
|
||||
|
||||
function str(key, holder) {
|
||||
|
||||
// Produce a string from holder[key].
|
||||
|
||||
var i, // The loop counter.
|
||||
k, // The member key.
|
||||
v, // The member value.
|
||||
length,
|
||||
mind = gap,
|
||||
partial,
|
||||
value = holder[key];
|
||||
|
||||
// If the value has a toJSON method, call it to obtain a replacement value.
|
||||
|
||||
if (value && typeof value === 'object' &&
|
||||
typeof value.toJSON === 'function') {
|
||||
value = value.toJSON(key);
|
||||
}
|
||||
|
||||
// If we were called with a replacer function, then call the replacer to
|
||||
// obtain a replacement value.
|
||||
|
||||
if (typeof rep === 'function') {
|
||||
value = rep.call(holder, key, value);
|
||||
}
|
||||
|
||||
// What happens next depends on the value's type.
|
||||
|
||||
switch (typeof value) {
|
||||
case 'string':
|
||||
return quote(value);
|
||||
|
||||
case 'number':
|
||||
|
||||
// JSON numbers must be finite. Encode non-finite numbers as null.
|
||||
|
||||
return isFinite(value) ? String(value) : 'null';
|
||||
|
||||
case 'boolean':
|
||||
case 'null':
|
||||
|
||||
// If the value is a boolean or null, convert it to a string. Note:
|
||||
// typeof null does not produce 'null'. The case is included here in
|
||||
// the remote chance that this gets fixed someday.
|
||||
|
||||
return String(value);
|
||||
|
||||
// If the type is 'object', we might be dealing with an object or an array or
|
||||
// null.
|
||||
|
||||
case 'object':
|
||||
|
||||
// Due to a specification blunder in ECMAScript, typeof null is 'object',
|
||||
// so watch out for that case.
|
||||
|
||||
if (!value) {
|
||||
return 'null';
|
||||
}
|
||||
|
||||
// Make an array to hold the partial results of stringifying this object value.
|
||||
|
||||
gap += indent;
|
||||
partial = [];
|
||||
|
||||
// Is the value an array?
|
||||
|
||||
if (Object.prototype.toString.apply(value) === '[object Array]') {
|
||||
|
||||
// The value is an array. Stringify every element. Use null as a placeholder
|
||||
// for non-JSON values.
|
||||
|
||||
length = value.length;
|
||||
for (i = 0; i < length; i += 1) {
|
||||
partial[i] = str(i, value) || 'null';
|
||||
}
|
||||
|
||||
// Join all of the elements together, separated with commas, and wrap them in
|
||||
// brackets.
|
||||
|
||||
v = partial.length === 0
|
||||
? '[]'
|
||||
: gap
|
||||
? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
|
||||
: '[' + partial.join(',') + ']';
|
||||
gap = mind;
|
||||
return v;
|
||||
}
|
||||
|
||||
// If the replacer is an array, use it to select the members to be stringified.
|
||||
|
||||
if (rep && typeof rep === 'object') {
|
||||
length = rep.length;
|
||||
for (i = 0; i < length; i += 1) {
|
||||
if (typeof rep[i] === 'string') {
|
||||
k = rep[i];
|
||||
v = str(k, value);
|
||||
if (v) {
|
||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
||||
// Otherwise, iterate through all of the keys in the object.
|
||||
|
||||
for (k in value) {
|
||||
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||
v = str(k, value);
|
||||
if (v) {
|
||||
partial.push(quote(k) + (gap ? ': ' : ':') + v);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Join all of the member texts together, separated with commas,
|
||||
// and wrap them in braces.
|
||||
|
||||
v = partial.length === 0
|
||||
? '{}'
|
||||
: gap
|
||||
? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
|
||||
: '{' + partial.join(',') + '}';
|
||||
gap = mind;
|
||||
return v;
|
||||
}
|
||||
}
|
||||
|
||||
// If the JSON object does not yet have a stringify method, give it one.
|
||||
|
||||
if (typeof JSON.stringify !== 'function') {
|
||||
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
|
||||
meta = { // table of character substitutions
|
||||
'\b': '\\b',
|
||||
'\t': '\\t',
|
||||
'\n': '\\n',
|
||||
'\f': '\\f',
|
||||
'\r': '\\r',
|
||||
'"' : '\\"',
|
||||
'\\': '\\\\'
|
||||
};
|
||||
JSON.stringify = function (value, replacer, space) {
|
||||
|
||||
// The stringify method takes a value and an optional replacer, and an optional
|
||||
// space parameter, and returns a JSON text. The replacer can be a function
|
||||
// that can replace values, or an array of strings that will select the keys.
|
||||
// A default replacer method can be provided. Use of the space parameter can
|
||||
// produce text that is more easily readable.
|
||||
|
||||
var i;
|
||||
gap = '';
|
||||
indent = '';
|
||||
|
||||
// If the space parameter is a number, make an indent string containing that
|
||||
// many spaces.
|
||||
|
||||
if (typeof space === 'number') {
|
||||
for (i = 0; i < space; i += 1) {
|
||||
indent += ' ';
|
||||
}
|
||||
|
||||
// If the space parameter is a string, it will be used as the indent string.
|
||||
|
||||
} else if (typeof space === 'string') {
|
||||
indent = space;
|
||||
}
|
||||
|
||||
// If there is a replacer, it must be a function or an array.
|
||||
// Otherwise, throw an error.
|
||||
|
||||
rep = replacer;
|
||||
if (replacer && typeof replacer !== 'function' &&
|
||||
(typeof replacer !== 'object' ||
|
||||
typeof replacer.length !== 'number')) {
|
||||
throw new Error('JSON.stringify');
|
||||
}
|
||||
|
||||
// Make a fake root object containing our value under the key of ''.
|
||||
// Return the result of stringifying the value.
|
||||
|
||||
return str('', {'': value});
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// If the JSON object does not yet have a parse method, give it one.
|
||||
|
||||
if (typeof JSON.parse !== 'function') {
|
||||
cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
|
||||
JSON.parse = function (text, reviver) {
|
||||
|
||||
// The parse method takes a text and an optional reviver function, and returns
|
||||
// a JavaScript value if the text is a valid JSON text.
|
||||
|
||||
var j;
|
||||
|
||||
function walk(holder, key) {
|
||||
|
||||
// The walk method is used to recursively walk the resulting structure so
|
||||
// that modifications can be made.
|
||||
|
||||
var k, v, value = holder[key];
|
||||
if (value && typeof value === 'object') {
|
||||
for (k in value) {
|
||||
if (Object.prototype.hasOwnProperty.call(value, k)) {
|
||||
v = walk(value, k);
|
||||
if (v !== undefined) {
|
||||
value[k] = v;
|
||||
} else {
|
||||
delete value[k];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return reviver.call(holder, key, value);
|
||||
}
|
||||
|
||||
|
||||
// Parsing happens in four stages. In the first stage, we replace certain
|
||||
// Unicode characters with escape sequences. JavaScript handles many characters
|
||||
// incorrectly, either silently deleting them, or treating them as line endings.
|
||||
|
||||
text = String(text);
|
||||
cx.lastIndex = 0;
|
||||
if (cx.test(text)) {
|
||||
text = text.replace(cx, function (a) {
|
||||
return '\\u' +
|
||||
('0000' + a.charCodeAt(0).toString(16)).slice(-4);
|
||||
});
|
||||
}
|
||||
|
||||
// In the second stage, we run the text against regular expressions that look
|
||||
// for non-JSON patterns. We are especially concerned with '()' and 'new'
|
||||
// because they can cause invocation, and '=' because it can cause mutation.
|
||||
// But just to be safe, we want to reject all unexpected forms.
|
||||
|
||||
// We split the second stage into 4 regexp operations in order to work around
|
||||
// crippling inefficiencies in IE's and Safari's regexp engines. First we
|
||||
// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
|
||||
// replace all simple value tokens with ']' characters. Third, we delete all
|
||||
// open brackets that follow a colon or comma or that begin the text. Finally,
|
||||
// we look to see that the remaining characters are only whitespace or ']' or
|
||||
// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
|
||||
|
||||
if (/^[\],:{}\s]*$/
|
||||
.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@')
|
||||
.replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']')
|
||||
.replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
|
||||
|
||||
// In the third stage we use the eval function to compile the text into a
|
||||
// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
|
||||
// in JavaScript: it can begin a block or an object literal. We wrap the text
|
||||
// in parens to eliminate the ambiguity.
|
||||
|
||||
j = eval('(' + text + ')');
|
||||
|
||||
// In the optional fourth stage, we recursively walk the new structure, passing
|
||||
// each name/value pair to a reviver function for possible transformation.
|
||||
|
||||
return typeof reviver === 'function'
|
||||
? walk({'': j}, '')
|
||||
: j;
|
||||
}
|
||||
|
||||
// If the text is not JSON parseable, then a SyntaxError is thrown.
|
||||
|
||||
throw new SyntaxError('JSON.parse');
|
||||
};
|
||||
}
|
||||
}());
|
||||
@@ -1,237 +0,0 @@
|
||||
$(document).ready(function() {
|
||||
var appdatacallback = function(data, tag) {
|
||||
var td = $.tmpl($('#log-data-template'), data);
|
||||
td.appendTo(tag);
|
||||
|
||||
td.find('.log-exception').each(function(i, e) {
|
||||
$(e).html(nl2br($(e).html()));
|
||||
});
|
||||
|
||||
td.find('.log-exception').click(function(e) {
|
||||
e.bubbles = false;
|
||||
return false;
|
||||
});
|
||||
td.find('.log-timestamp').each(function(i, e) {
|
||||
$(e).text((new Date(parseInt($(e).attr('title')))).toLocaleString());
|
||||
});
|
||||
td.click(function(e) {
|
||||
$(this).toggleClass('expanded');
|
||||
});
|
||||
};
|
||||
|
||||
var livedatacallback = function(data, tag) {
|
||||
var scrolledToEnd = tag.parent().scrollTop() > tag.height() - (tag.parent().height()*2);
|
||||
|
||||
var td = $.tmpl($('#live-log-data-template'), data)
|
||||
td.appendTo(tag);
|
||||
|
||||
td.find('.log-exception').each(function(i, e) {
|
||||
$(e).html(nl2br($(e).html()));
|
||||
});
|
||||
|
||||
td.find('.log-exception').click(function(e) {
|
||||
e.bubbles = false;
|
||||
return false;
|
||||
});
|
||||
td.find('.log-timestamp').each(function(i, e) {
|
||||
$(e).text(new Date($(e).attr('title')).toLocaleString());
|
||||
});
|
||||
td.click(function(e) {
|
||||
$(this).toggleClass('expanded');
|
||||
});
|
||||
|
||||
if (data != null && data.length > 0 && scrolledToEnd)
|
||||
tag.parent().scrollTop(tag.height());
|
||||
};
|
||||
|
||||
var generaldatacallback = function(data, tag) {
|
||||
var td = $.tmpl($('#log-backup-general-template'), data)
|
||||
td.appendTo(tag);
|
||||
|
||||
td.find('.log-exception').each(function(i, e) {
|
||||
$(e).html(nl2br($(e).html()));
|
||||
});
|
||||
td.find('.log-message').each(function(i, e) {
|
||||
$(e).html(nl2br($(e).html()));
|
||||
});
|
||||
|
||||
td.find('.log-exception').click(function(e) {
|
||||
return e.bubbles = false;
|
||||
});
|
||||
td.find('.log-message').click(function(e) {
|
||||
return e.bubbles = false;
|
||||
});
|
||||
|
||||
td.find('.log-timestamp').each(function(i, e) {
|
||||
$(e).text((new Date(parseInt($(e).attr('title')))).toLocaleString());
|
||||
});
|
||||
|
||||
td.click(function(e) {
|
||||
$(this).toggleClass('expanded');
|
||||
});
|
||||
};
|
||||
|
||||
var remotedatacallback = function(data, tag) {
|
||||
var td = $.tmpl($('#log-backup-remote-template'), data);
|
||||
td.appendTo(tag);
|
||||
|
||||
td.find('.log-data').each(function(i, e) {
|
||||
$(e).html(nl2br($(e).html()));
|
||||
});
|
||||
td.find('.log-data').click(function(e) {
|
||||
return e.bubbles = false;
|
||||
});
|
||||
|
||||
td.find('.log-timestamp').each(function(i, e) {
|
||||
$(e).text((new Date(parseInt($(e).attr('title')))).toLocaleString());
|
||||
});
|
||||
|
||||
td.click(function(e) {
|
||||
$(e.target).closest('.log-entry').toggleClass('expanded');
|
||||
});
|
||||
};
|
||||
|
||||
var refreshRunning = false;
|
||||
var refreshId = 0;
|
||||
|
||||
var refreshLiveData = function() {
|
||||
if (refreshRunning)
|
||||
return;
|
||||
|
||||
var v = $('#log-tab-live-level').val();
|
||||
if (v == '' || v == 'disabled')
|
||||
return;
|
||||
|
||||
if (!$('#log-dialog').dialog('isOpen'))
|
||||
return;
|
||||
|
||||
refreshRunning = true;
|
||||
|
||||
APP_DATA.callServer({'action': 'poll-log-messages', 'level': v, 'id': refreshId},
|
||||
function(data) {
|
||||
for(var n in data)
|
||||
refreshId = Math.max(refreshId, data[n].ID);
|
||||
|
||||
refreshRunning = false;
|
||||
livedatacallback(data, $('#log-tab-live'));
|
||||
setTimeout(refreshLiveData, 3000);
|
||||
},
|
||||
function() {
|
||||
refreshRunning = false;
|
||||
setTimeout(refreshLiveData, 1000);
|
||||
});
|
||||
};
|
||||
|
||||
$.showAppLog = function() {
|
||||
var dlg_buttons = $('#log-dialog').parent().find('.ui-dialog-buttonpane').find('.ui-button');
|
||||
|
||||
$('#log-dialog').dialog('open');
|
||||
|
||||
var data = $('#log-tab-stored').data('log');
|
||||
if (!data) {
|
||||
data = {
|
||||
first: null,
|
||||
last: null
|
||||
};
|
||||
$('#log-tab-stored').data('log', data);
|
||||
}
|
||||
|
||||
if (data.first == null) {
|
||||
$('#log-tab-stored').empty();
|
||||
APP_DATA.callServer({'action': 'read-log', 'pagesize': 100}, function(data) {
|
||||
appdatacallback(data, $('#log-tab-stored'));
|
||||
});
|
||||
};
|
||||
|
||||
var loglevel = $('#log-tab-live-level');
|
||||
loglevel.empty();
|
||||
|
||||
$('#log-tab-live').find('.log-entry').remove();
|
||||
|
||||
loglevel.change(function() {
|
||||
refreshId = 0;
|
||||
|
||||
var v = $('#log-tab-live-level').val();
|
||||
if (v == '' || v == 'disabled')
|
||||
return;
|
||||
|
||||
$('#log-tab-live').find('.log-entry').remove();
|
||||
refreshLiveData();
|
||||
});
|
||||
|
||||
APP_DATA.getServerConfig(function(server_config) {
|
||||
|
||||
loglevel.append($('<option></option>')
|
||||
.attr('value', 'disabled')
|
||||
.text('Disabled'));
|
||||
|
||||
for(var n in server_config.LogLevels)
|
||||
loglevel.append($('<option></option>')
|
||||
.attr('value',server_config.LogLevels[n])
|
||||
.text(server_config.LogLevels[n]));
|
||||
|
||||
}, function() { alert('Failed to read server data'); });
|
||||
|
||||
};
|
||||
|
||||
$.showBackupLog = function(id) {
|
||||
|
||||
$('#backup-log-tab-general').empty();
|
||||
$('#backup-log-tab-remote').empty();
|
||||
|
||||
$('<div id="restore-search-loader" class="small-loader-icon">').appendTo($('#backup-log-tab-general'));
|
||||
$('<div id="restore-search-loader" class="small-loader-icon">').appendTo($('#backup-log-tab-remote'));
|
||||
|
||||
var loglevel = $('#backup-log-live-level');
|
||||
loglevel.empty();
|
||||
|
||||
loglevel.change(refreshLiveData);
|
||||
|
||||
$('#backup-log-dialog').dialog('open');
|
||||
|
||||
|
||||
APP_DATA.callServer({'action': 'read-log', 'pagesize': 100, 'id': id, 'remotelog': false}, function(generaldata) {
|
||||
APP_DATA.callServer({'action': 'read-log', 'pagesize': 100, 'id': id, 'remotelog': true}, function(remotedata) {
|
||||
$('#backup-log-tab-general').empty();
|
||||
$('#backup-log-tab-remote').empty();
|
||||
|
||||
generaldatacallback(generaldata, $('#backup-log-tab-general'));
|
||||
remotedatacallback(remotedata, $('#backup-log-tab-remote'));
|
||||
|
||||
}, function() { alert('Failed to read log data'); });
|
||||
}, function() { alert('Failed to read log data'); });
|
||||
};
|
||||
|
||||
|
||||
$('#log-dialog').tabs({ active: 0 });
|
||||
$('#log-dialog').dialog({
|
||||
minWidth: 320,
|
||||
width: $('body').width > 600 ? 320 : 600,
|
||||
minHeight: 480,
|
||||
height: 500,
|
||||
modal: true,
|
||||
autoOpen: false,
|
||||
closeOnEscape: true,
|
||||
buttons: [
|
||||
{ text: 'Close', disabled: false, click: function(event, ui) {
|
||||
$(this).dialog('close');
|
||||
}}
|
||||
]
|
||||
});
|
||||
|
||||
$('#backup-log-dialog').tabs({ active: 0 });
|
||||
$('#backup-log-dialog').dialog({
|
||||
minWidth: 320,
|
||||
width: $('body').width > 600 ? 320 : 600,
|
||||
minHeight: 480,
|
||||
height: 500,
|
||||
modal: true,
|
||||
autoOpen: false,
|
||||
closeOnEscape: true,
|
||||
buttons: [
|
||||
{ text: 'Close', disabled: false, click: function(event, ui) {
|
||||
$(this).dialog('close');
|
||||
}}
|
||||
]
|
||||
});
|
||||
});
|
||||
@@ -1,52 +0,0 @@
|
||||
if ( !Date.prototype.toISOString ) {
|
||||
( function() {
|
||||
|
||||
function pad(number) {
|
||||
if ( number < 10 ) {
|
||||
return '0' + number;
|
||||
}
|
||||
return number;
|
||||
}
|
||||
|
||||
Date.prototype.toISOString = function() {
|
||||
return this.getUTCFullYear() +
|
||||
'-' + pad( this.getUTCMonth() + 1 ) +
|
||||
'-' + pad( this.getUTCDate() ) +
|
||||
'T' + pad( this.getUTCHours() ) +
|
||||
':' + pad( this.getUTCMinutes() ) +
|
||||
':' + pad( this.getUTCSeconds() ) +
|
||||
'.' + (this.getUTCMilliseconds() / 1000).toFixed(3).slice( 2, 5 ) +
|
||||
'Z';
|
||||
};
|
||||
|
||||
}() );
|
||||
}
|
||||
|
||||
function nl2br (str, is_xhtml) {
|
||||
var breakTag = (is_xhtml || typeof is_xhtml === 'undefined') ? '<br />' : '<br>';
|
||||
return (str + '').replace(/([^>\r\n]?)(\r\n|\n\r|\r|\n)/g, '$1'+ breakTag +'$2');
|
||||
}
|
||||
|
||||
function preg_quote( str ) {
|
||||
// http://kevin.vanzonneveld.net
|
||||
// + original by: booeyOH
|
||||
// + improved by: Ates Goral (http://magnetiq.com)
|
||||
// + improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net)
|
||||
// + bugfixed by: Onno Marsman
|
||||
// * example 1: preg_quote("$40");
|
||||
// * returns 1: '\$40'
|
||||
// * example 2: preg_quote("*RRRING* Hello?");
|
||||
// * returns 2: '\*RRRING\* Hello\?'
|
||||
// * example 3: preg_quote("\\.+*?[^]$(){}=!<>|:");
|
||||
// * returns 3: '\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:'
|
||||
|
||||
return (str+'').replace(/([\\\.\+\*\?\[\^\]\$\(\)\{\}\=\!\<\>\|\:])/g, "\\$1");
|
||||
}
|
||||
|
||||
function replace_all_insensitive(str, pattern, replacement) {
|
||||
return str.replace( new RegExp( "(" + preg_quote(pattern) + ")" , 'gi' ), replacement );
|
||||
};
|
||||
|
||||
function replace_all(str, pattern, replacement) {
|
||||
return str.replace( new RegExp( "(" + preg_quote(pattern) + ")" , 'g' ), replacement );
|
||||
}
|
||||
@@ -1,837 +0,0 @@
|
||||
$(document).ready(function() {
|
||||
|
||||
APP_DATA.plugins.backend['file'] = {
|
||||
hasssl: false,
|
||||
hideserverandport: true,
|
||||
optionalauth: true,
|
||||
|
||||
btnel: null,
|
||||
|
||||
fill_form_map: {
|
||||
'server-path': function(dict, key, el, cfgel) {
|
||||
var p = [];
|
||||
if (dict['server-name'] && dict['server-name'] != '')
|
||||
p.push(dict['server-name']);
|
||||
if (dict['server-path'] && dict['server-path'] != '')
|
||||
p.push(dict['server-path']);
|
||||
|
||||
var sep = '/';
|
||||
if (this.serverconfig)
|
||||
sep = this.serverconfig.DirectorySeparator;
|
||||
|
||||
p = p.join(sep);
|
||||
if (p.indexOf('file://') == 0)
|
||||
p = p.substr('file://'.length);
|
||||
|
||||
$('#server-path').val(p);
|
||||
}
|
||||
},
|
||||
|
||||
fill_dict_map: {
|
||||
'server-path': function(dict, key, el, cfgel) {
|
||||
var p = $(el).val();
|
||||
if (p.indexOf('file://') == 0)
|
||||
p = p.substr('file://'.length);
|
||||
dict['server-path'] = p;
|
||||
dict['server-name'] = '';
|
||||
}
|
||||
},
|
||||
|
||||
decode_uri: function(url) {
|
||||
var dict = EDIT_URI.decode_uri(url);
|
||||
if (dict == null || dict['backend-type'] == null) {
|
||||
|
||||
dict = dict || {};
|
||||
|
||||
var p = url;
|
||||
if (p.indexOf('file://') == 0)
|
||||
p = p.substr('file://'.length);
|
||||
|
||||
if (p.indexOf('?') > 0) {
|
||||
var q = p.substr(p.indexOf('?') + 1);
|
||||
p = p.substr(0, p.length - q.length - 1);
|
||||
q.replace(EDIT_URI.QUERY_REGEXP, function(str, key, val) {
|
||||
if (key)
|
||||
dict['--' + key] = decodeURIComponent(val);
|
||||
});
|
||||
}
|
||||
|
||||
$.extend(true, dict, {
|
||||
'source_uri': url,
|
||||
'backend-type': 'file',
|
||||
'server-path': p
|
||||
});
|
||||
}
|
||||
|
||||
return dict;
|
||||
},
|
||||
|
||||
setup: function(dlg, div) {
|
||||
$('#server-path').addClass('server-path-file');
|
||||
$('#server-path').watermark('mybackup');
|
||||
|
||||
this.btnel = $('<input type="button" value="..." class="browse-button" />').css('width', 'auto');
|
||||
this.btnel.insertAfter($('#server-path'));
|
||||
this.btnel.click(function() {
|
||||
$.browseForFolder({
|
||||
title: 'Select target folder',
|
||||
multiSelect: false,
|
||||
resolvePath: true,
|
||||
callback: function(path, display) {
|
||||
$('#server-path').val(path);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
if (this.serverconfig == null) {
|
||||
APP_DATA.getServerConfig(function(data) {
|
||||
this.serverconfig = data;
|
||||
});
|
||||
}
|
||||
},
|
||||
cleanup: function(dlg, div) {
|
||||
$('#server-path').removeClass('server-path-file');
|
||||
if (this.btnel != null) {
|
||||
this.btnel.remove();
|
||||
this.btnel = null;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
APP_DATA.plugins.backend['webdav'] = {
|
||||
defaultport: 80,
|
||||
defaultportssl: 443
|
||||
}
|
||||
|
||||
APP_DATA.plugins.backend['cloudfiles'] = {
|
||||
defaultport: 80,
|
||||
defaultportssl: 443
|
||||
}
|
||||
|
||||
APP_DATA.plugins.backend['ftp'] = {
|
||||
defaultport: 21,
|
||||
defaultportssl: 443,
|
||||
optionalpassword: true
|
||||
}
|
||||
|
||||
APP_DATA.plugins.backend['aftp'] = {
|
||||
defaultport: 21,
|
||||
defaultportssl: 443,
|
||||
optionalpassword: true
|
||||
}
|
||||
|
||||
APP_DATA.plugins.backend['ssh'] = {
|
||||
defaultport: 22,
|
||||
optionalauth: true,
|
||||
hasssl: false
|
||||
}
|
||||
|
||||
APP_DATA.plugins.backend['onedrive'] = {
|
||||
PLUGIN_LOGIN_LINK: 'https://duplicati-oauth-handler.appspot.com/',
|
||||
|
||||
hideserverandport: true,
|
||||
hideusernameandpassword: true,
|
||||
optionalauth: true,
|
||||
hasssl: false,
|
||||
fetchtoken: null,
|
||||
|
||||
passwordlabel: 'AuthID',
|
||||
|
||||
fill_form_map: {
|
||||
'--authid': 'authid'
|
||||
},
|
||||
|
||||
fill_dict_map: {
|
||||
'authid': '--authid'
|
||||
},
|
||||
|
||||
validate: function(form, values) {
|
||||
delete values['auth-username'];
|
||||
delete values['auth-password'];
|
||||
delete values['--auth-username'];
|
||||
delete values['--auth-password'];
|
||||
|
||||
if (values['--authid'] == '')
|
||||
return EDIT_URI.validation_error($('#server-password'), 'You must fill in an AuthID');
|
||||
|
||||
|
||||
return EDIT_URI.validate_input(values, true);
|
||||
},
|
||||
|
||||
setup: function(dlg, div) {
|
||||
|
||||
|
||||
var authid = EDIT_URI.createFieldset({label: 'AuthID', name: 'authid', after: $('#server-path'), watermark: 'Enter the AuthID value'});
|
||||
|
||||
authid.label.addClass('action-link');
|
||||
|
||||
|
||||
var self = this;
|
||||
authid.label.click(function() {
|
||||
|
||||
self.fetchtoken = Math.random().toString(36).substr(2) + Math.random().toString(36).substr(2);
|
||||
var ft = self.fetchtoken;
|
||||
|
||||
var countDown = 100;
|
||||
var url = self.PLUGIN_LOGIN_LINK + '?token=' + self.fetchtoken;
|
||||
var real_link = $('<a />').text(authid.label.text())
|
||||
.addClass('edit-dialog-label')
|
||||
.addClass('action-link')
|
||||
.attr('href', url)
|
||||
.attr('target', '_blank');
|
||||
|
||||
authid.label.attr('href', url).addClass('action-link');
|
||||
real_link.insertAfter(authid.label);
|
||||
|
||||
setTimeout(function() { authid.label.hide(); }, 500);
|
||||
|
||||
var w = 400;
|
||||
var h = 550;
|
||||
|
||||
var left = (screen.width/2)-(w/2);
|
||||
var top = (screen.height/2)-(h/2);
|
||||
var wnd = window.open(url, '_blank', 'height=' + h +',width=' + w + ',menubar=0,status=0,titlebar=0,toolbar=0,left=' + left + ',top=' + top)
|
||||
|
||||
var recheck = function() {
|
||||
countDown--;
|
||||
if (countDown > 0 && ft == self.fetchtoken) {
|
||||
$.ajax({
|
||||
url: self.PLUGIN_LOGIN_LINK + 'fetch',
|
||||
dataType: 'jsonp',
|
||||
data: {'token': ft}
|
||||
})
|
||||
.done(function(data) {
|
||||
if (data.authid) {
|
||||
authid.field.val(data.authid);
|
||||
wnd.close();
|
||||
} else {
|
||||
setTimeout(recheck, 3000);
|
||||
}
|
||||
})
|
||||
.fail(function() {
|
||||
setTimeout(recheck, 3000);
|
||||
});
|
||||
} else {
|
||||
if (wnd != null)
|
||||
wnd.close();
|
||||
}
|
||||
};
|
||||
|
||||
setTimeout(recheck, 6000);
|
||||
|
||||
return false;
|
||||
});
|
||||
},
|
||||
|
||||
cleanup: function(dlg, div) {
|
||||
this.fetchtoken = null;
|
||||
}
|
||||
}
|
||||
|
||||
APP_DATA.plugins.backend['googledrive'] = APP_DATA.plugins.backend['onedrive'];
|
||||
APP_DATA.plugins.backend['hubic'] = APP_DATA.plugins.backend['onedrive'];
|
||||
APP_DATA.plugins.backend['amzcd'] = APP_DATA.plugins.backend['onedrive'];
|
||||
APP_DATA.plugins.backend['box'] = APP_DATA.plugins.backend['onedrive'];
|
||||
|
||||
APP_DATA.plugins.backend['s3'] = {
|
||||
|
||||
PLUGIN_S3_LINK: 'https://portal.aws.amazon.com/gp/aws/developer/registration/index.html',
|
||||
|
||||
hasssl: true,
|
||||
hideserverandport: true,
|
||||
usernamelabel: 'AWS Access ID',
|
||||
passwordlabel: 'AWS Secret Key',
|
||||
usernamewatermark: 'AWS Access ID',
|
||||
passwordwatermark: 'AWS Secret Key',
|
||||
serverdrop_field: null,
|
||||
regiondrop_field: null,
|
||||
storageclassdrop_field: null,
|
||||
bucket_field: null,
|
||||
|
||||
known_hosts: null,
|
||||
known_regions: null,
|
||||
known_storage_classes: null,
|
||||
|
||||
setup_hosts_after_config: function() {
|
||||
if (this.known_hosts != null && this.serverdrop_field != null)
|
||||
{
|
||||
var servers = [];
|
||||
for (var k in this.known_hosts)
|
||||
servers.push({label: k + ' (' + this.known_hosts[k] + ')', value: this.known_hosts[k]});
|
||||
|
||||
this.serverdrop_field.autocomplete({
|
||||
minLength: 0,
|
||||
source: servers,
|
||||
});
|
||||
var self = this;
|
||||
this.serverdrop_field.click(function() {
|
||||
self.serverdrop_field.autocomplete('search', '');
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
setup_regions_after_config: function() {
|
||||
if (this.known_regions != null && this.regiondrop_field != null) {
|
||||
var buckets = [];
|
||||
for (var k in this.known_regions)
|
||||
buckets.push({label: k + ' (' + this.known_regions[k] + ')', value: this.known_regions[k]});
|
||||
|
||||
this.regiondrop_field.autocomplete({
|
||||
minLength: 0,
|
||||
source: buckets,
|
||||
});
|
||||
var self = this;
|
||||
this.regiondrop_field.click(function() {
|
||||
self.regiondrop_field.autocomplete('search', '');
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
setup_storage_classes_after_config: function() {
|
||||
if (this.known_storage_classes != null && this.storageclassdrop_field != null) {
|
||||
var buckets = [];
|
||||
for (var k in this.known_storage_classes)
|
||||
buckets.push({label: k + ' (' + this.known_storage_classes[k] + ')', value: this.known_storage_classes[k]});
|
||||
|
||||
this.storageclassdrop_field.autocomplete({
|
||||
minLength: 0,
|
||||
source: buckets,
|
||||
});
|
||||
var self = this;
|
||||
this.storageclassdrop_field.click(function() {
|
||||
self.storageclassdrop_field.autocomplete('search', '');
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
setup: function(dlg, div) {
|
||||
var self = this;
|
||||
|
||||
$('#server-path-label').hide();
|
||||
$('#server-path').hide();
|
||||
|
||||
var serverdrop = EDIT_URI.createFieldset({label: 'S3 servername', name: 's3-server', after: $('#server-path'), watermark: 'Click for a list of providers'});
|
||||
var bucketfield = EDIT_URI.createFieldset({label: 'S3 Bucket name', name: 's3-bucket', after: $('#server-username-and-password'), title: 'Use / to access subfolders in the bucket', watermark: 'Enter bucket name'});
|
||||
var regiondrop = EDIT_URI.createFieldset({label: 'Bucket create region', name: 's3-region', before: $('#server-options-label'), watermark: 'Click for a list of regions', title: 'Note that region is only used when creating buckets'});
|
||||
var storageclassdrop = EDIT_URI.createFieldset({label: 'Storage class', name: 's3-storage-class', after: regiondrop.outer, watermark: 'Click for a list of storage classes'});
|
||||
var signuplink = EDIT_URI.createFieldset({'label': ' ', href: this.PLUGIN_S3_LINK, type: 'link', before: bucketfield.outer, 'title': 'Click here for the sign up page'});
|
||||
|
||||
signuplink.outer.css('margin-bottom', '10px');
|
||||
|
||||
this.serverdrop_field = serverdrop.field;
|
||||
this.regiondrop_field = regiondrop.field;
|
||||
this.bucket_field = bucketfield.field;
|
||||
this.storageclassdrop_field = storageclassdrop.field;
|
||||
|
||||
|
||||
if (self.known_hosts == null) {
|
||||
APP_DATA.callServer({action: 'send-command', command: 's3-getconfig', 's3-config': 'Providers'}, function(data) {
|
||||
self.known_hosts = data.Result;
|
||||
self.setup_hosts_after_config();
|
||||
},
|
||||
function(data, success, message) {
|
||||
alert('Failed to get S3 config: ' + message);
|
||||
});
|
||||
} else {
|
||||
this.setup_hosts_after_config();
|
||||
}
|
||||
|
||||
if (self.known_regions == null) {
|
||||
APP_DATA.callServer({action: 'send-command', command: 's3-getconfig', 's3-config': 'Regions'}, function(data) {
|
||||
self.known_regions = data.Result;
|
||||
self.setup_regions_after_config();
|
||||
},
|
||||
function(data, success, message) {
|
||||
alert('Failed to get S3 config: ' + message);
|
||||
});
|
||||
} else {
|
||||
this.setup_regions_after_config();
|
||||
}
|
||||
|
||||
if (self.known_storage_classes == null) {
|
||||
APP_DATA.callServer({action: 'send-command', command: 's3-getconfig', 's3-config': 'StorageClasses'}, function(data) {
|
||||
self.known_storage_classes = data.Result;
|
||||
self.setup_storage_classes_after_config();
|
||||
},
|
||||
function(data, success, message) {
|
||||
alert('Failed to get S3 config: ' + message);
|
||||
});
|
||||
} else {
|
||||
this.setup_storage_classes_after_config();
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
cleanup: function(dlg, div) {
|
||||
$('#server-path-label').show();
|
||||
$('#server-path').show();
|
||||
this.serverdrop_field = null;
|
||||
this.regiondrop_field = null;
|
||||
this.storageclassdrop_field = null;
|
||||
this.bucket_field = null;
|
||||
},
|
||||
|
||||
fill_form: function(el, cfg) {
|
||||
// Upgrade from checkbox to string
|
||||
if (APP_UTIL.parseBoolOption(cfg['--s3-use-rrs']) && !cfg['--s3-location-constraint']) {
|
||||
delete cfg['--s3-use-rrs'];
|
||||
cfg['--s3-location-constraint'] = 'REDUCED_REDUNDANCY';
|
||||
}
|
||||
|
||||
EDIT_URI.fill_form(el, cfg);
|
||||
},
|
||||
|
||||
validate: function(dlg, values) {
|
||||
if (!EDIT_URI.validate_input(values, true))
|
||||
return;
|
||||
if (values['--s3-server-name'] == '')
|
||||
return EDIT_URI.validation_error(this.serverdrop_field, 'You must fill in or select the S3 server to use');
|
||||
|
||||
if (values['server-path'] == '')
|
||||
return EDIT_URI.validation_error(this.bucket_field, 'You must enter a S3 bucket name');
|
||||
if (values['server-path'].toLowerCase() != values['server-path']) {
|
||||
if (!confirm('The bucket name must be all lower case, convert automatically?')) {
|
||||
this.bucket_field.focus();
|
||||
return false;
|
||||
}
|
||||
values['server-path'] = values['server-path'].toLowerCase();
|
||||
this.bucket_field.val(values['server-path']);
|
||||
}
|
||||
if (values['server-path'].indexOf(values['--auth-username'].toLowerCase()) != 0) {
|
||||
if (confirm('The bucket name should start with your username, append automatically?')) {
|
||||
values['server-path'] = values['--auth-username'].toLowerCase() + '-' + values['server-path'];
|
||||
this.bucket_field.val(values['server-path']);
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
fill_form_map: {
|
||||
'server-path': 's3-bucket',
|
||||
'--s3-server-name': 's3-server',
|
||||
'--s3-storage-class': 's3-storage-class',
|
||||
'--s3-location-constraint': 's3-region'
|
||||
},
|
||||
|
||||
fill_dict_map: {
|
||||
's3-bucket': 'server-path',
|
||||
's3-server': '--s3-server-name',
|
||||
's3-storage-class': '--s3-storage-class',
|
||||
's3-region': '--s3-location-constraint'
|
||||
}
|
||||
}
|
||||
|
||||
APP_DATA.plugins.backend['azure'] = {
|
||||
|
||||
PLUGIN_AZURE_LINK: 'https://account.windowsazure.com/Home/Index',
|
||||
|
||||
hasssl: false,
|
||||
hideserverandport: true,
|
||||
usernamelabel: 'Account Name',
|
||||
passwordlabel: 'Access Key',
|
||||
usernamewatermark: 'Account Name',
|
||||
passwordwatermark: 'Access Key',
|
||||
container_field: null,
|
||||
|
||||
setup: function (dlg, div) {
|
||||
$('#server-path-label').hide();
|
||||
$('#server-path').hide();
|
||||
|
||||
$('#server-username').attr('placeholder', this.usernamewatermark);
|
||||
$('#server-password').attr('placeholder', this.passwordwatermark);
|
||||
|
||||
var containerfield = EDIT_URI.createFieldset({ label: 'Container Name', name: 'azure-container', after: $('#server-username-and-password'), title: 'Container name', watermark: 'Enter container name' });
|
||||
this.container_field = containerfield.field;
|
||||
|
||||
var signuplink = EDIT_URI.createFieldset({ 'label': ' ', href: this.PLUGIN_AZURE_LINK, type: 'link', before: $('#server-options-label'), 'title': 'Click here to sign in or register' });
|
||||
signuplink.outer.css('margin-bottom', '10px');
|
||||
|
||||
},
|
||||
|
||||
cleanup: function (dlg, div) {
|
||||
$('#server-path-label').show();
|
||||
$('#server-path').show();
|
||||
this.container_field = null;
|
||||
},
|
||||
|
||||
validate: function (dlg, values) {
|
||||
if (!EDIT_URI.validate_input(values, true))
|
||||
return false;
|
||||
if (values['azure-container'] == '')
|
||||
return EDIT_URI.validation_error(this.container_field, 'You must enter an Azure container name');
|
||||
|
||||
values['server-name'] = values["azure-container"].toLowerCase();
|
||||
this.container_field.val(values['server-name']);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
fill_form_map: {
|
||||
'server-name': 'azure-container'
|
||||
},
|
||||
|
||||
fill_dict_map: {
|
||||
'azure-container': 'server-name'
|
||||
}
|
||||
}
|
||||
|
||||
var tmp_gcs = $.extend(true, {
|
||||
locationdrop_field: null,
|
||||
known_locations: null,
|
||||
storage_class_field: null,
|
||||
known_storage_classes: null,
|
||||
|
||||
setup_locations_after_config: function() {
|
||||
if (this.known_locations != null && this.locationdrop_field != null)
|
||||
{
|
||||
var servers = [];
|
||||
for (var k in this.known_locations)
|
||||
servers.push({label: k + ' (' + this.known_locations[k] + ')', value: this.known_locations[k]});
|
||||
|
||||
this.locationdrop_field.autocomplete({
|
||||
minLength: 0,
|
||||
source: servers,
|
||||
});
|
||||
var self = this;
|
||||
this.locationdrop_field.click(function() {
|
||||
self.locationdrop_field.autocomplete('search', '');
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
setup_storage_classes_after_config: function() {
|
||||
if (this.known_storage_classes != null && this.storage_class_field != null)
|
||||
{
|
||||
var servers = [];
|
||||
for (var k in this.known_storage_classes)
|
||||
servers.push({label: k + ' (' + this.known_storage_classes[k] + ')', value: this.known_storage_classes[k]});
|
||||
|
||||
this.storage_class_field.autocomplete({
|
||||
minLength: 0,
|
||||
source: servers,
|
||||
});
|
||||
var self = this;
|
||||
this.storage_class_field.click(function() {
|
||||
self.storage_class_field.autocomplete('search', '');
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
setup_gcs: function()
|
||||
{
|
||||
var locationdrop = EDIT_URI.createFieldset({label: 'Bucket create location', name: 'gcs-location', before: $('#server-options-label'), watermark: 'Click for a list of locations', title: 'Note that location is only used when creating buckets'});
|
||||
var storageclassdrop = EDIT_URI.createFieldset({label: 'Bucket storage class', name: 'gcs-storage-class', before: $('#server-options-label'), watermark: 'Click for a list of storage classes', title: 'Note that storage class is only used when creating buckets'});
|
||||
var projectidfield = EDIT_URI.createFieldset({label: 'GCS Project ID', name: 'gcs-project', before: $('#server-options-label'), title: 'Supply the project ID', watermark: 'Enter project ID'});
|
||||
|
||||
this.locationdrop_field = locationdrop.field;
|
||||
this.storage_class_field = storageclassdrop.field;
|
||||
this.projectid_field = projectidfield.field;
|
||||
|
||||
this.prevsettings = {
|
||||
placeholder: $('#server-path').attr('placeholder'),
|
||||
text: $('#server-path-label').text()
|
||||
};
|
||||
|
||||
$('#server-path').attr('placeholder', 'bucket/folder/subfolder');
|
||||
$('#server-path-label').text('Bucket name');
|
||||
|
||||
|
||||
var self = this;
|
||||
|
||||
if (self.known_locations == null) {
|
||||
APP_DATA.callServer({action: 'send-command', command: 'gcs-getconfig', 'gcs-config': 'Locations'}, function(data) {
|
||||
self.known_locations = data.Result;
|
||||
self.setup_locations_after_config();
|
||||
},
|
||||
function(data, success, message) {
|
||||
alert('Failed to get GCS config: ' + message);
|
||||
});
|
||||
} else {
|
||||
this.setup_locations_after_config();
|
||||
}
|
||||
|
||||
if (self.known_storage_classes == null) {
|
||||
APP_DATA.callServer({action: 'send-command', command: 'gcs-getconfig', 'gcs-config': 'StorageClasses'}, function(data) {
|
||||
self.known_storage_classes = data.Result;
|
||||
self.setup_storage_classes_after_config();
|
||||
},
|
||||
function(data, success, message) {
|
||||
alert('Failed to get GCS config: ' + message);
|
||||
});
|
||||
} else {
|
||||
this.setup_storage_classes_after_config();
|
||||
}
|
||||
},
|
||||
|
||||
cleanup_gcs: function() {
|
||||
this.locationdrop_field = null;
|
||||
this.regiondrop_field = null;
|
||||
this.projectid_field = null;
|
||||
|
||||
if (this.prevsettings != null) {
|
||||
$('#server-path').attr('placeholder', this.prevsettings.placeholder);
|
||||
$('#server-path-label').text(this.prevsettings.text);
|
||||
this.prevsettings = null;
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
fill_form_map: {
|
||||
'--gcs-location': 'gcs-location',
|
||||
'--gcs-storage-class': 'gcs-storage-class',
|
||||
'--gcs-project': 'gcs-project'
|
||||
},
|
||||
|
||||
fill_dict_map: {
|
||||
'gcs-location': '--gcs-location',
|
||||
'gcs-storage-class': '--gcs-storage-class',
|
||||
'gcs-project': '--gcs-project'
|
||||
}
|
||||
|
||||
}, APP_DATA.plugins.backend['onedrive']);
|
||||
|
||||
tmp_gcs.setup_auth = tmp_gcs.setup;
|
||||
tmp_gcs.cleanup_auth = tmp_gcs.cleanup;
|
||||
|
||||
tmp_gcs.setup = function() {
|
||||
this.setup_auth();
|
||||
this.setup_gcs();
|
||||
};
|
||||
|
||||
tmp_gcs.cleanup = function() {
|
||||
this.cleanup_auth();
|
||||
this.cleanup_gcs();
|
||||
};
|
||||
|
||||
APP_DATA.plugins.backend['gcs'] = tmp_gcs;
|
||||
delete tmp_gcs;
|
||||
|
||||
APP_DATA.plugins.backend['openstack'] = {
|
||||
|
||||
hasssl: false,
|
||||
hideserverandport: true,
|
||||
|
||||
serverdrop_field: null,
|
||||
known_hosts: null,
|
||||
optionalauth: true,
|
||||
|
||||
setup_hosts_after_config: function() {
|
||||
if (this.known_hosts != null && this.serverdrop_field != null)
|
||||
{
|
||||
var servers = [];
|
||||
for (var k in this.known_hosts)
|
||||
servers.push({label: k + ' (' + this.known_hosts[k] + ')', value: this.known_hosts[k]});
|
||||
|
||||
this.serverdrop_field.autocomplete({
|
||||
minLength: 0,
|
||||
source: servers,
|
||||
});
|
||||
var self = this;
|
||||
this.serverdrop_field.click(function() {
|
||||
self.serverdrop_field.autocomplete('search', '');
|
||||
});
|
||||
}
|
||||
},
|
||||
|
||||
setup: function(dlg, div) {
|
||||
var self = this;
|
||||
|
||||
var projectidfield = EDIT_URI.createFieldset({label: 'Tenant Name', name: 'openstack-tenant-name', before: $('#server-options-label'), title: 'Enter the Tenant Name if you are not using API Key', watermark: 'Optional Tenant Name'});
|
||||
var projectidfield = EDIT_URI.createFieldset({label: 'API Key', name: 'openstack-apikey', before: $('#server-options-label'), title: 'If you supply the API key, the Password, Tenant Name fields are not required', watermark: 'Optional API Key'});
|
||||
var projectidfield = EDIT_URI.createFieldset({label: 'Container region', name: 'openstack-region', before: $('#server-options-label'), title: 'If your provider supports regions, you can supply the region value here.', watermark: 'Optional region'});
|
||||
|
||||
var serverdrop = EDIT_URI.createFieldset({label: 'OpenStack Authuri', name: 'openstack-authuri', after: $('#server-path'), watermark: 'Click for a list of providers'});
|
||||
this.serverdrop_field = serverdrop.field;
|
||||
|
||||
this.prevsettings = {
|
||||
placeholder: $('#server-path').attr('placeholder'),
|
||||
text: $('#server-path-label').text()
|
||||
};
|
||||
|
||||
$('#server-path').attr('placeholder', 'bucket/folder/subfolder');
|
||||
$('#server-path-label').text('Bucket name');
|
||||
|
||||
if (self.known_hosts == null) {
|
||||
APP_DATA.callServer({action: 'send-command', command: 'openstack-getconfig', 'openstack-config': 'Providers'}, function(data) {
|
||||
self.known_hosts = data.Result;
|
||||
self.setup_hosts_after_config();
|
||||
},
|
||||
function(data, success, message) {
|
||||
alert('Failed to get OpenStack config: ' + message);
|
||||
});
|
||||
} else {
|
||||
this.setup_hosts_after_config();
|
||||
}
|
||||
},
|
||||
|
||||
cleanup: function(dlg, div) {
|
||||
this.serverdrop_field = null;
|
||||
if (this.prevsettings != null) {
|
||||
$('#server-path').attr('placeholder', this.prevsettings.placeholder);
|
||||
$('#server-path-label').text(this.prevsettings.text);
|
||||
this.prevsettings = null;
|
||||
}
|
||||
},
|
||||
|
||||
validate: function(dlg, values) {
|
||||
if (!EDIT_URI.validate_input(values, true))
|
||||
return;
|
||||
if (values['--openstack-authuri'] == '')
|
||||
return EDIT_URI.validation_error(this.serverdrop_field, 'You must fill in or select the Authentication URI');
|
||||
|
||||
if (values['server-path'] == '')
|
||||
return EDIT_URI.validation_error($('#server-path'), 'You must enter a path');
|
||||
|
||||
if (values['server-username'] == '')
|
||||
return EDIT_URI.validation_error($('#server-username'), 'You must enter a username');
|
||||
|
||||
if (values['--openstack-apikey'] == '')
|
||||
{
|
||||
if (values['server-password'] == '')
|
||||
return EDIT_URI.validation_error($('#server-username'), 'You must enter a password or API key');
|
||||
|
||||
if (values['openstack-tenantname'] == '')
|
||||
return EDIT_URI.validation_error($('#server-username'), 'You must enter a Tenant Name if you do not supply the API key');
|
||||
}
|
||||
else
|
||||
{
|
||||
if (values['server-password'] != '')
|
||||
return EDIT_URI.validation_error($('#server-username'), 'You should not enter a password if you are using API key authentication');
|
||||
}
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
fill_form_map: {
|
||||
'--openstack-authuri': 'openstack-authuri',
|
||||
'--openstack-tenant-name': 'openstack-tenant-name',
|
||||
'--openstack-apikey': 'openstack-apikey',
|
||||
'--openstack-region': 'openstack-region'
|
||||
},
|
||||
|
||||
fill_dict_map: {
|
||||
'openstack-authuri': '--openstack-authuri',
|
||||
'openstack-tenant-name': '--openstack-tenant-name',
|
||||
'openstack-apikey': '--openstack-apikey',
|
||||
'openstack-region': '--openstack-region'
|
||||
}
|
||||
}
|
||||
|
||||
APP_DATA.plugins.backend['b2'] = {
|
||||
|
||||
PLUGIN_B2_LINK: 'https://www.backblaze.com/b2/cloud-storage.html',
|
||||
|
||||
hasssl: false,
|
||||
hideserverandport: true,
|
||||
usernamelabel: 'B2 Account ID',
|
||||
passwordlabel: 'B2 Application Key',
|
||||
usernamewatermark: 'B2 Cloud Storage Account ID',
|
||||
passwordwatermark: 'B2 Cloud Storage Application Key',
|
||||
|
||||
setup: function(dlg, div) {
|
||||
var self = this;
|
||||
|
||||
$('#server-path-label').hide();
|
||||
$('#server-path').hide();
|
||||
|
||||
var bucketfield = EDIT_URI.createFieldset({label: 'B2 Bucket name', name: 'b2-bucket', after: $('#server-username-and-password'), title: 'Use / to access subfolders in the bucket', watermark: 'Enter bucket name'});
|
||||
var signuplink = EDIT_URI.createFieldset({'label': ' ', href: this.PLUGIN_B2_LINK, type: 'link', before: bucketfield.outer, 'title': 'Click here for the sign up page'});
|
||||
|
||||
signuplink.outer.css('margin-bottom', '10px');
|
||||
|
||||
this.bucket_field = bucketfield.field;
|
||||
},
|
||||
|
||||
cleanup: function(dlg, div) {
|
||||
$('#server-path-label').show();
|
||||
$('#server-path').show();
|
||||
this.bucket_field = null;
|
||||
},
|
||||
|
||||
validate: function(dlg, values) {
|
||||
if (!EDIT_URI.validate_input(values, true))
|
||||
return;
|
||||
|
||||
if (values['server-path'] == '')
|
||||
return EDIT_URI.validation_error(this.bucket_field, 'You must enter a B2 bucket name');
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
fill_form_map: {
|
||||
'server-path': 'b2-bucket'
|
||||
},
|
||||
|
||||
fill_dict_map: {
|
||||
'b2-bucket': 'server-path'
|
||||
}
|
||||
}
|
||||
|
||||
APP_DATA.plugins.backend['mega'] = {
|
||||
|
||||
PLUGIN_MEGA_LINK: 'https://mega.co.nz',
|
||||
|
||||
hasssl: false,
|
||||
hideserverandport: true,
|
||||
usernamelabel: 'Username',
|
||||
passwordlabel: 'Password',
|
||||
usernamewatermark: 'Username',
|
||||
passwordwatermark: 'Password',
|
||||
path_field: null,
|
||||
|
||||
setup: function (dlg, div) {
|
||||
$('#server-path-label').hide();
|
||||
$('#server-path').hide();
|
||||
|
||||
$('#server-username').attr('placeholder', this.usernamewatermark);
|
||||
$('#server-password').attr('placeholder', this.passwordwatermark);
|
||||
|
||||
var pathfield = EDIT_URI.createFieldset({ label: 'Path', name: 'mega-path', after: $('#server-username-and-password'), title: 'Path', watermark: 'Enter path' });
|
||||
this.path_field = pathfield.field;
|
||||
|
||||
var signuplink = EDIT_URI.createFieldset({ 'label': ' ', href: this.PLUGIN_MEGA_LINK, type: 'link', before: $('#server-options-label'), 'title': 'Click here to sign in or register' });
|
||||
signuplink.outer.css('margin-bottom', '10px');
|
||||
|
||||
},
|
||||
|
||||
cleanup: function (dlg, div) {
|
||||
$('#server-path-label').show();
|
||||
$('#server-path').show();
|
||||
this.path_field = null;
|
||||
},
|
||||
|
||||
validate: function (dlg, values) {
|
||||
if (!EDIT_URI.validate_input(values, true))
|
||||
return false;
|
||||
|
||||
values['server-path'] = values["mega-path"].toLowerCase();
|
||||
this.path_field.val(values['server-path']);
|
||||
|
||||
return true;
|
||||
},
|
||||
|
||||
fill_form_map: {
|
||||
'server-path': function(dict, key, el, cfgel) {
|
||||
var p = [];
|
||||
if (dict['server-name'] && dict['server-name'] != '')
|
||||
p.push(dict['server-name']);
|
||||
if (dict['server-path'] && dict['server-path'] != '')
|
||||
p.push(dict['server-path']);
|
||||
|
||||
p = p.join('/');
|
||||
|
||||
$('#mega-path').val(p);
|
||||
}
|
||||
},
|
||||
|
||||
fill_dict_map: {
|
||||
'mega-path': function(dict, key, el, cfgel) {
|
||||
var p = $(el).val();
|
||||
dict['server-path'] = p;
|
||||
dict['server-name'] = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -1,972 +0,0 @@
|
||||
$(document).ready(function() {
|
||||
|
||||
var curpage = 0;
|
||||
var backupId = 0;
|
||||
var dirSep = '/';
|
||||
var pathSep = ':';
|
||||
var trees = {};
|
||||
var searchdata = {};
|
||||
var nodedata = {};
|
||||
|
||||
var manualIncludes = {};
|
||||
var searchTrees = {};
|
||||
var commonPrefix = [];
|
||||
|
||||
var dbversions = {};
|
||||
var isDirectRestore = false;
|
||||
|
||||
var includeMap = null;
|
||||
|
||||
var performRestore = function(tasks) {
|
||||
var dlg = $('<div></div>').attr('title', 'Restoring files ...');
|
||||
var cancelling = false;
|
||||
var currentProgressTask = null;
|
||||
var remainingTasks = tasks.length;
|
||||
|
||||
dlg.dialog({
|
||||
autoOpen: true,
|
||||
modal: true,
|
||||
closeOnEscape: false,
|
||||
buttons: [
|
||||
{ text: 'Cancel', click: function(event, ui) {
|
||||
if (confirm('Stop the restore?')) {
|
||||
cancelling = true;
|
||||
if (currentProgressTask != null)
|
||||
APP_DATA.stopTask(currentProgressTask.taskId, true);
|
||||
|
||||
updatePageNav();
|
||||
dlg.dialog('close');
|
||||
dlg.remove();
|
||||
}
|
||||
}}
|
||||
]
|
||||
});
|
||||
|
||||
dlg.parent().find('.ui-dialog-titlebar-close').remove().first().remove();
|
||||
|
||||
var pg = $('<div></div>');
|
||||
pg.progressbar({ value: false });
|
||||
var pgtxt = $('<div></div>');
|
||||
pgtxt.text('Sending jobs to server ...');
|
||||
|
||||
dlg.append(pg);
|
||||
dlg.append(pgtxt);
|
||||
|
||||
var onAllRestoresCompleted = function() {
|
||||
$(document).off('server-progress-updated', serverProgressUpdateMethod);
|
||||
$(document).off('server-state-updated', serverStateUpdateMethod);
|
||||
|
||||
curpage = Math.min(2, curpage+1);
|
||||
updatePageNav();
|
||||
dlg.dialog('close');
|
||||
dlg.remove();
|
||||
};
|
||||
|
||||
var serverProgressUpdateMethod = function(e, data) {
|
||||
if (currentProgressTask == null)
|
||||
pgtxt.text('Waiting for restore to begin ...');
|
||||
else {
|
||||
if (tasks.length == 1)
|
||||
pgtxt.text('Restoring files ...');
|
||||
else
|
||||
pgtxt.text('Restoring files (' + (tasks.length - remainingTasks) + ' of ' + tasks.length + ')');
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
var serverStateUpdateMethod = function(e, data) {
|
||||
var activeTaskId = -1;
|
||||
var queuedTasks = [];
|
||||
|
||||
if (cancelling)
|
||||
return;
|
||||
|
||||
if (data.ActiveTask != null)
|
||||
activeTaskId = data.ActiveTask.Item1;
|
||||
|
||||
if (data.SchedulerQueueIds != null)
|
||||
for(var n in data.SchedulerQueueIds)
|
||||
queuedTasks.push(data.SchedulerQueueIds[n].Item1);
|
||||
|
||||
var remaining = 0;
|
||||
for(var n in tasks) {
|
||||
|
||||
if (tasks[n].taskId == activeTaskId) {
|
||||
currentProgressTask = tasks[n];
|
||||
remaining++;
|
||||
continue;
|
||||
}
|
||||
|
||||
for(var i in queuedTasks)
|
||||
if (queuedTasks[i] == tasks[n].taskId) {
|
||||
remaining++;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (remaining == 0)
|
||||
onAllRestoresCompleted();
|
||||
};
|
||||
|
||||
var curTask = 0;
|
||||
var registerTasks = function() {
|
||||
if (curTask == tasks.length) {
|
||||
pgtxt.text('Waiting for restore to begin ...');
|
||||
$(document).on('server-progress-updated', serverProgressUpdateMethod);
|
||||
$(document).on('server-state-updated', serverStateUpdateMethod);
|
||||
return;
|
||||
}
|
||||
|
||||
var task = tasks[curTask];
|
||||
curTask++;
|
||||
|
||||
APP_DATA.callServer(task, function(data) {
|
||||
task['taskId'] = data.TaskID;
|
||||
registerTasks();
|
||||
},
|
||||
function(d, s, m) {
|
||||
alert('Error: ' + m);
|
||||
dlg.dialog('close');
|
||||
dlg.remove();
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
registerTasks();
|
||||
};
|
||||
|
||||
$('#restore-dialog').dialog({
|
||||
minWidth: 320,
|
||||
width: $('body').width > 600 ? 320 : 600,
|
||||
minHeight: 480,
|
||||
height: 500,
|
||||
modal: true,
|
||||
autoOpen: false,
|
||||
closeOnEscape: true,
|
||||
buttons: [
|
||||
{ text: '< Previous', disabled: true, click: function(event, ui) {
|
||||
curpage = Math.max(0, curpage-1);
|
||||
updatePageNav();
|
||||
|
||||
}},
|
||||
{ text: 'Next >', click: function(event, ui) {
|
||||
if (curpage == 2) {
|
||||
$('#restore-dialog').dialog('close');
|
||||
} else if (curpage == 1) {
|
||||
|
||||
var restorePath = null;
|
||||
|
||||
var overwrite = $('#restore-overwrite-overwrite').is(':checked');
|
||||
|
||||
var restore_permissions = $('#restore-metadata-permissions').is(':checked');
|
||||
var skip_metadata = $('#restore-metadata-none').is(':checked');
|
||||
|
||||
if ($('#restore-overwrite-target-other').is(':checked'))
|
||||
restorePath = $('#restore-target-path').val();
|
||||
|
||||
var tasks = [];
|
||||
for(var n in includeMap) {
|
||||
var t = {
|
||||
'action': 'restore-files',
|
||||
time: $('#restore-version').val(),
|
||||
'HTTP_METHOD': 'POST',
|
||||
id: backupId,
|
||||
'restore-path': restorePath,
|
||||
'overwrite': overwrite,
|
||||
'permissions': restore_permissions,
|
||||
'skip-metadata': skip_metadata,
|
||||
paths: []
|
||||
};
|
||||
for(var p in includeMap[n]) {
|
||||
if (p.lastIndexOf(dirSep) == p.length -1)
|
||||
t.paths.push(p + '*');
|
||||
else
|
||||
t.paths.push(p);
|
||||
}
|
||||
|
||||
if (t.paths.length > 0)
|
||||
{
|
||||
t.paths = t.paths.join(pathSep);
|
||||
tasks.push(t);
|
||||
}
|
||||
}
|
||||
|
||||
if (isDirectRestore) {
|
||||
|
||||
var backupid = null;
|
||||
|
||||
var dlg = APP_UTIL.create_modal_task_wait('Creating database', 'Building local database ... ', function(cancelled, taskid) {
|
||||
if (!cancelled)
|
||||
performRestore(tasks);
|
||||
});
|
||||
|
||||
APP_DATA.callServer({ action: 'copy-backup-to-temp', 'id': backupId }, function(data) {
|
||||
var bkid = data.ID;
|
||||
for(var n in tasks)
|
||||
tasks[n].id = bkid;
|
||||
|
||||
APP_DATA.callServer({ action: 'send-command', command: 'run-repair', 'id': bkid, 'time': $('#restore-version').val(), 'paths': tasks[0].paths, 'HTTP_METHOD': 'POST' }, function(data) {
|
||||
dlg.register_updates(data.ID);
|
||||
}, function(a,b,msg) {
|
||||
alert('Failed to connect: ' + msg);
|
||||
dlg.dialog('close');
|
||||
dlg.remove();
|
||||
});
|
||||
}, function(a,b,msg) {
|
||||
alert('Failed to connect: ' + msg);
|
||||
dlg.dialog('close');
|
||||
dlg.remove();
|
||||
});
|
||||
|
||||
|
||||
} else {
|
||||
performRestore(tasks);
|
||||
}
|
||||
} else {
|
||||
var els = 0;
|
||||
includeMap = buildIncludeMap();
|
||||
|
||||
for(var t in includeMap)
|
||||
for(var i in includeMap[t])
|
||||
els++;
|
||||
|
||||
if (els == 0) {
|
||||
alert('You must select at least one path to restore');
|
||||
return;
|
||||
}
|
||||
|
||||
curpage = Math.min(2, curpage+1);
|
||||
updatePageNav();
|
||||
|
||||
}
|
||||
}}
|
||||
]
|
||||
});
|
||||
|
||||
var dlg_buttons = $('#restore-dialog').parent().find('.ui-dialog-buttonpane').find('.ui-button');
|
||||
var updatePageNav = function() {
|
||||
if (curpage == 0) {
|
||||
$('#restore-files-page').show();
|
||||
$('#restore-path-page').hide();
|
||||
$('#restore-complete-page').hide();
|
||||
dlg_buttons.first().show();
|
||||
dlg_buttons.last().button('option', 'label', 'Next >');
|
||||
} else if (curpage == 1) {
|
||||
$('#restore-files-page').hide();
|
||||
$('#restore-path-page').show();
|
||||
$('#restore-complete-page').hide();
|
||||
dlg_buttons.first().show();
|
||||
dlg_buttons.last().button('option', 'label', 'Restore');
|
||||
} else {
|
||||
$('#restore-files-page').hide();
|
||||
$('#restore-path-page').hide();
|
||||
$('#restore-complete-page').show();
|
||||
|
||||
dlg_buttons.first().hide();
|
||||
dlg_buttons.last().button('option', 'label', 'OK');
|
||||
}
|
||||
|
||||
dlg_buttons.first().button('option', 'disabled', curpage == 0);
|
||||
};
|
||||
|
||||
$('#restore-search').watermark('Search for files & folders');
|
||||
|
||||
$('#restore-files-page').show();
|
||||
$('#restore-path-page').hide();
|
||||
$('#restore-complete-page').hide();
|
||||
|
||||
var colorize = function(tree, term, entry) {
|
||||
var tr = tree.jstree();
|
||||
$(entry || tree).find('a.jstree-anchor').each(function(i, e) {
|
||||
var s = $(e);
|
||||
var node = tr.get_node(s);
|
||||
if (node.text) {
|
||||
s.children('.search-match').remove();
|
||||
var o = s.children();
|
||||
s.html(replace_all_insensitive(node.text, term, '<div class="search-match">$1</div>'));
|
||||
s.prepend(o);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
var buildSearchNodes = function(time, data, search) {
|
||||
var rootpath = commonPrefix[time];
|
||||
if (rootpath != '' && rootpath[rootpath.length - 1] != dirSep)
|
||||
rootpath += dirSep;
|
||||
var rootnode = createNodeFromData(commonPrefix[time], commonPrefix[time], time, true);
|
||||
rootnode.state = rootnode.state || {};
|
||||
rootnode.state.opened = true;
|
||||
|
||||
|
||||
for(var i = 0; i < data.Files.length; i++) {
|
||||
var n = rootnode;
|
||||
var p = rootpath;
|
||||
var sp = data.Files[i].Path;
|
||||
|
||||
if (search && sp.toLowerCase().indexOf(search.toLowerCase()) < 0)
|
||||
continue;
|
||||
|
||||
var isDir = sp.substr(sp.length - 1) == dirSep;
|
||||
if (isDir)
|
||||
sp = sp.substr(0, sp.length - 1);
|
||||
|
||||
var items = sp.substr(rootpath.length).split(dirSep);
|
||||
|
||||
for(var j = 0; j < items.length; j++) {
|
||||
p += items[j] + (!isDir && j == items.length - 1 ? '' : dirSep);
|
||||
|
||||
var e = null;
|
||||
for(var x in n.children)
|
||||
if (n.children[x].filepath == p) {
|
||||
e = n.children[x];
|
||||
break;
|
||||
}
|
||||
|
||||
if (e == null) {
|
||||
e = createNodeFromData(p, commonPrefix[time], time, false);
|
||||
|
||||
if (j != items.length - 1) {
|
||||
e.state = e.state || {};
|
||||
e.state.opened = true;
|
||||
}
|
||||
|
||||
if (n.children === false || n.children === true)
|
||||
n.children = [];
|
||||
n.children.push(e);
|
||||
|
||||
}
|
||||
n = e;
|
||||
}
|
||||
}
|
||||
|
||||
return [rootnode];
|
||||
}
|
||||
|
||||
var inSearch = false;
|
||||
var doSearch = function(time, search) {
|
||||
if (inSearch)
|
||||
return;
|
||||
|
||||
$('#restore-search-loader').show();
|
||||
inSearch = true;
|
||||
|
||||
var stree = searchTrees[time];
|
||||
var tree = trees[time];
|
||||
|
||||
var buildSearchTree = function(nodes) {
|
||||
var streeel = $('<div></div>');
|
||||
searchTrees[time] = streeel;
|
||||
$('#restore-files-tree').append(streeel);
|
||||
|
||||
var te = streeel.jstree({
|
||||
'plugins' : [ 'checkbox' ],
|
||||
'core': { 'data' : nodes }
|
||||
});
|
||||
|
||||
colorize(streeel, search);
|
||||
streeel.show();
|
||||
};
|
||||
|
||||
if (searchdata[time]) {
|
||||
var t = searchdata[time];
|
||||
for(var p in t) {
|
||||
if (search.indexOf(p) == 0) {
|
||||
colorize(tree, search);
|
||||
|
||||
if (t[p].Files.length == 0) {
|
||||
alert('No results matched the query');
|
||||
tree.show();
|
||||
} else if (stree) {
|
||||
colorize(stree, search);
|
||||
tree.hide();
|
||||
stree.show();
|
||||
} else {
|
||||
buildSearchTree(buildSearchNodes(time, t[p], search));
|
||||
tree.hide();
|
||||
}
|
||||
$('#restore-search-loader').hide();
|
||||
inSearch = false;
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (tree) {
|
||||
colorize(tree, search);
|
||||
tree.hide();
|
||||
}
|
||||
if (stree)
|
||||
colorize(stree, search);
|
||||
|
||||
|
||||
if (stree) {
|
||||
stree.remove();
|
||||
delete searchTrees[time];
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
'url': APP_CONFIG.server_url,
|
||||
headers: {'X-XSRF-Token': APP_DATA.xsrf_token},
|
||||
'data': {
|
||||
'action': 'search-backup-files',
|
||||
'id': backupId,
|
||||
'time': time,
|
||||
'prefix-only': 'false',
|
||||
'filter': '*' + search + '*'
|
||||
},
|
||||
'dataType': 'json'
|
||||
})
|
||||
.done(function(data, status, xhr) {
|
||||
|
||||
if (!searchdata[time])
|
||||
searchdata[time] = {};
|
||||
|
||||
if (!manualIncludes[time])
|
||||
manualIncludes[time] = [];
|
||||
|
||||
searchdata[time][search] = data;
|
||||
|
||||
$('#restore-search-loader').hide();
|
||||
inSearch = false;
|
||||
|
||||
if (data.Files.length == 0) {
|
||||
alert('No results matched the query');
|
||||
tree.show();
|
||||
return;
|
||||
}
|
||||
|
||||
buildSearchTree(buildSearchNodes(time, data));
|
||||
|
||||
})
|
||||
.fail(function() {
|
||||
$('#restore-search-loader').hide();
|
||||
inSearch = false;
|
||||
alert('Search failed ...');
|
||||
tree.show();
|
||||
});
|
||||
};
|
||||
|
||||
var createNodeFromData = function(path, prefix, time, rootnode) {
|
||||
var disp = path.substr(prefix.length);
|
||||
var isFolder = disp.lastIndexOf(dirSep) == disp.length - 1;
|
||||
var icon = null;
|
||||
var state = null;
|
||||
if (isFolder)
|
||||
disp = disp.substr(0, disp.length - 1);
|
||||
else
|
||||
icon = 'icon-file icon-file-' + disp.substr(disp.lastIndexOf('.')+1);
|
||||
|
||||
if (rootnode) {
|
||||
disp = APP_DATA.getBackupName(backupId) || disp;
|
||||
//state = {opened: true};
|
||||
}
|
||||
|
||||
return {
|
||||
text: disp,
|
||||
filepath: path,
|
||||
time: time,
|
||||
children: isFolder,
|
||||
state: state,
|
||||
icon: icon
|
||||
};
|
||||
};
|
||||
|
||||
var loadNodes = function(node, callback, time) {
|
||||
$.ajax({
|
||||
'url': APP_CONFIG.server_url,
|
||||
'data': {
|
||||
'action': 'search-backup-files',
|
||||
'id': backupId,
|
||||
'time': time,
|
||||
'prefix-only': node.id === '#',
|
||||
'folder-contents': node.id !== '#',
|
||||
'filter': node.id === '#' ? '*' : node.original.filepath,
|
||||
'Prefix': node.id === '#' ? '' : node.original.filepath
|
||||
},
|
||||
headers: {'X-XSRF-Token': APP_DATA.xsrf_token},
|
||||
'dataType': 'json'
|
||||
})
|
||||
.done(function(data, status, xhr) {
|
||||
var nodes = [];
|
||||
data.Files = data.Files || [];
|
||||
for(var i = 0; i < data.Files.length; i++)
|
||||
nodes.push(createNodeFromData(data.Files[i].Path, data.Prefix, time, node.id === '#'));
|
||||
|
||||
callback(nodes, data);
|
||||
|
||||
if (node.id === '#')
|
||||
commonPrefix[time] = data.Files[0].Path;
|
||||
});
|
||||
};
|
||||
|
||||
var setupTree = function(time) {
|
||||
var treeel = trees[time];
|
||||
|
||||
if (!trees[time]) {
|
||||
var treeel = $('<div></div>');
|
||||
trees[time] = treeel;
|
||||
$('#restore-files-tree').append(treeel);
|
||||
|
||||
treeel.jstree({
|
||||
'core': {
|
||||
'data': function(node, callback) {
|
||||
if (nodedata[node.id]) {
|
||||
callback(nodedata[node.id]);
|
||||
colorize(treeel, $('#restore-search').val());
|
||||
} else {
|
||||
loadNodes(node, function(nodes, data) {
|
||||
callback(nodes);
|
||||
if (data.Prefix == '')
|
||||
treeel.jstree("open_node", treeel.find('li').first());
|
||||
colorize(treeel, $('#restore-search').val());
|
||||
},
|
||||
time);
|
||||
}
|
||||
}
|
||||
},
|
||||
'plugins' : [ 'checkbox' ]
|
||||
});
|
||||
}
|
||||
|
||||
for(var t in trees)
|
||||
if (t != time)
|
||||
trees[t].hide();
|
||||
else {
|
||||
trees[t].show();
|
||||
}
|
||||
};
|
||||
|
||||
var buildIncludeMap = function() {
|
||||
var time = $('#restore-version').val();
|
||||
var m = {};
|
||||
//strees = strees || trees;
|
||||
var strees = [ trees[time] ];
|
||||
var partialfolders = false;
|
||||
if (searchTrees[time] && searchTrees[time].is(':visible')) {
|
||||
partialfolders = true;
|
||||
strees = [ searchTrees[time] ];
|
||||
}
|
||||
|
||||
for(var t in strees) {
|
||||
m[t] = {};
|
||||
var tr = strees[t].jstree();
|
||||
|
||||
var roots = strees[t].children('ul').children('li');
|
||||
var follow = [];
|
||||
|
||||
roots.each(function(i,e) {
|
||||
follow.push(tr.get_node(e));
|
||||
});
|
||||
|
||||
while(follow.length > 0) {
|
||||
var n = follow.pop();
|
||||
if (n.state.selected && n.original.filepath) {
|
||||
// If we have partial folder matches,
|
||||
// we only include the leaves
|
||||
if (partialfolders) {
|
||||
if (!n.children || n.children.length == 0) {
|
||||
m[t][n.original.filepath] = 1;
|
||||
} else {
|
||||
// Non-leaf node, recurse it
|
||||
for(var c in n.children)
|
||||
follow.push(tr.get_node(n.children[c]));
|
||||
}
|
||||
|
||||
} else {
|
||||
m[t][n.original.filepath] = 1;
|
||||
}
|
||||
} else {
|
||||
//TODO: This traverses the entire tree,
|
||||
// we could choose only those with indeterminate,
|
||||
// but that state only exists in the DOM which is
|
||||
// removed when collapsed
|
||||
for(var c in n.children)
|
||||
follow.push(tr.get_node(n.children[c]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return m;
|
||||
};
|
||||
|
||||
$('#restore-dialog').on('setup-dialog', function(e, data) {
|
||||
backupId = data.id;
|
||||
isDirectRestore = data.isDirectRestore;
|
||||
trees = { };
|
||||
searchdata = { };
|
||||
dbversions = { };
|
||||
|
||||
$('#restore-files-tree').empty();
|
||||
$('#restore-search-loader').hide();
|
||||
$('#restore-form').each(function(i, e) { e.reset(); });
|
||||
$('#restore-overwrite-overwrite').each(function(i, e) { e.checked = true; });
|
||||
$('#restore-overwrite-target-original').each(function(i, e) { e.checked = true; });
|
||||
$('#restore-metadata-timestamps').each(function(i, e) { e.checked = true; });
|
||||
|
||||
curpage = 0;
|
||||
updatePageNav();
|
||||
|
||||
APP_DATA.getServerConfig(function(serverdata) {
|
||||
|
||||
// TODO: Should be the backup data versions, not the host OS
|
||||
dirSep = serverdata.DirectorySeparator;
|
||||
pathSep = serverdata.PathSeparator;
|
||||
|
||||
APP_DATA.callServer({ 'action': 'list-backup-sets', id: backupId, 'from-remote-only': isDirectRestore }, function(data, success, message) {
|
||||
$('#restore-version').empty();
|
||||
|
||||
if (data == null || data.length == 0) {
|
||||
alert('Failed to get list of backup times');
|
||||
$('#restore-dialog').dialog('close');
|
||||
}
|
||||
|
||||
for(var n in data)
|
||||
dbversions[data[n].Time] = isDirectRestore ? n : true;
|
||||
dbversions[data[0].Time] = true;
|
||||
|
||||
var latest_group = $('<optgroup></optgroup>').attr('label', 'Newest - ' + $.timeago(data[0].Time));
|
||||
latest_group.append($("<option></option>").attr("value", data[0].Time).text($.toDisplayDateAndTime($.parseDate(data[0].Time))));
|
||||
$('#restore-version').append(latest_group);
|
||||
|
||||
var dateStamp = function(a) { return a.getFullYear() * 10000 + a.getMonth() * 100 + a.getDate(); }
|
||||
var now = new Date();
|
||||
var today = dateStamp(now);
|
||||
var yesterday = dateStamp(new Date(new Date().setDate(now.getDate() - 1)));
|
||||
var week = dateStamp(new Date(new Date().setDate(now.getDate() - 7)));
|
||||
var thismonth = dateStamp(new Date(new Date().setMonth(now.getMonth() - 1)));
|
||||
var lastmonth = dateStamp(new Date(new Date().setMonth(now.getMonth() - 2)));
|
||||
|
||||
var dateBuckets = [
|
||||
{text:'Today', stamp: today, items: []},
|
||||
{text: 'Yesterday', stamp: yesterday, items: []},
|
||||
{text: 'This week', stamp: week, items: []},
|
||||
{text: 'This month', stamp: thismonth, items: []},
|
||||
{text: 'Last month', stamp: lastmonth, items: []}
|
||||
];
|
||||
|
||||
var yearBuckets = { };
|
||||
|
||||
for(var i in data) {
|
||||
if (i == '0')
|
||||
continue;
|
||||
var dt = $.parseDate(data[i].Time);
|
||||
var stamp = dateStamp(dt);
|
||||
var inserted = false;
|
||||
|
||||
for(var t in dateBuckets) {
|
||||
if (stamp >= dateBuckets[t].stamp) {
|
||||
dateBuckets[t].items.push(data[i])
|
||||
inserted = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!inserted) {
|
||||
var y = dt.getFullYear() + '';
|
||||
if (yearBuckets[y] == null) {
|
||||
yearBuckets[y] = {text: y, stamp: dateStamp(new Date(dt.getFullYear(), 0, 1)), items: []};
|
||||
dateBuckets.push(yearBuckets[y]);
|
||||
}
|
||||
yearBuckets[y].items.push(data[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
for(var n in dateBuckets) {
|
||||
var e = dateBuckets[n];
|
||||
if (e.items.length == 0)
|
||||
continue;
|
||||
|
||||
var group = $('<optgroup></optgroup>').attr('label', e.text);
|
||||
for(var d in e.items)
|
||||
group.append($("<option></option>").attr("value", e.items[d].Time).text($.toDisplayDateAndTime($.parseDate(e.items[d].Time))));
|
||||
|
||||
$('#restore-version').append(group);
|
||||
|
||||
}
|
||||
|
||||
$('#restore-version').trigger('change');
|
||||
|
||||
}, function(data, success, message) {
|
||||
alert('Failed to get list of backup times:\n' + message);
|
||||
$('#restore-dialog').dialog('close');
|
||||
});
|
||||
}, function() {
|
||||
alert('Failed to get server config');
|
||||
$('#restore-dialog').dialog('close');
|
||||
});
|
||||
});
|
||||
|
||||
var doQuickSearch = function(search) {
|
||||
var search = $('#restore-search').val();
|
||||
var time = $('#restore-version').val();
|
||||
if (searchdata[time]) {
|
||||
for(var k in searchdata[time]) {
|
||||
if (search.indexOf(k) == 0) {
|
||||
colorize(trees[time], search);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
$('#restore-search').keypress(function(e) {
|
||||
var time = $('#restore-version').val();
|
||||
if (e.which == 13 && $('#restore-search').val().trim() != '')
|
||||
doSearch(time, $('#restore-search').val());
|
||||
else if ($('#restore-search').val().trim() != '') {
|
||||
colorize(trees[time], $('#restore-search').val());
|
||||
if (searchTrees[time])
|
||||
colorize(searchTrees[time], $('#restore-search').val());
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
$('#restore-search').keyup(function(e) {
|
||||
var time = $('#restore-version').val();
|
||||
colorize(trees[time], $('#restore-search').val());
|
||||
if (searchTrees[time])
|
||||
colorize(searchTrees[time], $('#restore-search').val());
|
||||
});
|
||||
|
||||
$('#restore-search').change(function(e) {
|
||||
var time = $('#restore-version').val();
|
||||
colorize(trees[time], $('#restore-search').val());
|
||||
if (searchTrees[time])
|
||||
colorize(searchTrees[time], $('#restore-search').val());
|
||||
});
|
||||
|
||||
$('#restore-search').on('search', function(e) {
|
||||
var time = $('#restore-version').val();
|
||||
if ($('#restore-search').val() == '') {
|
||||
trees[time].show();
|
||||
if (searchTrees[time]) {
|
||||
searchTrees[time].remove();
|
||||
delete searchTrees[time];
|
||||
}
|
||||
colorize(trees[time], $('#restore-search').val());
|
||||
} else
|
||||
doSearch(time, $('#restore-search').val());
|
||||
});
|
||||
|
||||
$('#restore-version').change(function() {
|
||||
$('#restore-search').val('');
|
||||
|
||||
var selectedversion = $('#restore-version').val();
|
||||
|
||||
if (dbversions[selectedversion] !== true) {
|
||||
// Need to patch the db with data
|
||||
|
||||
var dlg = APP_UTIL.create_modal_task_wait('Updating database', 'Updating local database ... ', function(cancelled, taskid) {
|
||||
if (!cancelled) {
|
||||
dbversions[selectedversion] = true;
|
||||
setupTree(selectedversion);
|
||||
}
|
||||
});
|
||||
|
||||
APP_DATA.callServer({ action: 'send-command', command: 'run-repair-update', 'only-paths': true, 'id': backupId, 'time': selectedversion }, function(data) {
|
||||
dlg.register_updates(data.ID);
|
||||
}, function(a,b,msg) {
|
||||
alert('Failed to connect: ' + msg);
|
||||
dlg.dialog('close');
|
||||
dlg.remove();
|
||||
});
|
||||
} else {
|
||||
setupTree(selectedversion);
|
||||
}
|
||||
});
|
||||
|
||||
$('#restore-target-path').keypress(function() { $('#restore-overwrite-target-other').each(function(i,e) { e.checked = true; }); });
|
||||
$('#restore-target-path').change(function() { $('#restore-overwrite-target-other').each(function(i,e) { e.checked = true; }); });
|
||||
|
||||
$('#restore-overwrite-target-other').click(function() { $('#restore-target-path-browse').trigger('click'); } );
|
||||
|
||||
$('#restore-target-path-browse').click(function(e) {
|
||||
$.browseForFolder({
|
||||
title: 'Select restore folder',
|
||||
resolvePath: true,
|
||||
multiSelect: false,
|
||||
callback: function(path, display) {
|
||||
$('#restore-target-path').val(path);
|
||||
$('#restore-overwrite-target-other').each(function(i, e) { e.checked = true; });
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
$('#restore-direct-uri').watermark('webdavs://user:pass@example.com:995/backup?option=true');
|
||||
$('#restore-direct-encryption-password').watermark('Enter backup passphrase, if any');
|
||||
$('#restore-direct-advanced-options').watermark('Enter one option per line in command-line format, eg. --prefix=backup');
|
||||
|
||||
$('#restore-direct-uri-label').click(function() {
|
||||
$('#connection-uri-dialog').dialog('open');
|
||||
$('#connection-uri-dialog').trigger('setup-dialog', $('#restore-direct-uri'));
|
||||
});
|
||||
|
||||
$('#restore-direct-dialog').dialog({
|
||||
minWidth: 320,
|
||||
width: $('body').width > 600 ? 320 : 600,
|
||||
minHeight: 480,
|
||||
height: 500,
|
||||
modal: true,
|
||||
autoOpen: false,
|
||||
closeOnEscape: true,
|
||||
buttons: [
|
||||
{ text: 'Cancel', click: function(event, ui) {
|
||||
$(this).dialog('close');
|
||||
}},
|
||||
{ text: 'Connect', click: function(event, ui) {
|
||||
var uri = $('#restore-direct-uri').val();
|
||||
var passphrase = $('#restore-direct-encryption-password').val();
|
||||
|
||||
if (uri == null || uri.trim().length == 1) {
|
||||
alert('You must supply a connection URI');
|
||||
return;
|
||||
}
|
||||
|
||||
var options = {};
|
||||
if (passphrase != null && passphrase.trim().length > 0)
|
||||
options['--passphrase'] = passphrase;
|
||||
else
|
||||
options['--no-encryption'] = 'true';
|
||||
|
||||
if (!EDIT_URI.parse_extra_options($('#restore-direct-advanced-options'), options))
|
||||
return;
|
||||
|
||||
var settings = [];
|
||||
for(var k in options)
|
||||
settings.push({'Name': k, 'Value': options[k]});
|
||||
|
||||
var item = {
|
||||
'Schedule': null,
|
||||
'Backup': {
|
||||
'TargetURL': uri,
|
||||
'Settings': settings
|
||||
}
|
||||
};
|
||||
|
||||
var self = this;
|
||||
var backupid = null;
|
||||
|
||||
var dlg = APP_UTIL.create_modal_task_wait('Creating database', 'Building local database ... ', function(cancelled, taskid) {
|
||||
if (!cancelled) {
|
||||
APP_DATA.restoreBackup(backupid, true);
|
||||
$(self).dialog('close');
|
||||
}
|
||||
});
|
||||
|
||||
APP_DATA.testConnection(uri, function() {
|
||||
APP_DATA.addBackup(item, function(data) {
|
||||
backupid = data.ID;
|
||||
|
||||
APP_DATA.callServer({ action: 'send-command', command: 'run-repair', 'only-paths': true, 'id': backupid, 'version': 0 }, function(data) {
|
||||
dlg.register_updates(data.ID);
|
||||
|
||||
}, function(a,b,msg) {
|
||||
alert('Failed to connect: ' + msg);
|
||||
dlg.dialog('close');
|
||||
dlg.remove();
|
||||
});
|
||||
}, function(a,b,msg) {
|
||||
alert('Failed to create a backup set: ' + msg);
|
||||
dlg.dialog('close');
|
||||
dlg.remove();
|
||||
}, {'temporary': true});
|
||||
}, function(a,b,msg) {
|
||||
alert('Failed to connect: ' + msg);
|
||||
dlg.dialog('close');
|
||||
dlg.remove();
|
||||
});
|
||||
|
||||
}}
|
||||
]
|
||||
});
|
||||
|
||||
$('#restore-direct-options-dialog').dialog({
|
||||
minWidth: 320,
|
||||
width: $('body').width > 600 ? 320 : 600,
|
||||
minHeight: 480,
|
||||
height: 500,
|
||||
modal: true,
|
||||
autoOpen: false,
|
||||
closeOnEscape: true,
|
||||
buttons: [
|
||||
{ text: 'Close', disabled: false, click: function(event, ui) {
|
||||
$(this).dialog('close');
|
||||
}}
|
||||
]
|
||||
});
|
||||
|
||||
$('#restore-direct-options-link').click(function() {
|
||||
APP_DATA.getServerConfig(function(data) {
|
||||
$('#restore-direct-options-dialog').dialog('open');
|
||||
|
||||
var baseOpts = data.Options;
|
||||
|
||||
for(var n in data.BackendModules)
|
||||
baseOpts = baseOpts.concat(data.BackendModules[n].Options);
|
||||
|
||||
for(var n in data.CompressionModules)
|
||||
baseOpts = baseOpts.concat(data.CompressionModules[n].Options);
|
||||
|
||||
for(var n in data.EncryptionModules)
|
||||
baseOpts = baseOpts.concat(data.EncryptionModules[n].Options);
|
||||
|
||||
for(var n in data.GenericModules)
|
||||
baseOpts = baseOpts.concat(data.GenericModules[n].Options);
|
||||
|
||||
|
||||
$('#restore-direct-options-dialog').trigger('configure', { Options: baseOpts, callback: function(id) {
|
||||
$('#restore-direct-options-dialog').dialog('close');
|
||||
|
||||
var txt = $('#restore-direct-advanced-options').val().trim();
|
||||
if (txt.length > 0)
|
||||
txt += '\n';
|
||||
|
||||
var defaultvalue = '';
|
||||
for(var o in data.Options)
|
||||
if (data.Options[o].Name == id) {
|
||||
defaultvalue = data.Options[o].DefaultValue;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
txt += '--' + id + '=' + defaultvalue;
|
||||
$('#restore-direct-advanced-options').val('').val(txt);
|
||||
$('#restore-direct-advanced-options').focus();
|
||||
|
||||
}});
|
||||
}, function() {
|
||||
});
|
||||
});
|
||||
|
||||
$('#restore-direct-options-dialog').on('configure', function(e, data) {
|
||||
$('#restore-direct-options-dialog').empty();
|
||||
|
||||
var s = data.Options.sort(function(a, b){
|
||||
if (a == null)
|
||||
return -1;
|
||||
if (b == null)
|
||||
return 1;
|
||||
if (a == null && b == null)
|
||||
return 0;
|
||||
|
||||
if(a.Name < b.Name) return -1;
|
||||
if(a.Name > b.Name) return 1;
|
||||
return 0;
|
||||
});
|
||||
|
||||
//Fill with jQuery template
|
||||
$.tmpl($('#backup-option-template'), s).prependTo($('#restore-direct-options-dialog'));
|
||||
$('#restore-direct-options-dialog').find('.backup-option-link').click(function(e) {
|
||||
data.callback(e.target.id);
|
||||
});
|
||||
|
||||
$('#restore-direct-options-dialog').find('.backup-option-long').each(function(i, e) {
|
||||
$(e).html(nl2br($(e).html()));
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
@@ -1,148 +0,0 @@
|
||||
/*
|
||||
* Common style config
|
||||
*/
|
||||
|
||||
body {
|
||||
background-color: #f0f0f0;
|
||||
border: 0px none;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
font-family: 'Source Sans Pro', sans-serif;
|
||||
min-width: 320px;
|
||||
font-size: 75%;
|
||||
}
|
||||
|
||||
textarea.pre-style-text, .pre-style-text {
|
||||
white-space: pre;
|
||||
overflow: auto;
|
||||
word-wrap: normal;
|
||||
font-family: "Courier New", Courier, monospace;
|
||||
}
|
||||
|
||||
.content-wrap {
|
||||
margin: 0 auto;
|
||||
box-sizing: border-box;
|
||||
max-width: 1100px
|
||||
}
|
||||
|
||||
.content-wrap.padded {
|
||||
padding-left: 20px;
|
||||
padding-right: 20px;
|
||||
}
|
||||
|
||||
.ui-widget {
|
||||
font-family: 'Source Sans Pro', sans-serif;
|
||||
}
|
||||
|
||||
.action-link, .action-links li {
|
||||
text-decoration: underline;
|
||||
color: #56acbb;
|
||||
font-size: 12pt;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.hint-text {
|
||||
color: #9b9b9b;
|
||||
font-size: 12pt;
|
||||
}
|
||||
|
||||
.hint-text-caption {
|
||||
font-weight: bold;
|
||||
color: #9b9b9b;
|
||||
font-size: 12pt;
|
||||
}
|
||||
|
||||
.caption-text {
|
||||
color: #68845f;
|
||||
font-weight: bold;
|
||||
font-size: 18pt;
|
||||
}
|
||||
|
||||
.progressbar-background {
|
||||
background-color: #b1bead;
|
||||
}
|
||||
|
||||
.menu {
|
||||
background-color: rgba(255, 255, 255, 0.9);
|
||||
position: absolute;
|
||||
display: none;
|
||||
list-style: none;
|
||||
border: 1px solid #9b9b9b;
|
||||
margin: 0px;
|
||||
padding: 0px;
|
||||
border-radius: 3px;
|
||||
white-space: nowrap;
|
||||
z-index: 10000;
|
||||
}
|
||||
|
||||
.menu li {
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.large-loader-icon {
|
||||
width: 66px;
|
||||
height: 66px;
|
||||
margin: auto;
|
||||
background: url('../images/ajax-loader-66.gif') center center no-repeat;
|
||||
}
|
||||
|
||||
.medium-loader-icon {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
background: url("../images/ajax-loader-32.gif") center center no-repeat;
|
||||
}
|
||||
|
||||
.small-loader-icon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background: url("../images/ajax-loader-16.gif") center center no-repeat;
|
||||
}
|
||||
|
||||
.button-area {
|
||||
float: right;
|
||||
padding-bottom: 10px;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
.clearfix {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.password-strength-0 {
|
||||
color: #ff0000
|
||||
}
|
||||
|
||||
.password-strength-1 {
|
||||
color: #ff7700
|
||||
}
|
||||
.password-strength-2 {
|
||||
color: #aaaa00
|
||||
}
|
||||
|
||||
.password-strength-3 {
|
||||
color: #007700
|
||||
}
|
||||
|
||||
.password-strength-4 {
|
||||
color: #427e27;
|
||||
}
|
||||
|
||||
.password-strength-unknown {
|
||||
color: #999999
|
||||
}
|
||||
|
||||
.password-mismatch {
|
||||
color: #ff0000;
|
||||
}
|
||||
|
||||
a.jstree-anchor > i.icon-file.jstree-icon {
|
||||
background-image: url('/images/generic-file.png');
|
||||
background-position: 0px 0px;
|
||||
}
|
||||
|
||||
a.jstree-anchor > i.icon-clock.jstree-icon {
|
||||
background-image: url('/images/clock.png');
|
||||
background-position: 0px 0px;
|
||||
}
|
||||
|
||||
a.jstree-anchor > i.icon-file.jstree-icon.icon-file-log { background-image: url('/control.cgi?action=get-system-icon&ext=log'); }
|
||||
@@ -1,302 +0,0 @@
|
||||
/*
|
||||
* CSS config for the edit dialog
|
||||
*/
|
||||
|
||||
.edit-dialog label:before {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.edit-dialog {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.edit-dialog label {
|
||||
min-width: 250px;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.edit-dialog-label {
|
||||
min-width: 200px;
|
||||
line-height: 26px;
|
||||
clear: both;
|
||||
float: left;
|
||||
}
|
||||
|
||||
.edit-dialog input, .edit-dialog textarea, .edit-dialog select {
|
||||
background: none;
|
||||
border-color: #c0c0c0;
|
||||
}
|
||||
|
||||
.edit-dialog input, .edit-dialog select {
|
||||
width: 330px;
|
||||
}
|
||||
|
||||
.edit-dialog textarea {
|
||||
max-width: 330px;
|
||||
width: 330px;
|
||||
}
|
||||
|
||||
.input-block {
|
||||
clear: both;
|
||||
margin-top: 10px;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.edit-tab-general > .input-block:first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.field-group {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.button-area {
|
||||
clear: both;
|
||||
position: absolute;
|
||||
bottom: 0px;
|
||||
right: 0px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
.inline-links {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.inline-links > li {
|
||||
border-left: 1px solid #7d7d7d;
|
||||
display: inline-block;
|
||||
margin: 0;
|
||||
padding: 0 10px;
|
||||
}
|
||||
|
||||
.inline-links > li:first-child {
|
||||
border-left: none;
|
||||
padding-left: 5px;
|
||||
}
|
||||
|
||||
.field-group .inline-links {
|
||||
margin-top: 5px;
|
||||
}
|
||||
|
||||
#encryption-area {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
#backend-type {
|
||||
width: 140px;
|
||||
}
|
||||
|
||||
#server-port {
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
#server-name {
|
||||
width: 165px;
|
||||
}
|
||||
|
||||
#server-use-ssl {
|
||||
width: auto;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.checkbox-label {
|
||||
display: inline-block;
|
||||
margin-top: 2px;
|
||||
}
|
||||
|
||||
#source-folder-paths {
|
||||
margin-top: 10px;
|
||||
position: relative;
|
||||
|
||||
padding: 10px;
|
||||
background-color: lightgray;
|
||||
margin-bottom: 10px;
|
||||
border-radius: 3px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#source-folder-paths.empty {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
#source-folder-paths > div.source-folder {
|
||||
padding: 5px 25px 5px 5px;
|
||||
background-color: white;
|
||||
border-radius: 3px;
|
||||
display: inline-block;
|
||||
margin: 8px;
|
||||
position: relative;
|
||||
float: left;
|
||||
}
|
||||
|
||||
#source-folder-paths > div.source-folder .focused, #source-folder-paths > div.source-folder:hover {
|
||||
/*background-color: grey;
|
||||
color: black;*/
|
||||
}
|
||||
|
||||
#source-folder-paths > div.source-folder.path-valid {
|
||||
}
|
||||
|
||||
#source-folder-paths > div.source-folder.path-invalid {
|
||||
background-color: #ffcccc;
|
||||
}
|
||||
|
||||
|
||||
.source-folder-close-icon {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
background-position: -80px -128px;
|
||||
background-image: url(green-theme/images/ui-icons_365724_256x240.png);
|
||||
background-repeat: no-repeat;
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
right: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.source-folder-close-icon:hover {
|
||||
background-color: red;
|
||||
}
|
||||
|
||||
#source-folder-browser {
|
||||
clear: both;
|
||||
/*height: 160px;*/
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
#source-folder-path-text {
|
||||
/*max-width: 205px;*/
|
||||
width: 70%;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
#source-folder-path-add {
|
||||
margin-right: 0px;
|
||||
float: right;
|
||||
}
|
||||
|
||||
#source-folder-droptarget {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
display: block;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
#use-scheduled-run {
|
||||
float: left;
|
||||
width: auto;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
#next-run-time, #next-run-date, #repeat-run-number, #repeat-run-multiplier {
|
||||
width: 165px;
|
||||
}
|
||||
|
||||
#dblock-size-number, #dblock-size-multiplier, #keep-time-type, #keep-time-number, #keep-time-multiplier {
|
||||
width: 120px;
|
||||
}
|
||||
|
||||
#dblock-size-multiplier {
|
||||
width: 145px;
|
||||
}
|
||||
|
||||
#keep-time-multiplier {
|
||||
width: 80px;
|
||||
}
|
||||
|
||||
#dblock-size-number {
|
||||
width: 178px;
|
||||
}
|
||||
|
||||
#keep-time-type {
|
||||
width: 180px;
|
||||
}
|
||||
|
||||
#keep-time-number {
|
||||
width: 60px;
|
||||
}
|
||||
|
||||
#dblock-size-number {
|
||||
width: 178px;
|
||||
}
|
||||
|
||||
input.simple-checkbox {
|
||||
width: auto;
|
||||
float: none;
|
||||
}
|
||||
|
||||
.days-label {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.input-wrapper {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.hint-line-last {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
#edit-tab-schedule > div.clearfix, #edit-tab-options > div.clearfix {
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
#edit-dialog {
|
||||
width: 100%;
|
||||
border-top-left-radius: 0px;
|
||||
border-top-right-radius: 0px;
|
||||
}
|
||||
|
||||
.ui-tabs-nav {
|
||||
border-top-right-radius: 0px;
|
||||
border-top-left-radius: 0px;
|
||||
}
|
||||
|
||||
.edit-dialog-hint-text {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
#source-folder-paths.file-drag-target {
|
||||
background-color: #00ff00;
|
||||
}
|
||||
|
||||
#backup-options-link div.ui-icon-info, #server-options-label div.ui-icon-info {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
#server-options {
|
||||
max-width: none;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.backup-option-name {
|
||||
font-weight: bold;
|
||||
color: darkgreen;
|
||||
}
|
||||
|
||||
.backup-option-short, .backup-option-type, .backup-option-default {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.backup-option-summary, .backup-option-long {
|
||||
margin-left: 5px;
|
||||
}
|
||||
|
||||
.backup-option-long {
|
||||
margin-top: 5px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
input.server-path-file {
|
||||
width: 275px;
|
||||
}
|
||||
|
||||
input.browse-button {
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
width: auto;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 205 B |
|
Before Width: | Height: | Size: 206 B |
|
Before Width: | Height: | Size: 205 B |
|
Before Width: | Height: | Size: 230 B |
|
Before Width: | Height: | Size: 230 B |
|
Before Width: | Height: | Size: 206 B |
|
Before Width: | Height: | Size: 206 B |
|
Before Width: | Height: | Size: 230 B |
|
Before Width: | Height: | Size: 230 B |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 3.0 KiB |
|
Before Width: | Height: | Size: 1.0 KiB |
@@ -1,916 +0,0 @@
|
||||
/* jsTree default theme */
|
||||
.jstree-node,
|
||||
.jstree-children,
|
||||
.jstree-container-ul {
|
||||
display: block;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style-type: none;
|
||||
list-style-image: none;
|
||||
}
|
||||
.jstree-node {
|
||||
white-space: nowrap;
|
||||
}
|
||||
.jstree-anchor {
|
||||
display: inline-block;
|
||||
color: black;
|
||||
white-space: nowrap;
|
||||
padding: 0 4px 0 1px;
|
||||
margin: 0;
|
||||
vertical-align: top;
|
||||
}
|
||||
.jstree-anchor:focus {
|
||||
outline: 0;
|
||||
}
|
||||
.jstree-anchor,
|
||||
.jstree-anchor:link,
|
||||
.jstree-anchor:visited,
|
||||
.jstree-anchor:hover,
|
||||
.jstree-anchor:active {
|
||||
text-decoration: none;
|
||||
color: inherit;
|
||||
}
|
||||
.jstree-icon {
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
vertical-align: top;
|
||||
text-align: center;
|
||||
}
|
||||
.jstree-icon:empty {
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
vertical-align: top;
|
||||
text-align: center;
|
||||
}
|
||||
.jstree-ocl {
|
||||
cursor: pointer;
|
||||
}
|
||||
.jstree .jstree-open > .jstree-children {
|
||||
display: block;
|
||||
}
|
||||
.jstree .jstree-closed > .jstree-children,
|
||||
.jstree .jstree-leaf > .jstree-children {
|
||||
display: none;
|
||||
}
|
||||
.jstree-anchor > .jstree-themeicon {
|
||||
margin-right: 2px;
|
||||
}
|
||||
.jstree-no-icons .jstree-themeicon,
|
||||
.jstree-anchor > .jstree-themeicon-hidden {
|
||||
display: none;
|
||||
}
|
||||
.jstree-rtl .jstree-anchor {
|
||||
padding: 0 1px 0 4px;
|
||||
}
|
||||
.jstree-rtl .jstree-anchor > .jstree-themeicon {
|
||||
margin-left: 2px;
|
||||
margin-right: 0;
|
||||
}
|
||||
.jstree-rtl .jstree-node {
|
||||
margin-left: 0;
|
||||
}
|
||||
.jstree-rtl .jstree-container-ul > .jstree-node {
|
||||
margin-right: 0;
|
||||
}
|
||||
.jstree-wholerow-ul {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
min-width: 100%;
|
||||
}
|
||||
.jstree-wholerow-ul .jstree-anchor,
|
||||
.jstree-wholerow-ul .jstree-icon {
|
||||
position: relative;
|
||||
}
|
||||
.jstree-wholerow-ul .jstree-wholerow {
|
||||
width: 100%;
|
||||
cursor: pointer;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
-webkit-user-select: none;
|
||||
-moz-user-select: none;
|
||||
-ms-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
.vakata-context {
|
||||
display: none;
|
||||
}
|
||||
.vakata-context,
|
||||
.vakata-context ul {
|
||||
margin: 0;
|
||||
padding: 2px;
|
||||
position: absolute;
|
||||
background: #f5f5f5;
|
||||
border: 1px solid #979797;
|
||||
-moz-box-shadow: 5px 5px 4px -4px #666666;
|
||||
-webkit-box-shadow: 2px 2px 2px #999999;
|
||||
box-shadow: 2px 2px 2px #999999;
|
||||
}
|
||||
.vakata-context ul {
|
||||
list-style: none;
|
||||
left: 100%;
|
||||
margin-top: -2.7em;
|
||||
margin-left: -4px;
|
||||
}
|
||||
.vakata-context .vakata-context-right ul {
|
||||
left: auto;
|
||||
right: 100%;
|
||||
margin-left: auto;
|
||||
margin-right: -4px;
|
||||
}
|
||||
.vakata-context li {
|
||||
list-style: none;
|
||||
display: inline;
|
||||
}
|
||||
.vakata-context li > a {
|
||||
display: block;
|
||||
padding: 0 2em 0 2em;
|
||||
text-decoration: none;
|
||||
width: auto;
|
||||
color: black;
|
||||
white-space: nowrap;
|
||||
line-height: 2.4em;
|
||||
-moz-text-shadow: 1px 1px 0 white;
|
||||
-webkit-text-shadow: 1px 1px 0 white;
|
||||
text-shadow: 1px 1px 0 white;
|
||||
-moz-border-radius: 1px;
|
||||
-webkit-border-radius: 1px;
|
||||
border-radius: 1px;
|
||||
}
|
||||
.vakata-context li > a:hover {
|
||||
position: relative;
|
||||
background-color: #e8eff7;
|
||||
-moz-box-shadow: 0 0 2px #0a6aa1;
|
||||
-webkit-box-shadow: 0 0 2px #0a6aa1;
|
||||
box-shadow: 0 0 2px #0a6aa1;
|
||||
}
|
||||
.vakata-context li > a.vakata-context-parent {
|
||||
background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAIORI4JlrqN1oMSnmmZDQUAOw==");
|
||||
background-position: right center;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
.vakata-context li > a:focus {
|
||||
outline: 0;
|
||||
}
|
||||
.vakata-context .vakata-context-hover > a {
|
||||
position: relative;
|
||||
background-color: #e8eff7;
|
||||
-moz-box-shadow: 0 0 2px #0a6aa1;
|
||||
-webkit-box-shadow: 0 0 2px #0a6aa1;
|
||||
box-shadow: 0 0 2px #0a6aa1;
|
||||
}
|
||||
.vakata-context .vakata-context-separator a,
|
||||
.vakata-context .vakata-context-separator a:hover {
|
||||
background: white;
|
||||
border: 0;
|
||||
border-top: 1px solid #e2e3e3;
|
||||
height: 1px;
|
||||
min-height: 1px;
|
||||
max-height: 1px;
|
||||
padding: 0;
|
||||
margin: 0 0 0 2.4em;
|
||||
border-left: 1px solid #e0e0e0;
|
||||
-moz-text-shadow: 0 0 0 transparent;
|
||||
-webkit-text-shadow: 0 0 0 transparent;
|
||||
text-shadow: 0 0 0 transparent;
|
||||
-moz-box-shadow: 0 0 0 transparent;
|
||||
-webkit-box-shadow: 0 0 0 transparent;
|
||||
box-shadow: 0 0 0 transparent;
|
||||
-moz-border-radius: 0;
|
||||
-webkit-border-radius: 0;
|
||||
border-radius: 0;
|
||||
}
|
||||
.vakata-context .vakata-contextmenu-disabled a,
|
||||
.vakata-context .vakata-contextmenu-disabled a:hover {
|
||||
color: silver;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
box-shadow: 0 0 0;
|
||||
}
|
||||
.vakata-context li > a > i {
|
||||
text-decoration: none;
|
||||
display: inline-block;
|
||||
width: 2.4em;
|
||||
height: 2.4em;
|
||||
background: transparent;
|
||||
margin: 0 0 0 -2em;
|
||||
vertical-align: top;
|
||||
text-align: center;
|
||||
line-height: 2.4em;
|
||||
}
|
||||
.vakata-context li > a > i:empty {
|
||||
width: 2.4em;
|
||||
line-height: 2.4em;
|
||||
}
|
||||
.vakata-context li > a .vakata-contextmenu-sep {
|
||||
display: inline-block;
|
||||
width: 1px;
|
||||
height: 2.4em;
|
||||
background: white;
|
||||
margin: 0 0.5em 0 0;
|
||||
border-left: 1px solid #e2e3e3;
|
||||
}
|
||||
.vakata-context .vakata-contextmenu-shortcut {
|
||||
font-size: 0.8em;
|
||||
color: silver;
|
||||
opacity: 0.5;
|
||||
display: none;
|
||||
}
|
||||
.vakata-context-rtl ul {
|
||||
left: auto;
|
||||
right: 100%;
|
||||
margin-left: auto;
|
||||
margin-right: -4px;
|
||||
}
|
||||
.vakata-context-rtl li > a.vakata-context-parent {
|
||||
background-image: url("data:image/gif;base64,R0lGODlhCwAHAIAAACgoKP///yH5BAEAAAEALAAAAAALAAcAAAINjI+AC7rWHIsPtmoxLAA7");
|
||||
background-position: left center;
|
||||
background-repeat: no-repeat;
|
||||
}
|
||||
.vakata-context-rtl .vakata-context-separator > a {
|
||||
margin: 0 2.4em 0 0;
|
||||
border-left: 0;
|
||||
border-right: 1px solid #e2e3e3;
|
||||
}
|
||||
.vakata-context-rtl .vakata-context-left ul {
|
||||
right: auto;
|
||||
left: 100%;
|
||||
margin-left: -4px;
|
||||
margin-right: auto;
|
||||
}
|
||||
.vakata-context-rtl li > a > i {
|
||||
margin: 0 -2em 0 0;
|
||||
}
|
||||
.vakata-context-rtl li > a .vakata-contextmenu-sep {
|
||||
margin: 0 0 0 0.5em;
|
||||
border-left-color: white;
|
||||
background: #e2e3e3;
|
||||
}
|
||||
#jstree-marker {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
border-right: 0;
|
||||
border-top: 5px solid transparent;
|
||||
border-bottom: 5px solid transparent;
|
||||
border-left: 5px solid;
|
||||
width: 0;
|
||||
height: 0;
|
||||
font-size: 0;
|
||||
line-height: 0;
|
||||
}
|
||||
#jstree-dnd {
|
||||
line-height: 16px;
|
||||
margin: 0;
|
||||
padding: 4px;
|
||||
}
|
||||
#jstree-dnd .jstree-icon,
|
||||
#jstree-dnd .jstree-copy {
|
||||
display: inline-block;
|
||||
text-decoration: none;
|
||||
margin: 0 2px 0 0;
|
||||
padding: 0;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
#jstree-dnd .jstree-ok {
|
||||
background: green;
|
||||
}
|
||||
#jstree-dnd .jstree-er {
|
||||
background: red;
|
||||
}
|
||||
#jstree-dnd .jstree-copy {
|
||||
margin: 0 2px 0 2px;
|
||||
}
|
||||
.jstree-default .jstree-node,
|
||||
.jstree-default .jstree-icon {
|
||||
background-repeat: no-repeat;
|
||||
background-color: transparent;
|
||||
}
|
||||
.jstree-default .jstree-anchor,
|
||||
.jstree-default .jstree-wholerow {
|
||||
transition: background-color 0.15s, box-shadow 0.15s;
|
||||
}
|
||||
.jstree-default .jstree-hovered {
|
||||
background: #e7f4f9;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 0 1px #ccc;
|
||||
}
|
||||
.jstree-default .jstree-clicked {
|
||||
background: #beebff;
|
||||
border-radius: 2px;
|
||||
box-shadow: inset 0 0 1px #999;
|
||||
}
|
||||
.jstree-default .jstree-no-icons .jstree-anchor > .jstree-themeicon {
|
||||
display: none;
|
||||
}
|
||||
.jstree-default .jstree-disabled {
|
||||
background: transparent;
|
||||
color: #666;
|
||||
}
|
||||
.jstree-default .jstree-disabled.jstree-hovered {
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
.jstree-default .jstree-disabled.jstree-clicked {
|
||||
background: #efefef;
|
||||
}
|
||||
.jstree-default .jstree-disabled > .jstree-icon {
|
||||
opacity: 0.8;
|
||||
filter: url("data:image/svg+xml;utf8,<svg xmlns=\'http://www.w3.org/2000/svg\'><filter id=\'jstree-grayscale\'><feColorMatrix type=\'matrix\' values=\'0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0\'/></filter></svg>#jstree-grayscale");
|
||||
/* Firefox 10+ */
|
||||
filter: gray;
|
||||
/* IE6-9 */
|
||||
-webkit-filter: grayscale(100%);
|
||||
/* Chrome 19+ & Safari 6+ */
|
||||
}
|
||||
.jstree-default .jstree-search {
|
||||
font-style: italic;
|
||||
color: #8b0000;
|
||||
font-weight: bold;
|
||||
}
|
||||
.jstree-default .jstree-no-checkboxes .jstree-checkbox {
|
||||
display: none !important;
|
||||
}
|
||||
.jstree-default.jstree-checkbox-no-clicked .jstree-clicked {
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
}
|
||||
.jstree-default.jstree-checkbox-no-clicked .jstree-clicked.jstree-hovered {
|
||||
background: #e7f4f9;
|
||||
}
|
||||
.jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default.jstree-checkbox-no-clicked > .jstree-wholerow-ul .jstree-wholerow-clicked.jstree-wholerow-hovered {
|
||||
background: #e7f4f9;
|
||||
}
|
||||
#jstree-dnd.jstree-default .jstree-ok,
|
||||
#jstree-dnd.jstree-default .jstree-er {
|
||||
background-image: url("32px.png");
|
||||
background-repeat: no-repeat;
|
||||
background-color: transparent;
|
||||
}
|
||||
#jstree-dnd.jstree-default i {
|
||||
background: transparent;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
#jstree-dnd.jstree-default .jstree-ok {
|
||||
background-position: -9px -71px;
|
||||
}
|
||||
#jstree-dnd.jstree-default .jstree-er {
|
||||
background-position: -39px -71px;
|
||||
}
|
||||
.jstree-default > .jstree-striped {
|
||||
background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAAkCAMAAAB/qqA+AAAABlBMVEUAAAAAAAClZ7nPAAAAAnRSTlMNAMM9s3UAAAAXSURBVHjajcEBAQAAAIKg/H/aCQZ70AUBjAATb6YPDgAAAABJRU5ErkJggg==") left top repeat;
|
||||
}
|
||||
.jstree-default > .jstree-wholerow-ul .jstree-hovered,
|
||||
.jstree-default > .jstree-wholerow-ul .jstree-clicked {
|
||||
background: transparent;
|
||||
box-shadow: none;
|
||||
border-radius: 0;
|
||||
}
|
||||
.jstree-default .jstree-wholerow {
|
||||
-moz-box-sizing: border-box;
|
||||
-webkit-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.jstree-default .jstree-wholerow-hovered {
|
||||
background: #e7f4f9;
|
||||
}
|
||||
.jstree-default .jstree-wholerow-clicked {
|
||||
background: #beebff;
|
||||
background: -moz-linear-gradient(top, #beebff 0%, #a8e4ff 100%);
|
||||
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%, #beebff), color-stop(100%, #a8e4ff));
|
||||
background: -webkit-linear-gradient(top, #beebff 0%, #a8e4ff 100%);
|
||||
background: -o-linear-gradient(top, #beebff 0%, #a8e4ff 100%);
|
||||
background: -ms-linear-gradient(top, #beebff 0%, #a8e4ff 100%);
|
||||
background: linear-gradient(to bottom, #beebff 0%, #a8e4ff 100%);
|
||||
/*filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='@color1', endColorstr='@color2',GradientType=0 );*/
|
||||
}
|
||||
.jstree-default .jstree-node {
|
||||
min-height: 24px;
|
||||
line-height: 24px;
|
||||
margin-left: 24px;
|
||||
min-width: 24px;
|
||||
}
|
||||
.jstree-default .jstree-anchor {
|
||||
line-height: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
.jstree-default .jstree-icon {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
line-height: 24px;
|
||||
}
|
||||
.jstree-default .jstree-icon:empty {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
line-height: 24px;
|
||||
}
|
||||
.jstree-default.jstree-rtl .jstree-node {
|
||||
margin-right: 24px;
|
||||
}
|
||||
.jstree-default .jstree-wholerow {
|
||||
height: 24px;
|
||||
}
|
||||
.jstree-default .jstree-node,
|
||||
.jstree-default .jstree-icon {
|
||||
background-image: url("32px.png");
|
||||
}
|
||||
.jstree-default .jstree-node {
|
||||
background-position: -292px -4px;
|
||||
background-repeat: repeat-y;
|
||||
}
|
||||
.jstree-default .jstree-last {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default .jstree-open > .jstree-ocl {
|
||||
background-position: -132px -4px;
|
||||
}
|
||||
.jstree-default .jstree-closed > .jstree-ocl {
|
||||
background-position: -100px -4px;
|
||||
}
|
||||
.jstree-default .jstree-leaf > .jstree-ocl {
|
||||
background-position: -68px -4px;
|
||||
}
|
||||
.jstree-default .jstree-anchor > .jstree-themeicon {
|
||||
background-position: -260px -4px;
|
||||
}
|
||||
.jstree-default > .jstree-no-dots .jstree-node,
|
||||
.jstree-default > .jstree-no-dots .jstree-leaf > .jstree-ocl {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default > .jstree-no-dots .jstree-open > .jstree-ocl {
|
||||
background-position: -36px -4px;
|
||||
}
|
||||
.jstree-default > .jstree-no-dots .jstree-closed > .jstree-ocl {
|
||||
background-position: -4px -4px;
|
||||
}
|
||||
.jstree-default .jstree-disabled {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default .jstree-disabled.jstree-hovered {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default .jstree-disabled.jstree-clicked {
|
||||
background: #efefef;
|
||||
}
|
||||
.jstree-default .jstree-checkbox {
|
||||
background-position: -164px -4px;
|
||||
}
|
||||
.jstree-default .jstree-checkbox:hover {
|
||||
background-position: -164px -36px;
|
||||
}
|
||||
.jstree-default .jstree-clicked > .jstree-checkbox {
|
||||
background-position: -228px -4px;
|
||||
}
|
||||
.jstree-default .jstree-clicked > .jstree-checkbox:hover {
|
||||
background-position: -228px -36px;
|
||||
}
|
||||
.jstree-default .jstree-anchor > .jstree-undetermined {
|
||||
background-position: -196px -4px;
|
||||
}
|
||||
.jstree-default .jstree-anchor > .jstree-undetermined:hover {
|
||||
background-position: -196px -36px;
|
||||
}
|
||||
.jstree-default > .jstree-striped {
|
||||
background-size: auto 48px;
|
||||
}
|
||||
.jstree-default.jstree-rtl .jstree-node {
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
|
||||
background-position: 100% 1px;
|
||||
background-repeat: repeat-y;
|
||||
}
|
||||
.jstree-default.jstree-rtl .jstree-last {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default.jstree-rtl .jstree-open > .jstree-ocl {
|
||||
background-position: -132px -36px;
|
||||
}
|
||||
.jstree-default.jstree-rtl .jstree-closed > .jstree-ocl {
|
||||
background-position: -100px -36px;
|
||||
}
|
||||
.jstree-default.jstree-rtl .jstree-leaf > .jstree-ocl {
|
||||
background-position: -68px -36px;
|
||||
}
|
||||
.jstree-default.jstree-rtl > .jstree-no-dots .jstree-node,
|
||||
.jstree-default.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
|
||||
background-position: -36px -36px;
|
||||
}
|
||||
.jstree-default.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
|
||||
background-position: -4px -36px;
|
||||
}
|
||||
.jstree-default .jstree-themeicon-custom {
|
||||
background-color: transparent;
|
||||
background-image: none;
|
||||
}
|
||||
.jstree-default > .jstree-container-ul .jstree-loading > .jstree-ocl {
|
||||
background: url("throbber.gif") center center no-repeat;
|
||||
}
|
||||
.jstree-default.jstree-rtl .jstree-node {
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
|
||||
}
|
||||
.jstree-default.jstree-rtl .jstree-last {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-small .jstree-node {
|
||||
min-height: 18px;
|
||||
line-height: 18px;
|
||||
margin-left: 18px;
|
||||
min-width: 18px;
|
||||
}
|
||||
.jstree-default-small .jstree-anchor {
|
||||
line-height: 18px;
|
||||
height: 18px;
|
||||
}
|
||||
.jstree-default-small .jstree-icon {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
line-height: 18px;
|
||||
}
|
||||
.jstree-default-small .jstree-icon:empty {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
line-height: 18px;
|
||||
}
|
||||
.jstree-default-small.jstree-rtl .jstree-node {
|
||||
margin-right: 18px;
|
||||
}
|
||||
.jstree-default-small .jstree-wholerow {
|
||||
height: 18px;
|
||||
}
|
||||
.jstree-default-small .jstree-node,
|
||||
.jstree-default-small .jstree-icon {
|
||||
background-image: url("32px.png");
|
||||
}
|
||||
.jstree-default-small .jstree-node {
|
||||
background-position: -295px -7px;
|
||||
background-repeat: repeat-y;
|
||||
}
|
||||
.jstree-default-small .jstree-last {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-small .jstree-open > .jstree-ocl {
|
||||
background-position: -135px -7px;
|
||||
}
|
||||
.jstree-default-small .jstree-closed > .jstree-ocl {
|
||||
background-position: -103px -7px;
|
||||
}
|
||||
.jstree-default-small .jstree-leaf > .jstree-ocl {
|
||||
background-position: -71px -7px;
|
||||
}
|
||||
.jstree-default-small .jstree-anchor > .jstree-themeicon {
|
||||
background-position: -263px -7px;
|
||||
}
|
||||
.jstree-default-small > .jstree-no-dots .jstree-node,
|
||||
.jstree-default-small > .jstree-no-dots .jstree-leaf > .jstree-ocl {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-small > .jstree-no-dots .jstree-open > .jstree-ocl {
|
||||
background-position: -39px -7px;
|
||||
}
|
||||
.jstree-default-small > .jstree-no-dots .jstree-closed > .jstree-ocl {
|
||||
background-position: -7px -7px;
|
||||
}
|
||||
.jstree-default-small .jstree-disabled {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-small .jstree-disabled.jstree-hovered {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-small .jstree-disabled.jstree-clicked {
|
||||
background: #efefef;
|
||||
}
|
||||
.jstree-default-small .jstree-checkbox {
|
||||
background-position: -167px -7px;
|
||||
}
|
||||
.jstree-default-small .jstree-checkbox:hover {
|
||||
background-position: -167px -39px;
|
||||
}
|
||||
.jstree-default-small .jstree-clicked > .jstree-checkbox {
|
||||
background-position: -231px -7px;
|
||||
}
|
||||
.jstree-default-small .jstree-clicked > .jstree-checkbox:hover {
|
||||
background-position: -231px -39px;
|
||||
}
|
||||
.jstree-default-small .jstree-anchor > .jstree-undetermined {
|
||||
background-position: -199px -7px;
|
||||
}
|
||||
.jstree-default-small .jstree-anchor > .jstree-undetermined:hover {
|
||||
background-position: -199px -39px;
|
||||
}
|
||||
.jstree-default-small > .jstree-striped {
|
||||
background-size: auto 36px;
|
||||
}
|
||||
.jstree-default-small.jstree-rtl .jstree-node {
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
|
||||
background-position: 100% 1px;
|
||||
background-repeat: repeat-y;
|
||||
}
|
||||
.jstree-default-small.jstree-rtl .jstree-last {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-small.jstree-rtl .jstree-open > .jstree-ocl {
|
||||
background-position: -135px -39px;
|
||||
}
|
||||
.jstree-default-small.jstree-rtl .jstree-closed > .jstree-ocl {
|
||||
background-position: -103px -39px;
|
||||
}
|
||||
.jstree-default-small.jstree-rtl .jstree-leaf > .jstree-ocl {
|
||||
background-position: -71px -39px;
|
||||
}
|
||||
.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-node,
|
||||
.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
|
||||
background-position: -39px -39px;
|
||||
}
|
||||
.jstree-default-small.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
|
||||
background-position: -7px -39px;
|
||||
}
|
||||
.jstree-default-small .jstree-themeicon-custom {
|
||||
background-color: transparent;
|
||||
background-image: none;
|
||||
}
|
||||
.jstree-default-small > .jstree-container-ul .jstree-loading > .jstree-ocl {
|
||||
background: url("throbber.gif") center center no-repeat;
|
||||
}
|
||||
.jstree-default-small.jstree-rtl .jstree-node {
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAACAQMAAABv1h6PAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMHBgAAiABBI4gz9AAAAABJRU5ErkJggg==");
|
||||
}
|
||||
.jstree-default-small.jstree-rtl .jstree-last {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-large .jstree-node {
|
||||
min-height: 32px;
|
||||
line-height: 32px;
|
||||
margin-left: 32px;
|
||||
min-width: 32px;
|
||||
}
|
||||
.jstree-default-large .jstree-anchor {
|
||||
line-height: 32px;
|
||||
height: 32px;
|
||||
}
|
||||
.jstree-default-large .jstree-icon {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
}
|
||||
.jstree-default-large .jstree-icon:empty {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
}
|
||||
.jstree-default-large.jstree-rtl .jstree-node {
|
||||
margin-right: 32px;
|
||||
}
|
||||
.jstree-default-large .jstree-wholerow {
|
||||
height: 32px;
|
||||
}
|
||||
.jstree-default-large .jstree-node,
|
||||
.jstree-default-large .jstree-icon {
|
||||
background-image: url("32px.png");
|
||||
}
|
||||
.jstree-default-large .jstree-node {
|
||||
background-position: -288px 0px;
|
||||
background-repeat: repeat-y;
|
||||
}
|
||||
.jstree-default-large .jstree-last {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-large .jstree-open > .jstree-ocl {
|
||||
background-position: -128px 0px;
|
||||
}
|
||||
.jstree-default-large .jstree-closed > .jstree-ocl {
|
||||
background-position: -96px 0px;
|
||||
}
|
||||
.jstree-default-large .jstree-leaf > .jstree-ocl {
|
||||
background-position: -64px 0px;
|
||||
}
|
||||
.jstree-default-large .jstree-anchor > .jstree-themeicon {
|
||||
background-position: -256px 0px;
|
||||
}
|
||||
.jstree-default-large > .jstree-no-dots .jstree-node,
|
||||
.jstree-default-large > .jstree-no-dots .jstree-leaf > .jstree-ocl {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-large > .jstree-no-dots .jstree-open > .jstree-ocl {
|
||||
background-position: -32px 0px;
|
||||
}
|
||||
.jstree-default-large > .jstree-no-dots .jstree-closed > .jstree-ocl {
|
||||
background-position: 0px 0px;
|
||||
}
|
||||
.jstree-default-large .jstree-disabled {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-large .jstree-disabled.jstree-hovered {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-large .jstree-disabled.jstree-clicked {
|
||||
background: #efefef;
|
||||
}
|
||||
.jstree-default-large .jstree-checkbox {
|
||||
background-position: -160px 0px;
|
||||
}
|
||||
.jstree-default-large .jstree-checkbox:hover {
|
||||
background-position: -160px -32px;
|
||||
}
|
||||
.jstree-default-large .jstree-clicked > .jstree-checkbox {
|
||||
background-position: -224px 0px;
|
||||
}
|
||||
.jstree-default-large .jstree-clicked > .jstree-checkbox:hover {
|
||||
background-position: -224px -32px;
|
||||
}
|
||||
.jstree-default-large .jstree-anchor > .jstree-undetermined {
|
||||
background-position: -192px 0px;
|
||||
}
|
||||
.jstree-default-large .jstree-anchor > .jstree-undetermined:hover {
|
||||
background-position: -192px -32px;
|
||||
}
|
||||
.jstree-default-large > .jstree-striped {
|
||||
background-size: auto 64px;
|
||||
}
|
||||
.jstree-default-large.jstree-rtl .jstree-node {
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAACAQMAAAB49I5GAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjAAMOBgAAGAAJMwQHdQAAAABJRU5ErkJggg==");
|
||||
background-position: 100% 1px;
|
||||
background-repeat: repeat-y;
|
||||
}
|
||||
.jstree-default-large.jstree-rtl .jstree-last {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-large.jstree-rtl .jstree-open > .jstree-ocl {
|
||||
background-position: -128px -32px;
|
||||
}
|
||||
.jstree-default-large.jstree-rtl .jstree-closed > .jstree-ocl {
|
||||
background-position: -96px -32px;
|
||||
}
|
||||
.jstree-default-large.jstree-rtl .jstree-leaf > .jstree-ocl {
|
||||
background-position: -64px -32px;
|
||||
}
|
||||
.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-node,
|
||||
.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-leaf > .jstree-ocl {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-open > .jstree-ocl {
|
||||
background-position: -32px -32px;
|
||||
}
|
||||
.jstree-default-large.jstree-rtl > .jstree-no-dots .jstree-closed > .jstree-ocl {
|
||||
background-position: 0px -32px;
|
||||
}
|
||||
.jstree-default-large .jstree-themeicon-custom {
|
||||
background-color: transparent;
|
||||
background-image: none;
|
||||
}
|
||||
.jstree-default-large > .jstree-container-ul .jstree-loading > .jstree-ocl {
|
||||
background: url("throbber.gif") center center no-repeat;
|
||||
}
|
||||
.jstree-default-large.jstree-rtl .jstree-node {
|
||||
background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAACAQMAAAAD0EyKAAAABlBMVEUAAAAdHRvEkCwcAAAAAXRSTlMAQObYZgAAAAxJREFUCNdjgIIGBgABCgCBvVLXcAAAAABJRU5ErkJggg==");
|
||||
}
|
||||
.jstree-default-large.jstree-rtl .jstree-last {
|
||||
background: transparent;
|
||||
}
|
||||
@media (max-width: 768px) {
|
||||
.jstree-default-responsive {
|
||||
/*
|
||||
.jstree-open > .jstree-ocl,
|
||||
.jstree-closed > .jstree-ocl { border-radius:20px; background-color:white; }
|
||||
*/
|
||||
}
|
||||
.jstree-default-responsive .jstree-icon {
|
||||
background-image: url("40px.png");
|
||||
}
|
||||
.jstree-default-responsive .jstree-node,
|
||||
.jstree-default-responsive .jstree-leaf > .jstree-ocl {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-responsive .jstree-node {
|
||||
min-height: 40px;
|
||||
line-height: 40px;
|
||||
margin-left: 40px;
|
||||
min-width: 40px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.jstree-default-responsive .jstree-anchor {
|
||||
line-height: 40px;
|
||||
height: 40px;
|
||||
}
|
||||
.jstree-default-responsive .jstree-icon,
|
||||
.jstree-default-responsive .jstree-icon:empty {
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
}
|
||||
.jstree-default-responsive > .jstree-container-ul > .jstree-node {
|
||||
margin-left: 0;
|
||||
}
|
||||
.jstree-default-responsive.jstree-rtl .jstree-node {
|
||||
margin-left: 0;
|
||||
margin-right: 40px;
|
||||
}
|
||||
.jstree-default-responsive.jstree-rtl .jstree-container-ul > .jstree-node {
|
||||
margin-right: 0;
|
||||
}
|
||||
.jstree-default-responsive .jstree-ocl,
|
||||
.jstree-default-responsive .jstree-themeicon,
|
||||
.jstree-default-responsive .jstree-checkbox {
|
||||
background-size: 120px 200px;
|
||||
}
|
||||
.jstree-default-responsive .jstree-leaf > .jstree-ocl {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-responsive .jstree-open > .jstree-ocl {
|
||||
background-position: 0 0px !important;
|
||||
}
|
||||
.jstree-default-responsive .jstree-closed > .jstree-ocl {
|
||||
background-position: 0 -40px !important;
|
||||
}
|
||||
.jstree-default-responsive.jstree-rtl .jstree-closed > .jstree-ocl {
|
||||
background-position: -40px 0px !important;
|
||||
}
|
||||
.jstree-default-responsive .jstree-anchor > .jstree-themeicon {
|
||||
background-position: -40px -40px;
|
||||
}
|
||||
.jstree-default-responsive .jstree-checkbox,
|
||||
.jstree-default-responsive .jstree-checkbox:hover {
|
||||
background-position: -40px -80px;
|
||||
}
|
||||
.jstree-default-responsive .jstree-clicked > .jstree-checkbox,
|
||||
.jstree-default-responsive .jstree-clicked > .jstree-checkbox:hover {
|
||||
background-position: 0 -80px;
|
||||
}
|
||||
.jstree-default-responsive .jstree-anchor > .jstree-undetermined,
|
||||
.jstree-default-responsive .jstree-anchor > .jstree-undetermined:hover {
|
||||
background-position: 0 -120px;
|
||||
}
|
||||
.jstree-default-responsive .jstree-anchor {
|
||||
font-weight: bold;
|
||||
font-size: 1.1em;
|
||||
text-shadow: 1px 1px white;
|
||||
}
|
||||
.jstree-default-responsive > .jstree-striped {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-responsive .jstree-wholerow {
|
||||
border-top: 1px solid rgba(255, 255, 255, 0.7);
|
||||
border-bottom: 1px solid rgba(64, 64, 64, 0.2);
|
||||
background: #ebebeb;
|
||||
height: 40px;
|
||||
}
|
||||
.jstree-default-responsive .jstree-wholerow-hovered {
|
||||
background: #e7f4f9;
|
||||
}
|
||||
.jstree-default-responsive .jstree-wholerow-clicked {
|
||||
background: #beebff;
|
||||
}
|
||||
.jstree-default-responsive .jstree-children .jstree-last > .jstree-wholerow {
|
||||
box-shadow: inset 0 -6px 3px -5px #666666;
|
||||
}
|
||||
.jstree-default-responsive .jstree-children .jstree-open > .jstree-wholerow {
|
||||
box-shadow: inset 0 6px 3px -5px #666666;
|
||||
border-top: 0;
|
||||
}
|
||||
.jstree-default-responsive .jstree-children .jstree-open + .jstree-open {
|
||||
box-shadow: none;
|
||||
}
|
||||
.jstree-default-responsive .jstree-node,
|
||||
.jstree-default-responsive .jstree-icon,
|
||||
.jstree-default-responsive .jstree-node > .jstree-ocl,
|
||||
.jstree-default-responsive .jstree-themeicon,
|
||||
.jstree-default-responsive .jstree-checkbox {
|
||||
background-image: url("40px.png");
|
||||
background-size: 120px 200px;
|
||||
}
|
||||
.jstree-default-responsive .jstree-node {
|
||||
background-position: -80px 0;
|
||||
background-repeat: repeat-y;
|
||||
}
|
||||
.jstree-default-responsive .jstree-last {
|
||||
background: transparent;
|
||||
}
|
||||
.jstree-default-responsive .jstree-leaf > .jstree-ocl {
|
||||
background-position: -40px -120px;
|
||||
}
|
||||
.jstree-default-responsive .jstree-last > .jstree-ocl {
|
||||
background-position: -40px -160px;
|
||||
}
|
||||
.jstree-default-responsive .jstree-themeicon-custom {
|
||||
background-color: transparent;
|
||||
background-image: none;
|
||||
}
|
||||
}
|
||||
.jstree-default > .jstree-container-ul > .jstree-node {
|
||||
margin-left: 0;
|
||||
margin-right: 0;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@@ -1,51 +0,0 @@
|
||||
/*
|
||||
* CSS config for the log window
|
||||
*/
|
||||
|
||||
#log-dialog .log-backupid, #log-dialog .log-exception,
|
||||
#backup-log-tab-general .log-backupid, #backup-log-tab-general .log-exception, #backup-log-tab-general .log-message,
|
||||
#backup-log-tab-remote .log-operationid, #backup-log-tab-remote .log-data
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
|
||||
#log-dialog .log-message, #log-dialog .log-timestamp,
|
||||
#backup-log-tab-general .log-timestamp, #backup-log-tab-general .log-type,
|
||||
#backup-log-tab-remote .log-timestamp, #backup-log-tab-remote .log-type, #backup-log-tab-remote .log-path
|
||||
{
|
||||
display: inline-block;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#log-dialog .expanded div.log-exception,
|
||||
#backup-log-tab-general .expanded div.log-exception, #backup-log-tab-general .expanded div.log-message,
|
||||
#backup-log-tab-remote .expanded div.log-data
|
||||
{
|
||||
display: block;
|
||||
background-color: #ffffff;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
#log-tab-live .log-entry .log-message
|
||||
{
|
||||
display: inline;
|
||||
}
|
||||
|
||||
|
||||
#log-tab-live .log-entry
|
||||
{
|
||||
height: 1.2em;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#log-tab-live .log-entry.expanded
|
||||
{
|
||||
height: auto;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -1,514 +0,0 @@
|
||||
/*
|
||||
* CSS config for the main window
|
||||
*/
|
||||
|
||||
#main-topbar {
|
||||
position: absolute;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
height: 46px;
|
||||
background-color: #3a5e30;
|
||||
color: #9dab98;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
#main-list {
|
||||
padding-top: 82px;
|
||||
overflow: auto;
|
||||
padding-bottom: 60px;
|
||||
}
|
||||
|
||||
#main-list-container {
|
||||
background-color: #f3f3f3;
|
||||
overflow: hidden;
|
||||
/*min-height: calc(100vh - 82px);*/
|
||||
}
|
||||
|
||||
#main-appname {
|
||||
display: inline-block;
|
||||
font-family: "Arial Black", "GillSans", Helvetica, Arial, sans-serif;
|
||||
font-size: 24px;
|
||||
font-weight: bold;
|
||||
line-height: 46px;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
#main-appname.has-subtitle {
|
||||
padding-top: 5px;
|
||||
font-size: 16pt;
|
||||
}
|
||||
|
||||
#main-appname-subtitle {
|
||||
font-size: 7em;
|
||||
font-weight: normal;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
#main-newbackup, #main-restorebackup {
|
||||
color: white;
|
||||
cursor: pointer;
|
||||
border-radius: 3px;
|
||||
display: inline-block;
|
||||
font-size: 12pt;
|
||||
clear: both;
|
||||
float: left;
|
||||
margin-top: 40px;
|
||||
margin-bottom: 0px;
|
||||
}
|
||||
|
||||
#main-control-menu {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.main-shortcuts {
|
||||
float: right;
|
||||
padding-top: 8px;
|
||||
padding-right: 8px;
|
||||
margin: 0px;
|
||||
padding-left: 0px;
|
||||
list-style: none;
|
||||
}
|
||||
|
||||
.main-shortcuts li {
|
||||
padding-left: 8px;
|
||||
padding-right: 4px;
|
||||
cursor: pointer;
|
||||
background-color: #3a5e30;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.main-backup-entry, #main-newbackup, #main-restorebackup {
|
||||
margin-top: 20px;
|
||||
clear: both;
|
||||
display: inline-block;
|
||||
height: 150px;
|
||||
width: 350px;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
#main-restorebackup, #main-newbackup {
|
||||
margin-top: 0px;
|
||||
width: 1000px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.main-backup-entry .action-links {
|
||||
display: block;
|
||||
margin-top: 10px;
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
.main-backup-entry ul.hint-text, #main-newbackup > ul.hint-text, #main-restorebackup > ul.hint-text {
|
||||
list-style: none;
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
.main-backup-entry ul.hint-text > li, #main-newbackup > ul.hint-text > li, #main-restorebackup > ul.hint-text > li {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.main-backup-entry .action-links li {
|
||||
display: inline;
|
||||
border-right: 1px solid #56acbb;
|
||||
padding-left: 5px;
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.main-backup-entry .action-links .last {
|
||||
border-right: 0px none;
|
||||
padding-right: 0px;
|
||||
}
|
||||
|
||||
.main-backup-entry .action-links .first {
|
||||
padding-left: 0px;
|
||||
}
|
||||
|
||||
.main-backup-entry .hint-text-caption {
|
||||
padding-right: 5px;
|
||||
}
|
||||
|
||||
.main-backup-entry .caption-text, #main-newbackup .caption-text, #main-restorebackup .caption-text {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.main-backup-entry > .last-run-time.last-run-failed {
|
||||
color: red;
|
||||
}
|
||||
|
||||
div.main-icon-plus {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
display: block;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url('../images/plus.png');
|
||||
}
|
||||
|
||||
div.main-icon-restore {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
display: block;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url('../images/restore.png');
|
||||
}
|
||||
|
||||
.main-icon-clock {
|
||||
width: 23px;
|
||||
height: 23px;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url('../images/clock.png');
|
||||
}
|
||||
|
||||
.main-icon-donate {
|
||||
width: 28px;
|
||||
height: 28px;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url('../images/donate.png');
|
||||
}
|
||||
|
||||
.main-icon-hourglass {
|
||||
width: 18px;
|
||||
height: 24px;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url('../images/hourglass.png');
|
||||
}
|
||||
|
||||
.main-icon-pause {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url('../images/pause.png');
|
||||
}
|
||||
|
||||
.main-icon-run {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url('../images/play.png');
|
||||
}
|
||||
|
||||
.main-icon-settings {
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url('../images/menu-grey.png');
|
||||
}
|
||||
|
||||
.main-icon-small-close {
|
||||
width: 19px;
|
||||
height: 19px;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url('../images/small-close');
|
||||
}
|
||||
|
||||
#main-newbackup .main-icon-plus, #main-restorebackup .main-icon-restore {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.main-backup-control {
|
||||
display: block;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin-left: 0px;
|
||||
margin-top: 4px;
|
||||
position: absolute;
|
||||
background-image: url('../images/menu-grey-small.png');
|
||||
}
|
||||
|
||||
.main-backup-entry .caption-text, .main-backup-entry ul.hint-text, #main-newbackup > .caption-text, #main-newbackup > ul.hint-text, #main-restorebackup > .caption-text, #main-restorebackup > ul.hint-text {
|
||||
margin-left: 42px;
|
||||
}
|
||||
|
||||
.main-backup-action-buttons > .caption-text {
|
||||
font-size: 14pt;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
.main-button-add-text {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
padding-left: 10px;
|
||||
padding-top: 4px;
|
||||
}
|
||||
|
||||
.progress-area {
|
||||
background-color: #c8d1c5;
|
||||
color: #8f968e;
|
||||
border-radius: 3px;
|
||||
display: block;
|
||||
padding: 6px 12px 6px 12px;
|
||||
display: block;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.in-progress {
|
||||
color: #ecf0eb;
|
||||
min-height: 23px;
|
||||
}
|
||||
|
||||
.main-progress-cell {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.progress-area .main-icon-hourglass, .progress-area .main-icon-clock {
|
||||
display: inline-block;
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.main-progress-text {
|
||||
display: inline-block;
|
||||
vertical-align: top;
|
||||
padding-top: 4px;
|
||||
white-space: nowrap;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.backup-progress-indeterminate {
|
||||
background-image: url('green-theme/images/animated-overlay.gif');
|
||||
}
|
||||
|
||||
.backup-progress-overall {
|
||||
border-radius: 3px;
|
||||
display: block;
|
||||
height: 100%;
|
||||
width: 20%;
|
||||
background-color: green;
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0;
|
||||
|
||||
}
|
||||
.backup-details {
|
||||
float: left;
|
||||
width: 300px;
|
||||
}
|
||||
|
||||
.backup-progress {
|
||||
float: left;
|
||||
padding-bottom: 20px;
|
||||
min-width: 250px;
|
||||
white-space: nowrap;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
#edit-dialog {
|
||||
padding: 0px;
|
||||
border: 0px none;
|
||||
}
|
||||
|
||||
/* Merge tabs in dialog */
|
||||
#backup-log-dialog, #log-dialog, #about-dialog {
|
||||
padding: 0px;
|
||||
border: 0px none;
|
||||
width: 100%;
|
||||
border-top-left-radius: 0px;
|
||||
border-top-right-radius: 0px;
|
||||
}
|
||||
|
||||
.ui-dialog-titlebar {
|
||||
border-bottom-right-radius: 0px;
|
||||
border-bottom-left-radius: 0px;
|
||||
}
|
||||
|
||||
#click-intercept {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
display: none;
|
||||
z-index: 9999;
|
||||
}
|
||||
|
||||
#about-dialog-current {
|
||||
margin-bottom: 10px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.about-library-entry {
|
||||
margin-bottom: 10px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
.about-library-name {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.about-library-name, .about-library-description, .about-library-license {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.about-library-notes {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.main-status-area-outer {
|
||||
position: absolute;
|
||||
top: 46px;
|
||||
left: 0px;
|
||||
right: 0px;
|
||||
height: auto;
|
||||
z-index: 1;
|
||||
overflow: hidden;
|
||||
background-color: #91AA8A;
|
||||
}
|
||||
|
||||
#main-status-area {
|
||||
font-size: 14px;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
height: 20px;
|
||||
padding: 8px 0;
|
||||
color: #f0f0f0;
|
||||
}
|
||||
|
||||
#main-status-area-text {
|
||||
display: inline-block;
|
||||
min-width: 100px;
|
||||
}
|
||||
|
||||
#main-status-area-progress-text {
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
margin-left: 5px;
|
||||
margin-right: 5px;
|
||||
text-shadow:
|
||||
-1px -1px 0 #f0f0f0,
|
||||
1px -1px 0 #f0f0f0,
|
||||
-1px 1px 0 #f0f0f0,
|
||||
1px 1px 0 #f0f0f0;
|
||||
}
|
||||
|
||||
#main-status-area-progress-outer {
|
||||
background-color: #f0f0f0;
|
||||
min-width: 180px;
|
||||
margin-left: 20px;
|
||||
float: right;
|
||||
position: relative;
|
||||
color: #3a5e30;
|
||||
border-radius: 100px;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#main-status-area-cancel-button {
|
||||
height: 19px;
|
||||
width: 19px;
|
||||
float: right;
|
||||
background-image: url('../images/small-close.png');
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#main-status-area-progress-bar {
|
||||
border-radius: 100px;
|
||||
position: absolute;
|
||||
background-color: #ccc;
|
||||
height: 100%;
|
||||
width: 30%;
|
||||
}
|
||||
|
||||
#about-dialog-current-version {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
#about-dialog-changelog, .noty-update-changelog-link {
|
||||
display: inline;
|
||||
cursor: pointer;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
.export-dialog-label, .import-dialog-label {
|
||||
display: inline;
|
||||
}
|
||||
|
||||
.ui-icon-inline {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
#options-dialog .options-header {
|
||||
font-size: 22px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
#options-dialog .options-items, #options-dialog .edit-dialog-label {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
#options-dialog .hint-line-last {
|
||||
margin-left: 10px;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
#options-dialog .options-items > div {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
#options-dialog .options-header {
|
||||
padding-top: 15px;
|
||||
}
|
||||
|
||||
#options-dialog .options-header.options-header-first {
|
||||
padding-top: 0px;
|
||||
}
|
||||
|
||||
#global-advanced-options, #global-webservice-options {
|
||||
width: 320px;
|
||||
}
|
||||
|
||||
#global-options-startup-delay-multiplier {
|
||||
width: 270px;
|
||||
}
|
||||
|
||||
#webservice-password-label {
|
||||
min-width: 180px;
|
||||
}
|
||||
|
||||
#source-folder-filter-area {
|
||||
margin-top: 10px;
|
||||
}
|
||||
|
||||
#backup-context-menu > li > u {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
#backup-context-menu > li > u > b {
|
||||
padding: 0.4em;
|
||||
padding-top: 2px;
|
||||
color: #7f7f7f;
|
||||
}
|
||||
|
||||
/*
|
||||
* custom CSS
|
||||
*/
|
||||
|
||||
header {
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
footer{
|
||||
height: 50px;
|
||||
width: 100%;
|
||||
background-color: #3A5E30;
|
||||
color: #F0F0F0;
|
||||
bottom:0px;
|
||||
position:fixed;
|
||||
border-top: 10px solid #91AA8A;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
a.link_extern:hover, a.link_extern:active , a.link_extern:visited, a.link_extern:link {
|
||||
color: #F0F0F0;
|
||||
}
|
||||
|
||||
div.box-duplicati-copy{
|
||||
float:left;
|
||||
margin-left:5px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
div.box-visit-us{
|
||||
float:right;
|
||||
margin-right: 5px;
|
||||
text-align: right;
|
||||
}
|
||||
@@ -1,60 +0,0 @@
|
||||
#restore-dialog {
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
#restore-files-tree {
|
||||
overflow: auto;
|
||||
position: absolute;
|
||||
top: 58px;
|
||||
bottom: 16px;
|
||||
left: 16px;
|
||||
right: 8px;
|
||||
}
|
||||
|
||||
#restore-search {
|
||||
width: 320px;
|
||||
}
|
||||
|
||||
#restore-version {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.search-match {
|
||||
display: inline;
|
||||
font-weight: bold;
|
||||
color: black;
|
||||
}
|
||||
|
||||
#restore-hint-paypal, #restore-hint-bitcoin {
|
||||
background-color: #9b9b9b;
|
||||
color: black;
|
||||
padding: 20px;
|
||||
border-radius: 8px;
|
||||
font-weight: bold;
|
||||
margin: 20px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
#restore-complete-page > .hint-text {
|
||||
margin: 20px;
|
||||
}
|
||||
|
||||
#restore-hint-paypal > a, #restore-hint-bitcoin > a {
|
||||
color: black;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a.restore-current-time {
|
||||
font-weight: bold !important;
|
||||
color: black !important;
|
||||
}
|
||||
|
||||
#restore-search-loader {
|
||||
display: inline-block;
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
#restore-hint-overwrite, #restore-hint-metadata {
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 212 B |
|
Before Width: | Height: | Size: 208 B |
|
Before Width: | Height: | Size: 335 B |
|
Before Width: | Height: | Size: 207 B |
|
Before Width: | Height: | Size: 262 B |
|
Before Width: | Height: | Size: 262 B |
|
Before Width: | Height: | Size: 332 B |
|
Before Width: | Height: | Size: 280 B |
|
Before Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 6.8 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
@@ -41,6 +41,8 @@
|
||||
var theme = parseCookies()['default-theme'];
|
||||
if ((theme || '').trim().length == 0)
|
||||
theme = 'ngax';
|
||||
if (theme == 'greeno') // Make sure users are redirected automatically
|
||||
theme = 'ngax';
|
||||
|
||||
setCookieAndRun(theme); // Refresh
|
||||
|
||||
|
||||
@@ -84,13 +84,13 @@
|
||||
<div class="button" onclick="setView('ngax')">View now</div>
|
||||
</div>
|
||||
</li>
|
||||
<li class="theme-item">
|
||||
<!--<li class="theme-item">
|
||||
<h3 class="title">Greeno - Your friendly green theme</h3>
|
||||
<div class="buttons">
|
||||
<div class="button" id="greeno" onclick="setDefault('greeno')">Use as default</div>
|
||||
<div class="button" onclick="setView('greeno')">View now</div>
|
||||
</div>
|
||||
</li>
|
||||
</li>-->
|
||||
</ul>
|
||||
|
||||
<script type="text/javascript">updateToCurrentTheme();</script>
|
||||
|
||||