+ if (is_array($ctx))
+ {
+ foreach($ctx as $postname)
+ {
+ $context[$postname] = get_post($postname);
+ }
+ } else
+ $context = isset($_SESSION[$ctx]) ? $_SESSION[$ctx] : null;
+
+ array_unshift($_SESSION['Context'], array('name' => $ctx,
+ 'ctx' => $context,
+ 'caller' => $_SERVER['PHP_SELF'],
+ 'ret' => array()));
+ meta_forward($call);
+}
+/*
+ Restores context after external page call and
+ returns array of data passed by external page.
+*/
+function context_restore()
+{
+ if ( count($_SESSION['Context'])) {
+ if ($_SERVER['PHP_SELF'] == $_SESSION['Context'][0]['caller']) {
+ $ctx = array_shift($_SESSION['Context']);
+ if ($ctx) {
+ if (is_array($ctx['ctx'])) {
+ foreach($ctx['ctx'] as $name => $val)
+ {
+ $_POST[$name] = $val;
+ }
+ } else
+ if ($ctx['name']!='')
+ $_SESSION[$ctx['name']] = $ctx['ctx'];
+ return $ctx['ret'];
+ }
+ }
+ }
+ return false;
+}
+
+/*
+ Return to caller page if the page was called from external context.
+*/
+function context_return($ret)
+{
+ if ( count($_SESSION['Context'])) {
+ $ctx = &$_SESSION['Context'][0];
+ $ctx['ret'] = $ret;
+ meta_forward( $ctx['caller'] );
+ }
+}
+/*
+ Clearing context stack after page cancel.
+*/
+function context_reset()
+{
+ $_SESSION['Context'] = array();
+}
+
+/*
+ Context stack initialization
+*/
+if (!isset($_SESSION['Context'])) {
+ context_reset();
+}
+/*
+ Redirector for selector F4 calls.
+ $sel_editors is array of selname=>editor_page
+*/
+function editor_redirect($sel_editors, $save_fun='') {
+ foreach ($sel_editors as $selname=>$editor)
+ if (isset($_POST['_'.$selname.'_editor'])) {
+ if (function_exists($save_fun))
+ $save_fun();
+ unset($_POST['_'.$selname.'_editor']);
+ context_call($editor, array_keys($_POST));
+ }
+}
+/*
+ Return procedure for selector F4 calls
+*/
+function editor_return($vars, $restore_fun='') {
+ if (function_exists($restore_fun))
+ $restore_fun();
+
+ if ($ret = context_restore()) {
+ foreach ($vars as $postname=>$retname)
+ if (isset($ret[$retname])) {
+ $_POST[$postname] = $ret[$retname];
+ set_focus($postname);
+ }
+ }
+}
+