<?php
/*
Plugin Name: wp-xbel v2
Plugin URI: http://blog.stefan-macke.de/2006/07/18/firefox-bookmarks-mit-wordpress-anzeigen/
Description: Display XBEL XML Bookmarks files.
Author: Stefan Macke (original version by crea-doo)
Version: 2.0
Author URI: http://blog.stefan-macke.de
*/

/*
Please notice that I have only added some minor features. The 
original version of the plugin can be downloaded here:
http://development.crea-doo.at/wordpress/plugins/wp-xbel/
Thanks to crea-doo for developing this great plugin!
Stefan

New features in v2.0:
  * valid and indented XHTML
  * possibility to exclude folders from being shown    
*/

//---------------------------\\
// configuration
//---------------------------\\

// Filepath Options
$rootpath get_bloginfo('siteurl') . '/wp-content/plugins/wp-xbel/';

$xbel_options['path_to_xml']         = $rootpath 'xbel.xml';
$xbel_options['path_to_css']         = $rootpath 'wp-xbel.css';
$xbel_options['path_to_script']     = $rootpath 'wp-xbel.js';

// Folder Display Options
$xbel_options['folder_display']     = 'collapsable';            // option values: 'collapsable' or 'flat'
$xbel_options['folder_collapse']      = 'each';                    // option values: 'each' or 'root'
$xbel_options['folder_open']         = $rootpath 'img/folder_open.gif';
$xbel_options['folder_closed']         = $rootpath 'img/folder_closed.gif';

// Fave Icon Options
$xbel_options['display_icon']         = TRUE;
$xbel_options['display_default']     = TRUE;
$xbel_options['default_icon']         = $rootpath 'img/bookmark.gif';

// Description Options
$xbel_options['display_desc']         = 'none';                    // none, folder, bookmark, all
$xbel_options['desc_as_title']         = TRUE;

// Link Options
$xbel_options['link_nofollow']         = TRUE;
$xbel_options['submit_icon']         = FALSE;                    // Give WP User submitted links a WP favicon
$xbel_options['submit_owner']         = 'WP User';                // Define owner of submitted links
$xbel_options['submit_desc']         = 'Submitted by Test';        // Define description of submitted links

// Root Folder List Options
$xbel_options['list_start']         = '<div class="xbel_folder_title_down">';
$xbel_options['list_tween']         = '</div><div class="xbel_folder_title_down">';
$xbel_options['list_end']           = '</div>';

// this is a list of folders, you don't want to be shown on the website
$xbel_options['exclude_folders']    = array("Toolbar");

/*
    DO NOT EDIT BELOW UNLESS YOU KNOW WHAT YOU'RE DOING!
    IF YOU KNOW WHAT YOU'RE DOING: HAVE FUN
*/

extract($xbel_options);

if(IsSet(
$_POST['xbel_form']) && $_POST['xbel_form']) {
      if(IsSet(
$_POST['xbel_url'])) {
        if(
substr($_POST['xbel_url'], 07) != 'http://') {
            
$xbel_url 'http://' $_POST['xbel_url'];
        } else {
            
$xbel_url $_POST['xbel_url'];
        }
        
        if(!IsSet(
$_POST['xbel_title'])) {
            
$xbel_title $xbel_url;
        } else {
            
$xbel_title $_POST['xbel_title'];
        }
        
        
$xml str_replace('</xbel>'''file_get_contents($path_to_xml));
        
        
$fp fopen($path_to_xml"w");
        
$xml .= '<bookmark href="' str_replace('&''&amp;'$xbel_url) . '">';
        
$xml .= '<title>' $xbel_title '</title>';
        
$xml .= '<info><metadata owner="' $submit_owner '"';
        if(
$submit_icon$xml .= ' Icon="data:image/x-icon;base64,AAABAAEAEBAAAAAAAABoBQAAFgAAACgAAAAQAAAAIAAAAAEACAAAAAAAQAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAAAAQAAAAAAAAAAAQABAAEAAAEAAAAAAAAAAAEAAQABAAABAQEAAAAAAAABAAEAAQAAAQAAAQAAAAAAAQAAAAEAAAEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA="';
        
$xml .= '/></info>';
        
$xml .= '<desc>' $submit_desc '</desc>';
        
$xml .= '</bookmark>';
        
$xml .= '</xbel>';
        
fwrite ($fp,$xml);
        
fclose($fp);
      }
}

function 
wp_xbel() {
    global 
$xbel_options;
    
extract($xbel_options);
    
    if(
$folder_display != 'collapsable' && $folder_display != 'flat'$folder_display 'collapsable';
    if(
$folder_collapse != 'each' && $folder_collapse != 'root'$folder_collapse 'each';
    
      if(
$folder_display == 'collapsable') {
    
?>
    
    <?php
      
}
    
      
$xml file_get_contents($path_to_xml);
      
      
//echo $xml;
      
    
$values '';
    
$index '';
    
$parser xml_parser_create();
    
xml_parser_set_option($parserXML_OPTION_CASE_FOLDING0);
    
xml_parse_into_struct($parser,$xml,$values,$index);
    
xml_parser_free($parser);
    
    
$exclusion false;
    
$exclusion_level 0;
    
      
#print_r($values);
    
for($x 0$x sizeof($values); $x++) {
        switch(
$values[$x]['tag']) {
        case 
'xbel':
            switch(
$values[$x]['type']) {
            case 
'open':
                echo 
'<div class="xbel_xbel">' "\n";
                
                
// Process rest of xbel information
                
$x++;
                while(
$values[$x]['tag'] != 'bookmark' && $values[$x]['tag'] != 'folder' && $values[$x]['tag'] != 'xbel') {
                    if(
$values[$x]['tag'] == 'title') {
                        
$xbel_title $values[$x]['value'];
                    }
                    
$x++;
                }
                
$x--;
                
                
// Format and print xbel information
                #echo '<h1 class="xbel_xbel_title">'.$xbel_title.'</h1>';
                
                // clear out variables
                
if(IsSet($xbel_title)) unset($xbel_title);
                
                break;
            case 
'close':
                echo 
'</div>' "\n";
                break;
            }
            break;
                
        case 
'folder':
            switch(
$values[$x]['type']) {
            case 
'open':
                
$fldr_id str_replace('rdf%3A#$''a'$values[$x]['attributes']['id']);
                
                
// Process rest of folder information
                
$x++;
                while(
$values[$x]['tag'] != 'bookmark' && $values[$x]['tag'] != 'folder') {
                      if(
$values[$x]['tag'] == 'title') {
                            
$fldr_title $values[$x]['value'];
                            
$fldr_level $values[$x]['level'] - 1;
                      } else if(
$values[$x]['tag'] == 'desc') {
                            
$fldr_desc $values[$x]['value'];
                      }
                      
$x++;
                }
                
$x--;

                
// exclude folders
                
if (in_array($fldr_title$xbel_options['exclude_folders']))
                {
                    
$exclusion true;
                    
$exclusion_level $fldr_level;
                }

                if (!
$exclusion)
                {
                    echo 
"\t" '<div class="xbel_folder">' "\n"

                    
// Format and print folder information
                       
if ($folder_display == 'collapsable' && ($folder_collapse == 'each' || ($folder_collapse == 'root' && $values[$x]['level'] == 3))) {
                            echo 
"\t\t" '<div class="xbel_folder_title_closed" id="' $fldr_id '_title"><a href="JavaScript:toggleFolderView(' "'" $fldr_id "'" ')">' $fldr_title '</a></div>' "\n";
                           echo 
"\t\t" '<div class="xbel_folder_contents" id="' $fldr_id '" style="DISPLAY: none">' "\n";
                    } else {
                              echo 
"\t\t" '<div class="xbel_folder_title_open">' $fldr_title '</div>' "\n";
                              echo 
"\t\t" '<div class="xbel_folder_contents">' "\n";
                       }
                       if((
$display_desc == 'folder' || $display_desc == 'all') && strlen($fldr_desc) > 0) echo "\t" '<div class="xbel_folder_desc">' $fldr_desc '</div>' "\n";
                }
                
// clear out variables
                
if(IsSet($fldr_id)) unset($fldr_id);
                if(IsSet(
$fldr_title)) unset($fldr_title);
                if(IsSet(
$fldr_desc)) unset($fldr_desc);
                
                break;
            case 
'close':
                if (!
$exclusion)
                {
                    echo 
"\t\t</div>\n\t</div>\n";
                }
                
// reset exclusion
                
if ($values[$x]['level'] == $exclusion_level)
                {
                    
$exclusion false;
                }
                break;
            }
            break;
                
        case 
'bookmark':
            switch(
$values[$x]['type']) {
            case 
'open':
                
$last_obj $values[$x]['tag'];
                
$bkmk_url $values[$x]['attributes']['href'];
                
                
// Process rest of bookmark information
                
$x++;
                while(
$values[$x]['tag'] != 'bookmark') {
                      if(
$values[$x]['tag'] == 'title') {
                            
$bkmk_title $values[$x]['value'];
                      } else if(
$values[$x]['tag'] == 'desc') {
                            
$bkmk_desc $values[$x]['value'];
                      } else if(
$values[$x]['tag'] == 'metadata' && IsSet($values[$x]['attributes']['Icon'])) {
                            
$bkmk_icon $values[$x]['attributes']['Icon'];
                      }
                      
$x++;
                }
                
                if (!
$exclusion)
                {
                    
// Format and print bookmark information
                    
echo "\t\t\t" '<div class="xbel_bookmark_title">' "\n";
                    if(
strstr($_SERVER['HTTP_USER_AGENT'], 'MSIE')) {
                        if(
$display_default) echo "\t\t\t\t" '<img alt="Default Icon" src="' $default_icon '" width="16" height="16" align="middle" />' "\n";
                    } else {
                        if(IsSet(
$bkmk_icon) && $display_icon) echo "\t\t\t\t" '<img alt="Bookmark Icon" src="' $bkmk_icon.'" width="16" height="16" align="middle" />' "\n";
                        if((!IsSet(
$bkmk_icon) && $display_default) || (!$display_icon && $display_default)) echo "\t\t\t\t" '<img alt="Default Icon" src="' $default_icon '" width="16" height="16" align="middle" />' "\n";
                    }
                    echo 
"\t\t\t\t" '<a href="' htmlspecialchars($bkmk_url) . '"';
                    if(
$link_nofollow) echo ' rel="nofollow"';
                    if(
$desc_as_title) echo ' title="' preg_replace("/ {2,}|\t|\n|\r/"' 'htmlentities($bkmk_desc)) . '"';
                    echo 
'>' htmlspecialchars($bkmk_title) . "</a>\n\t\t\t</div>" "\n";
                    if(
$display_desc == 'bookmark' || $display_desc == 'all') echo "\t\t\t" '<div class="xbel_bookmark_desc">' $bkmk_desc '</div>' "\n";
                }
                            
                
// clear out variables
                
if(IsSet($bkmk_title)) unset($bkmk_title);
                if(IsSet(
$bkmk_url)) unset($bkmk_url);
                if(IsSet(
$bkmk_desc)) unset($bkmk_desc);
                if(IsSet(
$bkmk_icon)) unset($bkmk_icon);
                
                break;
            }
            break;
                
        case 
'separator':
            if (!
$exclusion)
            {
                echo 
"\t" '<div class="xbel_separator"></div>' "\n";
            }
            break;
        }
    }
}

function 
wp_xbel_root_list() {
    global 
$xbel_options;
    
extract($xbel_options);
    
    
$xml file_get_contents($path_to_xml);
    
    
$values '';
    
$index '';
    
$list = array();
    
$started FALSE;
    
    
$parser xml_parser_create();
    
xml_parser_set_option($parserXML_OPTION_CASE_FOLDING0);
    
xml_parse_into_struct($parser$xml$values$index);
    
xml_parser_free($parser);
    
    for(
$x 0$x sizeof($values); $x++) {
        if(
$values[$x]['tag'] == 'folder' &&
               
$values[$x]['type'] == 'open' &&
               
$values[$x]['level'] == 2) {
            
              if(
$started) {
                echo 
$list_tween;
              } else {
                echo 
$list_start;
                
$started TRUE;
              }
            
              echo 
'<a href="#' str_replace('rdf%3A#$'''$values[$x]['attributes']['id']) . '">' $values[$x+1]['value'] . '</a>';
        }
    }
    if(
$started) {
        echo 
$list_end;
    }
}

function 
wp_xbel_form() {
?>
    <form method="POST">
        <input type="hidden" name="xbel_form" value="TRUE" />
        <table border="0" style="margin-top: 20px">
            <tr>
                <td colspan="2"><span style="font-size: larger; font-weight: bold">Submit Link</span></td>
            </tr>
            <tr>
                <td valign="center"><span style="font-weight: bold">Title:</span></td>
                <td><input type="text" name="xbel_title" /></td>
            </tr>
            <tr>
                <td valign="center"><span style="font-weight: bold">Link:</span></td>
                <td><input type="text" name="xbel_url" /></td>
            </tr>
            <tr>
                <td colspan="2"><input type="submit" value="Submit Link" />
            </tr>
        </table>
    </form>
<?php
}

function 
wp_xbel_add_header($post_ID) {
    global 
$xbel_options;
    
extract($xbel_options);
?>
    <link rel="stylesheet" href="<?= $path_to_css ?>" type="text/css" />
    <script type='text/javascript' language='javascript'>
    function toggleFolderView (szDivID) {
        var obj = document.layers ? document.layers[szDivID] : document.getElementById ?  document.getElementById(szDivID).style : document.all[szDivID].style; 
        obj.display = (obj.display == 'none' ? 'block' : 'none'); 
        var obj_title = document.layers ? document.layers[szDivID+'_title'] : document.getElementById ?  document.getElementById(szDivID+'_title').style : document.all[szDivID+'_title'].style;
        obj_title.backgroundImage = (obj_title.backgroundImage == "url(<?= $xbel_options['folder_open'?>)" ? "url(<?= $xbel_options['folder_closed'?>)" : "url(<?= $xbel_options['folder_open'?>)");
    }
    </script>    
<?php
    
return $post_ID;
}

add_action('wp_head''wp_xbel_add_header');
?>