initial import from onelab svn codebase
[plewww.git] / planetlab / includes / plc_functions.php
1 <?php
2
3 // pagination function
4 function paginate( $fn_array, $table_id, $caption, $limit, $main_field, $other_func= NULL, $fid= NULL ) {
5   // get vars from call adjust them
6   $dir= strtolower( $caption );
7   $echo= "";
8
9   $link_page= 'index.php';
10
11   // check for page number
12   if( empty( $_GET['page'] ) )
13     $page= 1;
14   else
15     $page= $_GET['page'];
16
17   // reorder array_chunk
18   foreach( $fn_array as $arr1 ) {
19     unset( $arr2 );
20     
21     foreach( $arr1 as $key => $val ) {
22 //      if( substr( $key, -3 ) == "_id" )
23       if ( $key == $table_id  ) {
24         $id[$key]= $val;
25       } else {
26         $data[$key]= $val;
27       }
28     }
29     
30     foreach( $id as $key => $val )
31       $arr2[$key]= $val;
32
33     foreach( $data as $key => $val )
34       $arr2[$key]= $val;
35
36     $as_array[]= $arr2;
37   }
38
39   $totalrows= count( $as_array );
40
41   // if array has no rows display msg
42   if( $totalrows == 0 )
43     return "Nothing to display";
44
45   // set key and break up data struct
46   $newkey= $page - 1;  
47   $newarray= array_chunk( $as_array, $limit );
48
49   // start table output
50   $echo.= "<table class='list_set' border=0 cellpadding=2>\n";
51
52   // if there is a caption add it to table
53   if( $caption )
54     $echo.= "<caption class='list_set'>$caption</caption>\n";
55
56   $echo.= "<thead><tr class='list_set'>";
57
58   // go through keys of one array row for table headers
59   foreach( $newarray[$newkey][0] as $key => $val ) {
60 //    if( substr( $key, -3 ) != "_id" )
61     if ( $key != $table_id && $key != 'peer_id' )
62       $echo.= "<th class='list_set'>". ucfirst( $key ) ."</th>";
63   }
64
65   if( $other_func == 'slivers' )
66     $echo.= "<th>Slivers</th>";
67
68   $echo.= "</tr></thead><tbody>\n";
69
70   // go through array row by row to output table rows
71   foreach( $newarray[$newkey] as $assoc ) {
72
73     $extraclass="";
74     if ($assoc['peer_id']) {
75       $extraclass="plc-foreign";
76     }
77     
78
79     $echo.= "<tr class='list_set'>";
80
81     foreach( $assoc as $key => $val ) {
82       // do not rely on keys order
83       $id = $assoc[$table_id];
84 //      if( substr( $key, -3 ) == "_id" )
85       if ($key == $table_id) {
86 //      $id= $val;
87         continue;
88       } elseif( $key == $main_field ) {
89         $echo.= "<td class='list_set $extraclass'><a href='/db/$dir/$link_page?id=$id'>$val</a></td>";
90       } elseif ($key != 'peer_id') {
91         $echo.= "<td class='list_set $extraclass'>";
92         if( is_array( $val ) ) {
93           $count= 1;
94           $tot= count( $val );
95           foreach( $val as $k => $v ) {
96             $echo.= $v;
97             if( $count != $tot )
98               $echo.= ", ";
99             $count++;
100           }
101         }
102         else
103           $echo.= $val;
104         $echo.= "</td>";
105       }
106
107     }
108
109     if( $other_func == 'slivers' )
110       $echo.= "<td><a href='slivers.php?node=$fid&slice=$id'>view</a></td>";
111
112     $echo.= "</tr>\n";
113   }
114
115   // close table
116   $echo.= "</tbody></table>\n";
117   $echo.= "<hr />\n";
118
119   // find total number of pages
120   $numofpages = $totalrows / $limit;
121
122   // start navigation links
123   if( $numofpages > 1 ) {
124     // if page is not 1 display first and prev links
125     if( $page != 1 && $page ) {
126         $pageprev= $page - 1;
127         $echo.= "<a href=\"". $_SERVER['REQUEST_URI'] ."&page=1\">FIRST</a> &nbsp; ";
128         $echo.= " <a href=\"". $_SERVER['REQUEST_URI'] ."&page=$pageprev\">PREV ".$limit."</a> &nbsp; ";
129       }
130       else
131         $echo.= "PREV ". $limit ." ";
132
133     // if less than 30 pages display all
134     // otherwise show 30 pages but put ... inbetween
135     if( $numofpages < 30 ) {
136       $npages= $numofpages;
137       $start= 1;
138     }
139     else {
140       $npages= $page + 9;
141       if( $npages > $numofpages )
142         $npages= $numofpages;
143       $start= $page - 10;
144       if( $start < 1 )
145         $start= 1;
146       if( $page != 1 )
147         $echo.= " ... ";
148     }
149
150     // display pages, no link if current page
151     for( $i= $start; $i <= $npages; $i++ ) {
152       if( $i == $page )
153         $echo.= $i ." ";
154       else
155         $echo.= "<a href=\"". $_SERVER['REQUEST_URI'] ."&page=$i\">$i</a> ";
156
157     }
158
159     if( ( $totalrows % $limit ) != 0 ) {
160       $last= $numofpages + 1;
161       if( $i == $page )
162         $echo.= $i ." ";
163       else
164         $echo.= "<a href=\"". $_SERVER['REQUEST_URI'] ."&page=$i\">$i</a> ";
165     }
166     else
167       $last= $numofpages;
168
169     if( $numofpages >= 30 ) {
170       if( $page != $numofpages )
171         $echo.= " ... ";
172     }
173
174     if( ( $totalrows - ($limit * $page) ) > 0 ) {
175       $pagenext= $page + 1;
176       $echo.= " &nbsp; <a href=\"". $_SERVER['REQUEST_URI'] ."&page=$pagenext\">NEXT ".$limit."</a> &nbsp; ";
177     }
178     else
179       $echo.= "NEXT ". $limit;
180
181     $echo.= " <a href=\"". $_SERVER['REQUEST_URI'] ."&page=". intval( $last ) ."\">LAST</a>\n";
182
183   }
184
185   return $echo;
186   
187 }
188
189 // function for getting the diff of multi dimention array
190 function arr_diff( $a1, $a2 ) {
191   $diff= array();
192   foreach( $a1 as $k=>$v ) {
193     unset( $dv );
194     for( $x= 0; $x < count( $a2 ); $x++ ) {
195       if( is_int( $k ) ) {
196         if( array_search( $v, $a2 ) === false )
197           $dv=$v;
198         else if( is_array( $v ) )
199           $dv= arr_diff( $v, $a2[$x] );
200         if( $dv && !in_array( $dv, $diff ) )
201           $diff[]=$dv;
202       }
203       else {
204
205         if( !$a2[$k] )
206           $dv=$v;
207         else if(is_array($v))
208           $dv=arr_diff($v,$a2[$x]);
209         if($dv)
210           $diff[$x]=$dv;
211       }
212     }
213   }
214   return $diff;
215 }
216
217
218 function is_valid_email_addr($email)
219 {
220   if( ereg("^.+@.+\\..+$", $email) )
221     return true;
222   else
223     return false;
224 }
225
226 function is_valid_url($url)
227 {
228   if( ereg("^(http|https)://.+\..+$", strtolower($url) ) )
229     return true;
230   else
231     return false;
232 }
233
234 function is_valid_ip($ip)
235 {
236   if( ereg("^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$", $ip ) )
237     {
238       // it's at least in the right format, now check to see if
239       // each part is equal to less than 255
240       $parts= explode( '.', $ip );
241       $count= count($parts);
242
243       for( $i= 0; $i < $count; $i++ )
244         {
245           if( intval($parts[$i]) > 255 )
246             return false;
247         }
248
249       return true;
250     }
251   else
252     return false;
253 }
254
255
256 function is_valid_network_addr($network_addr,$mask)
257 {
258   $lNetwork= ip2long($network_addr);
259   $lMask= ip2long($mask);
260
261   // are they the correct format?
262   if( $lNetwork == -1 || $lMask == -1 )
263     return false;
264
265   // is network address valid for the mask?
266   if( ($lNetwork & $lMask) != $lNetwork )
267     return false;
268
269   return true;
270 }
271
272
273 // returns whether or not a network address is in the reserved space
274 // in the case of a invalid network address, false will be returned.
275 function is_reserved_network_addr($network_addr)
276 {
277   $lNetwork= ip2long($network_addr);
278
279   if( $lNetwork == -1 )
280     return false;
281
282   // does the network address fall in a reserved block?
283   $reserved_ips = array (
284                          array('10.0.0.0','10.255.255.255'),
285                          array('172.16.0.0','172.31.0.0'),
286                          array('192.168.0.0','192.168.255.0')
287                          );
288   foreach ($reserved_ips as $r)
289     {
290       $min = ip2long($r[0]);
291       $max = ip2long($r[1]);
292       
293       if (($lNetwork >= $min) && ($lNetwork <= $max))
294           return true;
295     }
296
297   return false;
298 }
299
300 // builds a table from an array of strings, with the given class
301 function plc_make_table ($class, $messages) {
302   // pretty print the cell
303   $formatted = "";
304   if (! empty ($messages)) {
305     $formatted="<table class='" . $class . "'>";
306     foreach ($messages as $message) {
307       $formatted .= "<tr><td>" . $message . "</td></tr>";
308     }
309     $formatted .= "</table>";
310   }
311   return $formatted;
312 }
313
314 // shows a php variable verbatim with a heading message
315 function plc_debug($message,$object) {
316   print "<br>" . $message . "<pre>";
317   print_r ($object);
318   print "</pre>";
319 }
320
321 // attempt to normalize the delete buttons and confirmations
322 function plc_delete_button($width=15) {
323   return '<span title="Delete this entry"><img width=' . $width . ' alt="Delete this entry" src="/planetlab/includes/delete.png"></span>';
324 }
325
326 function plc_js_confirm($message) {
327   return "onclick=\"javascript:return confirm('Are you sure you want to delete " . $message . " ?')\"";
328 }
329
330 function plc_delete_link($url,$delete_message,$visible) {
331   return "<a href='" . $url . "' " . plc_js_confirm($delete_message) . ">" . $visible . "</a>";
332 }
333
334 function plc_delete_link_button($url,$delete_message,$width=15) {
335   return "<a href='" . $url . "' " . plc_js_confirm($delete_message) . ">" . plc_delete_button($width) . "</a>";
336 }
337
338 function plc_event_button($type,$param,$id) {
339   return '<a href="/db/events/index.php?type=' . $type . '&' . $param . '=' . $id . '"> <span title="Related events"> <img src="/planetlab/includes/event.png" width=18></span></a>';
340 }
341
342 function plc_comon_button ($field, $value,$target="") {
343   $result='<a ';
344   if (!empty($target)) {
345     $result.='target="' . $target . '" ';
346   }
347   $result.='href="/db/nodes/comon.php?' . $field . "=" . $value . '">';
348   $result.='<span title="Link to Comon"> <img src="/planetlab/includes/comon.png" width="18"></span></a>';
349   return $result;
350 }
351
352 function plc_peers_option_list ($api) {
353
354     // get list of peers
355     $peers=$api->GetPeers(NULL,array('peer_id','peername'));
356     if (count($peers)==0) {
357       $predef=array(array("peer_id"=>"","peername"=>"All (no known peers)"));
358     } else {
359       $predef=array(array("peer_id"=>"","peername"=>"All peers"),
360                     array("peer_id"=>"local","peername"=>"Local only"));
361       // show a 'foreign' button only if that makes sense
362       if (count($peers) >= 2) {
363         $predef [] = array("peer_id"=>"foreign","peername"=>"Foreign peers");
364       }
365     }
366     
367     $result="";
368     foreach ($predef as $a) {
369       $peer_line = "<option value='" . $a['peer_id'] . "'>" . $a['peername'] . "</option>\n";
370       $result .= $peer_line;
371     }
372
373     if (!empty($peers)) {
374       foreach ($peers as $a) {
375         $peer_line = "<option value='" . $a['peer_id'] . "'>" . $a['peername'] . "</option>\n";
376         $result .= $peer_line;
377       }
378     }
379
380     return $result;
381 }
382
383 ?>