Source for file functions_system.php

Documentation is available at functions_system.php

  1. <?php
  2.  
  3. function validate_field_array( &$fieldArray ) {
  4. //applies security constraints to a display field array
  5. $returnArray;
  6. foreach( $fieldArray as $field ) {
  7. //if a view permission is specified...
  8. if( $field['permission'] ) {
  9. //...and is met, add the field to the return array
  10. if( allowed( $field['permission'] ) ) {
  11. //if an edit permission is specified but not met, add a static field
  12. if( $field['editPermission'] && !allowed( $field['editPermission'] ) ) {
  13. //add a static field
  14. $field[] = static_field( $field );
  15. } else {
  16. //add a form input or button
  17. $returnArray[] = $field;
  18. }
  19. } //...and not met, do nothing
  20. } else {
  21. //...if not specified add the field
  22. $returnArray[] = $field;
  23. }
  24. }
  25. return $returnArray;
  26. }
  27.  
  28. function static_field( $field ) {
  29. //returns a field without form input
  30. $returnField = $field;
  31. if( $field['type'] && $field['type'] == 'datetime_input' ) {
  32. $returnField['type'] = 'date';
  33. } else {
  34. $returnField['type'] = 'text';
  35. }
  36. return $returnField;
  37. }
  38.  
  39. function new_relationship_type( $name_foreward = NULL, $name_reverse = NULL, $description = NULL, $icon = NULL ) {
  40. $relationshipType = array(
  41. 'name_foreward'=>$name_foreward,
  42. 'name_reverse'=>$name_reverse,
  43. 'description'=>$description,
  44. 'icon'=>$icon
  45. );
  46. return insert_relationship_type( $relationshipType );
  47. /*
  48. global $db;
  49. $db->get_results("SELECT * FROM relationships" );
  50. if( !$db->col_info ) {
  51. $queryString = "CREATE TABLE relationships ( id int, typeID int, primaryID int, secondaryID int )";
  52. $db->query( $queryString );
  53. }
  54. $counter = $db->get_var( "SELECT value FROM system_settings WHERE name = 'object_type_counter'" );
  55. $db->query( "
  56. INSERT INTO object_types
  57. VALUES ( '".$counter."', '".$name."', '".$description."', 'relationships', 'relationship', '' )
  58. " );
  59. $db->query( "UPDATE system_settings SET value = '".($counter + 1)."' WHERE name = 'object_type_counter'" );
  60. return $counter;*/
  61. }
  62.  
  63. function get_objects( $type ) {
  64. //NOTE: i've modified the get_object_type to check for relationship types, so this bifurcation may not be needed
  65. if( $objectType =& $GLOBALS['core']->get_object_type( $type ) ) {
  66. return $objectType->retrieve_all();
  67. } else if( $relationshipType =& $GLOBALS['core']->get_relationship_type( $type ) ) {
  68. return $relationshipType->retrieve_all();
  69. }
  70. }
  71.  
  72. function &get_relationship( $id, $type = NULL ) {
  73. $relationship_types =& $GLOBALS['core']->get_attribute( "relationship_types" );
  74. $retrieved =& $relationship_types->get_attribute( "retrievedObjects" );
  75. if( $retrieved ) {
  76. //for the types aready retrieved from the DB, check for the requested object
  77. foreach( $retrieved as $r_type ) {
  78. if( $object =& $r_type->get_object($id) ) { return $object; }
  79. }
  80. }
  81. if( $nonRetrieved = array_diff_key( $relationship_types->get_attribute( "objects" ), $relationship_types->get_attribute( "retrievedObjects" ) ) ) {
  82. //if there are types that haven't been retrieved, retrieve them one at a time and check for the object
  83. foreach( $nonRetrieved as $typeID => $bool ) {
  84. if( $type =& $GLOBALS['core']->get_relationship_type( $typeID ) )
  85. if( $object =& $type->get_object($id) ) { return $object;
  86. }
  87. }
  88. }
  89. return false;
  90. }
  91.  
  92. function &get_object( $id, $type = NULL ) {
  93. if( $id == '*new*' ) {
  94. if( $type ) {
  95. $type =& $GLOBALS['core']->get_object_type( $type );
  96. if( !$object =& $type->get_object('*new*') ) {
  97. $class = $type->get_attribute( 'type_class_name' );
  98. $object =& new $class;
  99. }
  100. return $object;
  101. } else {
  102. return false;
  103. }
  104. } else {
  105. if( $type ) {
  106. //if a type was specified get that type and request the object
  107. $object_type =& $GLOBALS['core']->get_object_type($type);
  108. return $object_type->get_object( $id );
  109. } else {
  110. //otherwise get all defined object types
  111. $object_types =& $GLOBALS['core']->get_attribute( "object_types" );
  112. $retrieved =& $object_types->get_attribute( "retrievedObjects" );
  113. if( $retrieved ) {
  114. //for the types aready retrieved from the DB, check for the requested object
  115. foreach( $retrieved as $r_type ) {
  116. if( $object =& $r_type->get_object($id) ) { return $object; }
  117. }
  118. }
  119. if( $nonRetrieved = array_diff_key( $object_types->get_attribute( "objects" ), $object_types->get_attribute( "retrievedObjects" ) ) ) {
  120. //if there are types that haven't been retrieved, retrieve them one at a time and check for the object
  121. foreach( $nonRetrieved as $typeID => $bool ) {
  122. if( $type =& $GLOBALS['core']->get_object_type( $typeID ) )
  123. if( $object =& $type->get_object($id) ) { return $object;
  124. }
  125. }
  126. }
  127. }
  128. }
  129. return false;
  130. }
  131.  
  132. function validate_system() {
  133. //verifies that any resources required for the system module have been correctly installed and are working properly
  134. global $db;
  135. $return_bool = verify_core();
  136. $db->hide_errors();
  137. //locate required tables
  138. $db->get_results("SELECT * FROM object_types");
  139. if( !$db->col_info ) { $return_bool = false; }
  140. $db->get_results("SELECT * FROM type_sets");
  141. if( !$db->col_info ) { $return_bool = false; }
  142. $db->get_results("SELECT * FROM relationships");
  143. if( !$db->col_info ) { $return_bool = false; }
  144. $db->show_errors();
  145. return $return_bool;
  146. }
  147.  
  148. function auto_relate_new_object( $newObjectID ) {
  149. //processing for relating a new object
  150. if( isset( $_SESSION['new_object']['object'] ) && !count($GLOBALS['errorArray']) ) {
  151. $allowedObjects = get_allowed_object_types( $_SESSION['new_object']['relationship_type'], $_SESSION['new_object']['object'], $direction = $_SESSION['new_object']['direction'] );
  152. if( in_array( $newObjectID, $allowedObjects ) ) {
  153. $primaryID = ( ( $direction = $_SESSION['new_object']['direction'] == "foreward" ) ? $_SESSION['new_object']['object'] : $newObjectID );
  154. $secondaryID = ( ( $direction = $_SESSION['new_object']['direction'] == "reverse" ) ? $_SESSION['new_object']['object'] : $newObjectID );
  155. new_relationship( $_SESSION['new_object']['relationship_type'], $primaryID, $secondaryID );
  156. }
  157. }
  158. }
  159. /*
  160. function get_object_types( $attribute = NULL ) {
  161. //returns a multi-dimensional array of all the defined object types and each type's values, or a single value as specified
  162. global $db;
  163. $field = $attribute ? $attribute : "*";
  164. $returnArray = array();
  165. $rawArray = core_get_object_types();
  166. if( $attribute ) { foreach( $rawArray as $rawField ) {
  167. array_push( $returnArray, $rawField[ $field ] );
  168. } } else {
  169. $returnArray = $rawArray;
  170. }
  171. return $returnArray;
  172. }
  173.  
  174. function get_object_type( $typeID, $attribute = NULL ) {
  175. //NOTE: this doesn't need to be here...
  176. return core_get_object_type( $typeID );
  177. }
  178.  
  179. function get_relationship_types() {
  180. //returns a multi-dimensional array of all the defined relationship types and each type's values
  181. if( !isset( $GLOBALS['relationship_types'] ) ) {
  182. global $db;
  183. $GLOBALS['relationship_types'] = $db->get_results( "SELECT * FROM object_types", ARRAY_A );
  184. }
  185. return $GLOBALS['relationship_types'];
  186. }
  187.  
  188. function get_relationship_type_ID( $name ) {
  189. //returns the ID of the given relationship
  190. if( isset( $GLOBALS['relationship_types'] ) ) { foreach( $GLOBALS['relationship_types'] as $relationshipType ) {
  191. if( $relationshipType['name'] = $name ) { return $relationshipType['id']; }
  192. } } else { $GLOBALS['relationship_types'] = array(); }
  193. global $db;
  194.  
  195. $db->hide_errors();
  196. $relationshipTypeID = $db->get_results("SELECT * FROM object_types WHERE name = '".clean($name)."'");
  197. if( $relationshipTypeID['id'] ) {
  198. $db->show_errors();
  199. $GLOBALS['relationship_types'][$relationshipTypeID['id']] = $relationshipTypeID;
  200. return $relationshipTypeID['id'];
  201. } else if( $db->get_var( "SELECT name FROM object_types WHERE id = '".clean($name)."'") ) {
  202. $db->show_errors();
  203. return $name;
  204. } else {
  205. $db->show_errors();
  206. return false;
  207. }
  208.  
  209. }
  210.  
  211. function get_object_ID( $attribute = NULL, $value ) {
  212. //returns an array of all the object ID's and the objects' table names which have the specified value, for the specified attribute if specified
  213. global $db;
  214. $tables = get_object_types( 'table_name' );
  215. $returnArray = array();
  216. $db->hide_errors();
  217. if( $tables) { foreach( $tables as $table ) {
  218. $objects = $db->get_results( "SELECT id FROM ".clean($table)." WHERE ".clean($attribute)." = '".clean($value)."'", ARRAY_A );
  219. if( $objects ) { foreach( $objects as $object ) {
  220. array_push( $returnArray, array( 'id'=>$object[ 'id' ], 'table_name'=>$table ) );
  221. } }
  222. } }
  223. $db->show_errors();
  224. return $returnArray;
  225. }
  226.  
  227. function get_object_index( $objectID ) {
  228. //determines the type of the given object and calls that object type's get_index function
  229. if( $object =& get_object( $objectID ) ) {
  230. return $object->get_index();
  231. }
  232. /*
  233. global $db;
  234. if( $tableName = get_object_table_name( $objectID ) ) {
  235. $objectType = $db->get_var( "SELECT name FROM object_types WHERE table_name = '".$tableName."'" );
  236. $objectType = str_replace( " ", "_", $objectType );
  237. $evalString = "\$returnIndex = get_".$objectType."_index( ".$objectID." );";
  238. eval( clean($evalString) );
  239. } else {
  240. $returnIndex = "<strong>! object does not exist !</strong>";
  241. }
  242. return $returnIndex;
  243. }
  244.  
  245. function get_constraint_index( $constraintID ) {
  246. //returns an index value for a constraint
  247. global $db;
  248. $selectString = "SELECT name FROM constraints WHERE id = '".clean($constraintID)."'";
  249. $returnString = $db->get_var( $selectString );
  250.  
  251. return $returnString;
  252. }
  253. */
  254. function get_relationships( $objectID = NULL, $relationshipTypeID = NULL ) {
  255. //returns a multi-dimensional array containing all the defined relationships and their constituent values
  256. global $db;
  257.  
  258. if( $objectID && $relationshipType ) {
  259. $data = $db->get_results( "SELECT * FROM relationships WHERE typeID = '".clean($relationshipTypeID)."' AND ( primaryID = '".$objectID."' || secondaryID = '".$objectID."' )", ARRAY_A );
  260. } else if( $relationshipType ) {
  261. $data = $db->get_results( "SELECT * FROM relationships WHERE typeID = '".clean($relationshipTypeID)."'", ARRAY_A );
  262. } else if( $objectID ) {
  263. $data = $db->get_results( "SELECT * FROM relationships WHERE primaryID = '".clean($objectID)."' || secondaryID = '".clean($objectID)."'", ARRAY_A );
  264. } else {
  265. $data = $db->get_results( "SELECT * FROM relationships", ARRAY_A );
  266. }
  267. if( $data ) {
  268. foreach($data as $object ) {
  269. $returnArray[$object['id']] =& get_object( $object['id'] );
  270. }
  271. return $returnArray;
  272. } else {
  273. return false;
  274. }
  275. }
  276.  
  277. function get_allowed_object_types( $type, $objectID, $direction = NULL ) {
  278. //returns an array of all the objects can be related to the given object by the given type in the given position
  279. //direction refers to the direction of the relationship in reference to the given object
  280. global $db;
  281. $constraints = get_satisfied_constraints( $objectID );
  282. $rawArray = array();
  283. $returnArray = array();
  284.  
  285. if($direction == "reverse" || $direction == "either" || !$direction) {
  286. $selectString = "SELECT primary_constraintID FROM type_sets WHERE ";
  287. for($i=0;$i<count($constraints);$i++) {
  288. $selectString = $selectString.($i?"|| ":"")."secondary_constraintID = '".$constraints[$i]."' ";
  289. }
  290. $rawArray = $db->get_results( $selectString, ARRAY_A );
  291. for($i=0;$i<count($rawArray);$i++) {
  292. $constraintObjects = get_constrained_objects( $rawArray[$i]['primary_constraintID'] );
  293. foreach( $constraintObjects as $object ) {
  294. if( !in_array( $object, $returnArray ) ) { array_push( $returnArray, $object ); }
  295. }
  296. }
  297. } else if( $direction == "foreward" || $direction == "either" || !$direction ) {
  298. $selectString = "SELECT secondary_constraintID FROM type_sets WHERE ";
  299. for($i=0;$i<count($constraints);$i++) {
  300. $selectString = $selectString.($i?"|| ":"")."primary_constraintID = '".$constraints[$i]."' ";
  301. }
  302. $rawArray = $db->get_results( $selectString, ARRAY_A );
  303. for($i=0;$i<count($rawArray);$i++) {
  304. $constraintObjects = get_constrained_objects( $rawArray[$i]['secondary_constraintID'] );
  305. foreach( $constraintObjects as $object ) {
  306. if( !in_array( $object, $returnArray ) ) { array_push( $returnArray, $object ); }
  307. }
  308. }
  309. }
  310.  
  311. return $returnArray;
  312. }
  313. /*
  314. function get_type_sets( $relationshipType = NULL, &$constraintIDs, $position = NULL ) {
  315. //returns a multi-dimensional array containing all the defined type sets and their constituent values and the direction of the type set
  316. global $db;
  317. $returnArray = array();
  318.  
  319. //NOTE: this is rather cumbersome, and will vastly increase the SQL queries required - it may be faster to just pull all the constraints from the DB and process the objects rather than forcing SQL to do it
  320. //i've left capability to return all type sets of a given relationship type but i'm not writing it for now
  321. foreach( $constraintIDs as $constraintID ) {
  322. $selectString = "SELECT * FROM type_sets WHERE ";
  323. if( !$position ) { $selectString = $selectString."primary_constraintID = '".$constraintID->id."' || secondary_constraintID = '".$constraintID->id."'"; }
  324. else { $selectString = $selectString.($position=="primary" ? "primary_constraintID = '" : "secondary_constraintID = '").$constraintID->id."'"; }
  325.  
  326. if( $tempArray = $db->get_results( $selectString, ARRAY_A ) ) {
  327. foreach( $tempArray as $typeSet ) {
  328. //NOTE: small modification here - added get object so that the array returned is a set of references to the type sets found
  329. if( !in_array( $tempArray[$i], $returnArray ) ) { array_push( $returnArray, get_object( $typeSet['id'] ) ); }
  330. }
  331. }
  332. }
  333.  
  334. //NOTE: this returns an array of references...
  335. return $returnArray;
  336. }
  337.  
  338. function get_constraints() {
  339. //returns a multi-dimensional array containint all the defined constraints
  340. global $db;
  341. $selectString = "SELECT * FROM constraints";
  342. $returnArray = $db->get_results( $selectString, ARRAY_A );
  343. return $returnArray;
  344. }
  345.  
  346. function get_constraint( $constraintID ) {
  347. //returns a multi-dimensional array containint all the defined constraints
  348. global $db;
  349. $selectString = "SELECT * FROM constraints WHERE id = '".$constraintID."'";
  350. $returnArray = $db->get_results( $selectString, ARRAY_A );
  351. $returnArray = $returnArray[0];
  352. $returnArray['object_constraints'] = unserialize($returnArray['object_constraints']);
  353. $returnArray['relationship_constraints'] = unserialize($returnArray['relationship_constraints']);
  354.  
  355. return $returnArray;
  356. }
  357.  
  358. function get_constraint_ID( $name ) {
  359. //returns the ID of the given constraint
  360. global $db;
  361. $db->hide_errors();
  362. $relationshipTypeID = $db->get_var("SELECT id FROM constraints WHERE name = '".$name."'");
  363. if( $relationshipTypeID ) {
  364. $db->show_errors();
  365. return $relationshipTypeID;
  366. } else if( $db->get_var( "SELECT * FROM constraints WHERE id = '".$name."'") ) {
  367. $db->show_errors();
  368. return $name;
  369. } else {
  370. $db->show_errors();
  371. return false;
  372. }
  373. }
  374.  
  375. function new_relationship( $typeID, $primaryID, $secondaryID ) {
  376. //inserts a new relationship and sets its values to be as given
  377. global $db;
  378. if( $typeID && $primaryID && $secondaryID ) {
  379. $relationshipID = $db->get_var( "SELECT value FROM system_settings WHERE name = 'relationships_counter'" );
  380. $db->query( "INSERT INTO relationships ( id ) VALUES ( '".$relationshipID."' )" );
  381. $db->query( "UPDATE system_settings SET value = '".($relationshipID + 1)."' WHERE name = 'relationships_counter'" );
  382.  
  383. set_relationship( $relationshipID, $typeID, $primaryID, $secondaryID, $bi_directional );
  384. return $relationshipID;
  385. }
  386.  
  387. }
  388.  
  389. function set_object_values( $objectID, $values ) {
  390. }
  391.  
  392. function set_relationship( $relationshipID, $typeID, $primaryID, $secondaryID ) {
  393. //sets the values of the given relationship to the given values
  394. global $db;
  395. if( $typeID || $primaryID || $secondaryID || $bi_directional ) {
  396. $variableCount = 0;
  397. $updateString = "UPDATE relationships SET ";
  398. if( $typeID ) { $updateString = $updateString.($variableCount?", ":"")."typeID = '".$typeID."'"; $variableCount++; }
  399. if( $primaryID ) { $updateString = $updateString.($variableCount?", ":"")."primaryID = '".$primaryID."'"; $variableCount++; }
  400. if( $secondaryID ) { $updateString = $updateString.($variableCount?", ":"")."secondaryID = '".$secondaryID."'"; $variableCount++; }
  401. $updateString = $updateString." WHERE id = '".$relationshipID."'";
  402. $db->query( $updateString );
  403. }
  404.  
  405. }
  406.  
  407. function set_object_type( $objectID, $name, $description ) {
  408. }
  409. */
  410. function set_type_set_withNames( $relationshipTypeID = NULL, $primaryID = NULL, $secondaryID = NULL, $bi_directional = false ) {
  411. //this function adds a type set
  412. if( $relationshipTypeID && $primaryID && $secondaryID ) {
  413. global $db;
  414. //$relationshipTypeID = get_relationship_type_ID( $relationshipType );
  415. //$primaryID = get_constraint_ID( $primary );
  416. //$secondaryID = get_constraint_ID( $secondary );
  417. $typeSetID = get_type_set_ID( $relationshipTypeID, $primaryID, $secondaryID, $bi_directional );
  418. if( !$relationshipTypeID || !$primaryID || !$secondaryID ) { return false; }
  419. if( !$typeSetID ) {
  420. $typeSetID = $db->get_var( "SELECT value FROM system_settings WHERE name = 'objects_counter'" );
  421. $db->query( "
  422. INSERT INTO type_sets
  423. VALUES ( '".$typeSetID."', '".$relationshipTypeID."', '".$primaryID."', '".$secondaryID."', '".$bi_directional."' )
  424. " );
  425. $db->query( "UPDATE system_settings SET value = '".($typeSetID + 1)."' WHERE name = 'objects_counter'" );
  426. return $typeSetID;
  427. } else {
  428. return $typeSetID;
  429. }
  430. }
  431. }
  432.  
  433. function set_constraint_withNames( $name, $description, $objectConstraints, $relationshipConstraints ) {
  434. //this function defines a new constraint
  435. //NOTE: this function could use validation of the constraint string/array
  436. global $db;
  437. if( !isset($GLOBALS['core'] ) ) { $GLOBALS['core'] =& new core; }
  438. $constraint =& new constraint;
  439. $constraint->verify_set( array( 'name'=>$name, 'description'=>$description, 'object_constraints'=>$objectConstraints, 'relationship_constraints'=>$relationshipConstraints ) );
  440. return $constraint->get_attribute( 'id' );
  441. }
  442. /*
  443. function delete_object( $objectID ) {
  444. //NOTE: this doesn't need to be here...
  445. }
  446.  
  447. function delete_relationship( $relationshipID ) {
  448. //NOTE: this doesn't need to be here...
  449. }
  450.  
  451. function delete_object_type( $objectTypeID ) {
  452. }
  453.  
  454. function delete_relationship_type( $relationshipTypeID ) {
  455. //deletes a relationship type
  456. global $db;
  457. return $db->query( "DELETE FROM object_types WHERE id = '".$relationshipTypeID."'" );
  458. }
  459. */
  460. function report_error( $errorMessage ) {
  461. //this function adds an error to the system error log
  462. global $db;
  463. $time = time();
  464. $userIP = $_SERVER['REMOTE_ADDR'];
  465. $errorLog = $db->get_var( "SELECT value FROM system_settings WHERE name = 'error_log'" );
  466. if( $errorLog ) {
  467. $errorLog = unserialize( $errorLog );
  468. } else {
  469. $errorLog = array();
  470. }
  471. array_push( $errorLog, array( 'timestamp'=>$time, 'ip'=>$userIP, 'message'=>$errorMessage.(isset($_SESSION['user'])?' user with error: '.$_SESSION['user']:'') ) );
  472. $errorLog = serialize( $errorLog );
  473. $db->get_var( "UPDATE system_variables SET value = '".$errorLog."' WHERE name = 'error_log'" );
  474. }
  475.  
  476. function get_directory_tree( $path ) {
  477. //returns an array describing the directory structure below the given path of the given depth
  478. $rawContents = scandir( $path );
  479. $folders = array();
  480. $files = array();
  481. foreach( $rawContents as $item ) {
  482. $pathParts = pathinfo( $item );
  483. if( $item != "." && $item != ".." && $pathParts['extension'] != "db" && substr( $item, 0, 1 ) != "_" ) {
  484. if( is_dir( $path.'/'.$item ) ) {
  485. array_push( $folders, $path.'/'.$item );
  486. } else {
  487. array_push( $files, $path.'/'.$item );
  488. }
  489. }
  490. }
  491. return array( 'folders' => $folders, 'files' => $files );
  492. }
  493.  
  494. if( !function_exists( 'scandir' ) ) {
  495. function scandir( $dir ) {
  496. $dh = opendir($dir);
  497. while (false !== ($filename = readdir($dh))) {
  498. $files[] = $filename;
  499. }
  500. sort($files);
  501. return $files;
  502. }
  503. }
  504. /*
  505. function objects_retrieved( $type ) {
  506. //if the objects variable has been set and an object of the given type exists return true
  507. //NOTE: this isn't a very good method for doing this - it should compare the number of defined objects to the number of objects in the database
  508. //NOTE: another option would be to set a variable when the objects were retrieved that could be checked later.
  509. if( isset( $GLOBALS['objects'] ) ) {
  510. foreach( $GLOBALS['objects'] as $object ) {
  511. if( $object['type'] == $type ) { return true; }
  512. }
  513. } else { return false; }
  514. }
  515.  
  516. function retrieve_objects( $type ) {
  517. //determine the table name of the given object type
  518. $refTypes = get_object_types();
  519. foreach( $refTypes as $refType ) {
  520. if( $refType['name'] == $type ) { $table = $refType['table_name']; break; }
  521. }
  522. //if the table name is found get all the records in that table
  523. //NOTE: there is no ORDERBY statement - perhaps this could be saved as part of the object type definition
  524. if( $table ) {
  525. global $db;
  526. $return_array = $db->get_results( "SELECT * FROM ".$table, ARRAY_A );
  527. }
  528. //if results were returned, add them to the global object array
  529. if( count( $return_array ) ) {
  530. foreach( $return_array as $object ) {
  531. $GLOBALS['objects'][$object['id']]['type'] = $type;
  532. $GLOBALS['objects'][$object['id']]['table_name'] = $table;
  533. $GLOBALS['objects'][$object['id']]['attributes'] = $object;
  534. }
  535. }
  536. if( !isset( $GLOBALS['objects'] ) ) { $GLOBALS['objects'] = array(); }
  537.  
  538. }*/
  539. ?>

Documentation generated on Tue, 24 May 2005 03:58:16 -0400 by phpDocumentor 1.3.0RC3