username = $username; $this->folderid = $folderid; $this->expand = $expand; $this->folders = array (); $this->tree = array (); $this->get_children = array (); $this->level = 0; $this->foreign_username = false; if ($user) { $this->get_shared_data ($user); } else { $this->get_user_data (); } if ($settings['simple_tree_mode']) { $this->expand = $this->get_path_to_root ($this->folderid); } # searching for invalid folderid in GET variable if ( ! array_key_exists ($this->folderid, $this->folders)) { $this->folderid = 0; } # searching for invalid expand entries foreach ($this->expand as $key => $value) { if (! array_key_exists ($value, $this->folders)) { unset ($this->expand[$key]); } } } function get_user_data () { global $mysql; $query = sprintf ("SELECT id, childof, name, public FROM folder WHERE user='%s' AND deleted!='1' ORDER BY name", $mysql->escape ($_SESSION['username'])); if ($mysql->query ($query)) { while ($row = mysql_fetch_assoc ($mysql->result)) { $this->folders[$row['id']] = $row; if (!isset ($this->children[$row['childof']])) { $this->children[$row['childof']] = array (); } array_push ($this->children[$row['childof']], $row['id']); } } else { message ($mysql->error); } } function get_shared_data ($user) { global $mysql, $username; # does the user exist in the database? if (check_username ($user)) { $this->foreign_username = $user; } else { $this->foreign_username = $username; } # get all shared folders for the given user $query = "SELECT id, childof, name, public FROM folder WHERE public='1' AND deleted!='1' AND user='$this->foreign_username' ORDER BY name"; if ($mysql->query ($query)) { # make two arrays: # 1) $children containing arrays with children. the keys of these arrays are the id's of the parents # 2) $folders containing arrays with folder settings (id, childof, name, public) $shared_children = array (); while ($row = mysql_fetch_assoc ($mysql->result)) { $this->folders[$row['id']] = $row; if (!isset ($this->children[$row['childof']])) { $this->children[$row['childof']] = array (); } array_push ($this->children[$row['childof']], $row['id']); array_push ($shared_children, $row['id']); } $this->children[0] = array (); # the childof fields of each folder with no parent is being set to 0, so it becomes a child of the root folder foreach ($this->folders as $value) { if (in_array ($value['childof'], $shared_children)) { continue; } else { array_push ($this->children[0], $value['id']); $this->folders[$value['id']]['childof'] = 0; } } } else { message ($mysql->error); } } # assembles the tree function make_tree ($id) { if (isset ($this->children)){ $this->level++; if (isset ($this->children[$id])) { foreach ($this->children[$id] as $value) { array_push ($this->tree, array ( 'level' => $this->level, 'id' => $value, 'name' => $this->folders[$value]['name'], 'public' => $this->folders[$value]['public'], )); # check for children $symbol = &$this->tree[count ($this->tree) - 1]['symbol']; if (isset ($this->children[$value])) { if (in_array ($value, $this->expand)) { $symbol = 'minus'; $this->make_tree ($value); } else { $symbol = 'plus'; } } else { $symbol = ''; } } } $this->level--; } } # draws the tree function print_tree () { global $settings, $folder_opened, $folder_closed, $folder_opened_public, $folder_closed_public, $plus, $minus, $neutral; # depending on whom's bookmarks are being displayed, we set some variables differently if ($this->foreign_username) { $root_folder_name = $this->foreign_username . "'s Bookmarks"; $user_var = "&user=$this->foreign_username"; } else { $root_folder_name = $settings['root_folder_name']; $user_var = ""; } $root_folder = array ( 'level' => 0, 'id' => 0, 'name' => $root_folder_name, 'symbol' => null, 'public' => 0, ); array_unshift ($this->tree, $root_folder); # The top folder shows up too much on the top. Draw # a little space there. echo '
' . "\n"; foreach ($this->tree as $key => $value) { # this is the begining of the line that shows a folder # with the symbol (plus, minus or neutral) $spacer = '
'; echo $spacer; if ($value['id'] == $this->folderid) { $folder_name = '' . $value['name'] . ''; if (!$this->foreign_username && $value['public']) { $folder_image = $folder_opened_public; } else { $folder_image = $folder_opened; } } else { $folder_name = $value['name']; if (!$this->foreign_username && $value['public']) { $folder_image = $folder_closed_public; } else { $folder_image = $folder_closed; } } if ($key > 5) { $ankor = "#" . $this->tree[$key - 5]['id']; } else { $ankor = ""; } if ($value['symbol'] == "plus" || $value['symbol'] == "minus") { if ($value['symbol'] == "plus") { $symbol = $plus; $expand_s = $this->add_to_expand_list ($value['id']); if ($settings['fast_folder_plus']) { $expand_f = $expand_s; } else { $expand_f = $this->expand; } } else if ($value['symbol'] == "minus") { $symbol = $minus; $expand_s = $this->remove_from_expand_list ($value['id']); if ($settings['fast_folder_minus'] && $value['id'] == $this->folderid) { $expand_f = $expand_s; } else { $expand_f = $this->expand; } } if ($settings['fast_symbol']) { $folderid = $value['id']; } else { $folderid = $this->folderid; } # this prints the symbol (plus or minus) with its appropriate link echo '' . $symbol . ''; } else { $symbol = $neutral; $expand_f = $this->expand; echo $symbol; } # this prints the folder name with its appropriate link echo '' . $folder_image . " " . $folder_name . ''; # and this is the end of the line echo "
\n"; } } ### ### removes a value from the expand list ### function remove_from_expand_list ($id){ $expand = $this->expand; foreach ($expand as $key => $value) { if ($value == $id) { unset ($expand[$key]); } } return $expand; } ### ### adds a value to the expand list ### function add_to_expand_list ($id){ $expand = $this->expand; array_push ($expand, $id); return $expand; } ### ### returns an array containing all folder id's from ### a given folder up to the root folder ### function get_path_to_root ($id) { $path = array (); while ($id > 0) { array_push ($path, $id); if (!isset ($this->folders[$id])) { #echo "Folder Nr. $id does not have a parent"; return array (); } else { $id = $this->folders[$id]['childof']; } } return $path; } ### ### prints a path ### function print_path ($id) { global $settings, $delimiter; $parents = $this->get_path_to_root ($id); $parents = array_reverse ($parents); # the following if condition has been disabled. could be enabled to # allow the "show_root_folder" function. $path = $delimiter . $settings['root_folder_name']; foreach ($parents as $value) { $path .= $delimiter . $this->folders[$value]['name']; } return $path; } ### ### returns an array containing all folder id's that ### are children from a given folder ### function get_children ($id) { if (isset ($this->children[$id])) { foreach ($this->children[$id] as $value) { array_push ($this->get_children, $value); $this->get_children ($value); } } } } ?>