Merge branch 'master' of ssh://git.onelab.eu/git/plewww
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Mon, 22 Nov 2010 23:47:32 +0000 (00:47 +0100)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Mon, 22 Nov 2010 23:47:32 +0000 (00:47 +0100)
12 files changed:
planetlab/includes/plc_visibletags2.php
planetlab/nodes/nodes.php
planetlab/nodes/nodes2.php [deleted file]
planetlab/slices/slice.php
planetlab/slices/slice2.php [deleted file]
plekit/php/columns.php
plekit/php/logSorting.php
plekit/php/toggle.php
plekit/php/updateConfiguration.php
plekit/table/columns.js
plekit/toggle/toggle.js
plewww.spec

index 319ac7f..e0aad8f 100644 (file)
@@ -65,6 +65,9 @@ class VisibleTags {
     $columns=$this->columns();
     foreach ($columns as $column)
        {
+       if ($column['header'] == 'f')
+                continue;
+
            //panos: needed a few more fields in the header array
        $headerId = $column['header'];
        if ($column['headerId'] != "")
index 7ef48ca..7800b31 100644 (file)
@@ -17,10 +17,18 @@ include 'plc_header.php';
 require_once 'plc_functions.php';
 require_once 'plc_objects.php';
 require_once 'plc_peers.php';
-require_once 'plc_visibletags.php';
+require_once 'plc_visibletags2.php';
 require_once 'linetabs.php';
-require_once 'table.php';
+require_once 'table2.php';
 require_once 'nifty.php';
+require_once 'toggle.php';
+require_once 'columns.php';
+
+// keep css separate for now
+drupal_set_html_head('
+<link href="/planetlab/css/my_slice.css" rel="stylesheet" type="text/css" />
+');
+
 
 ini_set("memory_limit","64M");
 
@@ -63,13 +71,103 @@ function node_status ($node) {
   return plc_vertical_table($messages,'plc-warning');
 }
 
+
+$first_time_configuration = 'false';
+
+if (plc_is_admin()) 
+       $default_configuration = "ID:f|hostname:f|ST:f|AU:f";
+else
+       $default_configuration = "hostname:f|ST:f|AU:f";
+
+//$extra_default = "LCN|DN|R|L|OS|MS|SN";
+$column_configuration = "";
+$slice_column_configuration = "";
+
+$PersonTags=$api->GetPersonTags (array('person_id'=>$plc->person['person_id']));
+//print_r($PersonTags);
+foreach ($PersonTags as $ptag) {
+        if ($ptag['tagname'] == 'columnconf')
+        {
+                $column_configuration = $ptag['value'];
+                $conf_tag_id = $ptag['person_tag_id'];
+        }
+}
+
+//print("column configuration = ".$column_configuration);
+
+$nodesconf_exists = false;
+if ($column_configuration == "")
+{
+        $column_configuration = "nodes;default";
+        $nodesconf_exists = true;
+}
+else {
+        $slice_conf = explode(";",$column_configuration);
+        for ($i=0; $i<count($slice_conf); $i++ ) {
+                if ($slice_conf[$i] == "nodes")
+                {
+                        $i++;
+                        $slice_column_configuration = $slice_conf[$i];
+                        $nodesconf_exists = true;
+                        break;
+                }
+                else
+                {
+                        $i++;
+                        $slice_column_configuration = $slice_conf[$i];
+                }
+        }
+}
+
+if ($nodesconf_exists == false)
+        $column_configuration = $column_configuration.";nodes;default";
+//panos: need to define an "empty" configuration here (for the moment A column
+//will be added by default the first time
+
+
+if ($slice_column_configuration == "" || $slice_column_configuration == "default")
+        $full_configuration = $default_configuration;
+       
+else
+        $full_configuration = $default_configuration."|".$slice_column_configuration;
+
+//print("full configuration = ".$full_configuration);
+
 // fetch nodes 
-$node_fixed_columns=array('hostname','node_type','site_id','node_id','boot_state','run_level','last_contact',
-                         'interface_ids','peer_id', 'slice_ids');
+$node_fixed_columns=array('hostname','node_type','site_id','node_id','boot_state','last_contact','interface_ids','peer_id', 'slice_ids');
+
+$fix_columns = array();
+if (plc_is_admin()) 
+$fix_columns[]=array('tagname'=>'node_id', 'header'=>'ID', 'type'=>'string', 'title'=>'The ID the node');
+$fix_columns[]=array('tagname'=>'hostname', 'header'=>'hostname', 'type'=>'string', 'title'=>'The name of the node');
+$fix_columns[]=array('tagname'=>'peer_id', 'header'=>'AU', 'type'=>'string', 'title'=>'Authority');
+$fix_columns[]=array('tagname'=>'run_level', 'header'=>'ST', 'type'=>'string', 'title'=>'Status');
+//$fix_columns[]=array('tagname'=>'node_type', 'header'=>'RES', 'type'=>'string', 'title'=>'Reservable');
+
+
 $visibletags = new VisibleTags ($api, 'node');
-$visiblecolumns = $visibletags->column_names();
+$visibletags->columns();
+$tag_columns = $visibletags->headers();
+
+$extra_columns = array();
+$extra_columns[]=array('tagname'=>'sitename', 'header'=>'SN', 'type'=>'string', 'title'=>'Site name', 'fetched'=>true);
+$extra_columns[]=array('tagname'=>'domain', 'header'=>'DN', 'type'=>'string', 'title'=>'Toplevel domain name', 'fetched'=>true);
+$extra_columns[]=array('tagname'=>'ipaddress', 'header'=>'IP', 'type'=>'string', 'title'=>'IP Address', 'fetched'=>true);
+$extra_columns[]=array('tagname'=>'fcdistro', 'header'=>'OS', 'type'=>'string', 'title'=>'Operating system', 'fetched'=>false);
+
+$ConfigureColumns =new PlekitColumns($full_configuration, $fix_columns, $tag_columns, $extra_columns);
+
+$visiblecolumns = $ConfigureColumns->node_tags();
+
 $node_columns=array_merge($node_fixed_columns,$visiblecolumns);
 
+//$visibletags = new VisibleTags ($api, 'node');
+//$visiblecolumns = $visibletags->column_names();
+//print("<p>OLD");
+//print_r($visiblecolumns);
+//$node_columns=array_merge($node_fixed_columns,$visiblecolumns);
+
+
 // server-side filtering - set pattern in $_GET for filtering on hostname
 if ($pattern) {
   $node_filter['hostname']=$pattern;
@@ -159,7 +257,10 @@ $nifty=new PlekitNifty ('','objects-list','big');
 $nifty->start();
 $headers = array (); $offset=0;
 $notes=array();
+$notes [] = "For information about the different columns please see the <b>node table layout</b> tab above or <b>mouse over</b> the column headers";
+
 
+/*
 // fixed columns
 if (plc_is_admin()) { 
   $short="I"; $long="node_id"; $type='int'; 
@@ -183,9 +284,41 @@ $headers=array_merge($headers,$visibletags->headers());
 $notes=array_merge($notes,$visibletags->notes());
 $short="?"; $long="extra status info"; $type='string'; 
        $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
+*/
+
+$info_header = array();
+$short="?"; $long="extra status info"; $type='string'; 
+$info_header[$short]=array('type'=>$type,'title'=>$long, 'label'=>'?', 'header'=>'?', 'visible'=>true); 
+//$notes []= "$short = $long";
+//$info_header["?"] = "none";
+$headers = array_merge($ConfigureColumns->get_headers(),$info_header);
+
+//print("<p>HEADERS");
+//print_r($headers);
+
+$toggle_nodes=new PlekitToggle('nodes-column-configuration',
+                               "Node table layout",
+                               array('visible'=>'1'));
+$toggle_nodes->start();
+print("<div id='debug'></div>");
+print("<input type='hidden' id='slice_id' value='nodes' />");
+print("<input type='hidden' id='person_id' value='".$plc->person['person_id']."' />");
+print("<input type='hidden' id='conf_tag_id' value='".$conf_tag_id."' />");
+print("<input type='hidden' id='column_configuration' value='".$slice_column_configuration."' />");
+print("<br><input type='hidden' size=80 id='full_column_configuration' value='".$column_configuration."' />");
+//print("<input type='hidden' id='previousConf' value='".$slice_column_configuration."'></input>");
+print("<input type='hidden' id='defaultConf' value='".$default_configuration."'></input>");
+$ConfigureColumns->configuration_panel_html(true);
+$ConfigureColumns->javascript_init();
+$toggle_nodes->end();
+
+$table_options = array('notes'=>$notes,
+                       'search_width'=>15,
+                       'pagesize'=>20,
+                        'configurable'=>true);
 
 # initial sort on hostnames
-$table=new PlekitTable ("nodes",$headers,3+$offset);
+$table=new PlekitTable ("nodes",$headers,3+$offset, $table_options);
 $table->start();
 
 $peers = new Peers ($api);
@@ -202,22 +335,27 @@ foreach ($nodes as $node) {
   $peer_id=$node['peer_id'];
   
   $table->row_start();
+  $table->cell($node['node_id'], array('display'=>'none'));
   if (plc_is_admin()) $table->cell(l_node_t($node_id,$node_id));
-  $peers->cell ($table,$peer_id);
-  $table->cell (topdomain($hostname));
-  $table->cell (l_site_t($site_id,$login_base));
   $table->cell (l_node_t($node_id,$hostname));
-  $table->cell (l_interface_t($interface_id,$ip),array('only-if'=> !$peer_id));
+  $peers->cell ($table,$peer_id);
+  //$table->cell (topdomain($hostname));
+  $node['domain'] = topdomain($hostname);
+  //$table->cell (l_site_t($site_id,$login_base));
+  $node['sitename'] = l_site_t($site_id,$login_base);
+  //$table->cell (l_interface_t($interface_id,$ip),array('only-if'=> !$peer_id));
+  $node['ipaddress'] = l_interface_t($interface_id,$ip);
   list($label,$class) = Node::status_label_class_($node);
   $table->cell ($label,array('class'=>$class));
-  $table->cell (count($node['slice_ids']));
-  foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]);
+  //$table->cell (count($node['slice_ids']));
+  //foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]);
+  $ConfigureColumns->cells($table, $node);
   $table->cell (node_status($node));
   $table->row_end();
   
 }
 
-$table->end(array('notes'=>$notes));
+$table->end();
 $nifty->end();
 
 //plekit_linetabs ($tabs,"bottom");
@@ -226,3 +364,4 @@ $nifty->end();
 include 'plc_footer.php';
 
 ?>
+
diff --git a/planetlab/nodes/nodes2.php b/planetlab/nodes/nodes2.php
deleted file mode 100644 (file)
index 4311ca1..0000000
+++ /dev/null
@@ -1,364 +0,0 @@
-<?php
-
-// $Id$
-
-// Require login
-require_once 'plc_login.php';
-
-// Get session and API handles
-require_once 'plc_session.php';
-global $plc, $api;
-
-// Print header
-require_once 'plc_drupal.php';
-include 'plc_header.php';
-
-// Common functions
-require_once 'plc_functions.php';
-require_once 'plc_objects.php';
-require_once 'plc_peers.php';
-require_once 'plc_visibletags2.php';
-require_once 'linetabs.php';
-require_once 'table2.php';
-require_once 'nifty.php';
-require_once 'toggle.php';
-require_once 'columns.php';
-
-// keep css separate for now
-drupal_set_html_head('
-<link href="/planetlab/css/my_slice.css" rel="stylesheet" type="text/css" />
-');
-
-
-ini_set("memory_limit","64M");
-
-// -------------------- 
-// recognized URL arguments
-$peerscope=$_GET['peerscope'];
-$pattern=$_GET['pattern'];
-$site_id=intval($_GET['site_id']);
-$slice_id=intval($_GET['slice_id']);
-$person_id=intval($_GET['person_id']);
-
-// --- decoration
-$title="Nodes";
-$tabs=array();
-$tabs []= tab_nodes();
-if (count (plc_my_site_ids()) == 1) {
-    $tabs []= tab_nodes_mysite();
-} else {
-    $tabs []= tab_nodes_all_mysite();
-}
-$tabs []= tab_nodes_local();
-
-// -------------------- 
-$node_filter=array();
-
-//////////////////
-// performs sanity check and summarize the result in a single column
-function node_status ($node) {
-
-  $messages=array();
-  if ($node['node_type'] != 'regular' && $node['node_type'] != 'reservable' ) 
-    $messages []= $node['node_type'];
-
-  // checks on local nodes only
-  if ( ( ! $node['peer_id']) ) {
-    // has it got interfaces 
-    if (count($node['interface_ids']) == 0) 
-      $messages []= "No interface";
-  }
-  return plc_vertical_table($messages,'plc-warning');
-}
-
-
-$first_time_configuration = 'false';
-
-if (plc_is_admin()) 
-       $default_configuration = "ID:f|hostname:f|ST:f|AU:f|SN|DN|LCN";
-else
-       $default_configuration = "hostname:f|ST:f|AU:f|SN|LCN|DN";
-
-$column_configuration = "";
-$slice_column_configuration = "";
-
-$PersonTags=$api->GetPersonTags (array('person_id'=>$plc->person['person_id']));
-//print_r($PersonTags);
-foreach ($PersonTags as $ptag) {
-        if ($ptag['tagname'] == 'columnconf')
-        {
-                $column_configuration = $ptag['value'];
-                $conf_tag_id = $ptag['person_tag_id'];
-        }
-}
-
-//print("column configuration = ".$column_configuration);
-
-$nodesconf_exists = false;
-if ($column_configuration == "")
-{
-        $column_configuration = "nodes;default";
-        $nodesconf_exists = true;
-}
-else {
-        $slice_conf = explode(";",$column_configuration);
-        for ($i=0; $i<count($slice_conf); $i++ ) {
-                if ($slice_conf[$i] == "nodes")
-                {
-                        $i++;
-                        $slice_column_configuration = $slice_conf[$i];
-                        $nodesconf_exists = true;
-                        break;
-                }
-                else
-                {
-                        $i++;
-                        $slice_column_configuration = $slice_conf[$i];
-                }
-        }
-}
-
-if ($nodesconf_exists == false)
-        $column_configuration = $column_configuration.";nodes;default";
-//panos: need to define an "empty" configuration here (for the moment A column
-//will be added by default the first time
-
-
-if ($slice_column_configuration == "" || $slice_column_configuration == "default")
-        $full_configuration = $default_configuration;
-       
-else
-        $full_configuration = $default_configuration."|".$slice_column_configuration;
-
-//print("full configuration = ".$full_configuration);
-
-// fetch nodes 
-$node_fixed_columns=array('hostname','node_type','site_id','node_id','boot_state','last_contact','interface_ids','peer_id', 'slice_ids');
-
-$fix_columns = array();
-if (plc_is_admin()) 
-$fix_columns[]=array('tagname'=>'node_id', 'header'=>'ID', 'type'=>'string', 'title'=>'The ID the node');
-$fix_columns[]=array('tagname'=>'hostname', 'header'=>'hostname', 'type'=>'string', 'title'=>'The name of the node');
-$fix_columns[]=array('tagname'=>'peer_id', 'header'=>'AU', 'type'=>'string', 'title'=>'Authority');
-$fix_columns[]=array('tagname'=>'run_level', 'header'=>'ST', 'type'=>'string', 'title'=>'Status');
-//$fix_columns[]=array('tagname'=>'node_type', 'header'=>'RES', 'type'=>'string', 'title'=>'Reservable');
-
-
-$visibletags = new VisibleTags ($api, 'node');
-$visibletags->columns();
-$tag_columns = $visibletags->headers();
-
-$extra_columns = array();
-$extra_columns[]=array('tagname'=>'sitename', 'header'=>'SN', 'type'=>'string', 'title'=>'Site name', 'fetched'=>true);
-$extra_columns[]=array('tagname'=>'domain', 'header'=>'DN', 'type'=>'string', 'title'=>'Toplevel domain name', 'fetched'=>true);
-$extra_columns[]=array('tagname'=>'ipaddress', 'header'=>'IP', 'type'=>'string', 'title'=>'IP Address', 'fetched'=>true);
-
-$ConfigureColumns =new PlekitColumns($full_configuration, $fix_columns, $tag_columns, $extra_columns);
-
-$visiblecolumns = $ConfigureColumns->node_tags();
-
-$node_columns=array_merge($node_fixed_columns,$visiblecolumns);
-
-//$visibletags = new VisibleTags ($api, 'node');
-//$visiblecolumns = $visibletags->column_names();
-//print("<p>OLD");
-//print_r($visiblecolumns);
-//$node_columns=array_merge($node_fixed_columns,$visiblecolumns);
-
-
-// server-side filtering - set pattern in $_GET for filtering on hostname
-if ($pattern) {
-  $node_filter['hostname']=$pattern;
-  $title .= " matching " . $pattern;
- } else {
-  $node_filter['hostname']="*";
- }
-
-// server-side selection on peerscope
-$peerscope=new PeerScope($api,$_GET['peerscope']);
-$node_filter=array_merge($node_filter,$peerscope->filter());
-$title .= ' - ' . $peerscope->label();
-
-if ($site_id) {
-  $sites=$api->GetSites(array($site_id));
-  $site=$sites[0];
-  $name=$site['name'];
-  $login_base=$site['login_base'];
-  $title .= t_site($site);
-  $tabs []= tab_site($site);
-  $node_filter['site_id']=array($site_id);
-}
-
-if ($slice_id) {
-  $slices=$api->GetSlices(array($slice_id),array('node_ids','name'));
-  $slice=$slices[0];
-  $title .= t_slice($slice);
-  $tabs []= tab_slice($slice);
-  $node_filter['node_id'] = $slice['node_ids'];
- }
-
-// person_id is set : this is mostly oriented towards people managing several sites
-if ($person_id) {
-  // avoid doing a useless call to GetPersons if the person_id is already known though $plc,
-  // as this is mostly done for the 'all my sites nodes' link
-  if ($person_id == plc_my_person_id()) { 
-    $person=plc_my_person();
-    $site_ids = plc_my_site_ids();
-  } else {
-    // fetch the person's site_ids
-    $persons = $api->GetPersons(array('person_id'=>$person_id),array('person_id','email','site_ids'));
-    $person=$persons[0];
-    $site_ids=$person['site_ids'];
-  }
-  $title .= t_person($person);
-  $node_filter['site_id']=$site_ids;
- }
-
-// go
-$nodes=$api->GetNodes($node_filter,$node_columns);
-
-// build site_ids - interface_ids
-$site_ids=array();
-$interface_ids=array();
-if ($nodes) foreach ($nodes as $node) {
-  $site_ids []= $node['site_id'];
-  $interface_ids = array_merge ($interface_ids,$node['interface_ids']);
-}
-
-// fetch related interfaces
-$interface_columns=array('ip','node_id','interface_id');
-$interface_filter=array('is_primary'=>TRUE,'interface_id'=>$interface_ids);
-$interfaces=$api->GetInterfaces($interface_filter,$interface_columns);
-
-$interface_hash=array();
-foreach ($interfaces as $interface) $interface_hash[$interface['node_id']]=$interface;
-
-// fetch related sites
-$site_columns=array('site_id','login_base');
-$site_filter=array('site_id'=>$site_ids);
-$sites=$api->GetSites($site_filter,$site_columns);
-
-$site_hash=array();
-foreach ($sites as $site) $site_hash[$site['site_id']]=$site;
-
-// --------------------
-drupal_set_title($title);
-
-plekit_linetabs($tabs);
-
-if ( ! $nodes ) {
-  drupal_set_message ('No node found');
-  return;
- }
-  
-$nifty=new PlekitNifty ('','objects-list','big');
-$nifty->start();
-$headers = array (); $offset=0;
-$notes=array();
-$notes [] = "For information about the different columns please see the <b>node table layout</b> tab above or <b>mouse over</b> the column headers";
-
-
-/*
-// fixed columns
-if (plc_is_admin()) { 
-  $short="I"; $long="node_id"; $type='int'; 
-       $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
-  $offset=1; 
- }
-$short="P"; $long="Peer"; $type='string'; 
-       $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
-$short="D"; $long="toplevel domain name"; $type='string'; 
-       $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
-$headers["Site"]="string";
-$headers["Hostname"]="string";
-$short="IP"; $long="IP Address"; $type='sortIPAddress'; 
-       $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
-$short="ST"; $long=Node::status_footnote(); $type='string'; 
-       $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
-$short="SL"; $long="Number of slivers"; $type='int'; 
-       $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
-
-$headers=array_merge($headers,$visibletags->headers());
-$notes=array_merge($notes,$visibletags->notes());
-$short="?"; $long="extra status info"; $type='string'; 
-       $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
-*/
-
-$info_header = array();
-$short="?"; $long="extra status info"; $type='string'; 
-$info_header[$short]=array('type'=>$type,'title'=>$long, 'label'=>'?', 'header'=>'?', 'visible'=>true); 
-//$notes []= "$short = $long";
-//$info_header["?"] = "none";
-$headers = array_merge($ConfigureColumns->get_headers(),$info_header);
-
-//print("<p>HEADERS");
-//print_r($headers);
-
-$toggle_nodes=new PlekitToggle('nodes-column-configuration',
-                               "Node table layout",
-                               array('visible'=>'1'));
-$toggle_nodes->start();
-print("<div id='debug'></div>");
-print("<input type='hidden' id='slice_id' value='nodes' />");
-print("<input type='hidden' id='person_id' value='".$plc->person['person_id']."' />");
-print("<input type='hidden' id='conf_tag_id' value='".$conf_tag_id."' />");
-print("<input type='hidden' id='column_configuration' value='".$slice_column_configuration."' />");
-print("<br><input type='hidden' size=80 id='full_column_configuration' value='".$column_configuration."' />");
-//print("<input type='hidden' id='previousConf' value='".$slice_column_configuration."'></input>");
-print("<input type='hidden' id='defaultConf' value='".$default_configuration."'></input>");
-$ConfigureColumns->configuration_panel_html(true);
-$ConfigureColumns->javascript_init();
-$toggle_nodes->end();
-
-$table_options = array('notes'=>$notes,
-                       'search_width'=>15,
-                       'pagesize'=>20,
-                        'configurable'=>true);
-
-# initial sort on hostnames
-$table=new PlekitTable ("nodes",$headers,3+$offset, $table_options);
-$table->start();
-
-$peers = new Peers ($api);
-// write rows
-foreach ($nodes as $node) {
-  //$node_obj = new Node ($node);
-  $hostname=$node['hostname'];
-  $node_id=$node['node_id'];
-  $site_id=$node['site_id'];
-  $site=$site_hash[$site_id];
-  $login_base = $site['login_base'];
-  $ip=$interface_hash[$node['node_id']]['ip'];
-  $interface_id=$interface_hash[$node['node_id']]['interface_id'];
-  $peer_id=$node['peer_id'];
-  
-  $table->row_start();
-  $table->cell($node['node_id'], array('display'=>'none'));
-  if (plc_is_admin()) $table->cell(l_node_t($node_id,$node_id));
-  $table->cell (l_node_t($node_id,$hostname));
-  $peers->cell ($table,$peer_id);
-  //$table->cell (topdomain($hostname));
-  $node['domain'] = topdomain($hostname);
-  //$table->cell (l_site_t($site_id,$login_base));
-  $node['sitename'] = l_site_t($site_id,$login_base);
-  //$table->cell (l_interface_t($interface_id,$ip),array('only-if'=> !$peer_id));
-  $node['ipaddress'] = l_interface_t($interface_id,$ip);
-  list($label,$class) = Node::status_label_class_($node);
-  $table->cell ($label,array('class'=>$class));
-  //$table->cell (count($node['slice_ids']));
-  //foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]);
-  $ConfigureColumns->cells($table, $node);
-  $table->cell (node_status($node));
-  $table->row_end();
-  
-}
-
-$table->end();
-$nifty->end();
-
-//plekit_linetabs ($tabs,"bottom");
-
-// Print footer
-include 'plc_footer.php';
-
-?>
index d6de73e..b69e88c 100644 (file)
@@ -17,13 +17,14 @@ include 'plc_header.php';
 require_once 'plc_functions.php';
 require_once 'plc_peers.php';
 require_once 'plc_objects.php';
-require_once 'plc_visibletags.php';
+require_once 'plc_visibletags2.php';
 require_once 'linetabs.php';
-require_once 'table.php';
+require_once 'table2.php';
 require_once 'details.php';
 require_once 'toggle.php';
 require_once 'form.php';
 require_once 'raphael.php';
+require_once 'columns.php';
 
 // keep css separate for now
 drupal_set_html_head('
@@ -76,6 +77,7 @@ if ($profiling) plc_debug_prof('3: peers',count($peers));
 $sites= $api->GetSites( array( $site_id ) );
 $site=$sites[0];
 $site_name= $site['name'];
+$max_slices = $site['max_slices'];
 
 if ($profiling) plc_debug_prof('4: sites',count($sites));
 //////////////////////////////////////// building blocks for the renew area
@@ -150,36 +152,32 @@ EOF;
     if ( empty( $selectors ) ) {
       print <<< EOF
 <div class='my-slice-renewal'>
-Slices annot be renewed more than $MAX_WEEKS weeks from now, i.e. not beyond $max_text. 
+Slices cannot be renewed more than $MAX_WEEKS weeks from now, i.e. not beyond $max_text. 
 For this reason, the current slice cannot be renewed any further into the future, try again closer to expiration date.
 </div>
 EOF;
      } else {
       print <<< EOF
 <div class='my-slice-renewal'>
-<p>You <span class='bold'>must</span> provide a short description, 
-as well as a link to a project website, before renewing it.
-
-<br/> Please make sure to provide reasonable details on <span class='bold'>
-the kind of traffic</span>, and <span class='bold'>copyrights</span> if relevant. 
-Do <span class='bold'>not</span> provide bogus information; if a complaint is lodged against 
-your slice  and your PlanetLab Operations Center is unable to determine what the normal behavior 
-of your slice is, your slice may be deleted to resolve the complaint.</p>
-
-<p><span class='bold'>NOTE:</span> 
-Slices cannot be renewed beyond another $max_renewal_weeks week(s) ($max_renewal_date).
+<span class='bold'>Important:</span> Please take this opportunity to review and update your slice information in the Details tab, below.
+<p>
+PlanetLab's security model requires that anyone who is concerned about a slice's activity be able to immediately learn about that slice. The details that you provide are your public explanation about why the slice behaves as it does. Be sure to describe the <span class='bold'>kind of traffic</span> that your slice generates, and how it handles material that is under <span class='bold'>copyright</span>, if relevant.
+</p><p>
+The PlanetLab Operations Centres regularly respond to concerns raised by third parties about site behaviour. Most incidents are resolved rapidly based upon the publicly posted slice details. However, when these details are not sufficiently clear or accurate, and we cannot immediately reach the slice owner, we must delete the slice. 
 </p>
-</div>
 EOF;
 
       $form = new PlekitForm (l_actions(),
                              array('action'=>'renew-slice',
                                    'slice_id'=>$slice['slice_id']));
       $form->start();
-      print $form->label_html('expires','Duration');
+      print $form->label_html('expires','Duration:&nbsp;');
       print $form->select_html('expires',$selectors,array('label'=>'Pick one'));
       print $form->submit_html('renew-button','Renew');
       $form->end();
+
+print("<p><i>NOTE: Slices cannot be renewed beyond another $max_renewal_weeks week(s) ($max_renewal_date).</i>  </p>");
+print ("</div>");
     }
   }
  
@@ -294,7 +292,7 @@ $count=count($persons);
 
 if ($profiling) plc_debug_prof('4: persons',count($persons));
 $toggle=
-  new PlekitToggle ('my-slice-persons',"$count Users",
+  new PlekitToggle ('my-slice-persons',"$count users",
                    array('bubble'=>
                          'Manage accounts attached to this slice',
                          'visible'=>get_arg('show_persons',false)));
@@ -404,17 +402,131 @@ $toggle->end();
 //     (.) type is passed to the javascript table, for sorting (default is 'string')
 
 // minimal list as a start
-$node_fixed_columns = array('hostname','node_id','peer_id','slice_ids_whitelist',
+$node_fixed_columns = array('hostname','node_id','peer_id','slice_ids_whitelist', 'site_id',
                            'run_level','boot_state','last_contact','node_type');
 // create a VisibleTags object : basically the list of tag columns to show
-$visibletags = new VisibleTags ($api, 'node');
-$visiblecolumns = $visibletags->column_names();
-$node_columns=array_merge($node_fixed_columns,$visiblecolumns);
+//$visibletags = new VisibleTags ($api, 'node');
+//$visiblecolumns = $visibletags->column_names();
 
 // optimizing calls to GetNodes
-$all_nodes=$api->GetNodes(NULL,$node_columns);
+//$all_nodes=$api->GetNodes(NULL,$node_columns);
 //$slice_nodes=$api->GetNodes(array('node_id'=>$slice['node_ids']),$node_columns);
 //$potential_nodes=$api->GetNodes(array('~node_id'=>$slice['node_ids']),$node_columns);
+
+
+//NEW CODE FOR ENABLING COLUMN CONFIGURATION
+
+//prepare fix and configurable columns
+
+$fix_columns = array();
+$fix_columns[]=array('tagname'=>'hostname', 'header'=>'hostname', 'type'=>'string', 'title'=>'The name of the node');
+$fix_columns[]=array('tagname'=>'peer_id', 'header'=>'AU', 'type'=>'string', 'title'=>'Authority');
+$fix_columns[]=array('tagname'=>'run_level', 'header'=>'ST', 'type'=>'string', 'title'=>'Status');
+$fix_columns[]=array('tagname'=>'node_type', 'header'=>'RES', 'type'=>'string', 'title'=>'Reservable');
+
+// columns that correspond to the visible tags for nodes (*node/ui*)
+$visibletags = new VisibleTags ($api, 'node');
+$visibletags->columns();
+$tag_columns = $visibletags->headers();
+
+// extra columns that are not tags (for the moment not sorted correctly)
+
+$extra_columns = array();
+$extra_columns[]=array('tagname'=>'sitename', 'header'=>'SN', 'type'=>'string', 'title'=>'Site name', 'fetched'=>true);
+$extra_columns[]=array('tagname'=>'domain', 'header'=>'DN', 'type'=>'string', 'title'=>'Toplevel domain name', 'fetched'=>true);
+$extra_columns[]=array('tagname'=>'ipaddress', 'header'=>'IP', 'type'=>'string', 'title'=>'IP Address', 'fetched'=>true);
+$extra_columns[]=array('tagname'=>'fcdistro', 'header'=>'OS', 'type'=>'string', 'title'=>'Operating system', 'fetched'=>false);
+
+//Get user's column configuration
+
+$first_time_configuration = false;
+$default_configuration = "hostname:f|ST:f|AU:f|RES:f";
+//$extra_default = "";
+$column_configuration = "";
+$slice_column_configuration = "";
+
+$show_configuration = "";
+$show_reservable_message = '1';
+$show_columns_message = '1';
+
+
+//$PersonTags=$api->GetPersonTags (array('person_id'=>$plc->person['person_id']));
+$PersonTags=$api->GetPersonTags (array('person_id'=>$plc->person['person_id']));
+//print_r($PersonTags);
+foreach ($PersonTags as $ptag) {
+       if ($ptag['tagname'] == 'columnconf')
+       {
+                $column_configuration = $ptag['value'];
+               $conf_tag_id = $ptag['person_tag_id'];
+       }
+       if ($ptag['tagname'] == 'showconf')
+       {
+                $show_configuration = $ptag['value'];
+               $show_tag_id = $ptag['person_tag_id'];
+       }
+}
+
+//print("<br>person column configuration = ".$column_configuration);
+//print("<br>person show configuration = ".$show_configuration);
+
+$sliceconf_exists = false;
+if ($column_configuration == "")
+{
+       $first_time_configuration = true;
+       $column_configuration = $slice_id.";default";
+       $sliceconf_exists = true;
+}
+else {
+       $slice_conf = explode(";",$column_configuration);
+       for ($i=0; $i<count($slice_conf); $i++ ) {
+               if ($slice_conf[$i] == $slice_id)
+               {
+                       $i++;
+                       $slice_column_configuration = $slice_conf[$i];
+                       $sliceconf_exists = true;
+                       break;
+               }
+               else
+               {
+                       $i++;
+                       $slice_column_configuration = $slice_conf[$i];
+               }
+       }        
+}
+
+if ($sliceconf_exists == false)
+       $column_configuration = $column_configuration.";".$slice_id.";default";
+
+//print("<br>slice configuration = ".$slice_column_configuration);
+
+
+if ($slice_column_configuration == "")
+       $full_configuration = $default_configuration;
+else
+       $full_configuration = $default_configuration."|".$slice_column_configuration;
+
+
+//instantiate the column configuration class, which prepares the headers array
+$ConfigureColumns =new PlekitColumns($full_configuration, $fix_columns, $tag_columns, $extra_columns);
+
+$visiblecolumns = $ConfigureColumns->node_tags();
+
+$node_columns=array_merge($node_fixed_columns,$visiblecolumns);
+//print_r($node_columns);
+$all_nodes=$api->GetNodes(NULL,$node_columns);
+
+//print("<br>person show configuration = ".$show_configuration);
+
+$show_conf = explode(";",$show_configuration);
+foreach ($show_conf as $ss) {
+       if ($ss =="reservable")
+               $show_reservable_message = '0';
+       if ($ss =="columns")
+               $show_columns_message = '0';
+}        
+
+//print("res:".$show_reservable_message." - cols:".$show_columns_message);
+
 $slice_nodes=array();
 $potential_nodes=array();
 $reservable_nodes=array();
@@ -437,31 +549,43 @@ $toggle=new PlekitToggle ('my-slice-nodes',$nodes_message,
                                'visible'=>get_arg('show_nodes',false)));
 $toggle->start();
 
+
+//////////////////// reservable nodes area
+
+$count=count($reservable_nodes);
+if ($count && $privileges) {
+  // having reservable nodes in white lists looks a bit off scope for now...
+  $toggle_nodes=new PlekitToggle('my-slice-nodes-reserve',
+                                "Leases - " . count($reservable_nodes) . " reservable node(s)",
+                                array('visible'=>$show_reservable_message, 'info_div'=>'note_reservable_div'));
+  $toggle_nodes->start();
+
+if ($show_reservable_message) 
+$note_display = "";
+else
+$note_display = "display:none;";
+
 ////////// show a notice to people having attached a reservable node
 if (count($reservable_nodes) && $privileges) {
   $mark=reservable_mark();
   print <<<EOF
-<p class='note_reservable'>
-You have attached one or more <span class='bold'>reservable nodes</span> to your slice. 
+<br>
+<div id='note_reservable_div' style="align:center; background-color:#CAE8EA; padding:4px; width:800px; $note_display">
+<table align=center><tr><td valign=top>
+You have attached one or more reservable nodes to your slice. 
 Reservable nodes show up with the '$mark' mark. 
-Your slice will be available <span class='bold'>only during timeslots
-where you have obtained leases</span>
+Your slivers will be available only during timeslots
+where you have obtained leases. 
 You can manage your leases in the tab below.
 <br>
 Please note that as of August 2010 this feature is experimental. 
 Feedback is appreciated at <a href="mailto:devel@planet-lab.org">devel@planet-lab.org</a>
-</p>
+</td><td valign=top><span onClick=closeMessage('reservable')><img class='reset' src="/planetlab/icons/clear.png" alt="hide message"></span>
+</td></tr></table>
+</div>
 EOF;
 }  
 
-//////////////////// reservable nodes area
-$count=count($reservable_nodes);
-if ($count && $privileges) {
-  // having reservable nodes in white lists looks a bit off scope for now...
-  $toggle_nodes=new PlekitToggle('my-slice-nodes-reserve',
-                                "Leases - " . count($reservable_nodes) . " reservable node(s)",
-                                array('visible'=>get_arg('show_nodes_resa',false)));
-  $toggle_nodes->start();
   $grain=$api->GetLeaseGranularity();
   if ($profiling) plc_debug_prof('6 granul',$grain);
   // where to start from, expressed as an offset in hours from now
@@ -547,6 +671,72 @@ EOF;
   $toggle_nodes->end();
  }
 
+
+//////////////////// node configuration panel
+
+if ($first_time_configuration) 
+$column_conf_visible = '1';
+else
+$column_conf_visible = '0';
+
+
+$toggle_nodes=new PlekitToggle('my-slice-nodes-configuration',
+                               "Node table layout",
+                               array('visible'=>$column_conf_visible, 'info_div'=>'note_columns_div'));
+$toggle_nodes->start();
+
+//usort ($table_headers, create_function('$col1,$col2','return strcmp($col1["header"],$col2["header"]);'));
+//print("<p>TABLE HEADERS<p>");
+//print_r($table_headers);
+
+print("<div id='debug'></div>");
+print("<input type='hidden' id='slice_id' value='".$slice['slice_id']."' />");
+print("<input type='hidden' id='person_id' value='".$plc->person['person_id']."' />");
+print("<input type='hidden' id='conf_tag_id' value='".$conf_tag_id."' />");
+print("<input type='hidden' id='show_tag_id' value='".$show_tag_id."' />");
+print("<input type='hidden' id='show_configuration' value='".$show_configuration."' />");
+print("<input type='hidden' id='column_configuration' value='".$slice_column_configuration."' />");
+print("<br><input type='hidden' size=80 id='full_column_configuration' value='".$column_configuration."' />");
+print("<input type='hidden' id='previousConf' value='".$slice_column_configuration."'></input>");
+print("<input type='hidden' id='defaultConf' value='".$default_configuration."'></input>");
+
+//print ("showing column message = ".$show_columns_message);
+if ($show_columns_message == '0') 
+$note_display = "display:none;";
+else
+$note_display = "";
+
+  print <<<EOF
+<div id='note_columns_div' style="align:center; background-color:#CAE8EA; padding:4px; width:800px; $note_display">
+<table align=center><tr><td valign=top>
+This tab allows you to customize the columns in the node tables, below. Information on the nodes comes from a variety of monitoring sources. If you, as either a user or a provider of monitoring data, would like to see additional columns made available, please send us your request in mail to <a href="mailto:devel@planet-lab.org">devel@planet-lab.org</a>
+</td><td valign=top><span onClick=closeMessage('columns')><img class='reset' src="/planetlab/icons/clear.png" alt="hide message permanently"></span>
+</td></tr></table>
+</div>
+EOF;
+
+$ConfigureColumns->configuration_panel_html(true);
+
+$ConfigureColumns->javascript_init();
+
+$toggle_nodes->end();
+
+
+$all_sites=$api->GetSites(NULL, array('site_id','login_base'));
+$site_hash=array();
+foreach ($all_sites as $tmp_site) $site_hash[$tmp_site['site_id']]=$tmp_site['login_base'];
+
+$interface_columns=array('ip','node_id','interface_id');
+$interface_filter=array('is_primary'=>TRUE);
+$interfaces=$api->GetInterfaces($interface_filter,$interface_columns);
+
+$interface_hash=array();
+foreach ($interfaces as $interface) $interface_hash[$interface['node_id']]=$interface;
+
+
+
+
+
 //////////////////// nodes currently in
 $toggle_nodes=new PlekitToggle('my-slice-nodes-current',
                               count_english($slice_nodes,"node") . " currently in $name",
@@ -555,6 +745,10 @@ $toggle_nodes->start();
 
 $headers=array();
 $notes=array();
+//$notes=array_merge($notes,$visibletags->notes());
+$notes [] = "For information about the different columns please see the <b>node table layout</b> tab above or <b>mouse over</b> the column headers";
+
+/*
 $headers['peer']='string';
 $headers['hostname']='string';
 $short="-S-"; $long=Node::status_footnote(); $type='string'; 
@@ -563,27 +757,51 @@ $short=reservable_mark(); $long=reservable_legend(); $type='string';
        $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
 // the extra tags, configured for the UI
 $headers=array_merge($headers,$visibletags->headers());
-$notes=array_merge($notes,$visibletags->notes());
 
 if ($privileges) $headers[plc_delete_icon()]="none";
+*/
+
+$edit_header = array();
+if ($privileges) $edit_header[plc_delete_icon()]="none";
+$headers = array_merge($ConfigureColumns->get_headers(),$edit_header);
+
+//print("<p>HEADERS<p>");
+//print_r($headers);
 
 $table_options = array('notes'=>$notes,
                        'search_width'=>15,
-                       'pagesize'=>20);
-$table=new PlekitTable('nodes',$headers,'1',$table_options);
+                       'pagesize'=>20,
+                       'configurable'=>true);
+
+$table=new PlekitTable('nodes',$headers,NULL,$table_options);
 
 $form=new PlekitForm(l_actions(),array('slice_id'=>$slice['slice_id']));
 $form->start();
 $table->start();
 if ($slice_nodes) foreach ($slice_nodes as $node) {
   $table->row_start();
-  $peers->cell($table,$node['peer_id']);
+
+$table->cell($node['node_id'], array('display'=>'none'));
+
   $table->cell(l_node_obj($node));
+  $peers->cell($table,$node['peer_id']);
   $run_level=$node['run_level'];
   list($label,$class) = Node::status_label_class_($node);
   $table->cell ($label,array('class'=>$class));
   $table->cell( ($node['node_type']=='reservable')?reservable_mark():"" );
-  foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]);
+
+  $hostname=$node['hostname'];
+  $ip=$interface_hash[$node['node_id']]['ip'];
+  $interface_id=$interface_hash[$node['node_id']]['interface_id'];
+
+//extra columns
+$node['domain'] = topdomain($hostname);
+$node['sitename'] = l_site_t($node['site_id'],$site_hash[$node['site_id']]);
+$node['ipaddress'] = l_interface_t($interface_id,$ip);
+
+
+ //foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]);
+ $ConfigureColumns->cells($table, $node);
 
   if ($privileges) $table->cell ($form->checkbox_html('node_ids[]',$node['node_id']));
   $table->row_end();
@@ -622,6 +840,9 @@ if ($privileges) {
   if ( $potential_nodes ) {
     $headers=array();
     $notes=array();
+
+
+/*
     $headers['peer']='string';
     $headers['hostname']='string';
     $short="-S-"; $long=Node::status_footnote(); $type='string'; 
@@ -630,22 +851,43 @@ if ($privileges) {
        $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
     // the extra tags, configured for the UI
     $headers=array_merge($headers,$visibletags->headers());
-    $notes=array_merge($notes,$visibletags->notes());
     $headers['+']="none";
+*/
+
+    $add_header = array();
+    $add_header['+']="none";
+    $headers = array_merge($ConfigureColumns->get_headers(),$add_header);
+
+    //$notes=array_merge($notes,$visibletags->notes());
+$notes [] = "For information about the different columns please see the <b>node table layout</b> tab above or <b>mouse over</b> the column headers";
     
-    $table=new PlekitTable('add_nodes',$headers,'1', $table_options);
+    $table=new PlekitTable('add_nodes',$headers,NULL, $table_options);
     $form=new PlekitForm(l_actions(),
                         array('slice_id'=>$slice['slice_id']));
     $form->start();
     $table->start();
     if ($potential_nodes) foreach ($potential_nodes as $node) {
        $table->row_start();
-       $peers->cell($table,$node['peer_id']);
+
+$table->cell($node['node_id'], array('display'=>'none'));
+
        $table->cell(l_node_obj($node));
+       $peers->cell($table,$node['peer_id']);
        list($label,$class) = Node::status_label_class_($node);
        $table->cell ($label,array('class'=>$class));
        $table->cell( ($node['node_type']=='reservable')?reservable_mark():"" );
-       foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]);
+
+       //extra columns
+         $hostname=$node['hostname'];
+         $ip=$interface_hash[$node['node_id']]['ip'];
+         $interface_id=$interface_hash[$node['node_id']]['interface_id'];
+       $node['domain'] = topdomain($hostname);
+       $node['sitename'] = l_site_t($node['site_id'],$site_hash[$node['site_id']]);
+       $node['ipaddress'] = l_interface_t($interface_id,$ip);
+
+       //foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]);
+       $ConfigureColumns->cells($table, $node);
+
        $table->cell ($form->checkbox_html('node_ids[]',$node['node_id']));
        $table->row_end();
       }
@@ -691,15 +933,24 @@ $tag_value_threshold=24;
   $form->start();
   $table->start();
   if ($tags) {
+    // Get hostnames for nodes in a single pass
+    $_node_ids = array();
+    foreach ($tags as $tag) {
+      if ($tag['node_id']) {
+        array_push($_node_ids, $tag['node_id']);
+      }
+    }
+    $_nodes = $api->GetNodes(array('node_id' => $_node_ids), array('node_id', 'hostname'));
+    $_hostnames = array();
+    foreach ($_nodes as $_node) {
+      $_hostnames[$_node['node_id']] = $_node['hostname'];
+    }
+
+    // Loop through tags again to display
     foreach ($tags as $tag) {
       $node_name = "ALL";
       if ($tag['node_id']) {
-        $tag_nodes = $api->GetNodes(array('node_id'=>$tag['node_id']));
-       if ($profiling) plc_debug_prof('9 node for slice tag',count($tag_nodes));
-        if($tag_nodes) {
-          $node = $tag_nodes[0];
-          $node_name = $node['hostname'];
-        }
+        $node_name = $_hostnames[$tag['node_id']];
       }
       $nodegroup_name="n/a";
       if ($tag['nodegroup_id']) { 
diff --git a/planetlab/slices/slice2.php b/planetlab/slices/slice2.php
deleted file mode 100644 (file)
index 2862f1b..0000000
+++ /dev/null
@@ -1,985 +0,0 @@
-<?php
-
-// $Id$
-
-// Require login
-require_once 'plc_login.php';
-
-// Get session and API handles
-require_once 'plc_session.php';
-global $plc, $api;
-
-// Print header
-require_once 'plc_drupal.php';
-include 'plc_header.php';
-
-// Common functions
-require_once 'plc_functions.php';
-require_once 'plc_peers.php';
-require_once 'plc_objects.php';
-require_once 'plc_visibletags2.php';
-require_once 'linetabs.php';
-require_once 'table2.php';
-require_once 'details.php';
-require_once 'toggle.php';
-require_once 'form.php';
-require_once 'raphael.php';
-require_once 'columns.php';
-
-// keep css separate for now
-drupal_set_html_head('
-<link href="/planetlab/css/my_slice.css" rel="stylesheet" type="text/css" />
-<script src="/planetlab/slices/leases.js" type="text/javascript" charset="utf-8"></script>
-');
-
-// -------------------- admins potentially need to get full list of users
-ini_set('memory_limit','32M');
-
-$profiling=false;
-if ($_GET['profiling']) $profiling=true;
-
-if ($profiling)  plc_debug_prof_start();
-
-// -------------------- 
-// recognized URL arguments
-$slice_id=intval($_GET['id']);
-if ( ! $slice_id ) { plc_error('Malformed URL - id not set'); return; }
-
-////////////////////
-// have to name columns b/c we need the non-native 'omf_control' column
-$slice_columns=array('slice_id','name','peer_id','site_id','person_ids','node_ids','expires',
-                    'url','description','instantiation','omf_control');
-$slices= $api->GetSlices( array($slice_id), $slice_columns);
-
-if (empty($slices)) {
-  drupal_set_message ("Slice " . $slice_id . " not found");
-  return;
- }
-
-$slice=$slices[0];
-
-if ($profiling) plc_debug_prof('2: slice',count($slices));
-// pull all node info to vars
-$name= $slice['name'];
-$expires = date( "d/m/Y", $slice['expires'] );
-$site_id= $slice['site_id'];
-
-$person_ids=$slice['person_ids'];
-
-// get peers
-$peer_id= $slice['peer_id'];
-$peers=new Peers ($api);
-$local_peer = ! $peer_id;
-
-if ($profiling) plc_debug_prof('3: peers',count($peers));
-
-// gets site info
-$sites= $api->GetSites( array( $site_id ) );
-$site=$sites[0];
-$site_name= $site['name'];
-$max_slices = $site['max_slices'];
-
-if ($profiling) plc_debug_prof('4: sites',count($sites));
-//////////////////////////////////////// building blocks for the renew area
-// Constants
-global $DAY;           $DAY = 24*60*60;
-global $WEEK;          $WEEK = 7 * $DAY; 
-global $MAX_WEEKS;     $MAX_WEEKS= 8;          // weeks from today
-global $GRACE_DAYS;    $GRACE_DAYS=10;         // days for renewal promoted on top
-global $NOW;           $NOW=mktime();
-
-////////////////////////////////////////////////////////////
-// make the renew area on top and open if the expiration time is less than 10 days from now
-function renew_needed ($slice) {
-  global $DAY, $NOW, $GRACE_DAYS;
-  $current_exp=$slice['expires'];
-
-  $time_left = $current_exp - $NOW;
-  $visible = $time_left/$DAY <= $GRACE_DAYS;
-  return $visible;
-}
-
-function renew_area ($slice,$site,$visible) {
-  global $DAY, $WEEK, $MAX_WEEKS, $GRACE_DAYS, $NOW;
-  $current_exp=$slice['expires'];
-  $current_text = gmstrftime("%A %b-%d-%y %T %Z", $current_exp);
-  $max_exp= $NOW + ($MAX_WEEKS * $WEEK); // seconds since epoch
-  $max_text = gmstrftime("%A %b-%d-%y %T %Z", $max_exp);
-
-  // xxx some extra code needed to enable this area only if the slice description is OK:
-  // description and url must be non void
-  $toggle=
-    new PlekitToggle('renew',"Expires $current_text - Renew this slice",
-                    array("bubble"=>
-                          "Enter this zone if you wish to renew your slice",
-                          'visible'=>$visible));
-  $toggle->start();
-
-  // xxx message could take roles into account
-  if ($site['max_slices']<=0) {
-     $message= <<< EOF
-<p class='my-slice-renewal'>Slice creation and renewal have been temporarily disabled for your
-<site. This may have occurred because your site's nodes have been down
-or unreachable for several weeks, and multiple attempts to contact
-your site's PI(s) and Technical Contact(s) have all failed. If so,
-contact your site's PI(s) and Technical Contact(s) and ask them to
-bring up your site's nodes. Please visit your <a
-href='/db/sites/index.php?id=$site_id'>site details</a> page to find
-out more about your site's nodes, and how to contact your site's PI(s)
-and Technical Contact(s).</p>
-EOF;
-     echo $message;
-  } else {
-    // xxx this is a rough cut and paste from the former UI
-    // showing a datepicker view could be considered as well with some extra work
-    // calculate possible extension lengths
-    $selectors = array();
-    foreach ( array ( 1 => "One more week", 
-                     2 => "Two more weeks", 
-                     3 => "Three more weeks", 
-                     4 => "One more month" ) as $weeks => $text ) {
-      $candidate_exp = $current_exp + $weeks*$WEEK;
-      if ( $candidate_exp < $max_exp) {
-       $selectors []= array('display'=>"$text (" . gmstrftime("%A %b-%d-%y %T %Z", $candidate_exp) . ")",
-                            'value'=>$candidate_exp);
-       $max_renewal_weeks=$weeks;
-       $max_renewal_date= gmstrftime("%A %b-%d-%y %T %Z", $candidate_exp);
-      }
-    }
-
-    if ( empty( $selectors ) ) {
-      print <<< EOF
-<div class='my-slice-renewal'>
-Slices annot be renewed more than $MAX_WEEKS weeks from now, i.e. not beyond $max_text. 
-For this reason, the current slice cannot be renewed any further into the future, try again closer to expiration date.
-</div>
-EOF;
-     } else {
-      print <<< EOF
-<div class='my-slice-renewal'>
-<p>You <span class='bold'>must</span> provide a short description, 
-as well as a link to a project website, before renewing it.
-
-<br/> Please make sure to provide reasonable details on <span class='bold'>
-the kind of traffic</span>, and <span class='bold'>copyrights</span> if relevant. 
-Do <span class='bold'>not</span> provide bogus information; if a complaint is lodged against 
-your slice  and your PlanetLab Operations Center is unable to determine what the normal behavior 
-of your slice is, your slice may be deleted to resolve the complaint.</p>
-
-<p><span class='bold'>NOTE:</span> 
-Slices cannot be renewed beyond another $max_renewal_weeks week(s) ($max_renewal_date).
-</p>
-</div>
-EOF;
-
-      $form = new PlekitForm (l_actions(),
-                             array('action'=>'renew-slice',
-                                   'slice_id'=>$slice['slice_id']));
-      $form->start();
-      print $form->label_html('expires','Duration');
-      print $form->select_html('expires',$selectors,array('label'=>'Pick one'));
-      print $form->submit_html('renew-button','Renew');
-      $form->end();
-    }
-  }
-  $toggle->end();
-}
-
-////////////////////////////////////////////////////////////
-
-$am_in_slice = in_array(plc_my_person_id(),$person_ids);
-
-if ($am_in_slice) {
-  drupal_set_title("My slice " . $name);
- } else {
-  drupal_set_title("Slice " . $name);
-}
-
-$privileges = ( $local_peer && (plc_is_admin()  || plc_is_pi() || $am_in_slice));
-$tags_privileges = $privileges || plc_is_admin();
-
-$tabs=array();
-$tabs [] = tab_nodes_slice($slice_id);
-$tabs [] = tab_site($site);
-
-// are these the right privileges for deletion ?
-if ($privileges) {
-  $tabs ['Delete']= array('url'=>l_actions(),
-                         'method'=>'post',
-                         'values'=>array('action'=>'delete-slice','slice_id'=>$slice_id),
-                         'bubble'=>"Delete slice $name",
-                         'confirm'=>"Are you sure to delete slice $name");
-
-  $tabs["Events"]=array_merge(tablook_event(),
-                             array('url'=>l_event("Slice","slice",$slice_id),
-                                   'bubble'=>"Events for slice $name"));
-  $tabs["Comon"]=array_merge(tablook_comon(),
-                            array('url'=>l_comon("slice_id",$slice_id),
-                                  'bubble'=>"Comon page about slice $name"));
-}
-
-plekit_linetabs($tabs);
-
-////////////////////////////////////////
-$peers->block_start($peer_id);
-
-//////////////////////////////////////// renewal area 
-// (1) close to expiration : show on top and open
-
-if ($local_peer ) {
-  $renew_visible = renew_needed ($slice);
-  if ($renew_visible) renew_area ($slice,$site,true);
- }
-
-
-//////////////////// details
-// default for opening the details section or not ?
-if ($local_peer) {
-  $default_show_details = true;
- } else {
-  $default_show_details = ! $renew_visible;
- }
-  
-$toggle = 
-  new PlekitToggle ('my-slice-details',"Details",
-                   array('bubble'=>
-                         'Display and modify details for that slice',
-                         'visible'=>get_arg('show_details',$default_show_details)));
-$toggle->start();
-
-$details=new PlekitDetails($privileges);
-$details->form_start(l_actions(),array('action'=>'update-slice',
-                                      'slice_id'=>$slice_id,
-                                      'name'=>$name));
-
-$details->start();
-if (! $local_peer) {
-  $details->th_td("Peer",$peers->peer_link($peer_id));
-  $details->space();
- }
-
-
-$details->th_td('Name',$slice['name']);
-$details->th_td('Description',$slice['description'],'description',
-               array('input_type'=>'textarea',
-                     'width'=>50,'height'=>5));
-$details->th_td('URL',$slice['url'],'url',array('width'=>50));
-$details->tr_submit("submit","Update Slice");
-$details->th_td('Expires',$expires);
-$details->th_td('Instantiation',$slice['instantiation']);
-$details->th_td("OMF-friendly", ($slice['omf_control'] ? 'Yes' : 'No') . " [to change: see 'omf_control' in the tags section below]");
-$details->th_td('Site',l_site_obj($site));
-// xxx show the PIs here
-//$details->th_td('PIs',...);
-$details->end();
-
-$details->form_end();
-$toggle->end();
-
-//////////////////// persons
-$person_columns = array('email','person_id','first_name','last_name','roles');
-// get persons in slice
-if (!empty($person_ids))
-  $persons=$api->GetPersons(array('person_id'=>$slice['person_ids']),$person_columns);
-// just propose to add everyone else
-// xxx this is maybe too much for admins as it slows stuff down 
-// as regular persons can see only a fraction of the db anyway
-$potential_persons=
-  $api->GetPersons(array('~person_id'=>$slice['person_ids'],
-                        'peer_id'=>NULL,
-                        'enabled'=>true),
-                  $person_columns);
-$count=count($persons);
-
-if ($profiling) plc_debug_prof('4: persons',count($persons));
-$toggle=
-  new PlekitToggle ('my-slice-persons',"$count Users",
-                   array('bubble'=>
-                         'Manage accounts attached to this slice',
-                         'visible'=>get_arg('show_persons',false)));
-$toggle->start();
-
-////////// people currently in
-// visible:
-// hide if both current+add are included
-// so user can chose which section is of interest
-// show otherwise
-$toggle_persons = new PlekitToggle ('my-slice-persons-current',
-                                   "$count people currently in $name",
-                                   array('visible'=>get_arg('show_persons_current',!$privileges)));
-$toggle_persons->start();
-
-$headers=array();
-$headers['email']='string';
-$headers['first']='string';
-$headers['last']='string';
-$headers['R']='string';
-if ($privileges) $headers[plc_delete_icon()]="none";
-$table=new PlekitTable('persons',$headers,'0',
-                      array('notes_area'=>false));
-$form=new PlekitForm(l_actions(),array('slice_id'=>$slice['slice_id']));
-$form->start();
-$table->start();
-if ($persons) foreach ($persons as $person) {
-  $table->row_start();
-  $table->cell(l_person_obj($person));
-  $table->cell($person['first_name']);
-  $table->cell($person['last_name']);
-  $table->cell(plc_vertical_table ($person['roles']));
-  if ($privileges) $table->cell ($form->checkbox_html('person_ids[]',$person['person_id']));
-  $table->row_end();
-}
-// actions area
-if ($privileges) {
-
-  // remove persons
-  $table->tfoot_start();
-
-  $table->row_start();
-  $table->cell($form->submit_html ("remove-persons-from-slice","Remove selected"),
-              array('hfill'=>true,'align'=>'right'));
-  $table->row_end();
- }
-$table->end();
-$toggle_persons->end();
-
-////////// people to add
-if ($privileges) {
-  $count=count($potential_persons);
-  $toggle_persons = new PlekitToggle ('my-slice-persons-add',
-                                     "$count people may be added to $name",
-                                     array('visible'=>get_arg('show_persons_add',false)));
-  $toggle_persons->start();
-  if ( ! $potential_persons ) {
-    // xxx improve style
-    echo "<p class='not-relevant'>No person to add</p>";
-  } else {
-    $headers=array();
-    $headers['email']='string';
-    $headers['first']='string';
-    $headers['last']='string';
-    $headers['R']='string';
-    $headers['+']="none";
-    $options = array('notes_area'=>false,
-                    'search_width'=>15,
-                    'pagesize'=>8);
-    // show search for admins only as other people won't get that many names to add
-    if ( ! plc_is_admin() ) $options['search_area']=false;
-    
-    $table=new PlekitTable('add_persons',$headers,'0',$options);
-    $form=new PlekitForm(l_actions(),array('slice_id'=>$slice['slice_id']));
-    $form->start();
-    $table->start();
-    if ($potential_persons) foreach ($potential_persons as $person) {
-       $table->row_start();
-       $table->cell(l_person_obj($person));
-       $table->cell($person['first_name']);
-       $table->cell($person['last_name']);
-       $table->cell(plc_vertical_table ($person['roles']));
-       $table->cell ($form->checkbox_html('person_ids[]',$person['person_id']));
-       $table->row_end();
-      }
-    // add users
-    $table->tfoot_start();
-    $table->row_start();
-    $table->cell($form->submit_html ("add-persons-in-slice","Add selected"),
-                array('hfill'=>true,'align'=>'right'));
-    $table->row_end();
-    $table->end();
-    $form->end();
-  }
-  $toggle_persons->end();
-}
-$toggle->end();
-
-//////////////////////////////////////////////////////////// Nodes
-// the nodes details to display here
-// (1) we search for the tag types for which 'category' matches 'node*/ui*'
-// all these tags will then be tentatively displayed in this area
-// (2) further information can also be optionally specified in the category:
-//     (.) we split the category with '/' and search for assignments of the form var=value
-//     (.) header can be set to supersede the column header (default is tagname)
-//     (.) rank can be used for ordering the columns (default is tagname)
-//     (.) type is passed to the javascript table, for sorting (default is 'string')
-
-// minimal list as a start
-$node_fixed_columns = array('hostname','node_id','peer_id','slice_ids_whitelist', 'site_id',
-                           'run_level','boot_state','last_contact','node_type');
-// create a VisibleTags object : basically the list of tag columns to show
-//$visibletags = new VisibleTags ($api, 'node');
-//$visiblecolumns = $visibletags->column_names();
-
-// optimizing calls to GetNodes
-//$all_nodes=$api->GetNodes(NULL,$node_columns);
-//$slice_nodes=$api->GetNodes(array('node_id'=>$slice['node_ids']),$node_columns);
-//$potential_nodes=$api->GetNodes(array('~node_id'=>$slice['node_ids']),$node_columns);
-
-
-//NEW CODE FOR ENABLING COLUMN CONFIGURATION
-
-//prepare fix and configurable columns
-
-$fix_columns = array();
-$fix_columns[]=array('tagname'=>'hostname', 'header'=>'hostname', 'type'=>'string', 'title'=>'The name of the node');
-$fix_columns[]=array('tagname'=>'peer_id', 'header'=>'AU', 'type'=>'string', 'title'=>'Authority');
-$fix_columns[]=array('tagname'=>'run_level', 'header'=>'ST', 'type'=>'string', 'title'=>'Status');
-$fix_columns[]=array('tagname'=>'node_type', 'header'=>'RES', 'type'=>'string', 'title'=>'Reservable');
-
-// columns that correspond to the visible tags for nodes (*node/ui*)
-$visibletags = new VisibleTags ($api, 'node');
-$visibletags->columns();
-$tag_columns = $visibletags->headers();
-
-// extra columns that are not tags (for the moment not sorted correctly)
-
-$extra_columns = array();
-$extra_columns[]=array('tagname'=>'sitename', 'header'=>'SN', 'type'=>'string', 'title'=>'Site name', 'fetched'=>true);
-$extra_columns[]=array('tagname'=>'domain', 'header'=>'DN', 'type'=>'string', 'title'=>'Toplevel domain name', 'fetched'=>true);
-$extra_columns[]=array('tagname'=>'ipaddress', 'header'=>'IP', 'type'=>'string', 'title'=>'IP Address', 'fetched'=>true);
-
-//get user's column configuration
-
-$first_time_configuration = 'false';
-$default_configuration = "hostname:f|ST:f|AU:f|RES:f";
-$column_configuration = "";
-$slice_column_configuration = "";
-
-$show_configuration = "reservable:yes";
-$slice_show_configuration = "";
-$show_reservable_message = "";
-
-$PersonTags=$api->GetPersonTags (array('person_id'=>$plc->person['person_id']));
-//print_r($PersonTags);
-foreach ($PersonTags as $ptag) {
-       if ($ptag['tagname'] == 'columnconf')
-       {
-                $column_configuration = $ptag['value'];
-               $conf_tag_id = $ptag['person_tag_id'];
-       }
-       if ($ptag['tagname'] == 'showconf')
-       {
-                $show_configuration = $ptag['value'];
-               $show_tag_id = $ptag['person_tag_id'];
-       }
-}
-
-//print("<br>person column configuration = ".$column_configuration);
-
-$sliceconf_exists = false;
-if ($column_configuration == "")
-{
-       $column_configuration = $slice_id.";default";
-       $sliceconf_exists = true;
-}
-else {
-       $slice_conf = explode(";",$column_configuration);
-       for ($i=0; $i<count($slice_conf); $i++ ) {
-               if ($slice_conf[$i] == $slice_id)
-               {
-                       $i++;
-                       $slice_column_configuration = $slice_conf[$i];
-                       $sliceconf_exists = true;
-                       break;
-               }
-               else
-               {
-                       $i++;
-                       $slice_column_configuration = $slice_conf[$i];
-               }
-       }        
-}
-
-if ($sliceconf_exists == false)
-       $column_configuration = $column_configuration.";".$slice_id.";default";
-
-//print("<br>slice configuration = ".$slice_column_configuration);
-
-//instantiate the column configuration class, which prepares the headers array
-
-if ($slice_column_configuration == "")
-       $full_configuration = $default_configuration;
-else
-       $full_configuration = $default_configuration."|".$slice_column_configuration;
-
-$ConfigureColumns =new PlekitColumns($full_configuration, $fix_columns, $tag_columns, $extra_columns);
-
-$visiblecolumns = $ConfigureColumns->node_tags();
-
-$node_columns=array_merge($node_fixed_columns,$visiblecolumns);
-//print_r($node_columns);
-$all_nodes=$api->GetNodes(NULL,$node_columns);
-
-//print("<br>person show configuration = ".$show_configuration);
-
-$show_conf = explode(";",$show_configuration);
-for ($i=0; $i<count($show_conf); $i++ ) {
-                $i++;
-                $slice_show_configuration = $show_conf[$i];
-}        
-$reservable_value = explode(":", $slice_show_configuration);
-       if ($reservable_value[0]=="reservable" && $reservable_value[1] == "no")
-               $show_reservable_message = "display:none";
-
-//print("<br>slice show configuration = ".$slice_show_configuration);
-
-$slice_nodes=array();
-$potential_nodes=array();
-$reservable_nodes=array();
-foreach ($all_nodes as $node) {
-  if (in_array($node['node_id'],$slice['node_ids'])) {
-    $slice_nodes[]=$node;
-    if ($node['node_type']=='reservable') $reservable_nodes[]=$node;
-  } else {
-    $potential_nodes[]=$node;
-  }
-}
-if ($profiling) plc_debug_prof('5: nodes',count($slice_nodes));
-////////////////////
-// outline the number of reservable nodes
-$nodes_message=count_english($slice_nodes,"node");
-if (count($reservable_nodes)) $nodes_message .= " (" . count($reservable_nodes) . " reservable)";
-$toggle=new PlekitToggle ('my-slice-nodes',$nodes_message,
-                         array('bubble'=>
-                               'Manage nodes attached to this slice',
-                               'visible'=>get_arg('show_nodes',false)));
-$toggle->start();
-
-////////// show a notice to people having attached a reservable node
-if (count($reservable_nodes) && $privileges) {
-  $mark=reservable_mark();
-  print <<<EOF
-<div id='note_reservable_div' style="align:center; border : solid 2px red; padding:4px; width:800px; $show_reservable_message">
-<table align=center><tr><td valign=top>
-You have attached one or more <span class='bold'>reservable nodes</span> to your slice. 
-Reservable nodes show up with the '$mark' mark. 
-Your slivers will be available <span class='bold'>only during timeslots
-where you have obtained leases</span>. 
-You can manage your leases in the tab below.
-<br>
-Please note that as of August 2010 this feature is experimental. 
-Feedback is appreciated at <a href="mailto:devel@planet-lab.org">devel@planet-lab.org</a>
-</td><td valign=top><span onClick=closeShowReservable()><img class='reset' src="/planetlab/icons/clear.png" alt="hide message"></span>
-</td></tr></table>
-</div>
-EOF;
-}  
-
-//////////////////// reservable nodes area
-$count=count($reservable_nodes);
-if ($count && $privileges) {
-  // having reservable nodes in white lists looks a bit off scope for now...
-  $toggle_nodes=new PlekitToggle('my-slice-nodes-reserve',
-                                "Leases - " . count($reservable_nodes) . " reservable node(s)",
-                                array('visible'=>get_arg('show_nodes_resa',false)));
-  $toggle_nodes->start();
-  $grain=$api->GetLeaseGranularity();
-  if ($profiling) plc_debug_prof('6 granul',$grain);
-  // where to start from, expressed as an offset in hours from now
-  $resa_offset=$_GET['resa_offset'];
-  if ( ! $resa_offset ) $resa_offset=0;
-  $rough_start=time()+$resa_offset*3600;
-  // xxx should be configurable
-  $resa_slots=$_GET['resa_slots'];
-  if ( ! $resa_slots ) $resa_slots = 36;
-  // for now, show the next 72 hours, or 72 grains, which ever is smaller
-  $duration=$resa_slots*$grain;
-  $steps=$duration/$grain;
-  $start=intval($rough_start/$grain)*$grain;
-  $end=$rough_start+$duration;
-  $lease_columns=array('lease_id','name','t_from','t_until','hostname','name');
-  $leases=$api->GetLeases(array(']t_until'=>$rough_start,'[t_from'=>$end,'-SORT'=>'t_from'),$lease_columns);
-  if ($profiling) plc_debug_prof('7 leases',count($leases));
-  // hash nodes -> leases
-  $host_hash=array();
-  foreach ($leases as $lease) {
-    $hostname=$lease['hostname'];
-    if ( ! $host_hash[$hostname] ) {
-       $host_hash[$hostname]=array();
-    }
-    // resync within the table
-    $lease['nfrom']=($lease['t_from']-$start)/$grain;
-    $lease['nuntil']=($lease['t_until']-$start)/$grain;
-    $host_hash[$hostname] []= $lease;
-  }
-  # leases_data is the name used by leases.js to locate this table
-  echo "<table id='leases_data'>";
-  # pass (slice_id,slicename) as the [0,0] coordinate as thead>tr>td
-  echo "<thead><tr><td>" . $slice['slice_id'] . '&' . $slice['name'] . "</td>";
-  # the timeslot headers read (timestamp,label)
-  $day_names=array('Su','M','Tu','W','Th','F','Sa');
-  for ($i=0; $i<$steps; $i++) {
-    $timestamp=($start+$i*$grain);
-    $day=$day_names[intval(strftime("%w",$timestamp))];
-    $label=$day . strftime(" %H:%M",$timestamp);
-    // expose in each header cell the full timestamp, and how to display it - use & as a separator*/
-    echo "<th>" . implode("&",array($timestamp,$label)) . "</th>";
-  }
-  echo "</tr></thead><tbody>";
-  // todo - sort on hostnames
-  function sort_hostname ($a,$b) { return ($a['hostname']<$b['hostname'])?-1:1;}
-  usort($reservable_nodes,sort_hostname);
-  foreach ($reservable_nodes as $node) {
-    echo "<tr><th scope='row'>". $node['hostname'] . "</th>";
-    $hostname=$node['hostname'];
-    $leases=$host_hash[$hostname];
-    $counter=0;
-    while ($counter<$steps) {
-      if ($leases && ($leases[0]['nfrom']<=$counter)) {
-       $lease=array_shift($leases);
-       /* nicer display, merge two consecutive leases for the same slice 
-          avoid doing that for now, as it might makes things confusing */
-       /* while ($leases && ($leases[0]['name']==$lease['name']) && ($leases[0]['nfrom']==$lease['nuntil'])) {
-         $lease['nuntil']=$leases[0]['nuntil'];
-         array_shift($leases);
-         }*/
-       $duration=$lease['nuntil']-$counter;
-       echo "<td colspan='$duration'>" . $lease['lease_id'] . '&' . $lease['name'] . "</td>";
-       $counter=$lease['nuntil']; 
-      } else {
-       echo "<td></td>";
-       $counter+=1;
-      }
-    }
-    echo "</tr>";
-  }
-  echo "</tbody></table>\n";
-
-  // the general layout for the scheduler
-  echo <<< EOF
-<div id='leases_area'></div>
-
-<div id='leases_buttons'>
-  <button id='leases_clear' type='submit'>Clear</button>
-  <button id='leases_submit' type='submit'>Submit</button>
-</div>
-EOF;
-
-  $toggle_nodes->end();
- }
-
-
-//////////////////// node configuration panel
-
-$toggle_nodes=new PlekitToggle('my-slice-nodes-configuration',
-                               "Node table layout",
-                               array('visible'=>'1'));
-$toggle_nodes->start();
-
-//usort ($table_headers, create_function('$col1,$col2','return strcmp($col1["header"],$col2["header"]);'));
-//print("<p>TABLE HEADERS<p>");
-//print_r($table_headers);
-
-print("<div id='debug'></div>");
-print("<input type='hidden' id='slice_id' value='".$slice['slice_id']."' />");
-print("<input type='hidden' id='person_id' value='".$plc->person['person_id']."' />");
-print("<input type='hidden' id='conf_tag_id' value='".$conf_tag_id."' />");
-print("<input type='hidden' id='show_tag_id' value='".$show_tag_id."' />");
-print("<input type='hidden' id='column_configuration' value='".$slice_column_configuration."' />");
-print("<br><input type='hidden' size=80 id='full_column_configuration' value='".$column_configuration."' />");
-print("<input type='hidden' id='previousConf' value='".$slice_column_configuration."'></input>");
-print("<input type='hidden' id='defaultConf' value='".$default_configuration."'></input>");
-
-$ConfigureColumns->configuration_panel_html(true);
-
-$ConfigureColumns->javascript_init();
-
-$toggle_nodes->end();
-
-
-$all_sites=$api->GetSites(NULL, array('site_id','login_base'));
-$site_hash=array();
-foreach ($all_sites as $site) $site_hash[$site['site_id']]=$site['login_base'];
-
-$interface_columns=array('ip','node_id','interface_id');
-$interface_filter=array('is_primary'=>TRUE);
-$interfaces=$api->GetInterfaces($interface_filter,$interface_columns);
-
-$interface_hash=array();
-foreach ($interfaces as $interface) $interface_hash[$interface['node_id']]=$interface;
-
-
-
-
-
-//////////////////// nodes currently in
-$toggle_nodes=new PlekitToggle('my-slice-nodes-current',
-                              count_english($slice_nodes,"node") . " currently in $name",
-                              array('visible'=>get_arg('show_nodes_current',!$privileges)));
-$toggle_nodes->start();
-
-$headers=array();
-$notes=array();
-//$notes=array_merge($notes,$visibletags->notes());
-$notes [] = "For information about the different columns please see the <b>node table layout</b> tab above or <b>mouse over</b> the column headers";
-
-/*
-$headers['peer']='string';
-$headers['hostname']='string';
-$short="-S-"; $long=Node::status_footnote(); $type='string'; 
-       $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
-$short=reservable_mark(); $long=reservable_legend(); $type='string';
-       $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
-// the extra tags, configured for the UI
-$headers=array_merge($headers,$visibletags->headers());
-
-if ($privileges) $headers[plc_delete_icon()]="none";
-*/
-
-$edit_header = array();
-if ($privileges) $edit_header[plc_delete_icon()]="none";
-$headers = array_merge($ConfigureColumns->get_headers(),$edit_header);
-
-//print("<p>HEADERS<p>");
-//print_r($headers);
-
-$table_options = array('notes'=>$notes,
-                       'search_width'=>15,
-                       'pagesize'=>20,
-                       'configurable'=>true);
-
-$table=new PlekitTable('nodes',$headers,NULL,$table_options);
-
-$form=new PlekitForm(l_actions(),array('slice_id'=>$slice['slice_id']));
-$form->start();
-$table->start();
-if ($slice_nodes) foreach ($slice_nodes as $node) {
-  $table->row_start();
-
-$table->cell($node['node_id'], array('display'=>'none'));
-
-  $table->cell(l_node_obj($node));
-  $peers->cell($table,$node['peer_id']);
-  $run_level=$node['run_level'];
-  list($label,$class) = Node::status_label_class_($node);
-  $table->cell ($label,array('class'=>$class));
-  $table->cell( ($node['node_type']=='reservable')?reservable_mark():"" );
-
-  $hostname=$node['hostname'];
-  $ip=$interface_hash[$node['node_id']]['ip'];
-  $interface_id=$interface_hash[$node['node_id']]['interface_id'];
-
-//extra columns
-$node['domain'] = topdomain($hostname);
-$node['sitename'] = l_site_t($node['site_id'],$site_hash[$node['site_id']]);
-$node['ipaddress'] = l_interface_t($interface_id,$ip);
-
-
- //foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]);
- $ConfigureColumns->cells($table, $node);
-
-  if ($privileges) $table->cell ($form->checkbox_html('node_ids[]',$node['node_id']));
-  $table->row_end();
-}
-// actions area
-if ($privileges) {
-
-  // remove nodes
-  $table->tfoot_start();
-
-  $table->row_start();
-  $table->cell($form->submit_html ("remove-nodes-from-slice","Remove selected"),
-              array('hfill'=>true,'align'=>'right'));
-  $table->row_end();
- }
-$table->end();
-$toggle_nodes->end();
-
-//////////////////// nodes to add
-if ($privileges) {
-  $new_potential_nodes = array();
-  if ($potential_nodes) foreach ($potential_nodes as $node) {
-      $emptywl=empty($node['slice_ids_whitelist']);
-      $inwl = (!emptywl) and in_array($slice['slice_id'],$node['slice_ids_whitelist']);
-      if ($emptywl or $inwl)
-       $new_potential_nodes[]=$node;
-  }
-  $potential_nodes=$new_potential_nodes;
-
-  $count=count($potential_nodes);
-  $toggle_nodes=new PlekitToggle('my-slice-nodes-add',
-                                count_english($potential_nodes,"more node") . " available",
-                                array('visible'=>get_arg('show_nodes_add',false)));
-  $toggle_nodes->start();
-
-  if ( $potential_nodes ) {
-    $headers=array();
-    $notes=array();
-
-
-/*
-    $headers['peer']='string';
-    $headers['hostname']='string';
-    $short="-S-"; $long=Node::status_footnote(); $type='string'; 
-       $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
-       $short=reservable_mark(); $long=reservable_legend(); $type='string';
-       $headers[$short]=array('type'=>$type,'title'=>$long); $notes []= "$short = $long";
-    // the extra tags, configured for the UI
-    $headers=array_merge($headers,$visibletags->headers());
-    $headers['+']="none";
-*/
-
-    $add_header = array();
-    $add_header['+']="none";
-    $headers = array_merge($ConfigureColumns->get_headers(),$add_header);
-
-    //$notes=array_merge($notes,$visibletags->notes());
-$notes [] = "For information about the different columns please see the <b>node table layout</b> tab above or <b>mouse over</b> the column headers";
-    
-    $table=new PlekitTable('add_nodes',$headers,NULL, $table_options);
-    $form=new PlekitForm(l_actions(),
-                        array('slice_id'=>$slice['slice_id']));
-    $form->start();
-    $table->start();
-    if ($potential_nodes) foreach ($potential_nodes as $node) {
-       $table->row_start();
-
-$table->cell($node['node_id'], array('display'=>'none'));
-
-       $table->cell(l_node_obj($node));
-       $peers->cell($table,$node['peer_id']);
-       list($label,$class) = Node::status_label_class_($node);
-       $table->cell ($label,array('class'=>$class));
-       $table->cell( ($node['node_type']=='reservable')?reservable_mark():"" );
-
-       //extra columns
-         $hostname=$node['hostname'];
-         $ip=$interface_hash[$node['node_id']]['ip'];
-         $interface_id=$interface_hash[$node['node_id']]['interface_id'];
-       $node['domain'] = topdomain($hostname);
-       $node['sitename'] = l_site_t($node['site_id'],$site_hash[$node['site_id']]);
-       $node['ipaddress'] = l_interface_t($interface_id,$ip);
-
-       //foreach ($visiblecolumns as $tagname) $table->cell($node[$tagname]);
-       $ConfigureColumns->cells($table, $node);
-
-       $table->cell ($form->checkbox_html('node_ids[]',$node['node_id']));
-       $table->row_end();
-      }
-    // add nodes
-    $table->tfoot_start();
-    $table->row_start();
-    $table->cell($form->submit_html ("add-nodes-in-slice","Add selected"),
-                array('hfill'=>true,'align'=>'right'));
-    $table->row_end();
-    $table->end();
-    $form->end();
-  }
-  $toggle_nodes->end();
-}
-
-$toggle->end();
-
-// very wide values get abbreviated
-$tag_value_threshold=24;
-//////////////////////////////////////////////////////////// Tags
-//if ( $local_peer ) {
-  $tags=$api->GetSliceTags (array('slice_id'=>$slice_id));
-  if ($profiling) plc_debug_prof('8 slice tags',count($tags));
-  function get_tagname ($tag) { return $tag['tagname'];}
-  $tagnames = array_map ("get_tagname",$tags);
-  
-  $toggle = new PlekitToggle ('slice-tags',count_english_warning($tags,'tag'),
-                             array('bubble'=>'Inspect and set tags on tat slice',
-                                   'visible'=>get_arg('show_tags',false)));
-  $toggle->start();
-  
-  $headers=array(
-    "Name"=>"string",
-    "Value"=>"string",
-    "Node"=>"string",
-    "NodeGroup"=>"string");
-  if ($tags_privileges) $headers[plc_delete_icon()]="none";
-  
-  $table_options=array("notes_area"=>false,"pagesize_area"=>false,"search_width"=>10);
-  $table=new PlekitTable("slice_tags",$headers,'0',$table_options);
-  $form=new PlekitForm(l_actions(),
-                       array('slice_id'=>$slice['slice_id']));
-  $form->start();
-  $table->start();
-  if ($tags) {
-    foreach ($tags as $tag) {
-      $node_name = "ALL";
-      if ($tag['node_id']) {
-        $tag_nodes = $api->GetNodes(array('node_id'=>$tag['node_id']));
-       if ($profiling) plc_debug_prof('9 node for slice tag',count($tag_nodes));
-        if($tag_nodes) {
-          $node = $tag_nodes[0];
-          $node_name = $node['hostname'];
-        }
-      }
-      $nodegroup_name="n/a";
-      if ($tag['nodegroup_id']) { 
-        $nodegroups=$api->GetNodeGroups(array('nodegroup_id'=>$tag['nodegroup_id']));
-       if ($profiling) plc_debug_prof('10 nodegroup for slice tag',$nodegroup);
-        if ($nodegroup) {
-          $nodegroup = $nodegroups[0];
-          $nodegroup_name = $nodegroup['groupname'];
-        }
-      }
-      $table->row_start();
-      $table->cell(l_tag_obj($tag));
-      // very wide values get abbreviated
-      $table->cell(truncate_and_popup($tag['value'],$tag_value_threshold));
-      $table->cell($node_name);
-      $table->cell($nodegroup_name);
-      if ($tags_privileges) $table->cell ($form->checkbox_html('slice_tag_ids[]',$tag['slice_tag_id']));
-      $table->row_end();
-    }
-  }
-  if ($tags_privileges) {
-    $table->tfoot_start();
-    $table->row_start();
-    $table->cell($form->submit_html ("delete-slice-tags","Remove selected"),
-                 array('hfill'=>true,'align'=>'right'));
-    $table->row_end();
-    
-    $table->row_start();
-    function tag_selector ($tag) {
-      return array("display"=>$tag['tagname'],"value"=>$tag['tag_type_id']);
-    }
-    $all_tags= $api->GetTagTypes( array ("category"=>"slice*","-SORT"=>"+tagname"), array("tagname","tag_type_id"));
-    if ($profiling) plc_debug_prof('11 tagtypes',count($all_tags));
-    $selector_tag=array_map("tag_selector",$all_tags);
-    
-    function node_selector($node) { 
-      return array("display"=>$node["hostname"],"value"=>$node['node_id']);
-    }
-    $selector_node=array_map("node_selector",$slice_nodes);
-    
-    function nodegroup_selector($ng) {
-      return array("display"=>$ng["groupname"],"value"=>$ng['nodegroup_id']);
-    }
-    $all_nodegroups = $api->GetNodeGroups( array("groupname"=>"*"), array("groupname","nodegroup_id"));
-    if ($profiling) plc_debug_prof('13 nodegroups',count($all_nodegroups));
-    $selector_nodegroup=array_map("nodegroup_selector",$all_nodegroups);
-    
-    $table->cell($form->select_html("tag_type_id",$selector_tag,array('label'=>"Choose Tag")));
-    $table->cell($form->text_html("value","",array('width'=>8)));
-    $table->cell($form->select_html("node_id",$selector_node,array('label'=>"All Nodes")));
-    $table->cell($form->select_html("nodegroup_id",$selector_nodegroup,array('label'=>"No Nodegroup")));
-    $table->cell($form->submit_html("add-slice-tag","Set Tag"),array('columns'=>2,'align'=>'left'));
-    $table->row_end();
-  }
-    
-  $table->end();
-  $form->end();
-  $toggle->end();
-//}
-
-
-//////////////////////// renew slice
-if ($local_peer ) {
-  if ( ! $renew_visible) renew_area ($slice,$site,false);
- }
-
-$peers->block_end($peer_id);
-
-if ($profiling) plc_debug_prof_end();
-
-// Print footer
-include 'plc_footer.php';
-
-?>
index 5be7ca1..89404e5 100644 (file)
@@ -382,7 +382,8 @@ function quickselect_html() {
 //return '<p>This link uses the onclick event handler.<br><a href="#" onclick="setVisible(\'quicklist\');return false" target="_self">Open popup</a></p>';
 
 
-$quickselection = "<select id='quicklist' multiple size=10 onChange=changeSelectStatus(this.value)><option value''>Add/remove columns</option>";
+$quickselection = "<select id='quicklist' onChange=changeSelectStatus(this.value)><option value='0'>Short column descriptions and quick add/remove</option>";
+//$quickselection = "<select id='quicklist'><option value='0'>Short column descriptions and quick add/remove</option>";
 $prev_label="";
 $optionclass = "out";
 foreach ($this->all_headers as $h)
@@ -412,64 +413,20 @@ foreach ($this->all_headers as $h)
        $prev_label = $h['label'];
 
 
-$quickselection.="<option id='option'".$h['label']." class='".$optionclass."' '".$selected."' value='".$h['label']."'>".$h['label'].":&nbsp;".$h['title']."</option>";
+//$quickselection.="<option onclick=\"debugfilter('here2');removeSelectHandler(this);\" id='option'".$h['label']." class='".$optionclass."' value='".$h['label']."'><b>".$h['label']."</b>:&nbsp;".$h['title']."</option>";
+$quickselection.="<option id='option'".$h['label']." class='".$optionclass."' value='".$h['label']."'><b>".$h['label']."</b>:&nbsp;".$h['title']."</option>";
 }
 
 
 $quickselection.="</select>";
-$quickselection.="&nbsp;<input type='button' id='fetchbutton' onclick='fetchData()' value='Fetch data' disabled=true />";
 
 return $quickselection;
 
 }
 
 
-function quickselect_popup_html() {
-
-print('<div id="quickdiv">');
-print ("<select size='12' id='quicklist' onChange=changeSelectStatus(this.value)>");
-
-$prev_label="";
-$optionclass = "out";
-foreach ($this->all_headers as $h)
-{
-       if ($h['header'] == "hostname")
-               continue;
-
-       if ($h['fixed'])
-               $disabled = "disabled=true";
-       else
-               $disabled = "";
-
-        if ($this->headerIsVisible($h['label']))
-       {
-                       $optionclass = "in";
-               //$selected = "selected=selected";
-       }
-       else
-       {
-                       $optionclass = "out";
-               //$selected = "";
-       }
-
-       if ($prev_label == $h['label'])
-               continue;
-
-       $prev_label = $h['label'];
-
-
-        print ("<option id='option'".$h['label']." class='".$optionclass."' '".$selected."' value='".$h['label']."'>".$h['label'].":&nbsp;".$h['title']."</option>");
-}
-
-
-print("</select></div>");
-print("&nbsp;<input type='button' id='fetchbutton' onclick='fetchData()' value='Fetch data' disabled=true />");
-
-}
-
 function configuration_panel_html($showDescription) {
 
-
 if ($showDescription)
        $table_width = 700;
 else
index 27e7ff5..ec51656 100644 (file)
@@ -14,11 +14,12 @@ require_once 'plc_drupal.php';
 require_once 'plc_functions.php';
 
 $value=$_GET["value"];
-$person_id=$_GET["slice_id"];
+$person_id=$_GET["person_id"];
+$slice_id=$_GET["slice_id"];
 
-$myFile = "/var/log/myslice-log";
+$myFile = "/var/log/myslice.log";
 $fh = fopen($myFile, 'a') or die("can't open file");
-$stringData = "\n".date('Ymd-H:i')."|".$person_id.":".$value;
+$stringData = "\n".date('Ymd-H:i')."|".$person_id.":".$slice_id.":".$value;
 fwrite($fh, $stringData);
 fclose($fh);
 
index acc9fe5..038b302 100644 (file)
@@ -35,6 +35,7 @@ class PlekitToggle {
   // mandatory
   var $id;
   var $nifty;
+  var $info_div = "";
 
   function PlekitToggle ($id,$trigger,$options=NULL) {
     $this->id = $id;
@@ -44,6 +45,11 @@ class PlekitToggle {
       $options['start-hidden'] = ! $options['visible'];
       unset ($options['visible']);
     }
+
+    if (array_key_exists ('info_div',$options)) {
+       $this->info_div = $options['info_div'];
+    }
+
     if (!isset ($options['start-hidden'])) $options['start-hidden']=false;
     $this->options = $options;
   }
@@ -99,6 +105,8 @@ class PlekitToggle {
     $html .= $this->image_html();
     $html .= $this->trigger;
     $html .= "</$tagname>";
+    if ($this->info_div != "")
+    $html .= "&nbsp;(<a href=javascript:plc_show_toggle_info('$this->info_div','$this->id')>?</a>)";
     return $html;
   }
 
index 8b37381..9a0340b 100644 (file)
@@ -20,7 +20,7 @@ $tag_id=intval($_GET["tag_id"]);
 
 $api->UpdatePersonTag( $tag_id, $value );
 
-$myFile = "/var/log/myslice-log";
+$myFile = "/var/log/myslice.log";
 $fh = fopen($myFile, 'a') or die("can't open file");
 $stringData = "\n".date('Ymd-H:i')."|".$person_id.":".$slice_id.":".$value;
 fwrite($fh, $stringData);
index c0ab6c8..b4dc7f1 100644 (file)
@@ -123,7 +123,6 @@ var sourceL = 'Source: '+sourceComon;
 var valuesL = 'Unit: <b>5-minute load</b>';
 var detailL = '<i>The average 5-minute load (as reported by the Unix uptime command) over the selected period.</i>';
 var descL = '<span class="myslice title">'+titleL+'</span><p>'+detailL+'<p>'+selectPeriodL+'<p>'+valuesL+'<p>'+sourceL; 
-//var descL = '<span class="myslice title">'+titleL+'</span><p>'+detailL+'<p>'+valuesL+'<p>'+sourceL; 
 
 var titleLON= 'Longitude';
 var sourceLON = 'Source: '+sourceTophat;
@@ -230,7 +229,6 @@ var sourceR = 'Source: '+sourceComon+' (via '+sourceMySlice+')';
 var detailR = '<i>CoMon queries nodes every 5 minutes, for 255 queries per day. The average reliability is the percentage of queries over the selected period for which CoMon reports a value. The period is the most recent for which data is available, with CoMon data being collected by MySlice daily.</i>';
 var valuesR = 'Unit: <b>%</b>';
 var descR = '<span class="myslice title">'+titleR+'</span><p>'+detailR+'<p>'+selectPeriodR+'<p>'+valuesR+'<p>'+sourceR; 
-//var descR = '<span class="myslice title">'+titleR+'</span><p>'+detailR+'<p>'+valuesR+'<p>'+sourceR; 
 
 var titleRES = 'Reservation capabilities';
 var sourceRES = 'Source: '+sourceMyPLC;
@@ -360,13 +358,20 @@ function changeCheckStatus(column) {
                deleteColumn(document.getElementById(column).value);
 }
 
+function removeSelectHandler(object)
+{
+       debugfilter(object);
+        object.onclick = null;
+}
+
+
 //This function is used when the alternative "quick" selection list is used
 function changeSelectStatus(column) {
 
        var optionClass = "";
        var selected_index = document.getElementById('quicklist').selectedIndex;
 
-       if (document.getElementById('quicklist'))
+       if (document.getElementById('quicklist') && selected_index != 0)
        {
 
                optionClass = document.getElementById('quicklist').options[selected_index].className;
@@ -375,11 +380,13 @@ function changeSelectStatus(column) {
                {
                        deleteColumn(document.getElementById('quicklist').value);
                        document.getElementById('quicklist').options[selected_index].className = "out";
+                       document.getElementById('quicklist').value="0";
                }
                else
                {
                        addColumn(document.getElementById('quicklist').value, true);
                        document.getElementById('quicklist').options[selected_index].className = "in";
+                       document.getElementById('quicklist').value="0";
                }
        }
 }
@@ -421,15 +428,35 @@ function getHTTPObject()
         return false;
 }
 
-
-function closeShowReservable()
+function closeMessage(tab)
 {
+       var current_conf = document.getElementById('show_configuration').value;
+       var value = '';
+
+       if (current_conf != "")
+               current_conf += ";";
+
+       if (tab == 'reservable') {      
+        document.getElementById('note_reservable_div').style.display = "none";
+       if (current_conf.indexOf('reservable') != -1)
+               return;
+       value = current_conf+'reservable';
+       }
+
+       if (tab == 'columns') { 
+        document.getElementById('note_columns_div').style.display = "none";
+       if (current_conf.indexOf('columns') != -1)
+               return;
+       value = current_conf+'columns';
+       }
+
        var slice_id = document.getElementById('slice_id').value;
        var person_id = document.getElementById('person_id').value;
        var tag_id = document.getElementById('show_tag_id').value;
-        document.getElementById('note_reservable_div').style.display = "none";
-
-        var url = "/plekit/php/updateConfiguration.php?value="+slice_id+";reservable:no&slice_id="+slice_id+"&person_id="+person_id+"&tag_id="+tag_id;
+       
+        var url = "/plekit/php/updateConfiguration.php?value="+value+"&slice_id="+slice_id+"&person_id="+person_id+"&tag_id="+tag_id;
+       //debugfilter("updating conf with "+url);
+       document.getElementById('show_configuration').value = value;
 
        var req = getHTTPObject();
        req.open('GET', url, true);
@@ -504,14 +531,12 @@ function updateColumnConfiguration(value, reload)
         xmlhttp.send();
 }
 
-function logSortingAction(slice_id, value)
+function logSortingAction(person_id, slice_id, value)
 {
 
-       if (value.indexOf("column-1")!=-1)
-               return;
 
        var req = getHTTPObject();
-        var url = "/plekit/php/logSorting.php?value="+value+"&slice_id="+slice_id;
+        var url = "/plekit/php/logSorting.php?value="+value+"&slice_id="+slice_id+"&person_id="+person_id;
 
        req.open('GET', url, true);
        req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
@@ -526,14 +551,17 @@ function logSortingAction(slice_id, value)
 function sortCompleteCallback(tableid) {
 
        var slice_id = document.getElementById('slice_id').value;
+       var person_id = document.getElementById('person_id').value;
 
        var ths = document.getElementById(tableid).getElementsByTagName("th");
        for(var i = 0, th; th = ths[i]; i++) {
        if (th.className.indexOf("Sort") != -1)
        {
-               var column = th.className.substr(th.className.indexOf("column"),th.className.indexOf("column")+1);
-               var sortdirection = th.className.substr(th.className.indexOf("Sort")-8,th.className.indexOf("Sort"));
-               logSortingAction(slice_id, tableid+"|"+column+"|"+sortdirection);
+               var hclass = th.className;
+               var column = hclass.substr(hclass.indexOf("column"),hclass.indexOf("column")+1);
+               var sortdirection = hclass.substr(hclass.indexOf("Sort")-8,hclass.indexOf("Sort"));
+               if (column.indexOf("column-1")==-1 && column.indexOf("column-0")==-1)
+                       logSortingAction(person_id, slice_id, tableid+"|"+column+"|"+sortdirection);
        }
        }
 }
@@ -791,6 +819,7 @@ function addColumn(column, fetch) {
        var selectedperiod="";
        var header=column;
 
+
        if (inTypeC(column)!=-1)
        {
                column = column.substring(0,column.length-1);
@@ -807,7 +836,6 @@ function addColumn(column, fetch) {
                addColumnAjax(column, header);
 
        addColumnToConfiguration(header);
-       
 }
 
 
@@ -820,7 +848,6 @@ function deleteColumnCells(header) {
 }
 
 
-
 function deleteColumn(column) {
 
        var selectedperiod="";
@@ -834,8 +861,6 @@ function deleteColumn(column) {
        deleteColumnCells(header);
 
        deleteColumnFromConfiguration(header);
-
-       //document.getElementById('check'+column).checked = false;
 }
 
 
@@ -845,15 +870,12 @@ EXTRA
 
 //to be used for scrolling the column list with down/up arrows 
 
-function scrollList(tableid) {
-
-debugfilter("here");
-
+function scrollList() {
+debugfilter("here "+document.getElementById('scrolldiv').focused);
 if (event.keyCode == 40)
        debugfilter("down");
 else if (event.keyCode == 38)
        debugfilter("up");
-
 }
 
 function resetColumns() {
index c9d2e2f..aa19d8e 100644 (file)
@@ -1,17 +1,17 @@
-/* 
-   $Id$
-*/
 
-function plc_toggle (id) {
-  var area=$('toggle-area-' + id);
-  area.toggle();
-  var visible=$('toggle-image-visible-' + id);
-  var hidden=$('toggle-image-hidden-' + id);
-  if (area.visible()) {
-    visible.show();
-    hidden.hide();
-  } else {
-    visible.hide();
-    hidden.show();
-  }
+function plc_toggle(id){var area=$('toggle-area-'+id);area.toggle();var visible=$('toggle-image-visible-'+id);var hidden=$('toggle-image-hidden-'+id);if(area.visible()){visible.show();hidden.hide();}else{visible.hide();hidden.show();}}
+
+function plc_show_toggle_info(div, id) {
+//debugfilter("showing "+div);
+
+var area=$('toggle-area-'+id);
+var visible=$('toggle-image-visible-'+id);
+var hidden=$('toggle-image-hidden-'+id);
+
+if (document.getElementById(div).style.display == "none") {
+       document.getElementById(div).style.display = "";
+       if (! area.visible())
+               area.toggle();
+}
+
 }
index 3d67952..77a75be 100644 (file)
@@ -1,7 +1,7 @@
 # what the myplc rpm requires
 %define name plewww
 %define version 4.3
-%define taglevel 53
+%define taglevel 54
 
 # no need to mention pldistro as this module differs in both distros
 #%define release %{taglevel}%{?pldistro:.%{pldistro}}%{?date:.%{date}}
@@ -106,6 +106,9 @@ for module in user node; do
     cp -f /var/www/html/drupal-hacks/${module}.module /var/www/html/modules/${module}.module
 done
 popd
+# create myslice.log and change its ownership
+touch /var/log/myslice.log
+chown apache:apache /var/log/myslice.log
 
 %clean
 rm -rf $RPM_BUILD_ROOT
@@ -122,6 +125,9 @@ rm -rf $RPM_BUILD_ROOT
 /var/www/html/plekit
 
 %changelog
+* Mon Oct 25 2010 Baris Metin <Talip-Baris.Metin@sophia.inria.fr> - plewww-4.3-54
+- tagging plewww for a new deployment
+
 * Fri Oct 15 2010 Thierry Parmentelat <thierry.parmentelat@sophia.inria.fr> - plewww-4.3-53
 - add a 'report a problem' link for the RebootNode button
 - new exp page nodes2.php with consistent selectable-columns layout as myslice