virt2/api/soft/sxd/sxd.js

1076 lines
42 KiB
JavaScript
Raw Normal View History

function z(el) {
return document.getElementById(el);
}
var sxd = {
version: {num: 20007, type: 'lite', full: ''},
init: function () {
var icons = {
' .lb': '0 -80px',
' .rb': '-2px -80px',
' .mb': '-4px -80px',
'.ovr': '0 -20px',
'.ovr .lb': '0 -100px',
'.ovr .rb': '-2px -100px',
'.ovr .mb': '-4px -100px',
'.ovr .arr': '0 -40px',
'.dwn': '0 -20px',
'.dwn .lb': '0 -100px',
'.dwn .rb': '-2px -120px',
'.dwn .mb': '-4px -120px',
'.dwn .arr': '0 -60px'
};
for (var ico in icons) {
this.css.add('.zSel' + ico + ' {background-position:' + icons[ico] + ';}');
}
this.version.full = z('header').innerHTML;
this.main = z('main_div');
this.menu.el = z('sxdMenu');
this.name = z('name').lastChild;
this.loading = z('loading');
this.overlay = z('overlay');
this.progress.current = zProgressObject();
this.progress.current.init('sxdProc1', 1);
this.progress.total = zProgressObject();
this.progress.total.init('sxdProc2', 2);
this.tbar = zToolbarObject();
this.tree.backup = zTreeObject();
this.tree.backup.init('backup_tree', 1);
this.tree.restore = zTreeObject();
this.tree.restore.init('restore_tree', 2);
this.tree.services = zTreeObject();
this.tree.services.init('services_tree', 3);
this.comment.backup = z('backup_comment');
this.comment.restore = z('restore_comment');
this.timer.t1 = z('sxdTime1');
this.timer.t2 = z('sxdTime2');
this.timeout = null;
this.log = zGridObject();
this.log.init('sxdGrid1', {header: [[this.lng('dt'), 120], [this.lng('action')]], width: 565, height: 286});
this.files = zGridObject();
this.files.init('sxdGrid2', {
header: [[this.lng('db'), 90], [this.lng('dt'), 90], [this.lng('type'), 30], [this.lng('tab'), 30, 1, this.lng('table')], [this.lng('records'), 60, 1], [this.lng('size'), 45, 1], [this.lng('comment')]],
width: 565,
height: 334
});
this.result = zGridObject();
this.result.init('sxdGrid3', {
header: [['Table', 160], ['Op', 70], ['Msg_type', 50], ['Msg_text']],
width: 565,
height: 334
});
this.addDialogs(['connect', 'createdb', 'savejob', 'charsets']);
this.addTabs(['backup', 'restore', 'log', 'result', 'files', 'services', 'options']);
},
job: {name: 'abcdefgh', stop: 0, log_seek: 0, type: ''},
menu: {el: null, type: 'zSelMenu'},
tabs: {},
openTab: function (name) {
if (this.opened)this.tabs[this.opened].el.style.display = 'none';
this.opened = name;
this.name.innerHTML = this.tabs[name].name;
this.tabs[name].el.style.display = '';
document.title = sxd.version.full;
},
addTabs: function (o) {
for (var i = 0, l = o.length; i < l; i++) {
this.tabs[o[i]] = {name: this.lng(o[i]), el: z('tab_' + o[i])};
}
this.openTab(o[0]);
},
dialogs: {},
addDialogs: function (o) {
for (var i = 0, l = o.length; i < l; i++) {
this.dialogs[o[i]] = z('dia_' + o[i]);
}
},
tbar: {},
tree: {},
options: {},
progress: {},
combos: {},
comment: {},
lng: function (s) {
return sxdlng[s] ? sxdlng[s] : '[LNG: ' + s + ']';
},
timer: {
set: function (time1, time2, proc) {
function lead0(i) {
return i < 10 ? '0' + i : i;
}
function sec2time(sec) {
return lead0(Math.floor(sec / 60)) + ':' + lead0(sec % 60);
}
if (!time1 && !time2)this.t1.innerHTML = '00:00', this.t2.innerHTML = '00:00'; else {
var t = time2 - time1;
this.t1.innerHTML = sec2time(t);
this.t2.innerHTML = sec2time(t > 0 && proc > 0 ? Math.round(t / (proc / 100) - t) : 0);
}
}
},
actions: {
db: function () {
if (!this.value)return;
if (this.name == 'backup_db' || this.name == 'services_db')sxd.ajax('index', sxd.lng('load'), {
act: 'load_db',
name: this.name,
value: this.value
});
}, dblist: function () {
sxd.ajax('index', sxd.lng('load'), {act: 'dblist'});
}, filelist: function () {
sxd.ajax('index', sxd.lng('load'), {act: 'filelist'});
}, files: function () {
if (!this.value)return;
sxd.ajax('index', sxd.lng('load'), {act: 'load_files', name: this.name, value: this.value});
}, tab_connects: function () {
sxd.ajax('index', sxd.lng('load'), {act: 'load_connect'});
sxd.showDialog('connect');
}, tab_createdb: function () {
sxd.showDialog('createdb');
}, tab_backup: function () {
sxd.openTab('backup');
if (sxd.tree.backup.load)sxd.combos.backup_db.action();
}, tab_restore: function () {
sxd.openTab('restore');
if (sxd.tree.restore.load)sxd.combos.restore_file.action();
}, tab_files: function () {
sxd.ajax('index', sxd.lng('load'), {act: 'load_files_ext'});
sxd.openTab('files');
}, tab_services: function () {
sxd.openTab('services');
if (sxd.tree.services.load)sxd.combos.services_db.action();
}, tab_options: function () {
sxd.ajax('index', sxd.lng('load'), {act: 'load_options'});
sxd.openTab('options');
}, tab_exit: function () {
sxd.ajax('index', sxd.lng('load'), {act: 'exit'});
}
},
informer: function () {
if (sxd.job.timer)clearTimeout(sxd.job.timer);
if (sxd.job.stop)return;
sxd.job.timer = setTimeout(function () {
sxd.ajax('info', sxd.lng('run'), {job: sxd.job.name, act: 'info', lseek: sxd.job.log_seek}, 1, function () {
sxd.informer();
});
}, 250);
},
addDb: function () {
sxd.ajax('index', this.lng('sdb'), {
act: 'add_db',
name: z('db_name').value,
charset: this.combos.db_charset.value,
collate: this.combos.db_charset_col.value
});
sxd.hideDialog('createdb');
},
saveConnect: function () {
sxd.ajax('index', this.lng('sc'), {
act: 'save_connect',
host: z('con_host').value,
port: z('con_port').value,
user: z('con_user').value,
pass: z('con_pass').changed ? z('con_pass').value : null,
comp: z('con_comp').checked ? '1' : '0',
db: z('con_db').value
});
sxd.hideDialog('connect');
z('con_pass').value = '';
},
job2php: function () {
return sxd.opened == 'restore' || sxd.job.type == 'restore' ? {
act: 'restore',
type: 'restore',
db: this.combos.restore_db.value,
charset: this.combos.restore_charset.value,
file: this.combos.restore_file.value,
strategy: this.combos.restore_type.value,
correct: z('correct').checked ? 1 : 0,
autoinc: z('autoinc').checked ? 1 : 0,
obj: this.tree.restore.save()
} : {
act: 'backup',
type: 'backup',
db: this.combos.backup_db.value,
charset: this.combos.backup_charset.value,
zip: this.combos.backup_zip.value,
comment: this.comment.backup.value,
del_time: z('del_time').value,
del_count: z('del_count').value,
obj: this.tree.backup.save()
};
},
saveJob: function () {
var t = this.job2php();
t.job = z('sj_name').value, t.act = 'save_job', t.title = z('sj_title').value;
sxd.ajax('index', this.lng('sj'), t);
sxd.hideDialog('savejob');
},
runSavedJob: function (type, job) {
if (job == 0)return;
this.clearLogTab();
sxd.job.name = job;
sxd.job.type = type;
sxd.job.act = 'run_savedjob';
sxd.ajax('index', this.lng('run'), {act: 'run_savedjob', type: type, job: job}, 1);
this.openTab('log');
z('btn_resume').style.display = 'none';
z('btn_pause').style.display = '';
z('btn_stop').disabled = false;
z('btn_pause').disabled = false;
z('btn_again').disabled = true;
sxd.job.stop = 0;
sxd.informer();
},
saveOptions: function () {
sxd.confirms = z('conf_import').checked * 1 + z('conf_file').checked * 2 + z('conf_db').checked * 4;
sxd.ajax('index', this.lng('so'), {
act: 'save_options',
time_web: z('time_web').value * 1,
time_cron: z('time_cron').value * 1,
backup_path: z('backup_path').value,
backup_url: z('backup_url').value,
globstat: z('globstat').checked ? '1' : '0',
charsets: z('charsets').value,
only_create: z('only_create').value,
auth: z('auth').value,
confirm: sxd.confirms
});
sxd.hideDialog('connect');
z('con_pass').value = '';
},
clearLogTab: function () {
this.log.clear();
this.timer.set(0);
this.job.log_seek = 0;
this.progress.current.set(0);
this.progress.total.set(0);
},
runBackup: function () {
this.clearLogTab();
z('btn_resume').style.display = 'none';
z('btn_pause').style.display = '';
z('btn_down').style.display = 'none';
z('btn_stop').disabled = false;
z('btn_pause').disabled = false;
z('btn_again').disabled = true;
sxd.job.name = this.newJob();
sxd.job.type = 'backup';
var t = this.job2php();
this.openTab('log');
t.type = 'run', t.job = sxd.job.name;
this.ajax('index', this.lng('run'), t, 1);
sxd.job.stop = 0;
sxd.informer();
},
stopJob: function () {
z('btn_again').disabled = false;
z('btn_stop').disabled = true;
z('btn_pause').disabled = true;
sxd.ajax('info', this.lng('run'), {job: sxd.job.name, act: 'stop'}, 1);
},
pauseJob: function () {
z('btn_again').disabled = false;
z('btn_stop').disabled = true;
z('btn_pause').disabled = true;
sxd.ajax('info', this.lng('run'), {job: sxd.job.name, act: 'pause'}, 1);
z('btn_resume').style.display = '';
z('btn_pause').style.display = 'none';
},
resumeJob: function () {
z('btn_stop').disabled = false;
z('btn_pause').disabled = false;
z('btn_again').disabled = true;
sxd.ajax('index', this.lng('run'), {job: sxd.job.name, act: 'resume'}, 1);
z('btn_resume').style.display = 'none';
z('btn_pause').style.display = '';
sxd.job.stop = 0;
sxd.informer();
},
runAgain: function () {
if (sxd.job.act == 'run_savedjob') {
sxd.runSavedJob(sxd.job.type, sxd.job.name);
}
else if (sxd.job.type == 'backup') {
sxd.runBackup();
}
else if (sxd.job.type == 'restore') {
sxd.runRestore();
}
},
runRestore: function () {
if (sxd.confirms & 1 && !confirm(sxd.lng('fic')))return;
this.clearLogTab();
z('btn_resume').style.display = 'none';
z('btn_pause').style.display = '';
z('btn_down').style.display = 'none';
z('btn_stop').disabled = false;
z('btn_pause').disabled = false;
z('btn_again').disabled = true;
sxd.job.name = this.newJob();
sxd.job.type = 'restore';
var t = this.job2php();
this.openTab('log');
t.type = 'run', t.job = sxd.job.name;
this.ajax('index', this.lng('run'), t, 1);
sxd.job.stop = 0;
sxd.informer();
},
runServices: function (type) {
switch (type) {
case'delete':
if (sxd.confirms & 4 && !confirm(sxd.lng('ddc')))return;
sxd.ajax('index', sxd.lng('run'), {act: 'delete_db', name: this.combos.services_db.value});
return;
}
this.result.clear();
this.openTab('result');
this.ajax('index', this.lng('run'), {
act: 'services',
type: type,
db: this.combos.services_db.value,
check: this.combos.services_check.value,
repair: this.combos.services_repair.value,
obj: this.tree.services.save()
});
},
runFiles: function (type, file) {
file = file || this.files.selected.file;
switch (type) {
case'open':
sxd.combos.restore_file.select(file);
sxd.openTab('restore');
break;
case'download':
location.href = sxd.backupUrl + file;
break;
case'delete':
if (!file)return;
if (sxd.confirms & 2 && !confirm(sxd.lng('fdc')))return;
sxd.ajax('index', sxd.lng('run'), {act: 'delete_file', name: file});
sxd.actions.filelist();
break;
}
},
ajax: function (url, txt, req, nothide, onload) {
function obj2php(obj, depth) {
var s = '';
depth = depth || '';
for (var o in obj) {
s += typeof obj[o] == 'object' ? obj2php(obj[o], depth + '[' + o + ']') : 'ajax' + depth + '[' + o + ']=' + encodeURIComponent(obj[o]) + '&';
}
return s;
}
this.showLoading(txt);
url += '.php';
var params = obj2php(req);
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : (window.ActiveXObject ? new ActiveXObject('Microsoft.XMLHTTP') : null);
xhr.open('POST', url, true);
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
var t = this;
function oncomplete() {
if (xhr && xhr.readyState == 4) {
if (xhr.status == 200) {
eval(xhr.responseText);
}
else {
alert(xhr.statusText);
}
if (onload)onload();
xhr = null;
clearInterval(iv);
iv = null;
if (!nothide)t.hideLoading();
}
}
var iv = setInterval(oncomplete, 33);
xhr.send(params);
},
css: {
add: function (rule, index) {
var s = document.styleSheets[0];
if (!index)index = s.cssRules ? s.cssRules.length : s.rules.length;
if (s.addRule) {
if (/^([^{]+)\{(.*)\}\s*$/.test(rule)) {
s.addRule(RegExp.$1, RegExp.$2, index);
}
}
else {
s.insertRule(rule, index);
}
}, swap: function (elem, classes, sel) {
var tmp = elem.className.split(/\s+/);
for (var t in tmp) {
for (var c in classes) {
if (tmp[t] == classes[c]) {
tmp[t] = classes[sel];
break;
}
}
}
elem.className = tmp.join(' ');
}
},
showDialog: function (name) {
this.overlay.style.display = 'block';
var d = this.dialogs[name];
d.style.display = 'block';
d.style.marginTop = '-' + Math.round(d.clientHeight / 2 - 2) + 'px';
d.getElementsByTagName('input')[0].focus();
},
hideDialog: function (name) {
this.dialogs[name].style.display = 'none';
this.overlay.style.display = 'none';
},
addCombo: function (name, value, ico, opts) {
this.combos[name] = {ico: ico || 0, el: z(name)};
var c = this.combos[name];
var t;
if (typeof opts == 'object') {
opts = this.addOpt(opts);
}
else if (t = /^(\w+):(\w+)$/.exec(opts)) {
var tmp = {};
if (this.combos[t[2]].options.length > 0)tmp[opts] = this.combos[t[2]].options[this.combos[t[2]].sel].opts; else tmp[opts] = [];
value = this.addOpt(tmp, 1);
this.combos[t[2]].child = c;
}
else {
var t = {};
t[opts] = {};
opts = this.addOpt(t);
}
c.options = this.options[opts];
c.optName = opts;
c.name = name;
c.parent = this;
c.el.className = 'zSel';
c.el.innerHTML = '<div class="lb"></div><div class="txt" style="background-position:-16px ' + ((c.ico - 1) * -16) + 'px;"></div><div class="arr"><div class="mb"></div><div class="more"></div><div class="rb"></div></div>';
c.action = function () {
};
c.select = function (value, wheel) {
this.sel *= 1;
if (this.options == undefined)return false;
if (value == '+') {
this.sel += this.sel < this.options.length - 1 ? 1 : 0;
}
else if (value == '-') {
this.sel -= this.sel > 0 ? 1 : 0;
}
else {
this.sel = 0;
for (var i in this.options)if (this.options[i].value == value) {
this.sel = i;
break;
}
}
if (wheel) {
this.parent.menu.el.style.display = 'none';
document.body.onclick = null;
}
this.value = this.options[this.sel] ? this.options[this.sel].value : 0;
this.text = this.options[this.sel] ? this.options[this.sel].text : '';
this.el.childNodes[1].innerHTML = this.text;
if (this.child) {
this.parent.clearOpt(this.child.optName);
var tmp = {};
tmp[this.child.optName] = this.options[this.sel].opts;
this.child.select(this.parent.addOpt(tmp, 1), 0);
}
var _this = this;
if (wheel) {
clearTimeout(sxd.timeout);
sxd.timeout = setTimeout(function () {
_this.action();
}, 333);
}
else this.action();
};
c.select(value, 0);
c.action = this.actions[opts] || function () {
};
c.show = function () {
if (!c.el.disabled)_this.showMenu(c, c.options, {});
};
var _this = this;
c.el.onmouseover = function (e) {
e = e || window.event;
if (!c.el.disabled)c.el.className = 'zSel ovr';
};
c.el.onmousewheel = function (e) {
e = e || window.event;
var s = e.wheelDelta > 0 ? '-' : '+';
if (!c.el.disabled)c.select(s, 1);
};
if (c.el.addEventListener)c.el.addEventListener('DOMMouseScroll', function (e) {
e.wheelDelta = -e.detail;
c.el.onmousewheel(e);
}, false);
c.el.onmouseout = function (e) {
c.el.className = 'zSel';
};
c.el.onmousedown = function (e) {
e = e || window.event;
if (!c.el.disabled) {
if (_this.menu.el.style.display != 'none' && _this.menu.el.obj.name == c.name) {
_this.menu.el.style.display = 'none';
c.el.className = 'zSel ovr';
}
else {
c.el.className = 'zSel dwn';
c.show();
}
}
if (e.stopPropagation)e.stopPropagation();
e.cancelBubble = true;
};
},
addOpt: function (options, txt) {
txt = txt || 0;
var def = '';
for (var o in options) {
if (!this.options[o]) {
this.options[o] = [];
}
for (var i in options[o]) {
if (typeof options[o][i] == 'object')
this.options[o].push({text: i, value: i * 1 == i ? i * 1 : i, opts: options[o][i]}); else {
if (txt && options[o][i])def = i;
this.options[o].push({text: txt ? i : options[o][i], value: i * 1 == i ? i * 1 : i});
}
}
this.options[o] = this.options[o].sort(this.keyNatSort);
}
return txt ? def : o;
},
clearOpt: function (name) {
if (name) {
if (this.options[name])this.options[name].length = 0;
}
else for (var o in this.options)this.options[o].length = 0;
},
showMenu: function (obj, opts, cfg) {
var s = '', m = this.menu.el;
m.className = 'zSelMenu';
m.innerHTML = '<div style="width:100%;"></div>';
for (var o in opts) {
s = document.createElement('DIV');
s.innerHTML = opts[o].text;
s.title = s.firstChild.nodeValue || '';
if (o == obj.sel) {
s.className = 'ovr';
m.over = s;
}
s.value = opts[o].value;
s.onmouseover = function () {
if (m.over)m.over.className = '';
this.className = 'ovr';
m.over = this;
};
s.onmousedown = function () {
if (cfg.runjob)sxd.runSavedJob(m.obj.com, this.value); else if (cfg.btn)sxd.runServices(this.value); else m.obj.select(this.value, 0);
m.style.display = 'none';
};
m.firstChild.appendChild(s);
}
m.style.display = 'block';
var pos = this.offset(obj.el);
m.style.width = (cfg.width ? cfg.width : obj.el.offsetWidth - 4) + 'px';
var height = (m.firstChild.offsetHeight < 260 ? m.firstChild.offsetHeight : 260);
m.style.height = height + 'px';
m.style.top = pos.top - (cfg.btn ? height + obj.el.offsetHeight + 2 : 0) + 'px';
m.style.left = pos.left + 'px';
m.scrollTop = m.over ? m.over.offsetTop : 0;
m.obj = obj;
m.onmousedown = function (e) {
e = e || window.event;
if (e.stopPropagation)e.stopPropagation();
e.cancelBubble = true;
};
document.body.onmousedown = function () {
m.style.display = 'none';
document.body.onclick = null;
};
},
offset: function (el) {
var top = el.offsetTop + el.offsetHeight + 1, left = el.offsetLeft + 2;
while ((el = el.offsetParent))top += el.offsetTop - el.scrollTop, left += el.offsetLeft - el.scrollLeft;
return {top: top, left: left};
},
keyNatSort: function (a, b) {
var aa, bb;
a = a.value, b = b.value;
while ((aa = /^(\D+|(\d+))(.*?)$/.exec(a)) && (bb = /^(\D+|(\d+))(.*?)$/.exec(b))) {
if (aa[2] && bb[2] && aa[2] != bb[2])return aa[2] * 1 > bb[2] * 1 ? 1 : -1; else if (aa[1] && bb[1] && aa[1] != bb[1])return aa[1] > bb[1] ? 1 : -1; else if (aa[3] && bb[3] && aa[3] != bb[3])a = aa[3], b = bb[3]; else return 0;
}
},
formatSize: function (size, add) {
add = add || 0;
if (size >= 0) {
var i = 0;
while (size > 999 && (size /= 1024))i++;
size = (i > 0 ? size.toPrecision(3) : size) + ' ' + sxdlng.sizes[i];
if (add == 2)return size; else if (add == 1)return ' <span>[ ' + size + ' ]</span>';
return '[ ' + size + ' ]';
}
return '';
},
showLoading: function (txt) {
this.loading.innerHTML = txt;
this.loading.style.visibility = 'visible';
},
hideLoading: function () {
this.loading.style.visibility = 'hidden';
sxd.job.stop = 1;
z('btn_stop').disabled = true;
z('btn_pause').disabled = true;
z('btn_again').disabled = false;
},
newJob: function () {
var key = 'qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM1234567890';
var name = '';
for (var i = 0; i < 8; i++)name += key.charAt(Math.round(Math.random() * 61));
return name;
}
};
function zTreeObject() {
return {
init: function (elem, num) {
this.el = z(elem);
this.name = elem;
this.prefix = 'zti_' + num + '_';
this.id = '#' + elem;
this.index = [];
this.data = [];
this.load = true;
this.err = false;
var _this = this;
this.el.className = 'zTree';
this.el.onselectstart = function () {
return false;
};
this.el.onclick = function (e) {
e = e || window.event;
var t = e.target || e.srcElement;
switch (t.tagName.toUpperCase()) {
case'I':
if (t.className == 'pm') {
_this.openBranch(_this.getId(t));
}
else if (t.className.match(/^cb[0124]$/)) {
_this.clickBranch(_this.getId(t));
}
break;
case'A':
_this.clickBranch(_this.getId(t));
if (e.stopPropagation)e.stopPropagation();
e.cancelBubble = true;
break;
}
if (t.parentNode.tagName.toUpperCase() == 'A') {
_this.clickBranch(_this.getId(t));
}
return false;
};
this.el.onmousedown = function (e) {
e = e || window.event;
var t = e.target || e.srcElement;
if (t.tagName.toUpperCase() == 'A' || t.parentNode.tagName.toUpperCase() == 'A') {
return false;
}
};
var treeIcons = ['li.df > div', 'li.dt > div', 'li.dl > div', '.close .pm', '.pm', '.cb0', '.cb1', '.cb2', '.cb3', '.cb4'];
for (var ico in treeIcons) {
sxd.css.add('.zTree ' + treeIcons[ico] + ' {background-position: 0 -' + (ico * 18) + 'px;}');
}
var Icons = ['.cTA', '.cVI', '.cPR', '.cFU', '.cTR', '.cEV', '.iTA', '.iVI', '.iPR', '.iFU', '.iTR', '.iEV'];
for (ico in Icons) {
sxd.css.add('.zTree ' + Icons[ico] + ' {background-position: 0 -' + (ico * 16) + 'px;}');
}
}, getId: function (o) {
while (!o.parentNode.id && (o = o.parentNode)) {
}
return o.parentNode.id.replace(this.prefix, '') * 1;
}, openBranch: function (id) {
var o = this.index[id];
o.open = (o.open + 1) % 2;
sxd.css.swap(o.el, ['close', 'open'], o.open);
}, clickBranch: function (id) {
if (sxd.version.type == 'lite' && this.name == 'restore_tree') {
alert(sxd.lng('pro'));
return false;
}
var o = this.index[id];
if (o.checked == 3) {
return false;
}
this.setCheckBox(id, o.checked == 4 ? 1 : (o.checked + 1) % (o.type.match(/^.TA$/) ? 3 : 2));
this.changeChilds(o);
this.checkParents(o);
}, setCheckBox: function (id, check) {
check = (this.index[id].typen == 2 && check == 1 && this.index[id].size == undefined) ? 2 : check;
this.index[id].checked = check;
this.index[id].el.firstChild.childNodes[1].className = 'cb' + check;
}, changeChilds: function (o) {
if (o.childs) {
for (var c in o.childs) {
this.setCheckBox(o.childs[c].id, o.checked);
this.changeChilds(o.childs[c]);
}
}
}, checkParents: function (o) {
var check;
while (o.pid > 0) {
o = this.index[o.pid];
check = -1;
for (var c in o.childs) {
if (check >= 0 && check != o.childs[c].checked) {
check = 4;
break;
}
check = o.childs[c].checked;
}
this.setCheckBox(o.id, check);
}
if (o.id == 1) {
this.recountSizes(o);
}
}, drawTree: function (d) {
this.load = this.err = false;
if (typeof(d) != 'object')return false;
var index = [''], data = [];
var types = ['', 'cTA', 'iTA', 'cVI', 'iVI', 'cPR', 'iPR', 'cFU', 'iFU', 'cTR', 'iTR', 'cEV', 'iEV'];
for (var k = 0, l = d.length; k < l; k++) {
o = {};
o.id = d[k][0];
o.pid = d[k][1];
o.parent = index[o.pid];
o.name = d[k][2];
o.type = types[d[k][3]];
o.typen = d[k][3];
o.checked = d[k][4] || 0;
if (d[k][3] < 3)o.size = d[k][3] == 2 ? d[k][5] : 0;
if (d[k][3] & 1)o.childs = [], o.open = d[k][5] || 0;
index[o.id] = o;
if (o.pid > 0)index[o.pid].childs.push(o); else data.push(o);
}
this.lastId = 0;
this.el.innerHTML = this.drawChilds(data, 0);
for (k = 1, l = index.length; k < l; k++) {
if (!index[k])continue;
o = z(this.prefix + index[k].id);
index[k].el = o;
}
this.data = data;
this.index = index;
}, recountSizes: function (o) {
if (!o.childs) {
return 0;
}
var size = 0;
for (var k in o.childs) {
size += this.recountSizes(o.childs[k]);
if (o.childs[k].type == 'iTA' && o.childs[k].checked == 1) {
size += o.childs[k].size || 0;
}
}
o.el.getElementsByTagName('span')[0].innerHTML = sxd.formatSize(size, 0);
return size;
}, drawChilds: function (aChilds, pid) {
if (aChilds.length == 0)return '';
var sTree = '<ul>';
var cLi, cPlus, cCheck, cIcon, sChilds, o, nChild = 0, lastChild = aChilds.length, pCheck = -1, chSize = 0;
for (var k = 0; k < lastChild; k++) {
o = aChilds[k];
if (o.childs && o.childs.length > 0) {
cPlus = 'pm';
sChilds = this.drawChilds(o.childs, o.id);
}
else {
if (pid == 0) {
o.checked = 3;
}
cPlus = sChilds = '';
}
pCheck = (pCheck >= 0 && pCheck != o.checked) ? 4 : o.checked;
++nChild;
if (lastChild == nChild) {
cLi = 'dl';
}
else {
cLi = 'dt';
}
cCheck = 'cb' + o.checked;
cIcon = o.type || 'iTA';
if (o.size && (o.checked == 1 || o.checked == 4)) {
chSize += o.size;
}
sTree += '<li class="' + cLi + (o.open ? ' open' : ' close') + '" id="' + this.prefix + o.id + '"><div><i class="' + cPlus
+ '"></i><i class="' + cCheck + '"></i><a href="#"><i class=' + cIcon + '></i> ' + o.name
+ sxd.formatSize(o.size, 1) + ' </a></div>' + sChilds + '</li>';
}
if (o.pid > 0) {
o.parent.checked = pCheck;
if (chSize > 0) {
o.parent.size += chSize;
}
}
return sTree + '</ul>';
}, save: function () {
if (this.err)return null;
var data = this.data;
var saved = {TA: [], TC: [], VI: [], PR: [], FU: [], TR: [], EV: []};
var o, c, tc;
for (var i1 = 0, l1 = data.length; i1 < l1; i1++) {
o = data[i1];
if (o.checked == 4) {
for (var i2 = 0, l2 = o.childs.length; i2 < l2; i2++) {
c = o.childs[i2];
if (c.checked == 4) {
for (var i3 = 0, l3 = c.childs.length; i3 < l3; i3++) {
tc = c.childs[i3];
if (tc.checked == 1)saved['TA'].push(tc.name); else if (tc.checked == 2)saved['TC'].push(tc.name);
}
}
else if (c.checked == 1)saved[c.type.substr(1, 2)].push(c.name); else if (c.checked == 2)saved['TC'].push(c.name);
}
}
else if (o.checked == 1)saved[o.type.substr(1, 2)].push('*'); else if (o.checked == 2)saved['TC'].push('*');
}
return saved;
}, error: function (str) {
str = str || 'Empty';
this.err = true;
this.el.innerHTML = '<div class=error><div>' + str + '</div></div>';
}
};
}
function zToolbarObject() {
return {
init: function (elem, buttons) {
this.el = z(elem);
this.name = elem;
this.id = '#' + elem;
this.el.className = 'zTBar';
this.buttons = buttons;
this.curBtn = {id: 0, more: 0, pop: 0, el: null, com: null};
var _this = this;
this.el.onmouseover = function (e) {
if (_this.curBtn.pop)return;
if (_this.getId(e || window.event)) {
_this.curBtn.el.className = 'btn ovr';
}
};
this.el.onmouseout = function (e) {
if (_this.curBtn.pop)return;
if (_this.getId(e || window.event)) {
_this.curBtn.el.className = 'btn';
}
};
this.el.onmousedown = function (e) {
e = e || window.event;
if (_this.curBtn.pop)return;
if (_this.getId(e || window.event)) {
_this.curBtn.el.className = _this.curBtn.more ? 'btn ovr' : 'btn dwn';
if (_this.curBtn.more) {
_this.curBtn.el.lastChild.className = 'arr dwn';
_this.curBtn.pop = 1;
sxd.showMenu(_this.curBtn, sxd.options['sj_' + _this.curBtn.com], {width: 220, runjob: true});
document.body.onclick = function () {
_this.curBtn.el.className = 'btn';
_this.curBtn.el.lastChild.className = 'arr';
_this.curBtn.pop = 0;
document.body.onclick = null;
};
if (e.stopPropagation)e.stopPropagation();
e.cancelBubble = true;
}
}
};
this.el.onmouseup = function (e) {
if (_this.curBtn.pop)return;
if (_this.getId(e || window.event)) {
_this.curBtn.el.className = 'btn ovr';
if (_this.curBtn.more) {
_this.curBtn.el.lastChild.className = 'arr';
}
sxd.actions['tab_' + _this.curBtn.com](_this.curBtn.more);
}
};
var icons = {
'.btn.ovr': '0 -28px',
'.ovr .lb': '0 -72px',
'.ovr .rb': '-4px -72px',
'.ovr .mb': '0 -138px',
'.btn.dwn': '0 -94px',
'.dwn .lb': '0 -116px',
'.dwn .rb': '-4px -116px',
'.dwn .mb': '-4px -138px',
'.dwn.arr': '0 -94px',
'.dwn.arr .mb': '-4px -50px'
};
for (var ico in icons) {
sxd.css.add('.zTBar ' + ico + ' {background-position:' + icons[ico] + ';}');
}
var btn, sTBar = '';
for (var b in buttons) {
btn = buttons[b];
if (btn[0] == '|') {
sTBar += '<div class="spl"></div>';
continue;
}
ico = ' style="background-position:-16px ' + ((btn[2] - 1) * -16) + 'px;"';
sTBar += '<div class="btn" id="ztbi_' + b + '"><div class="lb"></div>';
sTBar += btn[3] & 1 ? '<div class="txt"' + ico + '>' + btn[1] + '</div>' : '<div class="ico" title="' + btn[1] + '"' + ico + '></div>';
sTBar += btn[3] & 2 ? '<div class="arr"><div class="mb"></div><div class="more"></div><div class="rb"></div></div>' : '<div class="rb"></div>';
sTBar += '</div>';
}
this.el.innerHTML = sTBar;
if (this.el.lastChild.offsetTop > 30) {
btn = this.el.lastChild.childNodes[1];
btn.className = 'ico';
btn.title = btn.innerHTML;
btn.innerHTML = '';
}
}, getId: function (e) {
var o = e.target || e.srcElement;
var r = {id: 0, more: 0, pop: 0, el: null, com: null};
while (!o.id) {
if (o.className.match(/arr/)) {
r.more = 1;
}
o = o.parentNode;
}
if (o.id && o.className != 'zTBar') {
r.id = o.id.replace('ztbi_', '') * 1;
r.el = o;
r.com = this.buttons[r.id][0];
this.curBtn = r;
return true;
}
return false;
}
};
}
function zProgressObject() {
return {
init: function (elem, type) {
this.el = z(elem);
this.name = elem;
this.type = type;
this.el.className = 'zProc ' + (type == 2 ? 'blue' : 'green');
this.el.innerHTML = '<div class=bot><div class=txt>0%</div></div><div class=top><div class=txt>0%</div></div>';
this.txt1 = this.el.firstChild.firstChild;
this.txt2 = this.el.lastChild.firstChild;
this.top = this.el.lastChild;
}, set: function (proc, size, cur, tot) {
proc = proc > 0 ? (proc > 100 ? 100 : proc) : 0;
size = size || 0;
cur = cur || 0;
tot = tot || 0;
this.txt1.innerHTML = proc + '%' + (size ? ' ' + sxd.formatSize(size) : '') + (cur && tot ? ' [' + cur + '/' + tot + ']' : '');
this.txt2.innerHTML = this.txt1.innerHTML;
if (this.type == 2)document.title = proc + '% - ' + sxd.version.full;
this.top.style.width = Math.round(proc * 3) + 'px';
}
};
}
function zGridObject() {
return {
init: function (elem, cfg) {
this.el = z(elem);
this.name = elem;
this.cfg = cfg;
this.el.className = 'zGrid';
var header = '';
this.cols = cfg.header.length;
for (var i = 0; i < this.cols; i++) {
header += '<th' + (cfg.header[i][1] ? ' width=' + cfg.header[i][1] : '') + '>' + cfg.header[i][0] + '</th>';
}
this.el.innerHTML = '<div class=header><div><table cellspacing=0><tr>' + header + '</tr></table></div></div><div style="overflow-x:hidden;overflow-y:auto;"><table cellspacing="0"></table></div>';
this.data = this.el.lastChild.firstChild;
this.datadiv = this.el.lastChild;
this.data.style.width = cfg.width + 'px';
this.el.firstChild.style.height = '22px';
this.el.firstChild.style.width = (cfg.width - 1) + 'px';
this.datadiv.style.height = (cfg.height - 23) + 'px';
this.datadiv.style.width = (cfg.width - 1) + 'px';
if (this.name == 'sxdGrid1') {
this.oldtime = '';
this.add = this.addLog;
}
else {
var _this = this;
this.selected = null;
this.add = function (rows) {
if (typeof rows[0] == 'object') {
for (var row in rows)this.addRow(rows[row]);
}
else this.addRow(rows);
};
this.datadiv.onclick = function () {
_this.selected.className = '';
_this.selected = null;
};
}
}, addLog: function (time, txt, color) {
var newrow, td1, td2;
for (var i = 0; i < txt.length; i++) {
newrow = this.data.insertRow(-1);
td1 = newrow.insertCell(-1);
td2 = newrow.insertCell(-1);
td1.width = 120;
if (!i) {
td1.innerHTML = this.oldtime != time ? time : '&nbsp;';
this.oldtime = time;
}
td2.className = 'wrap';
td2.innerHTML = txt[i] || '&nbsp;';
if (color)td2.style.color = color;
}
this.datadiv.scrollTop = this.datadiv.scrollHeight;
}, addRow: function (row) {
var newrow = this.data.insertRow(-1);
var td;
if (this.name == 'sxdGrid2')row[5] = sxd.formatSize(row[5], 2);
for (var i = 0; i < this.cols; i++) {
td = newrow.insertCell(-1);
if (this.cfg.header[i][1])td.width = this.cfg.header[i][1];
if (this.cfg.header[i][2] == 1)td.style.textAlign = 'right';
td.innerHTML = row[i] || '&nbsp;';
td.title = row[i] || '';
if (i == 0 && this.name == 'sxdGrid2')td.title += "\n" + row[7];
}
newrow.file = row[this.cols];
var _this = this;
newrow.onclick = function (e) {
e = e || window.event;
if (_this.selected)_this.selected.className = '';
this.className = 'sel';
_this.selected = this;
if (e.stopPropagation)e.stopPropagation();
e.cancelBubble = true;
};
newrow.ondblclick = function (e) {
e = e || window.event;
if (_this.selected)_this.selected.className = '';
this.className = 'sel';
_this.selected = this;
sxd.runFiles('open');
if (e.stopPropagation)e.stopPropagation();
e.cancelBubble = true;
};
}, clear: function () {
for (var i = 0, l = this.data.rows.length; i < l; i++) {
this.data.deleteRow(0);
}
this.oldtime = '';
}
};
}