protected function callback($args)
{
$checkReg = '/[^a-zA-Z0-9;._-]/';
$node = isset($args['node']) && !preg_match($checkReg, $args['node']) ? $args['node'] : '';
$json = isset($args['json']) && json_decode($args['json']) ? $args['json'] : '{}';
$bind = isset($args['bind']) && !preg_match($checkReg, $args['bind']) ? $args['bind'] : '';
$done = !empty($args['done']);
while (ob_get_level()) {
if (!ob_end_clean()) {
break;
}
}
if ($done || !$this->callbackWindowURL) {
$script = '';
if ($node) {
if ($bind) {
$trigger = 'elf.trigger(\'' . $bind . '\', data);';
$triggerdone = 'elf.trigger(\'' . $bind . 'done\');';
$triggerfail = 'elf.trigger(\'' . $bind . 'fail\', data);';
} else {
$trigger = $triggerdone = $triggerfail = '';
}
$script .= '
var w = window.opener || window.parent || window;
try {
var elf = w.document.getElementById(\'' . $node . '\').elfinder;
if (elf) {
var data = ' . $json . ';
if (data.error) {
' . $triggerfail . '
elf.error(data.error);
} else {
data.warning && elf.error(data.warning);
data.removed && data.removed.length && elf.remove(data);
data.added && data.added.length && elf.add(data);
data.changed && data.changed.length && elf.change(data);
' . $trigger . '
' . $triggerdone . '
data.sync && elf.sync();
}
}
} catch(e) {
// for CORS
w.postMessage && w.postMessage(JSON.stringify({bind:\'' . $bind . '\',data:' . $json . '}), \'*\');
}';
}
$script .= 'window.close();';
$out = '<!DOCTYPE html><html><head><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><script>' . $script . '</script></head><body><a href="#" onlick="window.close();return false;">Close this window</a></body></html>';
header('Content-Type: text/html; charset=utf-8');
header('Content-Length: ' . strlen($out));
header('Cache-Control: private');
header('Pragma: no-cache');
echo $out;
} else {
$url = $this->callbackWindowURL;
$url .= (strpos($url, '?') === false ? '?' : '&') . '&node=' . rawurlencode($node) . ($json !== '{}' ? '&json=' . rawurlencode($json) : '') . ($bind ? '&bind=' . rawurlencode($bind) : '') . '&done=1';
header('Location: ' . $url);
}
exit;
}