diff -rcN ppa.cvs ppa.dev diff -rcN ppa.cvs/aggregates.php ppa.dev/aggregates.php *** ppa.cvs/aggregates.php 2007-01-15 16:48:17.000000000 +0100 --- ppa.dev/aggregates.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 276,281 **** --- 276,283 ---- 'aggrname' => array( 'title' => $lang['strname'], 'field' => 'proname', + 'url' => "redirect.php?subject=aggregate&action=properties&{$misc->href}&", + 'vars' => array('aggrname' => 'proname', 'aggrtype' => 'proargtypes'), ), 'aggrtype' => array( 'title' => $lang['strtype'], *************** *** 299,309 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "redirect.php?subject=aggregate&action=properties&{$misc->href}&", - 'vars' => array('aggrname' => 'proname', 'aggrtype' => 'proargtypes'), - ), 'alter' => array( 'title' => $lang['stralter'], 'url' => "{$PHP_SELF}?action=alter&{$misc->href}&", --- 301,306 ---- diff -rcN ppa.cvs/ajax_display.php ppa.dev/ajax_display.php *** ppa.cvs/ajax_display.php 1970-01-01 01:00:00.000000000 +0100 --- ppa.dev/ajax_display.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 0 **** --- 1,162 ---- + processRequests(); + + /** ajax function handle definitions **/ + function printFk($id, $fk, $params, $nbcols) { + global $misc, $data, $lang; + + if (!empty($fk['ns'])) + $req = "SELECT * from {$fk['ns']}.{$fk['reftab']} WHERE TRUE"; + else $req = "SELECT * from {$fk['reftab']} WHERE TRUE"; + + foreach ($fk['fkeys'] as $i => $col) { + $v = strtr($params[$i], + array( + '&' => '&', + ''' => "'", + '"' => '"', + '<' => '<', + '>' => '>' + ) + ); + $req.= sprintf(" AND $col='%s'", pg_escape_string($v)); + } + + $rs = $data->selectSet($req); + + $res = sprintf( + ' + + ' + , $id, $fk['name'], $lang['strclose'], $misc->icon('Delete') + ); + + foreach (array_keys($rs->fields) as $k) + $res.= ""; + $res.= + " + \n"; + + $j = 0; + foreach ($rs->fields as $v) { + $finfo = $rs->fetchField($j); + $res.= sprintf( + "\n" + , $misc->printVal($v, $finfo->type, array('null' => true, 'clip' => true)) + ); + $j++; + } + $res.= "
+ [close] + $k
%s
\n"; + + $objResponse = new xajaxResponse(); + + $objResponse->addInsertAfter($id, 'tr', "tr{$fk['name']}$id"); + $objResponse->addCreate("tr{$fk['name']}$id", 'td', "td{$fk['name']}$id"); + $objResponse->addAssign("td{$fk['name']}$id", 'colSpan', $nbcols); + $objResponse->addAssign("td{$fk['name']}$id", 'innerHTML', $res); + + return $objResponse->getXML(); + } + + function removeFk($id, $fk) { + $objResponse = new xajaxResponse(); + $objResponse->addRemove("tr$fk$id"); + return $objResponse->getXML(); + } + + /** + * Get a table row, format them and return xml'ed result to + * be processed by xajax. + * @param $id tr's id + * @param $col col that called the function + * @param $ns referenced table's namespace + * @param $t referenced table + * @param $keys key values "key=value,key2=value2,..." + * @param $nbcols number of colspan + */ + /*function printFkOld($id, $col, $ns, $t, $keys, $nbcols) { + global $misc, $data, $lang; + + if (!empty($ns)) + $req = "SELECT * from $ns.$t WHERE TRUE"; + else $req = "SELECT * from $t WHERE TRUE"; + + while ($k = array_shift($keys)) + $req.= sprintf(" AND $k='%s'", pg_escape_string(strtr(array_shift($keys), array('&' => '&', ''' => "'", '"' => '"', '<' => '<', '>' => '>')))); + + $rs = $data->selectSet($req); + + if ($data->hasForeignKeysInfo()) + $tmp = $data->getForeignKeys($t, $ns); + else + $tmp = array(); + + if (!empty($tmp)) { + $fkeys = array(); + foreach ($tmp as $fkn => $fks) { + foreach ($fks['keys'] as $k => $v) + $fkeys[$k] =& $tmp[$fkn]; + } + unset($tmp); + } + + $res = sprintf('' + , $id, $col, $lang['strclose'], $misc->icon('Delete')); + + foreach (array_keys($rs->fields) as $k) + $res.= ""; + + $res.= "\n\n"; + + $j = 0; + foreach ($rs->fields as $v) { + $finfo = $rs->fetchField($j); + $fname = $misc->printVal($finfo->name); + if (isset($fkeys[$fname]) && !is_null($v)) { + $res.= sprintf("\n" + , count($rs->fields) + 1, $misc->printVal($v, $finfo->type, array('null' => true, 'clip' => true)) + ); + } + else + $res.= sprintf("\n" + , $misc->printVal($v, $finfo->type, array('null' => true, 'clip' => true))); + $j++; + } + $res.= "\n
+ [close]$k
+ printVal($v)}\'"); + } + $res.= sprintf("', %s);\">%s\n%s
\n"; + + $objResponse = new xajaxResponse(); + + $objResponse->addInsertAfter($id, 'tr', "FKtr$col$id"); + $objResponse->addCreate("FKtr$col$id", 'td', "rFKtd$col$id"); + $objResponse->addAssign("rFKtd$col$id", 'colSpan', $nbcols); + $objResponse->addAssign("rFKtd$col$id", 'innerHTML', "" . $res); + + return $objResponse->getXML(); + } + */ + ?> diff -rcN ppa.cvs/all_db.php ppa.dev/all_db.php *** ppa.cvs/all_db.php 2007-03-30 20:31:50.000000000 +0200 --- ppa.dev/all_db.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 275,280 **** --- 275,282 ---- 'database' => array( 'title' => $lang['strdatabase'], 'field' => 'datname', + 'url' => "redirect.php?subject=database&{$misc->href}&", + 'vars' => array('database' => 'datname'), ), 'owner' => array( 'title' => $lang['strowner'], *************** *** 303,313 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "redirect.php?subject=database&{$misc->href}&", - 'vars' => array('database' => 'datname'), - ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "{$PHP_SELF}?action=confirm_drop&subject=database&{$misc->href}&", --- 305,310 ---- diff -rcN ppa.cvs/classes/Ajax.php ppa.dev/classes/Ajax.php *** ppa.cvs/classes/Ajax.php 1970-01-01 01:00:00.000000000 +0100 --- ppa.dev/classes/Ajax.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 0 **** --- 1,33 ---- + xjx = new xajax('', ''); + else + $this->xjx = new xajax($url . '?' . 'server=' . urlencode($_REQUEST['server']) .'&database=' . urlencode($_REQUEST['database']), ''); + + foreach ($fns as $fn) { + $this->xjx->registerFunction($fn); + } + } + + /** + * @return the javascripts functions needed in browser side + */ + function getJs() { + return $this->xjx->getJavascript('libraries/xajax'); + } + + /** + * Process xajax request in server side + */ + function processRequests() { + $this->xjx->processRequests(); + } + } + ?> diff -rcN ppa.cvs/classes/database/Postgres73.php ppa.dev/classes/database/Postgres73.php *** ppa.cvs/classes/database/Postgres73.php 2007-01-10 03:01:17.000000000 +0100 --- ppa.dev/classes/database/Postgres73.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 1202,1207 **** --- 1202,1251 ---- // Constraint functions /** + * A function to get all foreign keys on a table + * @param $table the table's name + * @param $ns the table's namespace + * return An associative array of foreign keys : + * array( + * constraint_id => array( + * 'reftab' => referenced table + * 'ns' => referenced table's namespace + * 'keys' => array( + * col => foreign col,... + * ) + * ) + * ) + */ + function getForeignKeys($table, $ns) { + $this->clean($table); + $this->clean($ns); + $sql = "SELECT c.conname, cl2.relname, ns.nspname, t.tgargs + FROM + pg_trigger t,pg_class cl,pg_proc p,pg_constraint c,pg_class cl2,pg_namespace ns + WHERE + t.tgenabled AND t.tgrelid = cl.oid AND t.tgfoid = p.oid AND p.proname = 'RI_FKey_check_ins' AND c.conname=tgconstrname + AND c.confrelid = cl2.oid AND cl2.relnamespace=ns.oid AND c.conrelid = ( + SELECT oid FROM pg_catalog.pg_class + WHERE relname='$table' AND relnamespace = (SELECT oid FROM pg_catalog.pg_namespace WHERE nspname='$ns'))"; + $rs = $this->SelectSet($sql); + $a = array(); + if ($rs && !$rs->EOF) { + $arr =& $rs->GetArray(); + foreach($arr as $v) { + $data = explode(chr(0), $v['tgargs']); + $nb = (count($data) - 5) / 2; // count numbers of fields in the FK + $a[$data[0]]['reftab'] = $data[2]; + $a[$data[0]]['ns'] = $v['nspname']; + $a[$data[0]]['keys'] = array(); + for ($i=$nb; $i>0; $i--) + $a[$data[0]]['keys'][$data[($i*2)+2]] = $data[($i*2)+3]; + } + return $a; + } + return $a; + } + + /** * A function for getting all columns linked by foreign keys given a group of tables * @param $tables multi dimensional assoc array that holds schema and table name * @return An array of linked tables and columns diff -rcN ppa.cvs/classes/database/Postgres.php ppa.dev/classes/database/Postgres.php *** ppa.cvs/classes/database/Postgres.php 2007-04-06 00:27:35.000000000 +0200 --- ppa.dev/classes/database/Postgres.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 3999,4004 **** --- 3999,4005 ---- foreach ($values as $k => $v) { if ($v != '' || $this->selectOps[$ops[$k]] == 'p') { $this->fieldClean($k); + $this->clean($v); if ($first) { $sql .= " WHERE "; $first = false; *************** *** 4008,4017 **** // Different query format depending on operator type switch ($this->selectOps[$ops[$k]]) { case 'i': - // Only clean the field for the inline case - // this is because (x), subqueries need to - // to allow 'a','b' as input. - $this->clean($v); $sql .= "\"{$k}\" {$ops[$k]} '{$v}'"; break; case 'p': --- 4009,4014 ---- diff -rcN ppa.cvs/classes/Misc.php ppa.dev/classes/Misc.php *** ppa.cvs/classes/Misc.php 2007-03-15 17:14:10.000000000 +0100 --- ppa.dev/classes/Misc.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 778,783 **** --- 778,784 ---- 'url' => 'tblproperties.php', 'urlvars' => array('subject' => 'table', 'table' => field('table')), 'icon' => 'Columns', + 'branch'=> true, ), 'indexes' => array ( 'title' => $lang['strindexes'], *************** *** 785,790 **** --- 786,792 ---- 'urlvars' => array('subject' => 'table', 'table' => field('table')), 'help' => 'pg.index', 'icon' => 'Indexes', + 'branch'=> true, ), 'constraints' => array ( 'title' => $lang['strconstraints'], *************** *** 792,797 **** --- 794,800 ---- 'urlvars' => array('subject' => 'table', 'table' => field('table')), 'help' => 'pg.constraint', 'icon' => 'Constraints', + 'branch'=> true, ), 'triggers' => array ( 'title' => $lang['strtriggers'], *************** *** 799,804 **** --- 802,808 ---- 'urlvars' => array('subject' => 'table', 'table' => field('table')), 'help' => 'pg.trigger', 'icon' => 'Triggers', + 'branch'=> true, ), 'rules' => array ( 'title' => $lang['strrules'], *************** *** 806,811 **** --- 810,816 ---- 'urlvars' => array('subject' => 'table', 'table' => field('table')), 'help' => 'pg.rule', 'icon' => 'Rules', + 'branch'=> true, ), 'info' => array ( 'title' => $lang['strinfo'], *************** *** 825,836 **** --- 830,843 ---- 'url' => 'tblproperties.php', 'urlvars' => array('subject' => 'table', 'table' => field('table'), 'action' => 'import'), 'icon' => 'Import', + 'hide' => true, ), 'export' => array ( 'title' => $lang['strexport'], 'url' => 'tblproperties.php', 'urlvars' => array('subject' => 'table', 'table' => field('table'), 'action' => 'export'), 'icon' => 'Export', + 'hide' => true, ), ); *************** *** 841,846 **** --- 848,854 ---- 'url' => 'viewproperties.php', 'urlvars' => array('subject' => 'view', 'view' => field('view')), 'icon' => 'Columns', + 'branch'=> true, ), 'definition' => array ( 'title' => $lang['strdefinition'], *************** *** 854,859 **** --- 862,868 ---- 'urlvars' => array('subject' => 'view', 'view' => field('view')), 'help' => 'pg.rule', 'icon' => 'Rules', + 'branch'=> true, ), 'privileges' => array ( 'title' => $lang['strprivileges'], *************** *** 867,872 **** --- 876,882 ---- 'url' => 'viewproperties.php', 'urlvars' => array('subject' => 'view', 'view' => field('view'), 'action' => 'export'), 'icon' => 'Export', + 'hide' => true, ), ); *************** *** 1500,1506 **** function printUrlVars(&$vars, &$fields) { foreach ($vars as $var => $varfield) { ! echo "{$var}=", urlencode($fields[$varfield]), "&"; } } --- 1510,1520 ---- function printUrlVars(&$vars, &$fields) { foreach ($vars as $var => $varfield) { ! if (is_array($varfield)) ! foreach ($varfield as $v) ! printf("%s[%s]=%s&", $var, $v, urlencode($fields[$v])); ! else ! echo "{$var}=", urlencode($fields[$varfield]), "&"; } } *************** *** 1560,1576 **** unset($columns['comment']); } - // Apply the 'properties' action to the first column - // and remove it from the action list. - // (Remove this section to keep the 'Properties' button instead of links) - if (isset($actions['properties'])) { - reset($columns); - list($first_column) = each($columns); - $columns[$first_column]['url'] = $actions['properties']['url']; - $columns[$first_column]['vars'] = $actions['properties']['vars']; - unset($actions['properties']); - } - if (isset($columns['comment'])) { // Uncomment this for clipped comments. // TODO: This should be a user option. --- 1574,1579 ---- *************** *** 1614,1620 **** if (!is_null($pre_fn)) $alt_actions = $pre_fn($tabledata, $actions); if (!isset($alt_actions)) $alt_actions =& $actions; ! echo "\n"; if (isset($multiactions)) { foreach ($multiactions['keycols'] as $k => $v) $a[$k] = $tabledata->fields[$v]; --- 1617,1623 ---- if (!is_null($pre_fn)) $alt_actions = $pre_fn($tabledata, $actions); if (!isset($alt_actions)) $alt_actions =& $actions; ! echo "\n"; if (isset($multiactions)) { foreach ($multiactions['keycols'] as $k => $v) $a[$k] = $tabledata->fields[$v]; *************** *** 1649,1662 **** $misc->printUrlVars($column['vars'], $tabledata->fields); echo "\">"; } ! $type = isset($column['type']) ? $column['type'] : null; $params = isset($column['params']) ? $column['params'] : array(); echo $misc->printVal($tabledata->fields[$column['field']], $type, $params); } - if (isset($column['url'])) echo ""; - echo "\n"; break; } --- 1652,1680 ---- $misc->printUrlVars($column['vars'], $tabledata->fields); echo "\">"; } ! else if (isset($column['tag'])) { ! if ((!isset($column['tag']['nonull'])) ! || ($column['tag']['nonull'] && !is_null($tabledata->fields[$column['field']]))) ! { ! $column['tag']['close'] = true; ! printf("<%s", $column['tag']['tagname']); ! foreach ($column['tag']['attrs'] as $n => $v) ! //printf(' %s="%s"', $n, value($v, $tabledata->fields, 'html')); ! print value_xml_attr($n, $v, $tabledata->fields); ! echo '>'; ! } ! else ! $column['tag']['close'] = false; ! } ! $type = isset($column['type']) ? $column['type'] : null; $params = isset($column['params']) ? $column['params'] : array(); echo $misc->printVal($tabledata->fields[$column['field']], $type, $params); + + if (isset($column['url'])) echo ""; + else if (isset($column['tag']) && $column['tag']['close'] = true) printf("", $column['tag']['tagname']); } echo "\n"; break; } diff -rcN ppa.cvs/constraints.php ppa.dev/constraints.php *** ppa.cvs/constraints.php 2007-01-15 16:48:17.000000000 +0100 --- ppa.dev/constraints.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 488,493 **** --- 488,525 ---- "\">{$lang['straddfk']}

\n"; } + function doTree() { + global $misc, $data; + + $constraints = $data->getConstraints($_REQUEST['table']); + + $reqvars = $misc->getRequestVars('schema'); + + function getIcon($f) { + switch($f['contype']) { + case 'u': + return 'UniqueConstraint'; + case 'c': + return 'CheckConstraint'; + case 'f': + return 'ForeignKey'; + case 'p': + return 'PrimaryKey'; + + } + } + + $attrs = array( + 'text' => field('conname'), + 'icon' => callback('getIcon'), + ); + + $misc->printTreeXML($constraints, $attrs); + exit; + } + + if ($action == 'tree') doTree(); + $misc->printHeader($lang['strtables'] . ' - ' . $_REQUEST['table'] . ' - ' . $lang['strconstraints'], ""); diff -rcN ppa.cvs/display.js ppa.dev/display.js *** ppa.cvs/display.js 1970-01-01 01:00:00.000000000 +0100 --- ppa.dev/display.js 2007-04-07 13:22:32.000000000 +0200 *************** *** 0 **** --- 1,7 ---- + function FKHandler(elt, fk, param) { + var pid = elt.parentNode.parentNode.id; + + if (xajax.$('td' + fk['name'] + pid) == null) { + printFk(pid, fk, param, nbcols); + } + } diff -rcN ppa.cvs/display.php ppa.dev/display.php *** ppa.cvs/display.php 2007-03-24 03:15:54.000000000 +0100 --- ppa.dev/display.php 2007-04-07 13:28:10.000000000 +0200 *************** *** 263,269 **** $subject = $_REQUEST['subject']; if (isset($_REQUEST[$subject])) $object = $_REQUEST[$subject]; } ! $misc->printTrail(isset($subject) ? $subject : 'database'); if (isset($object)) { --- 263,272 ---- $subject = $_REQUEST['subject']; if (isset($_REQUEST[$subject])) $object = $_REQUEST[$subject]; } ! ! require_once('ajax_display.php'); ! print $jx->getJs(); ! $misc->printTrail(isset($subject) ? $subject : 'database'); if (isset($object)) { *************** *** 290,300 **** // If 'strings' is not set, default to collapsed if (!isset($_REQUEST['strings'])) $_REQUEST['strings'] = 'collapsed'; ! // Fetch unique row identifier, if this is a table browse request. ! if (isset($object)) $key = $data->getRowIdentifier($object); else ! $key = array(); // Set the schema search path if ($data->hasSchemas() && isset($_REQUEST['search_path'])) { --- 293,305 ---- // If 'strings' is not set, default to collapsed if (!isset($_REQUEST['strings'])) $_REQUEST['strings'] = 'collapsed'; ! // Fetch unique row identifier & Foreign keys, if this is a table browse request. ! if (isset($object)) { $key = $data->getRowIdentifier($object); + $fkeys = $data->hasForeignKeysInfo()? $data->getForeignKeys($object, $_REQUEST['schema']) : array(); + } else ! $key = $fkey = array(); // Set the schema search path if ($data->hasSchemas() && isset($_REQUEST['search_path'])) { *************** *** 311,333 **** $conf['max_rows'], $max_pages); // Build strings for GETs ! $str = $misc->href; // . "&page=" . urlencode($_REQUEST['page']); ! if (isset($object)) $str .= "&" . urlencode($subject) . '=' . urlencode($object); ! if (isset($subject)) $str .= "&subject=" . urlencode($subject); ! if (isset($_REQUEST['query'])) $str .= "&query=" . urlencode($_REQUEST['query']); ! if (isset($_REQUEST['count'])) $str .= "&count=" . urlencode($_REQUEST['count']); ! if (isset($_REQUEST['return_url'])) $str .= "&return_url=" . urlencode($_REQUEST['return_url']); ! if (isset($_REQUEST['return_desc'])) $str .= "&return_desc=" . urlencode($_REQUEST['return_desc']); ! if (isset($_REQUEST['search_path'])) $str .= "&search_path=" . urlencode($_REQUEST['search_path']); // This string just contains sort info ! $str2 = "sortkey=" . urlencode($_REQUEST['sortkey']) . "&sortdir=" . urlencode($_REQUEST['sortdir']); ! if (is_object($rs) && $rs->recordCount() > 0) { // Show page navigation ! $misc->printPages($_REQUEST['page'], $max_pages, "display.php?page=%s&{$str}&{$str2}&strings=" . urlencode($_REQUEST['strings'])); ! echo "\n"; // Check that the key is actually in the result set. This can occur for select // operations where the key fields aren't part of the select. XXX: We should --- 316,339 ---- $conf['max_rows'], $max_pages); // Build strings for GETs ! $gets = $misc->href; // . "&page=" . urlencode($_REQUEST['page']); ! if (isset($object)) $gets .= "&" . urlencode($subject) . '=' . urlencode($object); ! if (isset($subject)) $gets .= "&subject=" . urlencode($subject); ! if (isset($_REQUEST['query'])) $gets .= "&query=" . urlencode($_REQUEST['query']); ! if (isset($_REQUEST['count'])) $gets .= "&count=" . urlencode($_REQUEST['count']); ! if (isset($_REQUEST['return_url'])) $gets .= "&return_url=" . urlencode($_REQUEST['return_url']); ! if (isset($_REQUEST['return_desc'])) $gets .= "&return_desc=" . urlencode($_REQUEST['return_desc']); ! if (isset($_REQUEST['search_path'])) $gets .= "&search_path=" . urlencode($_REQUEST['search_path']); // This string just contains sort info ! $sortgetter = "sortkey=" . urlencode($_REQUEST['sortkey']) . "&sortdir=" . urlencode($_REQUEST['sortdir']); ! ! $columns = array(); $actions = array(); if (is_object($rs) && $rs->recordCount() > 0) { + // Show page navigation ! $misc->printPages($_REQUEST['page'], $max_pages, "display.php?page=%s&{$gets}&{$sortgetter}&strings=" . urlencode($_REQUEST['strings'])); // Check that the key is actually in the result set. This can occur for select // operations where the key fields aren't part of the select. XXX: We should *************** *** 340,349 **** break; } } - // Display edit and delete actions if we have a key - if (sizeof($key) > 0) - echo "\n"; $j = 0; foreach ($rs->f as $k => $v) { if (isset($object) && $k == $data->id && !$conf['show_oids']) { --- 346,378 ---- break; } } + // builds actions array if we have rowIdentifiers + if (sizeof($key) > 0) { + //adding actions to the table's cols + $columns['actions'] = array( + 'title' => $lang['stractions'], + ); + //define actions for each entry + $actions = array( + 'edit' => array( + 'title' => $lang['stredit'], + 'url' => sprintf("display.php?action=confeditrow&strings=%s&page=%s&%s&%s&" + , urlencode($_REQUEST['strings']), urlencode($_REQUEST['page']), $gets, $sortgetter + ), + 'vars' => array('key' => $key) + ), + 'delete'=> array( + 'title' => $lang['strdelete'], + 'url' => sprintf("display.php?action=confdelrow&strings=%s&page=%s&%s&%s&" + , urlencode($_REQUEST['strings']), urlencode($_REQUEST['page']), $gets, $sortgetter + ), + 'vars' => array('key' => $key) + ), + ); + } + + //builds columns array $j = 0; foreach ($rs->f as $k => $v) { if (isset($object) && $k == $data->id && !$conf['show_oids']) { *************** *** 351,420 **** continue; } $finfo = $rs->fetchField($j); // Display column headers with sorting options, unless we're PostgreSQL // 7.0 and it's a non-TABLE mode if (!$data->hasFullSubqueries() && $type != 'TABLE') { ! echo "\n"; } else { ! echo "\n"; } $j++; } ! ! echo "\n"; ! ! $i = 0; ! reset($rs->f); ! while (!$rs->EOF) { ! $id = (($i % 2) == 0 ? '1' : '2'); ! echo "\n"; ! // Display edit and delete links if we have a key ! if (sizeof($key) > 0) { ! $key_str = ''; ! $has_nulls = false; ! foreach ($key as $v) { ! if ($rs->f[$v] === null) { ! $has_nulls = true; ! break; } - if ($key_str != '') $key_str .= '&'; - $key_str .= urlencode("key[{$v}]") . '=' . urlencode($rs->f[$v]); - } - if ($has_nulls) { - echo "\n"; - } else { - echo "\n"; - echo "\n"; } } ! $j = 0; ! foreach ($rs->f as $k => $v) { ! $finfo = $rs->fetchField($j++); ! if (isset($_REQUEST['table']) && $k == $data->id && !$conf['show_oids']) continue; ! elseif ($v !== null && $v == '') echo ""; ! else { ! echo ""; ! } } ! echo "\n"; ! $rs->moveNext(); ! $i++; } ! echo "
{$lang['stractions']}", $misc->printVal($finfo->name), "", ! $misc->printVal($finfo->name), "
 {$lang['stredit']}{$lang['strdelete']} ", ! $misc->printVal($v, $finfo->type, array('null' => true, 'clip' => ($_REQUEST['strings']=='collapsed'))), "
\n"; echo "

", $rs->recordCount(), " {$lang['strrows']}

\n"; // Show page navigation ! $misc->printPages($_REQUEST['page'], $max_pages, "display.php?page=%s&{$str}&{$str2}&strings=" . urlencode($_REQUEST['strings'])); } else echo "

{$lang['strnodata']}

\n"; --- 380,484 ---- continue; } $finfo = $rs->fetchField($j); + $columns[$misc->printVal($finfo->name)] = array( + 'field' => $k, + 'type' => $finfo->type, + 'params' => array( + 'null' => true, + 'clip' => ($_REQUEST['strings']=='collapsed'), + ), + ); + // Display column headers with sorting options, unless we're PostgreSQL // 7.0 and it's a non-TABLE mode if (!$data->hasFullSubqueries() && $type != 'TABLE') { ! $columns[$misc->printVal($finfo->name)]['title'] = $misc->printVal($finfo->name); } else { ! $columns[$misc->printVal($finfo->name)]['title'] = sprintf( ! '%s' ! , $gets, ($j + 1), ($_REQUEST['sortdir'] == 'asc' && $_REQUEST['sortkey'] == ($j + 1)) ? 'desc' : 'asc' ! , urlencode($_REQUEST['strings']), urlencode($_REQUEST['page']), $misc->printVal($finfo->name) ! ); } $j++; } ! ! //adds Foreign Keys links if having some ! if (!empty($fkeys)) { ! $cols = array_keys($columns); ! $nbcols = count($cols) + 1; //+1 for action col ! ! $jsCode = ''; ! foreach ($fkeys as $fk => $def) { ! $allKey = true; ! $jsKey = "\nvar $fk = new Array();\n{$fk}['name']='$fk'\n"; ! $jsKey.= "{$fk}['reftab']='{$def['reftab']}';\n"; ! $jsKey.= "{$fk}['ns']='{$def['ns']}';\n{$fk}['keys']=new Array();\n{$fk}['fkeys']=new Array();\n"; ! $params = array("FKHandler(this, $fk, new Array('"); ! //check if all the cols of the FK are present ! foreach ($def['keys'] as $k => $rk) ! if (! in_array($k, $cols)) { ! $allKey = false;break; ! } else { ! $jsKey.= "{$fk}['keys'].push('$k');\n{$fk}['fkeys'].push('$rk');\n"; ! $params[] = escape(field($k), 'xml');$params[] = "','"; ! } ! ! if ($allKey) { /* every keys are here, close js code and add the event to the col */ ! $jsCode.= $jsKey; ! array_pop($params); ! $params[] = "'))"; ! foreach ($def['keys'] as $k => $rk) { ! $columns[$k]['tag'] = array( ! 'tagname' => 'a', ! 'attrs' => array( ! 'onclick' => new ConcatDecorator($params), ! 'class' => 'fklink', ! 'title' => noEscape($lang['strshowfk']) ! ), ! 'nonull' => true, ! ); } } } ! if (!empty($jsCode)) { // So we have fks links... ! echo "\n"; ! echo "\n\n"; ! echo "\n\n"; } ! unset($cols); } ! ! /** everything done, print request value now ! **/ ! //callback function to test if rowIdentifiers are NOT NULL ! function preFn(&$rd, $actions = null) { ! if (empty($actions)) return; ! ! $b=true; // check if all cols are NOT NULL ? ! foreach ($actions['edit']['vars']['key'] as $v) ! if (is_null($rd->fields[$v])) { ! $b=false;break; ! } ! ! if (!$b) ! return array( ! 'delete' => array('disable' => true), ! 'edit' => array('disable' => true) ! ); ! return; ! } ! ! reset($rs->fields); ! ! if (empty($actions)) ! $misc->printTable($rs, $columns, $actions, $lang['strnodata']); ! else $misc->printTable($rs, $columns, $actions, $lang['strnodata'], 'preFn'); ! echo "

", $rs->recordCount(), " {$lang['strrows']}

\n"; + // Show page navigation ! $misc->printPages($_REQUEST['page'], $max_pages, "display.php?page=%s&{$gets}&{$sortgetter}&strings=" . urlencode($_REQUEST['strings'])); } else echo "

{$lang['strnodata']}

\n"; *************** *** 431,440 **** // Expand/Collapse if ($_REQUEST['strings'] == 'expanded') ! echo "{$lang['strcollapse']}\n"; else ! echo "{$lang['strexpand']}\n"; // Create report if (isset($_REQUEST['query']) && $conf['show_reports'] && isset($rs) && is_object($rs) && $rs->recordCount() > 0) { --- 495,504 ---- // Expand/Collapse if ($_REQUEST['strings'] == 'expanded') ! echo "{$lang['strcollapse']}\n"; else ! echo "{$lang['strexpand']}\n"; // Create report if (isset($_REQUEST['query']) && $conf['show_reports'] && isset($rs) && is_object($rs) && $rs->recordCount() > 0) { *************** *** 459,465 **** } // Refresh ! echo "| {$lang['strrefresh']}\n"; echo "

\n"; --- 523,529 ---- } // Refresh ! echo "| {$lang['strrefresh']}\n"; echo "

\n"; diff -rcN ppa.cvs/domains.php ppa.dev/domains.php *** ppa.cvs/domains.php 2007-01-26 18:55:42.000000000 +0100 --- ppa.dev/domains.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 378,383 **** --- 378,385 ---- 'domain' => array( 'title' => $lang['strdomain'], 'field' => 'domname', + 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&", + 'vars' => array('domain' => 'domname'), ), 'type' => array( 'title' => $lang['strtype'], *************** *** 407,417 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&", - 'vars' => array('domain' => 'domname'), - ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "{$PHP_SELF}?action=confirm_drop&{$misc->href}&", --- 409,414 ---- diff -rcN ppa.cvs/functions.php ppa.dev/functions.php *** ppa.cvs/functions.php 2007-02-15 19:30:23.000000000 +0100 --- ppa.dev/functions.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 630,635 **** --- 630,637 ---- 'title' => $lang['strfunction'], 'field' => 'proproto', 'type' => 'verbatim', + 'url' => "redirect.php?subject=function&action=properties&{$misc->href}&", + 'vars' => array('function' => 'proproto', 'function_oid' => 'prooid'), ), 'returns' => array( 'title' => $lang['strreturns'], *************** *** 654,664 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "redirect.php?subject=function&action=properties&{$misc->href}&", - 'vars' => array('function' => 'proproto', 'function_oid' => 'prooid'), - ), 'alter' => array( 'title' => $lang['stralter'], 'url' => "{$PHP_SELF}?action=edit&{$misc->href}&", --- 656,661 ---- diff -rcN ppa.cvs/groups.php ppa.dev/groups.php *** ppa.cvs/groups.php 2007-01-15 16:48:17.000000000 +0100 --- ppa.dev/groups.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 220,225 **** --- 220,227 ---- 'group' => array( 'title' => $lang['strgroup'], 'field' => 'groname', + 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&", + 'vars' => array('group' => 'groname'), ), 'actions' => array( 'title' => $lang['stractions'], *************** *** 227,237 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&", - 'vars' => array('group' => 'groname'), - ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "{$PHP_SELF}?action=confirm_drop&{$misc->href}&", --- 229,234 ---- diff -rcN ppa.cvs/indexes.php ppa.dev/indexes.php *** ppa.cvs/indexes.php 2007-01-15 16:48:17.000000000 +0100 --- ppa.dev/indexes.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 311,316 **** --- 311,342 ---- echo "

href}&table=", urlencode($_REQUEST['table']), "\">{$lang['strcreateindex']}

\n"; } + function doTree() { + global $misc, $data; + + $indexes = $data->getIndexes($_REQUEST['table']); + + $reqvars = $misc->getRequestVars('table'); + + function getIcon($f) { + if ($f['indisprimary'] == 't') + return 'PrimaryKey'; + if ($f['indisunique'] == 't') + return 'UniqueConstraint'; + return 'Index'; + } + + $attrs = array( + 'text' => field('indname'), + 'icon' => callback('getIcon'), + ); + + $misc->printTreeXML($indexes, $attrs); + exit; + } + + if ($action == 'tree') doTree(); + $misc->printHeader($lang['strindexes'], ""); if ($action == 'create_index' || $action == 'save_create_index') diff -rcN ppa.cvs/lang/english.php ppa.dev/lang/english.php *** ppa.cvs/lang/english.php 2007-04-02 21:44:51.000000000 +0200 --- ppa.dev/lang/english.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 139,144 **** --- 139,145 ---- $lang['stractionsonmultiplelines'] = 'Actions on multiple lines'; $lang['strcheckall'] = 'Check All'; $lang['struncheckall'] = 'Uncheck All'; + $lang['strclose'] = 'Close'; // Database sizes $lang['strsize'] = 'Size'; *************** *** 477,482 **** --- 478,484 ---- $lang['strfkcolumnlist'] = 'Columns in key'; $lang['strondelete'] = 'ON DELETE'; $lang['stronupdate'] = 'ON UPDATE'; + $lang['strshowfk'] = 'Show referenced key(s).'; // Functions $lang['strfunction'] = 'Function'; diff -rcN ppa.cvs/lang/french.php ppa.dev/lang/french.php *** ppa.cvs/lang/french.php 2007-04-02 21:44:51.000000000 +0200 --- ppa.dev/lang/french.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 139,144 **** --- 139,145 ---- $lang['stractionsonmultiplelines'] = 'Actions sur plusieurs lignes'; $lang['strcheckall'] = 'Sélectionner tout'; $lang['struncheckall'] = 'Desélectionner tout'; + $lang['strclose'] = 'Fermer'; // Database Sizes $lang['strsize'] = 'Taille'; *************** *** 478,483 **** --- 479,485 ---- $lang['strfkcolumnlist'] = 'Liste des colonnes de la clé'; $lang['strondelete'] = 'ON DELETE'; $lang['stronupdate'] = 'ON UPDATE'; + $lang['strshowfk'] = 'Montrer la (les) clé(s) référencée(s).'; // Functions $lang['strfunction'] = 'Fonction'; diff -rcN ppa.cvs/lang/recoded/english.php ppa.dev/lang/recoded/english.php *** ppa.cvs/lang/recoded/english.php 2007-04-02 21:44:54.000000000 +0200 --- ppa.dev/lang/recoded/english.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 139,144 **** --- 139,145 ---- $lang['stractionsonmultiplelines'] = 'Actions on multiple lines'; $lang['strcheckall'] = 'Check All'; $lang['struncheckall'] = 'Uncheck All'; + $lang['strclose'] = 'Close'; // Database sizes $lang['strsize'] = 'Size'; *************** *** 477,482 **** --- 478,484 ---- $lang['strfkcolumnlist'] = 'Columns in key'; $lang['strondelete'] = 'ON DELETE'; $lang['stronupdate'] = 'ON UPDATE'; + $lang['strshowfk'] = 'Show referenced key(s).'; // Functions $lang['strfunction'] = 'Function'; diff -rcN ppa.cvs/lang/recoded/french.php ppa.dev/lang/recoded/french.php *** ppa.cvs/lang/recoded/french.php 2007-04-02 21:44:54.000000000 +0200 --- ppa.dev/lang/recoded/french.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 139,144 **** --- 139,145 ---- $lang['stractionsonmultiplelines'] = 'Actions sur plusieurs lignes'; $lang['strcheckall'] = 'Sélectionner tout'; $lang['struncheckall'] = 'Desélectionner tout'; + $lang['strclose'] = 'Fermer'; // Database Sizes $lang['strsize'] = 'Taille'; *************** *** 478,483 **** --- 479,485 ---- $lang['strfkcolumnlist'] = 'Liste des colonnes de la clé'; $lang['strondelete'] = 'ON DELETE'; $lang['stronupdate'] = 'ON UPDATE'; + $lang['strshowfk'] = 'Montrer la (les) clé(s) référencée(s).'; // Functions $lang['strfunction'] = 'Fonction'; diff -rcN ppa.cvs/libraries/decorator.inc.php ppa.dev/libraries/decorator.inc.php *** ppa.cvs/libraries/decorator.inc.php 2007-04-06 00:27:41.000000000 +0200 --- ppa.dev/libraries/decorator.inc.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 56,61 **** --- 56,65 ---- return new Decorator($value, false); } + function escape($value, $esc) { + return new Decorator($value, $esc); + } + function replace($str, $params) { return new replaceDecorator($str, $params); } *************** *** 72,81 **** if (is_string($val)) { switch($esc) { case 'xml': ! return strtr($val, array( '&' => '&', ! "'" => ''', '"' => '"', ! '<' => '<', '>' => '>' )); case 'html': return htmlspecialchars($val); --- 76,87 ---- if (is_string($val)) { switch($esc) { case 'xml': ! return strtr("$val", array( '&' => '&', ! "'" => ''', ! '"' => '"', ! '<' => '<', ! '>' => '>' )); case 'html': return htmlspecialchars($val); *************** *** 114,120 **** } function value($fields) { ! return $this->v; } } --- 120,126 ---- } function value($fields) { ! return value($this->v, $fields, $this->esc); } } diff -rcN ppa.cvs/libraries/xajax/xajaxCompress.php ppa.dev/libraries/xajax/xajaxCompress.php *** ppa.cvs/libraries/xajax/xajaxCompress.php 1970-01-01 01:00:00.000000000 +0100 --- ppa.dev/libraries/xajax/xajaxCompress.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 0 **** --- 1,182 ---- + \ Pas de fin de ligne à la fin du fichier. diff -rcN ppa.cvs/libraries/xajax/xajax.inc.php ppa.dev/libraries/xajax/xajax.inc.php *** ppa.cvs/libraries/xajax/xajax.inc.php 1970-01-01 01:00:00.000000000 +0100 --- ppa.dev/libraries/xajax/xajax.inc.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 0 **** --- 1,1239 ---- + aFunctions = array(); + $this->aObjects = array(); + $this->aFunctionIncludeFiles = array(); + $this->sRequestURI = $sRequestURI; + if ($this->sRequestURI == "") + $this->sRequestURI = $this->_detectURI(); + $this->sWrapperPrefix = $sWrapperPrefix; + $this->bDebug = $bDebug; + $this->bStatusMessages = false; + $this->bWaitCursor = true; + $this->bExitAllowed = true; + $this->bErrorHandler = false; + $this->sLogFile = ""; + $this->bCleanBuffer = false; + $this->setCharEncoding($sEncoding); + $this->bDecodeUTF8Input = false; + $this->bOutputEntities = false; + } + + /** + * Sets the URI to which requests will be made. + * Usage: $xajax->setRequestURI("http://www.xajaxproject.org"); + * + * @param string the URI (can be absolute or relative) of the PHP script + * that will be accessed when an xajax request occurs + */ + function setRequestURI($sRequestURI) + { + $this->sRequestURI = $sRequestURI; + } + + /** + * Sets the prefix that will be appended to the Javascript wrapper + * functions (default is "xajax_"). + * + * @param string + */ + // + function setWrapperPrefix($sPrefix) + { + $this->sWrapperPrefix = $sPrefix; + } + + /** + * Enables debug messages for xajax. + * */ + function debugOn() + { + $this->bDebug = true; + } + + /** + * Disables debug messages for xajax (default behavior). + */ + function debugOff() + { + $this->bDebug = false; + } + + /** + * Enables messages in the browser's status bar for xajax. + */ + function statusMessagesOn() + { + $this->bStatusMessages = true; + } + + /** + * Disables messages in the browser's status bar for xajax (default behavior). + */ + function statusMessagesOff() + { + $this->bStatusMessages = false; + } + + /** + * Enables the wait cursor to be displayed in the browser (default behavior). + */ + function waitCursorOn() + { + $this->bWaitCursor = true; + } + + /** + * Disables the wait cursor to be displayed in the browser. + */ + function waitCursorOff() + { + $this->bWaitCursor = false; + } + + /** + * Enables xajax to exit immediately after processing a request and + * sending the response back to the browser (default behavior). + */ + function exitAllowedOn() + { + $this->bExitAllowed = true; + } + + /** + * Disables xajax's default behavior of exiting immediately after + * processing a request and sending the response back to the browser. + */ + function exitAllowedOff() + { + $this->bExitAllowed = false; + } + + /** + * Turns on xajax's error handling system so that PHP errors that occur + * during a request are trapped and pushed to the browser in the form of + * a Javascript alert. + */ + function errorHandlerOn() + { + $this->bErrorHandler = true; + } + + /** + * Turns off xajax's error handling system (default behavior). + */ + function errorHandlerOff() + { + $this->bErrorHandler = false; + } + + /** + * Specifies a log file that will be written to by xajax during a request + * (used only by the error handling system at present). If you don't invoke + * this method, or you pass in "", then no log file will be written to. + * Usage: $xajax->setLogFile("/xajax_logs/errors.log"); + */ + function setLogFile($sFilename) + { + $this->sLogFile = $sFilename; + } + + /** + * Causes xajax to clean out all output buffers before outputting a + * response (default behavior). + */ + function cleanBufferOn() + { + $this->bCleanBuffer = true; + } + /** + * Turns off xajax's output buffer cleaning. + */ + function cleanBufferOff() + { + $this->bCleanBuffer = false; + } + + /** + * Sets the character encoding for the HTTP output based on + * $sEncoding, which is a string containing the character + * encoding to use. You don't need to use this method normally, since the + * character encoding for the response gets set automatically based on the + * XAJAX_DEFAULT_CHAR_ENCODING constant. + * Usage: $xajax->setCharEncoding("utf-8"); + * + * @param string the encoding type to use (utf-8, iso-8859-1, etc.) + */ + function setCharEncoding($sEncoding) + { + $this->sEncoding = $sEncoding; + } + + /** + * Causes xajax to decode the input request args from UTF-8 to the current + * encoding if possible. Either the iconv or mb_string extension must be + * present for optimal functionality. + */ + function decodeUTF8InputOn() + { + $this->bDecodeUTF8Input = true; + } + + /** + * Turns off decoding the input request args from UTF-8 (default behavior). + */ + function decodeUTF8InputOff() + { + $this->bDecodeUTF8Input = false; + } + + /** + * Tells the response object to convert special characters to HTML entities + * automatically (only works if the mb_string extension is available). + */ + function outputEntitiesOn() + { + $this->bOutputEntities = true; + } + + /** + * Tells the response object to output special characters intact. (default + * behavior). + */ + function outputEntitiesOff() + { + $this->bOutputEntities = false; + } + + /** + * Registers a PHP function or method to be callable through xajax in your + * Javascript. If you want to register a function, pass in the name of that + * function. If you want to register a static class method, pass in an + * array like so: + * array("myFunctionName", "myClass", "myMethod") + * For an object instance method, use an object variable for the second + * array element (and in PHP 4 make sure you put an & before the variable + * to pass the object by reference). Note: the function name is what you + * call via Javascript, so it can be anything as long as it doesn't + * conflict with any other registered function name. + * + * Usage: $xajax->registerFunction("myFunction"); + * or: $xajax->registerFunction(array("myFunctionName", &$myObject, "myMethod")); + * + * @param mixed contains the function name or an object callback array + * @param mixed request type (XAJAX_GET/XAJAX_POST) that should be used + * for this function. Defaults to XAJAX_POST. + */ + function registerFunction($mFunction,$sRequestType=XAJAX_POST) + { + if (is_array($mFunction)) { + $this->aFunctions[$mFunction[0]] = 1; + $this->aFunctionRequestTypes[$mFunction[0]] = $sRequestType; + $this->aObjects[$mFunction[0]] = array_slice($mFunction, 1); + } + else { + $this->aFunctions[$mFunction] = 1; + $this->aFunctionRequestTypes[$mFunction] = $sRequestType; + } + } + + /** + * Registers a PHP function to be callable through xajax which is located + * in some other file. If the function is requested the external file will + * be included to define the function before the function is called. + * + * Usage: $xajax->registerExternalFunction("myFunction","myFunction.inc.php",XAJAX_POST); + * + * @param string contains the function name or an object callback array + * ({@link xajax::registerFunction() see registerFunction} for + * more info on object callback arrays) + * @param string contains the path and filename of the include file + * @param mixed the RequestType (XAJAX_GET/XAJAX_POST) that should be used + * for this function. Defaults to XAJAX_POST. + */ + function registerExternalFunction($mFunction,$sIncludeFile,$sRequestType=XAJAX_POST) + { + $this->registerFunction($mFunction, $sRequestType); + + if (is_array($mFunction)) { + $this->aFunctionIncludeFiles[$mFunction[0]] = $sIncludeFile; + } + else { + $this->aFunctionIncludeFiles[$mFunction] = $sIncludeFile; + } + } + + /** + * Registers a PHP function to be called when xajax cannot find the + * function being called via Javascript. Because this is technically + * impossible when using "wrapped" functions, the catch-all feature is + * only useful when you're directly using the xajax.call() Javascript + * method. Use the catch-all feature when you want more dynamic ability to + * intercept unknown calls and handle them in a custom way. + * + * Usage: $xajax->registerCatchAllFunction("myCatchAllFunction"); + * + * @param string contains the function name or an object callback array + * ({@link xajax::registerFunction() see registerFunction} for + * more info on object callback arrays) + */ + function registerCatchAllFunction($mFunction) + { + if (is_array($mFunction)) { + $this->sCatchAllFunction = $mFunction[0]; + $this->aObjects[$mFunction[0]] = array_slice($mFunction, 1); + } + else { + $this->sCatchAllFunction = $mFunction; + } + } + + /** + * Registers a PHP function to be called before xajax calls the requested + * function. xajax will automatically add the request function's response + * to the pre-function's response to create a single response. Another + * feature is the ability to return not just a response, but an array with + * the first element being false (a boolean) and the second being the + * response. In this case, the pre-function's response will be returned to + * the browser without xajax calling the requested function. + * + * Usage: $xajax->registerPreFunction("myPreFunction"); + * + * @param string contains the function name or an object callback array + * ({@link xajax::registerFunction() see registerFunction} for + * more info on object callback arrays) + */ + function registerPreFunction($mFunction) + { + if (is_array($mFunction)) { + $this->sPreFunction = $mFunction[0]; + $this->aObjects[$mFunction[0]] = array_slice($mFunction, 1); + } + else { + $this->sPreFunction = $mFunction; + } + } + + /** + * Returns true if xajax can process the request, false if otherwise. + * You can use this to determine if xajax needs to process the request or + * not. + * + * @return boolean + */ + function canProcessRequests() + { + if ($this->getRequestMode() != -1) return true; + return false; + } + + /** + * Returns the current request mode (XAJAX_GET or XAJAX_POST), or -1 if + * there is none. + * + * @return mixed + */ + function getRequestMode() + { + if (!empty($_GET["xajax"])) + return XAJAX_GET; + + if (!empty($_POST["xajax"])) + return XAJAX_POST; + + return -1; + } + + /** + * This is the main communications engine of xajax. The engine handles all + * incoming xajax requests, calls the apporiate PHP functions (or + * class/object methods) and passes the XML responses back to the + * Javascript response handler. If your RequestURI is the same as your Web + * page then this function should be called before any headers or HTML has + * been sent. + */ + function processRequests() + { + + $requestMode = -1; + $sFunctionName = ""; + $bFoundFunction = true; + $bFunctionIsCatchAll = false; + $sFunctionNameForSpecial = ""; + $aArgs = array(); + $sPreResponse = ""; + $bEndRequest = false; + $sResponse = ""; + + $requestMode = $this->getRequestMode(); + if ($requestMode == -1) return; + + if ($requestMode == XAJAX_POST) + { + $sFunctionName = $_POST["xajax"]; + + if (!empty($_POST["xajaxargs"])) + $aArgs = $_POST["xajaxargs"]; + } + else + { + header ("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); + header ("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); + header ("Cache-Control: no-cache, must-revalidate"); + header ("Pragma: no-cache"); + + $sFunctionName = $_GET["xajax"]; + + if (!empty($_GET["xajaxargs"])) + $aArgs = $_GET["xajaxargs"]; + } + + // Use xajax error handler if necessary + if ($this->bErrorHandler) { + $GLOBALS['xajaxErrorHandlerText'] = ""; + set_error_handler("xajaxErrorHandler"); + } + + if ($this->sPreFunction) { + if (!$this->_isFunctionCallable($this->sPreFunction)) { + $bFoundFunction = false; + $objResponse = new xajaxResponse(); + $objResponse->addAlert("Unknown Pre-Function ". $this->sPreFunction); + $sResponse = $objResponse->getXML(); + } + } + //include any external dependencies associated with this function name + if (array_key_exists($sFunctionName,$this->aFunctionIncludeFiles)) + { + ob_start(); + include_once($this->aFunctionIncludeFiles[$sFunctionName]); + ob_end_clean(); + } + + if ($bFoundFunction) { + $sFunctionNameForSpecial = $sFunctionName; + if (!array_key_exists($sFunctionName, $this->aFunctions)) + { + if ($this->sCatchAllFunction) { + $sFunctionName = $this->sCatchAllFunction; + $bFunctionIsCatchAll = true; + } + else { + $bFoundFunction = false; + $objResponse = new xajaxResponse(); + $objResponse->addAlert("Unknown Function $sFunctionName."); + $sResponse = $objResponse->getXML(); + } + } + else if ($this->aFunctionRequestTypes[$sFunctionName] != $requestMode) + { + $bFoundFunction = false; + $objResponse = new xajaxResponse(); + $objResponse->addAlert("Incorrect Request Type."); + $sResponse = $objResponse->getXML(); + } + } + + if ($bFoundFunction) + { + for ($i = 0; $i < sizeof($aArgs); $i++) + { + // If magic quotes is on, then we need to strip the slashes from the args + if (get_magic_quotes_gpc() == 1 && is_string($aArgs[$i])) { + + $aArgs[$i] = stripslashes($aArgs[$i]); + } + if (stristr($aArgs[$i],"") != false) + { + $aArgs[$i] = $this->_xmlToArray("xjxobj",$aArgs[$i]); + } + else if (stristr($aArgs[$i],"") != false) + { + $aArgs[$i] = $this->_xmlToArray("xjxquery",$aArgs[$i]); + } + else if ($this->bDecodeUTF8Input) + { + $aArgs[$i] = $this->_decodeUTF8Data($aArgs[$i]); + } + } + + if ($this->sPreFunction) { + $mPreResponse = $this->_callFunction($this->sPreFunction, array($sFunctionNameForSpecial, $aArgs)); + if (is_array($mPreResponse) && $mPreResponse[0] === false) { + $bEndRequest = true; + $sPreResponse = $mPreResponse[1]; + } + else { + $sPreResponse = $mPreResponse; + } + if (is_a($sPreResponse, "xajaxResponse")) { + $sPreResponse = $sPreResponse->getXML(); + } + if ($bEndRequest) $sResponse = $sPreResponse; + } + + if (!$bEndRequest) { + if (!$this->_isFunctionCallable($sFunctionName)) { + $objResponse = new xajaxResponse(); + $objResponse->addAlert("The Registered Function $sFunctionName Could Not Be Found."); + $sResponse = $objResponse->getXML(); + } + else { + if ($bFunctionIsCatchAll) { + $aArgs = array($sFunctionNameForSpecial, $aArgs); + } + $sResponse = $this->_callFunction($sFunctionName, $aArgs); + } + if (is_a($sResponse, "xajaxResponse")) { + $sResponse = $sResponse->getXML(); + } + if (!is_string($sResponse) || strpos($sResponse, "") === FALSE) { + $objResponse = new xajaxResponse(); + $objResponse->addAlert("No XML Response Was Returned By Function $sFunctionName."); + $sResponse = $objResponse->getXML(); + } + else if ($sPreResponse != "") { + $sNewResponse = new xajaxResponse($this->sEncoding, $this->bOutputEntities); + $sNewResponse->loadXML($sPreResponse); + $sNewResponse->loadXML($sResponse); + $sResponse = $sNewResponse->getXML(); + } + } + } + + $sContentHeader = "Content-type: text/xml;"; + if ($this->sEncoding && strlen(trim($this->sEncoding)) > 0) + $sContentHeader .= " charset=".$this->sEncoding; + header($sContentHeader); + if ($this->bErrorHandler && !empty( $GLOBALS['xajaxErrorHandlerText'] )) { + $sErrorResponse = new xajaxResponse(); + $sErrorResponse->addAlert("** PHP Error Messages: **" . $GLOBALS['xajaxErrorHandlerText']); + if ($this->sLogFile) { + $fH = @fopen($this->sLogFile, "a"); + if (!$fH) { + $sErrorResponse->addAlert("** Logging Error **\n\nxajax was unable to write to the error log file:\n" . $this->sLogFile); + } + else { + fwrite($fH, "** xajax Error Log - " . strftime("%b %e %Y %I:%M:%S %p") . " **" . $GLOBALS['xajaxErrorHandlerText'] . "\n\n\n"); + fclose($fH); + } + } + + $sErrorResponse->loadXML($sResponse); + $sResponse = $sErrorResponse->getXML(); + + } + if ($this->bCleanBuffer) while (@ob_end_clean()); + print $sResponse; + if ($this->bErrorHandler) restore_error_handler(); + + if ($this->bExitAllowed) + exit(); + } + + /** + * Prints the xajax Javascript header and wrapper code into your page by + * printing the output of the getJavascript() method. It should only be + * called between the
 
tags in your HTML page. + * Remember, if you only want to obtain the result of this function, use + * {@link xajax::getJavascript()} instead. + * + * Usage: + * + * + * ... + * < ?php $xajax->printJavascript(); ? > + * + * + * @param string the relative address of the folder where xajax has been + * installed. For instance, if your PHP file is + * "http://www.myserver.com/myfolder/mypage.php" + * and xajax was installed in + * "http://www.myserver.com/anotherfolder", then $sJsURI + * should be set to "../anotherfolder". Defaults to assuming + * xajax is in the same folder as your PHP file. + * @param string the relative folder/file pair of the xajax Javascript + * engine located within the xajax installation folder. + * Defaults to xajax_js/xajax.js. + */ + function printJavascript($sJsURI="", $sJsFile=NULL) + { + print $this->getJavascript($sJsURI, $sJsFile); + } + + /** + * Returns the xajax Javascript code that should be added to your HTML page + * between the tags. + * + * Usage: + * + * < ?php $xajaxJSHead = $xajax->getJavascript(); ? > + * + * ... + * < ?php echo $xajaxJSHead; ? > + * + * + * @param string the relative address of the folder where xajax has been + * installed. For instance, if your PHP file is + * "http://www.myserver.com/myfolder/mypage.php" + * and xajax was installed in + * "http://www.myserver.com/anotherfolder", then $sJsURI + * should be set to "../anotherfolder". Defaults to assuming + * xajax is in the same folder as your PHP file. + * @param string the relative folder/file pair of the xajax Javascript + * engine located within the xajax installation folder. + * Defaults to xajax_js/xajax.js. + * @return string + */ + function getJavascript($sJsURI="", $sJsFile=NULL) + { + $html = $this->getJavascriptConfig(); + $html .= $this->getJavascriptInclude($sJsURI, $sJsFile); + + return $html; + } + + /** + * Returns a string containing inline Javascript that sets up the xajax + * runtime (typically called internally by xajax from get/printJavascript). + * + * @return string + */ + function getJavascriptConfig() + { + $html = "\t\n"; + return $html; + } + + /** + * Returns a string containing a Javascript include of the xajax.js file + * along with a check to see if the file loaded after six seconds + * (typically called internally by xajax from get/printJavascript). + * + * @param string the relative address of the folder where xajax has been + * installed. For instance, if your PHP file is + * "http://www.myserver.com/myfolder/mypage.php" + * and xajax was installed in + * "http://www.myserver.com/anotherfolder", then $sJsURI + * should be set to "../anotherfolder". Defaults to assuming + * xajax is in the same folder as your PHP file. + * @param string the relative folder/file pair of the xajax Javascript + * engine located within the xajax installation folder. + * Defaults to xajax_js/xajax.js. + * @return string + */ + function getJavascriptInclude($sJsURI="", $sJsFile=NULL) + { + if ($sJsFile == NULL) $sJsFile = "xajax_js/xajax.js"; + + if ($sJsURI != "" && substr($sJsURI, -1) != "/") $sJsURI .= "/"; + + $html = "\t\n"; + $html .= "\t\n"; + return $html; + } + + /** + * This method can be used to create a new xajax.js file out of the + * xajax_uncompressed.js file (which will only happen if xajax.js doesn't + * already exist on the filesystem). + * + * @param string an optional argument containing the full server file path + * of xajax.js. + */ + function autoCompressJavascript($sJsFullFilename=NULL) + { + $sJsFile = "xajax_js/xajax.js"; + + if ($sJsFullFilename) { + $realJsFile = $sJsFullFilename; + } + else { + $realPath = realpath(dirname(__FILE__)); + $realJsFile = $realPath . "/". $sJsFile; + } + + // Create a compressed file if necessary + if (!file_exists($realJsFile)) { + $srcFile = str_replace(".js", "_uncompressed.js", $realJsFile); + if (!file_exists($srcFile)) { + trigger_error("The xajax uncompressed Javascript file could not be found in the " . dirname($realJsFile) . " folder. Error ", E_USER_ERROR); + } + require(dirname(__FILE__)."/xajaxCompress.php"); + $javaScript = implode('', file($srcFile)); + $compressedScript = xajaxCompressJavascript($javaScript); + $fH = @fopen($realJsFile, "w"); + if (!$fH) { + trigger_error("The xajax compressed javascript file could not be written in the " . dirname($realJsFile) . " folder. Error ", E_USER_ERROR); + } + else { + fwrite($fH, $compressedScript); + fclose($fH); + } + } + } + + /** + * Returns the current URL based upon the SERVER vars. + * + * @access private + * @return string + */ + function _detectURI() { + $aURL = array(); + + // Try to get the request URL + if (!empty($_SERVER['REQUEST_URI'])) { + $aURL = parse_url($_SERVER['REQUEST_URI']); + } + + // Fill in the empty values + if (empty($aURL['scheme'])) { + if (!empty($_SERVER['HTTP_SCHEME'])) { + $aURL['scheme'] = $_SERVER['HTTP_SCHEME']; + } else { + $aURL['scheme'] = (!empty($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) != 'off') ? 'https' : 'http'; + } + } + + if (empty($aURL['host'])) { + if (!empty($_SERVER['HTTP_HOST'])) { + if (strpos($_SERVER['HTTP_HOST'], ':') > 0) { + list($aURL['host'], $aURL['port']) = explode(':', $_SERVER['HTTP_HOST']); + } else { + $aURL['host'] = $_SERVER['HTTP_HOST']; + } + } else if (!empty($_SERVER['SERVER_NAME'])) { + $aURL['host'] = $_SERVER['SERVER_NAME']; + } else { + print "xajax Error: xajax failed to automatically identify your Request URI."; + print "Please set the Request URI explicitly when you instantiate the xajax object."; + exit(); + } + } + + if (empty($aURL['port']) && !empty($_SERVER['SERVER_PORT'])) { + $aURL['port'] = $_SERVER['SERVER_PORT']; + } + + if (empty($aURL['path'])) { + if (!empty($_SERVER['PATH_INFO'])) { + $sPath = parse_url($_SERVER['PATH_INFO']); + } else { + $sPath = parse_url($_SERVER['PHP_SELF']); + } + $aURL['path'] = $sPath['path']; + unset($sPath); + } + + if (!empty($aURL['query'])) { + $aURL['query'] = '?'.$aURL['query']; + } + + // Build the URL: Start with scheme, user and pass + $sURL = $aURL['scheme'].'://'; + if (!empty($aURL['user'])) { + $sURL.= $aURL['user']; + if (!empty($aURL['pass'])) { + $sURL.= ':'.$aURL['pass']; + } + $sURL.= '@'; + } + + // Add the host + $sURL.= $aURL['host']; + + // Add the port if needed + if (!empty($aURL['port']) && (($aURL['scheme'] == 'http' && $aURL['port'] != 80) || ($aURL['scheme'] == 'https' && $aURL['port'] != 443))) { + $sURL.= ':'.$aURL['port']; + } + + // Add the path and the query string + $sURL.= $aURL['path'].@$aURL['query']; + + // Clean up + unset($aURL); + return $sURL; + } + + /** + * Returns true if the function name is associated with an object callback, + * false if not. + * + * @param string the name of the function + * @access private + * @return boolean + */ + function _isObjectCallback($sFunction) + { + if (array_key_exists($sFunction, $this->aObjects)) return true; + return false; + } + + /** + * Returns true if the function or object callback can be called, false if + * not. + * + * @param string the name of the function + * @access private + * @return boolean + */ + function _isFunctionCallable($sFunction) + { + if ($this->_isObjectCallback($sFunction)) { + if (is_object($this->aObjects[$sFunction][0])) { + return method_exists($this->aObjects[$sFunction][0], $this->aObjects[$sFunction][1]); + } + else { + return is_callable($this->aObjects[$sFunction]); + } + } + else { + return function_exists($sFunction); + } + } + + /** + * Calls the function, class method, or object method with the supplied + * arguments. + * + * @param string the name of the function + * @param array arguments to pass to the function + * @access private + * @return mixed the output of the called function or method + */ + function _callFunction($sFunction, $aArgs) + { + if ($this->_isObjectCallback($sFunction)) { + $mReturn = call_user_func_array($this->aObjects[$sFunction], $aArgs); + } + else { + $mReturn = call_user_func_array($sFunction, $aArgs); + } + return $mReturn; + } + + /** + * Generates the Javascript wrapper for the specified PHP function. + * + * @param string the name of the function + * @param mixed the request type + * @access private + * @return string + */ + function _wrap($sFunction,$sRequestType=XAJAX_POST) + { + $js = "function ".$this->sWrapperPrefix."$sFunction(){return xajax.call(\"$sFunction\", arguments, ".$sRequestType.");}\n"; + return $js; + } + + /** + * Takes a string containing xajax xjxobj XML or xjxquery XML and builds an + * array representation of it to pass as an argument to the PHP function + * being called. + * + * @param string the root tag of the XML + * @param string XML to convert + * @access private + * @return array + */ + function _xmlToArray($rootTag, $sXml) + { + $aArray = array(); + $sXml = str_replace("<$rootTag>","<$rootTag>|~|",$sXml); + $sXml = str_replace("","|~|",$sXml); + $sXml = str_replace("","|~|",$sXml); + $sXml = str_replace("","|~|",$sXml); + $sXml = str_replace("","|~|",$sXml); + $sXml = str_replace("","|~||~|",$sXml); + $sXml = str_replace("","|~|",$sXml); + $sXml = str_replace("","|~||~|",$sXml); + $sXml = str_replace("","|~|",$sXml); + $sXml = str_replace("","|~||~|",$sXml); + + $this->aObjArray = explode("|~|",$sXml); + + $this->iPos = 0; + $aArray = $this->_parseObjXml($rootTag); + + return $aArray; + } + + /** + * A recursive function that generates an array from the contents of + * $this->aObjArray. + * + * @param string the root tag of the XML + * @access private + * @return array + */ + function _parseObjXml($rootTag) + { + $aArray = array(); + + if ($rootTag == "xjxobj") + { + while(!stristr($this->aObjArray[$this->iPos],"
")) + { + $this->iPos++; + if(stristr($this->aObjArray[$this->iPos],"")) + { + $key = ""; + $value = null; + + $this->iPos++; + while(!stristr($this->aObjArray[$this->iPos],"")) + { + if(stristr($this->aObjArray[$this->iPos],"")) + { + $this->iPos++; + while(!stristr($this->aObjArray[$this->iPos],"")) + { + $key .= $this->aObjArray[$this->iPos]; + $this->iPos++; + } + } + if(stristr($this->aObjArray[$this->iPos],"")) + { + $this->iPos++; + while(!stristr($this->aObjArray[$this->iPos],"")) + { + if(stristr($this->aObjArray[$this->iPos],"")) + { + $value = $this->_parseObjXml("xjxobj"); + $this->iPos++; + } + else + { + $value .= $this->aObjArray[$this->iPos]; + if ($this->bDecodeUTF8Input) + { + $value = $this->_decodeUTF8Data($value); + } + } + $this->iPos++; + } + } + $this->iPos++; + } + + $aArray[$key]=$value; + } + } + } + + if ($rootTag == "xjxquery") + { + $sQuery = ""; + $this->iPos++; + while(!stristr($this->aObjArray[$this->iPos],"")) + { + if (stristr($this->aObjArray[$this->iPos],"") || stristr($this->aObjArray[$this->iPos],"")) + { + $this->iPos++; + continue; + } + $sQuery .= $this->aObjArray[$this->iPos]; + $this->iPos++; + } + + parse_str($sQuery, $aArray); + if ($this->bDecodeUTF8Input) + { + foreach($aArray as $key => $value) + { + $aArray[$key] = $this->_decodeUTF8Data($value); + } + } + // If magic quotes is on, then we need to strip the slashes from the + // array values because of the parse_str pass which adds slashes + if (get_magic_quotes_gpc() == 1) { + $newArray = array(); + foreach ($aArray as $sKey => $sValue) { + if (is_string($sValue)) + $newArray[$sKey] = stripslashes($sValue); + else + $newArray[$sKey] = $sValue; + } + $aArray = $newArray; + } + } + + return $aArray; + } + + /** + * Decodes string data from UTF-8 to the current xajax encoding. + * + * @param string data to convert + * @access private + * @return string converted data + */ + function _decodeUTF8Data($sData) + { + $sValue = $sData; + if ($this->bDecodeUTF8Input) + { + $sFuncToUse = NULL; + + if (function_exists('iconv')) + { + $sFuncToUse = "iconv"; + } + else if (function_exists('mb_convert_encoding')) + { + $sFuncToUse = "mb_convert_encoding"; + } + else if ($this->sEncoding == "ISO-8859-1") + { + $sFuncToUse = "utf8_decode"; + } + else + { + trigger_error("The incoming xajax data could not be converted from UTF-8", E_USER_NOTICE); + } + + if ($sFuncToUse) + { + if (is_string($sValue)) + { + if ($sFuncToUse == "iconv") + { + $sValue = iconv("UTF-8", $this->sEncoding.'//TRANSLIT', $sValue); + } + else if ($sFuncToUse == "mb_convert_encoding") + { + $sValue = mb_convert_encoding($sValue, $this->sEncoding, "UTF-8"); + } + else + { + $sValue = utf8_decode($sValue); + } + } + } + } + return $sValue; + } + + }// end class xajax + + /** + * This function is registered with PHP's set_error_handler() function if + * the xajax error handling system is turned on. + */ + function xajaxErrorHandler($errno, $errstr, $errfile, $errline) + { + $errorReporting = error_reporting(); + if (($errno & $errorReporting) == 0) return; + + if ($errno == E_NOTICE) { + $errTypeStr = "NOTICE"; + } + else if ($errno == E_WARNING) { + $errTypeStr = "WARNING"; + } + else if ($errno == E_USER_NOTICE) { + $errTypeStr = "USER NOTICE"; + } + else if ($errno == E_USER_WARNING) { + $errTypeStr = "USER WARNING"; + } + else if ($errno == E_USER_ERROR) { + $errTypeStr = "USER FATAL ERROR"; + } + else if ($errno == E_STRICT) { + return; + } + else { + $errTypeStr = "UNKNOWN: $errno"; + } + $GLOBALS['xajaxErrorHandlerText'] .= "\n----\n[$errTypeStr] $errstr\nerror in line $errline of file $errfile"; + } + + ?> \ Pas de fin de ligne à la fin du fichier. diff -rcN ppa.cvs/libraries/xajax/xajax_js/xajax.js ppa.dev/libraries/xajax/xajax_js/xajax.js *** ppa.cvs/libraries/xajax/xajax_js/xajax.js 1970-01-01 01:00:00.000000000 +0100 --- ppa.dev/libraries/xajax/xajax_js/xajax.js 2007-04-07 13:22:32.000000000 +0200 *************** *** 0 **** --- 1,172 ---- + /* xajax Javascript library :: version 0.2.4 */ + Array.prototype.containsValue=function(valueToCheck){for(var i=0;i 1000)text=text.substr(0,1000)+"...\n[long response]\n...";try{if(this.debugWindow==undefined||this.debugWindow.closed==true){this.debugWindow=window.open('about:blank','xajax-debug','width=800,height=600,scrollbars=1,resizable,status');this.debugWindow.document.write('Xajax debug output

Xajax debug output

');} + text=text.replace(/&/g,"&") + text=text.replace(//g,">") + debugTag=this.debugWindow.document.getElementById('debugTag');debugTag.innerHTML=(''+(new Date()).toString()+': '+text+'
')+debugTag.innerHTML;}catch(e){alert("Xajax Debug:\n "+text);} + };this.workId='xajaxWork'+new Date().getTime();this.depth=0;this.responseErrorsForAlert=["400","401","402","403","404","500","501","502","503"];this.getRequestObject=function(){if(xajaxDebug)this.DebugMessage("Initializing Request Object..");var req=null;if(typeof XMLHttpRequest!="undefined") + req=new XMLHttpRequest();if(!req&&typeof ActiveXObject!="undefined"){try{req=new ActiveXObject("Msxml2.XMLHTTP");} + catch(e){try{req=new ActiveXObject("Microsoft.XMLHTTP");} + catch(e2){try{req=new ActiveXObject("Msxml2.XMLHTTP.4.0");} + catch(e3){req=null;} + } + } + } + if(!req&&window.createRequest) + req=window.createRequest();if(!req)this.DebugMessage("Request Object Instantiation failed.");return req;} + this.$=function(sId){if(!sId){return null;} + var returnObj=document.getElementById(sId);if(!returnObj&&document.all){returnObj=document.all[sId];} + if(xajaxDebug&&!returnObj&&sId!=this.workId){this.DebugMessage("Element with the id \""+sId+"\" not found.");} + return returnObj;} + this.include=function(sFileName){var objHead=document.getElementsByTagName('head');var objScript=document.createElement('script');objScript.type='text/javascript';objScript.src=sFileName;objHead[0].appendChild(objScript);} + this.stripOnPrefix=function(sEventName){sEventName=sEventName.toLowerCase();if(sEventName.indexOf('on')==0){sEventName=sEventName.replace(/on/,'');} + return sEventName;} + this.addOnPrefix=function(sEventName){sEventName=sEventName.toLowerCase();if(sEventName.indexOf('on')!=0){sEventName='on'+sEventName;} + return sEventName;} + this.addHandler=function(sElementId,sEvent,sFunctionName){if(window.addEventListener){sEvent=this.stripOnPrefix(sEvent);eval("this.$('"+sElementId+"').addEventListener('"+sEvent+"',"+sFunctionName+",false);");} + else{sAltEvent=this.addOnPrefix(sEvent);eval("this.$('"+sElementId+"').attachEvent('"+sAltEvent+"',"+sFunctionName+",false);");} + } + this.removeHandler=function(sElementId,sEvent,sFunctionName){if(window.addEventListener){sEvent=this.stripOnPrefix(sEvent);eval("this.$('"+sElementId+"').removeEventListener('"+sEvent+"',"+sFunctionName+",false);");} + else{sAltEvent=this.addOnPrefix(sEvent);eval("this.$('"+sElementId+"').detachEvent('"+sAltEvent+"',"+sFunctionName+",false);");} + } + this.create=function(sParentId,sTag,sId){var objParent=this.$(sParentId);objElement=document.createElement(sTag);objElement.setAttribute('id',sId);if(objParent) + objParent.appendChild(objElement);} + this.insert=function(sBeforeId,sTag,sId){var objSibling=this.$(sBeforeId);objElement=document.createElement(sTag);objElement.setAttribute('id',sId);objSibling.parentNode.insertBefore(objElement,objSibling);} + this.insertAfter=function(sAfterId,sTag,sId){var objSibling=this.$(sAfterId);objElement=document.createElement(sTag);objElement.setAttribute('id',sId);objSibling.parentNode.insertBefore(objElement,objSibling.nextSibling);} + this.getInput=function(sType,sName,sId){var Obj;if(!window.addEventListener){Obj=document.createElement('');} + else{Obj=document.createElement('input');Obj.setAttribute('type',sType);Obj.setAttribute('name',sName);Obj.setAttribute('id',sId);} + return Obj;} + this.createInput=function(sParentId,sType,sName,sId){var objParent=this.$(sParentId);var objElement=this.getInput(sType,sName,sId);if(objParent&&objElement) + objParent.appendChild(objElement);} + this.insertInput=function(sBeforeId,sType,sName,sId){var objSibling=this.$(sBeforeId);var objElement=this.getInput(sType,sName,sId);if(objElement&&objSibling&&objSibling.parentNode) + objSibling.parentNode.insertBefore(objElement,objSibling);} + this.insertInputAfter=function(sAfterId,sType,sName,sId){var objSibling=this.$(sAfterId);var objElement=this.getInput(sType,sName,sId);if(objElement&&objSibling&&objSibling.parentNode){objSibling.parentNode.insertBefore(objElement,objSibling.nextSibling);} + } + this.remove=function(sId){objElement=this.$(sId);if(objElement&&objElement.parentNode&&objElement.parentNode.removeChild){objElement.parentNode.removeChild(objElement);} + } + this.replace=function(sId,sAttribute,sSearch,sReplace){var bFunction=false;if(sAttribute=="innerHTML") + sSearch=this.getBrowserHTML(sSearch);eval("var txt=this.$('"+sId+"')."+sAttribute);if(typeof txt=="function"){txt=txt.toString();bFunction=true;} + if(txt.indexOf(sSearch)>-1){var newTxt='';while(txt.indexOf(sSearch)>-1){x=txt.indexOf(sSearch)+sSearch.length+1;newTxt+=txt.substr(0,x).replace(sSearch,sReplace);txt=txt.substr(x,txt.length-x);} + newTxt+=txt;if(bFunction){eval('this.$("'+sId+'").'+sAttribute+'=newTxt;');} + else if(this.willChange(sId,sAttribute,newTxt)){eval('this.$("'+sId+'").'+sAttribute+'=newTxt;');} + } + } + this.getFormValues=function(frm){var objForm;var submitDisabledElements=false;if(arguments.length > 1&&arguments[1]==true) + submitDisabledElements=true;var prefix="";if(arguments.length > 2) + prefix=arguments[2];if(typeof(frm)=="string") + objForm=this.$(frm);else + objForm=frm;var sXml="";if(objForm&&objForm.tagName=='FORM'){var formElements=objForm.elements;for(var i=0;i < formElements.length;i++){if(!formElements[i].name) + continue;if(formElements[i].name.substring(0,prefix.length)!=prefix) + continue;if(formElements[i].type&&(formElements[i].type=='radio'||formElements[i].type=='checkbox')&&formElements[i].checked==false) + continue;if(formElements[i].disabled&&formElements[i].disabled==true&&submitDisabledElements==false) + continue;var name=formElements[i].name;if(name){if(sXml!='') + sXml+='&';if(formElements[i].type=='select-multiple'){for(var j=0;j < formElements[i].length;j++){if(formElements[i].options[j].selected==true) + sXml+=name+"="+encodeURIComponent(formElements[i].options[j].value)+"&";} + } + else{sXml+=name+"="+encodeURIComponent(formElements[i].value);} + } + } + } + sXml+="";return sXml;} + this.objectToXML=function(obj){var sXml="";for(i in obj){try{if(i=='constructor') + continue;if(obj[i]&&typeof(obj[i])=='function') + continue;var key=i;var value=obj[i];if(value&&typeof(value)=="object"&&this.depth <=50){this.depth++;value=this.objectToXML(value);this.depth--;} + sXml+=""+key+""+value+"";} + catch(e){if(xajaxDebug)this.DebugMessage(e.name+": "+e.message);} + } + sXml+="";return sXml;} + this._nodeToObject=function(node){if(node.nodeName=='#cdata-section'){var data="";for(var j=0;j"+document.getElementsByTagName("HTML")[0].innerHTML+"";} + this.processResponse=function(xml){clearTimeout(loadingTimeout);this.doneLoadingFunction();if(xajaxStatusMessages==true)window.status='Processing...';var tmpXajax=null;xml=xml.documentElement;if(xml==null) + return;var skipCommands=0;for(var i=0;i 0){skipCommands--;continue;} + if(xml.childNodes[i].nodeName=="cmd"){var cmd;var id;var property;var data;var search;var type;var before;var objElement=null;for(var j=0;j 1&&xml.childNodes[i].firstChild.nodeName=="#cdata-section"){data="";for(var j=0;j 1){for(var j=0;j 1&&xml.childNodes[i].childNodes[j].firstChild.nodeName=="#cdata-section"){var internalData="";for(var k=0;k 1000) text = text.substr(0,1000)+"...\n[long response]\n..."; + try { + if (this.debugWindow == undefined || this.debugWindow.closed == true) { + this.debugWindow = window.open('about:blank', 'xajax-debug', 'width=800,height=600,scrollbars=1,resizable,status'); + this.debugWindow.document.write('Xajax debug output

Xajax debug output

'); + } + text = text.replace(/&/g, "&") + text = text.replace(//g, ">") + debugTag = this.debugWindow.document.getElementById('debugTag'); + debugTag.innerHTML = (''+(new Date()).toString()+': ' + text + '
') + debugTag.innerHTML; + } catch (e) { + alert("Xajax Debug:\n " + text); + } + }; + + this.workId = 'xajaxWork'+ new Date().getTime(); + this.depth = 0; + this.responseErrorsForAlert = ["400","401","402","403","404","500","501","502","503"]; + + //Get the XMLHttpRequest Object + this.getRequestObject = function() + { + if (xajaxDebug) this.DebugMessage("Initializing Request Object.."); + var req = null; + if (typeof XMLHttpRequest != "undefined") + req = new XMLHttpRequest(); + if (!req && typeof ActiveXObject != "undefined") + { + try + { + req=new ActiveXObject("Msxml2.XMLHTTP"); + } + catch (e) + { + try + { + req=new ActiveXObject("Microsoft.XMLHTTP"); + } + catch (e2) + { + try { + req=new ActiveXObject("Msxml2.XMLHTTP.4.0"); + } + catch (e3) + { + req=null; + } + } + } + } + if(!req && window.createRequest) + req = window.createRequest(); + + if (!req) this.DebugMessage("Request Object Instantiation failed."); + + return req; + } + + // xajax.$() is shorthand for document.getElementById() + this.$ = function(sId) + { + if (!sId) { + return null; + } + var returnObj = document.getElementById(sId); + if (!returnObj && document.all) { + returnObj = document.all[sId]; + } + if (xajaxDebug && !returnObj && sId != this.workId) { + this.DebugMessage("Element with the id \"" + sId + "\" not found."); + } + return returnObj; + } + + // xajax.include(sFileName) dynamically includes an external javascript file + this.include = function(sFileName) + { + var objHead = document.getElementsByTagName('head'); + var objScript = document.createElement('script'); + objScript.type = 'text/javascript'; + objScript.src = sFileName; + objHead[0].appendChild(objScript); + } + + this.stripOnPrefix = function(sEventName) + { + sEventName = sEventName.toLowerCase(); + if (sEventName.indexOf('on') == 0) + { + sEventName = sEventName.replace(/on/,''); + } + + return sEventName; + } + + this.addOnPrefix = function(sEventName) + { + sEventName = sEventName.toLowerCase(); + if (sEventName.indexOf('on') != 0) + { + sEventName = 'on' + sEventName; + } + + return sEventName; + } + + // xajax.addHandler adds an event handler to an element + this.addHandler = function(sElementId, sEvent, sFunctionName) + { + if (window.addEventListener) + { + sEvent = this.stripOnPrefix(sEvent); + eval("this.$('"+sElementId+"').addEventListener('"+sEvent+"',"+sFunctionName+",false);"); + } + else + { + sAltEvent = this.addOnPrefix(sEvent); + eval("this.$('"+sElementId+"').attachEvent('"+sAltEvent+"',"+sFunctionName+",false);"); + } + } + + // xajax.removeHandler removes an event handler from an element + this.removeHandler = function(sElementId, sEvent, sFunctionName) + { + if (window.addEventListener) + { + sEvent = this.stripOnPrefix(sEvent); + eval("this.$('"+sElementId+"').removeEventListener('"+sEvent+"',"+sFunctionName+",false);"); + } + else + { + sAltEvent = this.addOnPrefix(sEvent); + eval("this.$('"+sElementId+"').detachEvent('"+sAltEvent+"',"+sFunctionName+",false);"); + } + } + + // xajax.create creates a new child node under a parent + this.create = function(sParentId, sTag, sId) + { + var objParent = this.$(sParentId); + objElement = document.createElement(sTag); + objElement.setAttribute('id',sId); + if (objParent) + objParent.appendChild(objElement); + } + + // xajax.insert inserts a new node before another node + this.insert = function(sBeforeId, sTag, sId) + { + var objSibling = this.$(sBeforeId); + objElement = document.createElement(sTag); + objElement.setAttribute('id',sId); + objSibling.parentNode.insertBefore(objElement, objSibling); + } + + // xajax.insertAfter inserts a new node after another node + this.insertAfter = function(sAfterId, sTag, sId) + { + var objSibling = this.$(sAfterId); + objElement = document.createElement(sTag); + objElement.setAttribute('id',sId); + objSibling.parentNode.insertBefore(objElement, objSibling.nextSibling); + } + + this.getInput = function(sType, sName, sId) + { + var Obj; + if (!window.addEventListener) + { + Obj = document.createElement(''); + } + else + { + Obj = document.createElement('input'); + Obj.setAttribute('type',sType); + Obj.setAttribute('name',sName); + Obj.setAttribute('id',sId); + } + return Obj; + } + + // xajax.createInput creates a new input node under a parent + this.createInput = function(sParentId, sType, sName, sId) + { + var objParent = this.$(sParentId); + var objElement = this.getInput(sType, sName, sId); + if (objParent && objElement) + objParent.appendChild(objElement); + } + + // xajax.insertInput creates a new input node before another node + this.insertInput = function(sBeforeId, sType, sName, sId) + { + var objSibling = this.$(sBeforeId); + var objElement = this.getInput(sType, sName, sId); + if (objElement && objSibling && objSibling.parentNode) + objSibling.parentNode.insertBefore(objElement, objSibling); + } + + // xajax.insertInputAfter creates a new input node after another node + this.insertInputAfter = function(sAfterId, sType, sName, sId) + { + var objSibling = this.$(sAfterId); + var objElement = this.getInput(sType, sName, sId); + if (objElement && objSibling && objSibling.parentNode) { + objSibling.parentNode.insertBefore(objElement, objSibling.nextSibling); + } + } + + // xajax.remove deletes an element + this.remove = function(sId) + { + objElement = this.$(sId); + if (objElement && objElement.parentNode && objElement.parentNode.removeChild) + { + objElement.parentNode.removeChild(objElement); + } + } + + //xajax.replace searches for text in an attribute of an element and replaces it + //with a different text + this.replace = function(sId,sAttribute,sSearch,sReplace) + { + var bFunction = false; + + if (sAttribute == "innerHTML") + sSearch = this.getBrowserHTML(sSearch); + + eval("var txt=this.$('"+sId+"')."+sAttribute); + if (typeof txt == "function") + { + txt = txt.toString(); + bFunction = true; + } + if (txt.indexOf(sSearch)>-1) + { + var newTxt = ''; + while (txt.indexOf(sSearch) > -1) + { + x = txt.indexOf(sSearch)+sSearch.length+1; + newTxt += txt.substr(0,x).replace(sSearch,sReplace); + txt = txt.substr(x,txt.length-x); + } + newTxt += txt; + if (bFunction) + { + eval('this.$("'+sId+'").'+sAttribute+'=newTxt;'); + } + else if (this.willChange(sId,sAttribute,newTxt)) + { + eval('this.$("'+sId+'").'+sAttribute+'=newTxt;'); + } + } + } + + // xajax.getFormValues() builds a query string XML message from the elements of a form object + // * The first argument is the id of the form + // * The second argument (optional) can be set to true if you want to submit disabled elements + // * The third argument (optional) allows you to specify a string prefix that a form element + // name must contain if you want that element to be submitted + this.getFormValues = function(frm) + { + var objForm; + var submitDisabledElements = false; + if (arguments.length > 1 && arguments[1] == true) + submitDisabledElements = true; + var prefix=""; + if(arguments.length > 2) + prefix = arguments[2]; + + if (typeof(frm) == "string") + objForm = this.$(frm); + else + objForm = frm; + var sXml = ""; + if (objForm && objForm.tagName == 'FORM') + { + var formElements = objForm.elements; + for( var i=0; i < formElements.length; i++) + { + if (!formElements[i].name) + continue; + if (formElements[i].name.substring(0, prefix.length) != prefix) + continue; + if (formElements[i].type && (formElements[i].type == 'radio' || formElements[i].type == 'checkbox') && formElements[i].checked == false) + continue; + if (formElements[i].disabled && formElements[i].disabled == true && submitDisabledElements == false) + continue; + var name = formElements[i].name; + if (name) + { + if (sXml != '') + sXml += '&'; + if(formElements[i].type=='select-multiple') + { + for (var j = 0; j < formElements[i].length; j++) + { + if (formElements[i].options[j].selected == true) + sXml += name+"="+encodeURIComponent(formElements[i].options[j].value)+"&"; + } + } + else + { + sXml += name+"="+encodeURIComponent(formElements[i].value); + } + } + } + } + + sXml +=""; + + return sXml; + } + + // Generates an XML message that xajax can understand from a javascript object + this.objectToXML = function(obj) + { + var sXml = ""; + for (i in obj) + { + try + { + if (i == 'constructor') + continue; + if (obj[i] && typeof(obj[i]) == 'function') + continue; + + var key = i; + var value = obj[i]; + if (value && typeof(value)=="object" && this.depth <= 50) + { + this.depth++; + value = this.objectToXML(value); + this.depth--; + } + + sXml += ""+key+""+value+""; + + } + catch(e) + { + if (xajaxDebug) this.DebugMessage(e.name+": "+e.message); + } + } + sXml += ""; + + return sXml; + } + + // unserializes data structure from xajaxResponse::_buildObjXml() + this._nodeToObject = function(node) { + // parentNode here is weird, have to tune + if (node.nodeName == '#cdata-section') { + var data = ""; + for (var j=0; j"+document.getElementsByTagName("HTML")[0].innerHTML+""; + } + + //Process XML xajaxResponses returned from the request + this.processResponse = function(xml) + { + clearTimeout(loadingTimeout); + this.doneLoadingFunction(); + if (xajaxStatusMessages == true) window.status = 'Processing...'; + var tmpXajax = null; + xml = xml.documentElement; + if (xml == null) + return; + + var skipCommands = 0; + for (var i=0; i 0) { + skipCommands--; + continue; + } + if (xml.childNodes[i].nodeName == "cmd") + { + var cmd; + var id; + var property; + var data; + var search; + var type; + var before; + var objElement = null; + + for (var j=0; j 1 && xml.childNodes[i].firstChild.nodeName == "#cdata-section") + { + data = ""; + for (var j=0; j 1) + { + for (var j=0; j 1 && xml.childNodes[i].childNodes[j].firstChild.nodeName == "#cdata-section") + { + var internalData = ""; + for (var k=0; k + *
  • Assign - sets the specified attribute of an element in your page
  • + *
  • Append - appends data to the end of the specified attribute of an + * element in your page
  • + *
  • Prepend - prepends data to the beginning of the specified attribute of + * an element in your page
  • + *
  • Replace - searches for and replaces data in the specified attribute of + * an element in your page
  • + *
  • Script - runs the supplied JavaScript code
  • + *
  • Alert - shows an alert box with the supplied message text
  • + * + * + * Note: elements are identified by their HTML id, so if you don't see + * your browser HTML display changing from the request, make sure you're using + * the right id names in your response. + * + * @package xajax + */ + class xajaxResponse + { + /**#@+ + * @access protected + */ + /** + * @var string internal XML storage + */ + var $xml; + /** + * @var string the encoding type to use + */ + var $sEncoding; + /** + * @var boolean if special characters in the XML should be converted to + * entities + */ + var $bOutputEntities; + + /**#@-*/ + + /** + * The constructor's main job is to set the character encoding for the + * response. + * + * Note: to change the character encoding for all of the + * responses, set the XAJAX_DEFAULT_ENCODING constant before you + * instantiate xajax. + * + * @param string contains the character encoding string to use + * @param boolean lets you set if you want special characters in the output + * converted to HTML entities + * + */ + function xajaxResponse($sEncoding=XAJAX_DEFAULT_CHAR_ENCODING, $bOutputEntities=false) + { + $this->setCharEncoding($sEncoding); + $this->bOutputEntities = $bOutputEntities; + } + + /** + * Sets the character encoding for the response based on $sEncoding, which + * is a string containing the character encoding to use. You don't need to + * use this method normally, since the character encoding for the response + * gets set automatically based on the XAJAX_DEFAULT_CHAR_ENCODING + * constant. + * + * @param string + */ + function setCharEncoding($sEncoding) + { + $this->sEncoding = $sEncoding; + } + + /** + * Tells the response object to convert special characters to HTML entities + * automatically (only works if the mb_string extension is available). + */ + function outputEntitiesOn() + { + $this->bOutputEntities = true; + } + + /** + * Tells the response object to output special characters intact. (default + * behavior) + */ + function outputEntitiesOff() + { + $this->bOutputEntities = false; + } + + /** + * Adds a confirm commands command message to the XML response. + * + * Usage: $objResponse->addConfirmCommands(1, "Do you want to preview the new data?"); + * + * @param integer the number of commands to skip if the user presses + * Cancel in the browsers's confirm dialog + * @param string the message to show in the browser's confirm dialog + */ + function addConfirmCommands($iCmdNumber, $sMessage) + { + $this->xml .= $this->_cmdXML(array("n"=>"cc","t"=>$iCmdNumber),$sMessage); + } + + /** + * Adds an assign command message to the XML response. + * + * Usage: $objResponse->addAssign("contentDiv", "innerHTML", "Some Text"); + * + * @param string contains the id of an HTML element + * @param string the part of the element you wish to modify ("innerHTML", + * "value", etc.) + * @param string the data you want to set the attribute to + */ + function addAssign($sTarget,$sAttribute,$sData) + { + $this->xml .= $this->_cmdXML(array("n"=>"as","t"=>$sTarget,"p"=>$sAttribute),$sData); + } + + /** + * Adds an append command message to the XML response. + * + * Usage: $objResponse->addAppend("contentDiv", "innerHTML", "Some New Text"); + * + * @param string contains the id of an HTML element + * @param string the part of the element you wish to modify ("innerHTML", + * "value", etc.) + * @param string the data you want to append to the end of the attribute + */ + function addAppend($sTarget,$sAttribute,$sData) + { + $this->xml .= $this->_cmdXML(array("n"=>"ap","t"=>$sTarget,"p"=>$sAttribute),$sData); + } + + /** + * Adds an prepend command message to the XML response. + * + * Usage: $objResponse->addPrepend("contentDiv", "innerHTML", "Some Starting Text"); + * + * @param string contains the id of an HTML element + * @param string the part of the element you wish to modify ("innerHTML", + * "value", etc.) + * @param string the data you want to prepend to the beginning of the + * attribute + */ + function addPrepend($sTarget,$sAttribute,$sData) + { + $this->xml .= $this->_cmdXML(array("n"=>"pp","t"=>$sTarget,"p"=>$sAttribute),$sData); + } + + /** + * Adds a replace command message to the XML response. + * + * Usage: $objResponse->addReplace("contentDiv", "innerHTML", "text", "text"); + * + * @param string contains the id of an HTML element + * @param string the part of the element you wish to modify ("innerHTML", + * "value", etc.) + * @param string the string to search for + * @param string the string to replace the search string when found in the + * attribute + */ + function addReplace($sTarget,$sAttribute,$sSearch,$sData) + { + $sDta = ""; + $this->xml .= $this->_cmdXML(array("n"=>"rp","t"=>$sTarget,"p"=>$sAttribute),$sDta); + } + + /** + * Adds a clear command message to the XML response. + * + * Usage: $objResponse->addClear("contentDiv", "innerHTML"); + * + * @param string contains the id of an HTML element + * @param string the part of the element you wish to clear ("innerHTML", + * "value", etc.) + */ + function addClear($sTarget,$sAttribute) + { + $this->addAssign($sTarget,$sAttribute,''); + } + + /** + * Adds an alert command message to the XML response. + * + * Usage: $objResponse->addAlert("This is important information"); + * + * @param string the text to be displayed in the Javascript alert box + */ + function addAlert($sMsg) + { + $this->xml .= $this->_cmdXML(array("n"=>"al"),$sMsg); + } + + /** + * Uses the addScript() method to add a Javascript redirect to another URL. + * + * Usage: $objResponse->addRedirect("http://www.xajaxproject.org"); + * + * @param string the URL to redirect the client browser to + */ + function addRedirect($sURL) + { + //we need to parse the query part so that the values are rawurlencode()'ed + //can't just use parse_url() cos we could be dealing with a relative URL which + // parse_url() can't deal with. + $queryStart = strpos($sURL, '?', strrpos($sURL, '/')); + if ($queryStart !== FALSE) + { + $queryStart++; + $queryEnd = strpos($sURL, '#', $queryStart); + if ($queryEnd === FALSE) + $queryEnd = strlen($sURL); + $queryPart = substr($sURL, $queryStart, $queryEnd-$queryStart); + parse_str($queryPart, $queryParts); + $newQueryPart = ""; + foreach($queryParts as $key => $value) + { + $newQueryPart .= rawurlencode($key).'='.rawurlencode($value).ini_get('arg_separator.output'); + } + $sURL = str_replace($queryPart, $newQueryPart, $sURL); + } + $this->addScript('window.location = "'.$sURL.'";'); + } + + /** + * Adds a Javascript command message to the XML response. + * + * Usage: $objResponse->addScript("var x = prompt('get some text');"); + * + * @param string contains Javascript code to be executed + */ + function addScript($sJS) + { + $this->xml .= $this->_cmdXML(array("n"=>"js"),$sJS); + } + + /** + * Adds a Javascript function call command message to the XML response. + * + * Usage: $objResponse->addScriptCall("myJSFunction", "arg 1", "arg 2", 12345); + * + * @param string $sFunc the name of a Javascript function + * @param mixed $args,... optional arguments to pass to the Javascript function + */ + function addScriptCall() { + $arguments = func_get_args(); + $sFunc = array_shift($arguments); + $sData = $this->_buildObjXml($arguments); + $this->xml .= $this->_cmdXML(array("n"=>"jc","t"=>$sFunc),$sData); + } + + /** + * Adds a remove element command message to the XML response. + * + * Usage: $objResponse->addRemove("Div2"); + * + * @param string contains the id of an HTML element to be removed + */ + function addRemove($sTarget) + { + $this->xml .= $this->_cmdXML(array("n"=>"rm","t"=>$sTarget),''); + } + + /** + * Adds a create element command message to the XML response. + * + * Usage: $objResponse->addCreate("parentDiv", "h3", "myid"); + * + * @param string contains the id of an HTML element to to which the new + * element will be appended. + * @param string the tag to be added + * @param string the id to be assigned to the new element + * @param string deprecated, use the addCreateInput() method instead + */ + function addCreate($sParent, $sTag, $sId, $sType="") + { + if ($sType) + { + trigger_error("The \$sType parameter of addCreate has been deprecated. Use the addCreateInput() method instead.", E_USER_WARNING); + return; + } + $this->xml .= $this->_cmdXML(array("n"=>"ce","t"=>$sParent,"p"=>$sId),$sTag); + } + + /** + * Adds a insert element command message to the XML response. + * + * Usage: $objResponse->addInsert("childDiv", "h3", "myid"); + * + * @param string contains the id of the child before which the new element + * will be inserted + * @param string the tag to be added + * @param string the id to be assigned to the new element + */ + function addInsert($sBefore, $sTag, $sId) + { + $this->xml .= $this->_cmdXML(array("n"=>"ie","t"=>$sBefore,"p"=>$sId),$sTag); + } + + /** + * Adds a insert element command message to the XML response. + * + * Usage: $objResponse->addInsertAfter("childDiv", "h3", "myid"); + * + * @param string contains the id of the child after which the new element + * will be inserted + * @param string the tag to be added + * @param string the id to be assigned to the new element + */ + function addInsertAfter($sAfter, $sTag, $sId) + { + $this->xml .= $this->_cmdXML(array("n"=>"ia","t"=>$sAfter,"p"=>$sId),$sTag); + } + + /** + * Adds a create input command message to the XML response. + * + * Usage: $objResponse->addCreateInput("form1", "text", "username", "input1"); + * + * @param string contains the id of an HTML element to which the new input + * will be appended + * @param string the type of input to be created (text, radio, checkbox, + * etc.) + * @param string the name to be assigned to the new input and the variable + * name when it is submitted + * @param string the id to be assigned to the new input + */ + function addCreateInput($sParent, $sType, $sName, $sId) + { + $this->xml .= $this->_cmdXML(array("n"=>"ci","t"=>$sParent,"p"=>$sId,"c"=>$sType),$sName); + } + + /** + * Adds an insert input command message to the XML response. + * + * Usage: $objResponse->addInsertInput("input5", "text", "username", "input1"); + * + * @param string contains the id of the child before which the new element + * will be inserted + * @param string the type of input to be created (text, radio, checkbox, + * etc.) + * @param string the name to be assigned to the new input and the variable + * name when it is submitted + * @param string the id to be assigned to the new input + */ + function addInsertInput($sBefore, $sType, $sName, $sId) + { + $this->xml .= $this->_cmdXML(array("n"=>"ii","t"=>$sBefore,"p"=>$sId,"c"=>$sType),$sName); + } + + /** + * Adds an insert input command message to the XML response. + * + * Usage: $objResponse->addInsertInputAfter("input7", "text", "email", "input2"); + * + * @param string contains the id of the child after which the new element + * will be inserted + * @param string the type of input to be created (text, radio, checkbox, + * etc.) + * @param string the name to be assigned to the new input and the variable + * name when it is submitted + * @param string the id to be assigned to the new input + */ + function addInsertInputAfter($sAfter, $sType, $sName, $sId) + { + $this->xml .= $this->_cmdXML(array("n"=>"iia","t"=>$sAfter,"p"=>$sId,"c"=>$sType),$sName); + } + + /** + * Adds an event command message to the XML response. + * + * Usage: $objResponse->addEvent("contentDiv", "onclick", "alert(\'Hello World\');"); + * + * @param string contains the id of an HTML element + * @param string the event you wish to set ("onclick", "onmouseover", etc.) + * @param string the Javascript string you want the event to invoke + */ + function addEvent($sTarget,$sEvent,$sScript) + { + $this->xml .= $this->_cmdXML(array("n"=>"ev","t"=>$sTarget,"p"=>$sEvent),$sScript); + } + + /** + * Adds a handler command message to the XML response. + * + * Usage: $objResponse->addHandler("contentDiv", "onclick", "content_click"); + * + * @param string contains the id of an HTML element + * @param string the event you wish to set ("onclick", "onmouseover", etc.) + * @param string the name of a Javascript function that will handle the + * event. Multiple handlers can be added for the same event + */ + function addHandler($sTarget,$sEvent,$sHandler) + { + $this->xml .= $this->_cmdXML(array("n"=>"ah","t"=>$sTarget,"p"=>$sEvent),$sHandler); + } + + /** + * Adds a remove handler command message to the XML response. + * + * Usage: $objResponse->addRemoveHandler("contentDiv", "onclick", "content_click"); + * + * @param string contains the id of an HTML element + * @param string the event you wish to remove ("onclick", "onmouseover", + * etc.) + * @param string the name of a Javascript handler function that you want to + * remove + */ + function addRemoveHandler($sTarget,$sEvent,$sHandler) + { + $this->xml .= $this->_cmdXML(array("n"=>"rh","t"=>$sTarget,"p"=>$sEvent),$sHandler); + } + + /** + * Adds an include script command message to the XML response. + * + * Usage: $objResponse->addIncludeScript("functions.js"); + * + * @param string URL of the Javascript file to include + */ + function addIncludeScript($sFileName) + { + $this->xml .= $this->_cmdXML(array("n"=>"in"),$sFileName); + } + + /** + * Returns the XML to be returned from your function to the xajax processor + * on your page. Since xajax 0.2, you can also return an xajaxResponse + * object from your function directly, and xajax will automatically request + * the XML using this method call. + * + * Usage: return $objResponse->getXML(); + * + * @return string response XML data + */ + function getXML() + { + $sXML = "sEncoding && strlen(trim($this->sEncoding)) > 0) + $sXML .= " encoding=\"".$this->sEncoding."\""; + $sXML .= " ?".">" . $this->xml . ""; + + return $sXML; + } + + /** + * Adds the commands of the provided response XML output to this response + * object + * + * Usage: + * $r1 = $objResponse1->getXML(); + * $objResponse2->loadXML($r1); + * return $objResponse2->getXML(); + * + * @param string the response XML (returned from a getXML() method) to add + * to the end of this response object + */ + function loadXML($mXML) + { + if (is_a($mXML, "xajaxResponse")) { + $mXML = $mXML->getXML(); + } + $sNewXML = ""; + $iStartPos = strpos($mXML, "") + 5; + $sNewXML = substr($mXML, $iStartPos); + $iEndPos = strpos($sNewXML, ""); + $sNewXML = substr($sNewXML, 0, $iEndPos); + $this->xml .= $sNewXML; + } + + /** + * Generates XML from command data + * + * @access private + * @param array associative array of attributes + * @param string data + * @return string XML command + */ + function _cmdXML($aAttributes, $sData) + { + if ($this->bOutputEntities) { + if (function_exists('mb_convert_encoding')) { + $sData = call_user_func_array('mb_convert_encoding', array(&$sData, 'HTML-ENTITIES', $this->sEncoding)); + } + else { + trigger_error("The xajax XML response output could not be converted to HTML entities because the mb_convert_encoding function is not available", E_USER_NOTICE); + } + } + $xml = " $sValue) + $xml .= " $sAttribute=\"$sValue\""; + if ($sData !== null && !stristr($sData,'"; + else if ($sData !== null) + $xml .= ">$sData"; + else + $xml .= ">"; + + return $xml; + } + + /** + * Recursively serializes a data structure in XML so it can be sent to + * the client. It could be thought of as the opposite of + * {@link xajax::_parseObjXml()}. + * + * @access private + * @param mixed data structure to serialize to XML + * @return string serialized XML + */ + function _buildObjXml($var) { + if (gettype($var) == "object") $var = get_object_vars($var); + if (!is_array($var)) { + return ""; + } + else { + $data = ""; + foreach ($var as $key => $value) { + $data .= ""; + $data .= "" . htmlspecialchars($key) . ""; + $data .= "" . $this->_buildObjXml($value) . ""; + $data .= ""; + } + $data .= ""; + return $data; + } + } + + }// end class xajaxResponse + ?> diff -rcN ppa.cvs/operators.php ppa.dev/operators.php *** ppa.cvs/operators.php 2007-01-15 16:48:17.000000000 +0100 --- ppa.dev/operators.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 116,121 **** --- 116,123 ---- 'operator' => array( 'title' => $lang['stroperator'], 'field' => 'oprname', + 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&", + 'vars' => array('operator' => 'oprname', 'operator_oid' => 'oid'), ), 'leftarg' => array( 'title' => $lang['strleftarg'], *************** *** 139,149 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&", - 'vars' => array('operator' => 'oprname', 'operator_oid' => 'oid'), - ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "{$PHP_SELF}?action=confirm_drop&{$misc->href}&", --- 141,146 ---- diff -rcN ppa.cvs/PATCH ppa.dev/PATCH *** ppa.cvs/PATCH 1970-01-01 01:00:00.000000000 +0100 --- ppa.dev/PATCH 2007-04-07 13:22:32.000000000 +0200 *************** *** 0 **** --- 1,2 ---- + TODO: + - recursive FKs links in display diff -rcN ppa.cvs/plugin_slony.php ppa.dev/plugin_slony.php *** ppa.cvs/plugin_slony.php 2007-01-10 03:34:54.000000000 +0100 --- ppa.dev/plugin_slony.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 435,440 **** --- 435,442 ---- 'no_name' => array( 'title' => $lang['strcluster'], 'field' => 'cluster' + 'url' => "plugin_slony.php?{$misc->href}&action=cluster_properties&", + 'vars' => array('slony_cluster' => 'cluster') ), 'actions' => array( 'title' => $lang['stractions'], *************** *** 446,456 **** ); $actions = array ( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "plugin_slony.php?{$misc->href}&action=cluster_properties&", - 'vars' => array('slony_cluster' => 'cluster') - ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "plugin_slony.php?{$misc->href}&action=confirm_drop_cluster&", --- 448,453 ---- *************** *** 602,607 **** --- 599,606 ---- 'no_name' => array( 'title' => $lang['strname'], 'field' => 'no_comment' + 'url' => "plugin_slony.php?{$misc->href}&action=node_properties&subject=slony_node&", + 'vars' => array('no_id' => 'no_id', 'no_name' => 'no_comment') ), 'no_status' => array( 'title' => $lang['strstatus'], *************** *** 618,628 **** ); $actions = array ( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "plugin_slony.php?{$misc->href}&action=node_properties&subject=slony_node&", - 'vars' => array('no_id' => 'no_id', 'no_name' => 'no_comment') - ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "plugin_slony.php?{$misc->href}&action=confirm_drop_node&subject=slony_node&", --- 617,622 ---- *************** *** 761,766 **** --- 755,762 ---- 'no_name' => array( 'title' => $lang['strname'], 'field' => 'no_comment' + 'url' => "plugin_slony.php?{$misc->href}&action=path_properties&", + 'vars' => array('no_id' => 'pa_client', 'path_id' => 'no_id') ), 'actions' => array( 'title' => $lang['stractions'], *************** *** 772,782 **** ); $actions = array ( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "plugin_slony.php?{$misc->href}&action=path_properties&", - 'vars' => array('no_id' => 'pa_client', 'path_id' => 'no_id') - ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "plugin_slony.php?{$misc->href}&action=confirm_drop_path&", --- 768,773 ---- *************** *** 938,943 **** --- 929,936 ---- 'no_name' => array( 'title' => $lang['strname'], 'field' => 'no_comment' + 'url' => "plugin_slony.php?{$misc->href}&action=listen_properties&", + 'vars' => array('no_id' => 'li_receiver', 'listen_id' => 'no_id', 'origin_id' => 'li_origin') ), 'actions' => array( 'title' => $lang['stractions'], *************** *** 949,959 **** ); $actions = array ( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "plugin_slony.php?{$misc->href}&action=listen_properties&", - 'vars' => array('no_id' => 'li_receiver', 'listen_id' => 'no_id', 'origin_id' => 'li_origin') - ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "plugin_slony.php?{$misc->href}&action=confirm_drop_listen&", --- 942,947 ---- *************** *** 1110,1115 **** --- 1098,1105 ---- 'set_name' => array( 'title' => $lang['strname'], 'field' => 'set_comment' + 'url' => "plugin_slony.php?{$misc->href}&action=set_properties&", + 'vars' => array('set_id' => 'set_id') ), 'actions' => array( 'title' => $lang['stractions'], *************** *** 1121,1131 **** ); $actions = array ( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "plugin_slony.php?{$misc->href}&action=set_properties&", - 'vars' => array('set_id' => 'set_id') - ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "plugin_slony.php?{$misc->href}&action=confirm_drop_set&", --- 1111,1116 ---- *************** *** 1512,1517 **** --- 1497,1504 ---- 'table' => array( 'title' => $lang['strtable'], 'field' => 'qualname', + 'url' => "redirect.php?subject=table&{$misc->href}&", + 'vars' => array('table' => 'relname', 'schema' => 'nspname'), ), 'owner' => array( 'title' => $lang['strowner'], *************** *** 1536,1546 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "redirect.php?subject=table&{$misc->href}&", - 'vars' => array('table' => 'relname', 'schema' => 'nspname'), - ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "plugin_slony.php?{$misc->href}&action=confirm_drop_table&set_id={$_REQUEST['set_id']}&", --- 1523,1528 ---- *************** *** 1796,1801 **** --- 1778,1785 ---- 'sequence' => array( 'title' => $lang['strsequence'], 'field' => 'qualname', + 'url' => "sequences.php?action=properties&{$misc->href}&", + 'vars' => array('sequence' => 'seqname', 'schema' => 'nspname'), ), 'owner' => array( 'title' => $lang['strowner'], *************** *** 1811,1821 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "sequences.php?action=properties&{$misc->href}&", - 'vars' => array('sequence' => 'seqname', 'schema' => 'nspname'), - ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "plugin_slony.php?{$misc->href}&action=confirm_drop_sequence&set_id={$_REQUEST['set_id']}&", --- 1795,1800 ---- *************** *** 2002,2024 **** 'no_name' => array( 'title' => $lang['strname'], 'field' => 'no_comment' ), - /* 'actions' => array( - 'title' => $lang['stractions'], - ),*/ 'no_comment' => array( 'title' => $lang['strcomment'], 'field' => 'no_comment' ) ); ! $actions = array ( ! 'properties' => array( ! 'title' => $lang['strproperties'], ! 'url' => "plugin_slony.php?{$misc->href}&action=subscription_properties&", ! 'vars' => array('set_id' => 'sub_set', 'no_id' => 'no_id') ! ) ! ); $misc->printTable($subscriptions, $columns, $actions, $lang['strnosubscriptions']); } --- 1981,1996 ---- 'no_name' => array( 'title' => $lang['strname'], 'field' => 'no_comment' + 'url' => "plugin_slony.php?{$misc->href}&action=subscription_properties&", + 'vars' => array('set_id' => 'sub_set', 'no_id' => 'no_id') ), 'no_comment' => array( 'title' => $lang['strcomment'], 'field' => 'no_comment' ) ); ! $actions = array (); $misc->printTable($subscriptions, $columns, $actions, $lang['strnosubscriptions']); } diff -rcN ppa.cvs/reports.php ppa.dev/reports.php *** ppa.cvs/reports.php 2007-01-26 18:55:42.000000000 +0100 --- ppa.dev/reports.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 246,251 **** --- 246,253 ---- 'report' => array( 'title' => $lang['strreport'], 'field' => 'report_name', + 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&", + 'vars' => array('report_id' => 'report_id'), ), 'database' => array( 'title' => $lang['strdatabase'], *************** *** 267,277 **** $return_url = urlencode("{$PHP_SELF}?{$misc->href}"); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&", - 'vars' => array('report_id' => 'report_id'), - ), 'run' => array( 'title' => $lang['strrun'], 'url' => "display.php?subject=report&{$misc->href}&return_url={$return_url}&return_desc=".urlencode($lang['strback'])."&", --- 269,274 ---- diff -rcN ppa.cvs/roles.php ppa.dev/roles.php *** ppa.cvs/roles.php 2007-01-10 01:58:54.000000000 +0100 --- ppa.dev/roles.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 559,564 **** --- 559,566 ---- 'role' => array( 'title' => $lang['strrole'], 'field' => 'rolname', + 'url' => "redirect.php?subject=role&action=properties&{$misc->href}&", + 'vars' => array('rolename' => 'rolname'), ), 'superuser' => array( 'title' => $lang['strsuper'], *************** *** 603,613 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "redirect.php?subject=role&action=properties&{$misc->href}&", - 'vars' => array('rolename' => 'rolname'), - ), 'alter' => array( 'title' => $lang['stralter'], 'url' => "{$PHP_SELF}?action=alter&{$misc->href}&", --- 605,610 ---- diff -rcN ppa.cvs/rules.php ppa.dev/rules.php *** ppa.cvs/rules.php 2006-06-18 01:50:19.000000000 +0200 --- ppa.dev/rules.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 165,170 **** --- 165,188 ---- echo "

    href}&{$subject}={$object}&subject={$subject}\">{$lang['strcreaterule']}

    \n"; } + function doTree() { + global $misc, $data; + + $rules = $data->getRules($_REQUEST[$_REQUEST['subject']]); + + $reqvars = $misc->getRequestVars($_REQUEST['subject']); + + $attrs = array( + 'text' => field('rulename'), + 'icon' => 'Rule', + ); + + $misc->printTreeXML($rules, $attrs); + exit; + } + + if ($action == 'tree') doTree(); + // Different header if we're view rules or table rules $misc->printHeader($_REQUEST[$_REQUEST['subject']] . ' - ' . $lang['strrules']); $misc->printBody(); diff -rcN ppa.cvs/schemas.php ppa.dev/schemas.php *** ppa.cvs/schemas.php 2007-02-05 19:39:52.000000000 +0100 --- ppa.dev/schemas.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 32,37 **** --- 32,39 ---- 'schema' => array( 'title' => $lang['strschema'], 'field' => 'nspname', + 'url' => "redirect.php?subject=schema&{$misc->href}&", + 'vars' => array('schema' => 'nspname'), ), 'owner' => array( 'title' => $lang['strowner'], *************** *** 47,57 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "redirect.php?subject=schema&{$misc->href}&", - 'vars' => array('schema' => 'nspname'), - ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "{$PHP_SELF}?action=drop&{$misc->href}&", --- 49,54 ---- diff -rcN ppa.cvs/sequences.php ppa.dev/sequences.php *** ppa.cvs/sequences.php 2006-12-31 16:22:59.000000000 +0100 --- ppa.dev/sequences.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 31,36 **** --- 31,38 ---- 'sequence' => array( 'title' => $lang['strsequence'], 'field' => 'seqname', + 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&", + 'vars' => array('sequence' => 'seqname'), ), 'owner' => array( 'title' => $lang['strowner'], *************** *** 46,56 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&", - 'vars' => array('sequence' => 'seqname'), - ), 'alter' => array( 'title' => $lang['stralter'], 'url' => "sequences.php?action=confirm_alter&{$misc->href}&subject=sequence&", --- 48,53 ---- diff -rcN ppa.cvs/servers.php ppa.dev/servers.php *** ppa.cvs/servers.php 2007-01-10 02:25:12.000000000 +0100 --- ppa.dev/servers.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 42,47 **** --- 42,49 ---- 'server' => array( 'title' => $lang['strserver'], 'field' => 'desc', + 'url' => "redirect.php?subject=server&", + 'vars' => array('server' => 'id'), ), 'host' => array( 'title' => $lang['strhost'], *************** *** 61,71 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "redirect.php?subject=server&", - 'vars' => array('server' => 'id'), - ), 'logout' => array( 'title' => $lang['strlogout'], 'url' => "{$PHP_SELF}?action=logout&", --- 63,68 ---- diff -rcN ppa.cvs/tables.php ppa.dev/tables.php *** ppa.cvs/tables.php 2007-04-02 21:44:47.000000000 +0200 --- ppa.dev/tables.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 813,818 **** --- 813,820 ---- 'table' => array( 'title' => $lang['strtable'], 'field' => 'relname', + 'url' => "redirect.php?subject=table&{$misc->href}&", + 'vars' => array('table' => 'relname'), ), 'owner' => array( 'title' => $lang['strowner'], *************** *** 837,847 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "redirect.php?subject=table&{$misc->href}&", - 'vars' => array('table' => 'relname'), - ), 'browse' => array( 'title' => $lang['strbrowse'], 'url' => "display.php?{$misc->href}&subject=table&return_url=".urlencode("tables.php?{$misc->href}")."&return_desc=".urlencode($lang['strback'])."&", --- 839,844 ---- *************** *** 909,918 **** $reqvars, array('table' => field('relname')) ), ! 'branch' => url('tblproperties.php', $reqvars, array ( ! 'action' => 'tree', 'table' => field('relname') ) ) --- 906,915 ---- $reqvars, array('table' => field('relname')) ), ! 'branch' => url('tables.php', $reqvars, array ( ! 'action' => 'subtree', 'table' => field('relname') ) ) *************** *** 922,928 **** --- 919,957 ---- exit; } + function doSubTree() { + global $misc, $data; + + $tabs = $misc->getNavTabs('table'); + $items = $misc->adjustTabsForTree($tabs); + $reqvars = $misc->getRequestVars('table'); + + $attrs = array( + 'text' => noEscape(field('title')), + 'icon' => field('icon'), + 'action' => url( + field('url'), + $reqvars, + array('table' => $_REQUEST['table']) + ), + 'branch' => ifempty( + field('branch'), '', url( + field('url'), + $reqvars, + array( + 'action' => 'tree', + 'table' => $_REQUEST['table'] + ) + ) + ), + ); + + $misc->printTreeXML($items, $attrs); + exit; + } + if ($action == 'tree') doTree(); + if ($action == 'subtree') dosubTree(); $misc->printHeader($lang['strtables']); $misc->printBody(); *************** *** 974,979 **** --- 1003,1015 ---- case 'confirm_analyze': doAnalyze(true); break; + case 'analyze': + if (isset($_POST['analyze'])) doAnalyze(false); + else doDefault(); + break; + case 'confirm_analyze': + doAnalyze(true); + break; default: doDefault(); break; diff -rcN ppa.cvs/tblproperties.php ppa.dev/tblproperties.php *** ppa.cvs/tblproperties.php 2007-03-24 03:33:59.000000000 +0100 --- ppa.dev/tblproperties.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 616,621 **** --- 616,623 ---- 'column' => array( 'title' => $lang['strcolumn'], 'field' => 'attname', + 'url' => "colproperties.php?subject=column&{$misc->href}&table=".urlencode($_REQUEST['table'])."&", + 'vars' => array('column' => 'attname'), ), 'type' => array( 'title' => $lang['strtype'], *************** *** 641,651 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "colproperties.php?subject=column&{$misc->href}&table=".urlencode($_REQUEST['table'])."&", - 'vars' => array('column' => 'attname'), - ), 'alter' => array( 'title' => $lang['stralter'], 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&table=".urlencode($_REQUEST['table'])."&", --- 643,648 ---- diff -rcN ppa.cvs/themes/default/global.css ppa.dev/themes/default/global.css *** ppa.cvs/themes/default/global.css 2006-12-31 16:01:24.000000000 +0100 --- ppa.dev/themes/default/global.css 2007-04-07 13:22:32.000000000 +0200 *************** *** 404,406 **** --- 404,413 ---- .normal_field { } + + .fklink { + cursor:pointer; + float:right; + padding-right: 20px; + } + .closelink{cursor:pointer} diff -rcN ppa.cvs/triggers.php ppa.dev/triggers.php *** ppa.cvs/triggers.php 2007-01-15 16:48:17.000000000 +0100 --- ppa.dev/triggers.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 329,334 **** --- 329,353 ---- echo "

    href}&table=", urlencode($_REQUEST['table']), "\">{$lang['strcreatetrigger']}

    \n"; } + function doTree() { + + global $misc, $data; + + $triggers = $data->getTriggers($_REQUEST['table']); + + $reqvars = $misc->getRequestVars('table'); + + $attrs = array( + 'text' => field('tgname'), + 'icon' => 'Trigger', + ); + + $misc->printTreeXML($triggers, $attrs); + exit; + } + + if ($action == 'tree') doTree(); + $misc->printHeader($lang['strtables'] . ' - ' . $_REQUEST['table'] . ' - ' . $lang['strtriggers']); $misc->printBody(); diff -rcN ppa.cvs/types.php ppa.dev/types.php *** ppa.cvs/types.php 2007-01-23 15:12:29.000000000 +0100 --- ppa.dev/types.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 406,411 **** --- 406,413 ---- 'type' => array( 'title' => $lang['strtype'], 'field' => 'typname', + 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&", + 'vars' => array('type' => 'basename'), ), 'owner' => array( 'title' => $lang['strowner'], *************** *** 437,447 **** if (!isset($types->fields['typtype'])) unset($columns['flavour']); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "{$PHP_SELF}?action=properties&{$misc->href}&", - 'vars' => array('type' => 'basename'), - ), 'drop' => array( 'title' => $lang['strdrop'], 'url' => "{$PHP_SELF}?action=confirm_drop&{$misc->href}&", --- 439,444 ---- diff -rcN ppa.cvs/views.php ppa.dev/views.php *** ppa.cvs/views.php 2007-01-02 18:24:44.000000000 +0100 --- ppa.dev/views.php 2007-04-07 13:22:32.000000000 +0200 *************** *** 527,537 **** $misc->printMsg($msg); $views = $data->getViews(); ! $columns = array( 'view' => array( 'title' => $lang['strview'], 'field' => 'relname', ), 'owner' => array( 'title' => $lang['strowner'], --- 527,539 ---- $misc->printMsg($msg); $views = $data->getViews(); ! $columns = array( 'view' => array( 'title' => $lang['strview'], 'field' => 'relname', + 'url' => "redirect.php?subject=view&{$misc->href}&", + 'vars' => array('view' => 'relname'), ), 'owner' => array( 'title' => $lang['strowner'], *************** *** 547,557 **** ); $actions = array( - 'properties' => array( - 'title' => $lang['strproperties'], - 'url' => "redirect.php?subject=view&{$misc->href}&", - 'vars' => array('view' => 'relname'), - ), 'browse' => array( 'title' => $lang['strbrowse'], 'url' => "display.php?{$misc->href}&subject=view&return_url=".urlencode("views.php?{$misc->href}")."&return_desc=".urlencode($lang['strback'])."&", --- 549,554 ---- *************** *** 597,625 **** $attrs = array( 'text' => field('relname'), 'icon' => 'View', ! 'iconAction' => url('display.php', ! $reqvars, ! array('view' => field('relname')) ! ), 'toolTip'=> field('relcomment'), ! 'action' => url('redirect.php', ! $reqvars, ! array('view' => field('relname')) ! ), ! 'branch' => url('viewproperties.php', ! $reqvars, ! array ( ! 'action' => 'tree', ! 'view' => field('relname') ! ) ! ) ); $misc->printTreeXML($views, $attrs); exit; } if ($action == 'tree') doTree(); $misc->printHeader($lang['strviews']); $misc->printBody(); --- 594,641 ---- $attrs = array( 'text' => field('relname'), 'icon' => 'View', ! 'iconAction' => url('display.php', $reqvars, array('view' => field('relname'))), 'toolTip'=> field('relcomment'), ! 'action' => url('redirect.php', $reqvars, array('view' => field('relname'))), ! 'branch' => url('views.php', $reqvars, ! array ( ! 'action' => 'subtree', ! 'view' => field('relname') ! ) ! ) ); $misc->printTreeXML($views, $attrs); exit; } + function doSubTree() { + global $misc, $data; + + $tabs = $misc->getNavTabs('view'); + $items = $misc->adjustTabsForTree($tabs); + $reqvars = $misc->getRequestVars('view'); + + $attrs = array( + 'text' => noEscape(field('title')), + 'icon' => field('icon'), + 'action' => url(field('url'), $reqvars, field('urlvars'), array('view' => $_REQUEST['view'])), + 'branch' => ifempty( + field('branch'), '', url(field('url'), field('urlvars'), $reqvars, + array( + 'action' => 'tree', + 'view' => $_REQUEST['view'] + ) + ) + ), + ); + + $misc->printTreeXML($items, $attrs); + exit; + } + if ($action == 'tree') doTree(); + if ($action == 'subtree') dosubTree(); $misc->printHeader($lang['strviews']); $misc->printBody();