<?php
/**
 *  BookmarkMe Action component
 *
 *  $Id: action.php 111 2008-12-25 19:33:15Z wingedfox $
 *  $HeadURL: https://svn.debugger.ru/repos/common/DokuWiki/BookmarkMe/tags/BookmarkMe.v0.8/action.php $
 *
 *  @lastmodified $Date: 2008-12-25 22:33:15 +0300 (Чтв, 25 Дек 2008) $
 *  @license      LGPL 2 (http://www.gnu.org/licenses/lgpl.html)
 *  @author       Ilya Lebedev <ilya@lebedev.net>
 *  @version      $Rev: 111 $
 *  @copyright    (c) 2005-2007, Ilya Lebedev
 */

if(!defined('DOKU_INC')) die();

if(!function_exists('array_combine')) {
    /**
     *  array_combine emulation
     *
     *  @author Ivo van Sandick
     *  @date 02-Sep-2005 12:04
     *  @see http://php.net/manual/ru/function.array-combine.php#56424
     *  @param array $keys array with keys
     *  @param array $vals array with values
     *  @return array resulting array with ($keys => $vals) pairs
     */
    function array_combine( $keys, $vals ) {
        $keys = array_values( (array) $keys );
        $vals = array_values( (array) $vals );
        $n = max( count( $keys ), count( $vals ) );
        $r = array();
        for( $i=0; $i<$n; $i++ ) {
           $r[ $keys[ $i ] ] = $vals[ $i ];
        }
        return $r;
    }
}

if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'action.php');

class action_plugin_bookmarkme extends DokuWiki_Action_Plugin {

    var $bookmarks = array(
        'del.icio.us' => 'http://del.icio.us/post?title=%title%&amp;url=%permalink%'
       ,'Digg' => 'http://digg.com/submit?phase=2&amp;title=%title%&amp;url=%permalink%'
       ,'Furl' => 'http://www.furl.net/storeIt.jsp?t=%title%&amp;u=%permalink%'
       ,'Reddit' => 'http://reddit.com/submit?title=%title%&amp;url=%permalink%'
       ,'Ask' => 'http://myjeeves.ask.com/mysearch/BookmarkIt?v=1.2&amp;t=webpages&amp;title=%title%&amp;url=%permalink%'
       ,'BlinkList' => 'http://www.blinklist.com/index.php?Action=Blink/addblink.php&amp;Title=%title%&amp;Description=&amp;Url=%permalink%'
       ,'blogmarks' => 'http://blogmarks.net/my/new.php?mini=1&amp;simple=1&amp;title=%title%&amp;url=%permalink%'
       ,'Google' => 'http://www.google.com/bookmarks/mark?op=add&amp;title=%title%&amp;bkmk=%permalink%'
       ,'Ma.gnolia' => 'http://ma.gnolia.com/beta/bookmarklet/add?title=%title%&amp;description=%title%&amp;url=%permalink%'
       ,'Netscape' => 'http://www.netscape.com/submit/?T=%title%&amp;U=%permalink%'
       ,'ppnow' => 'http://www.ppnow.com/submit.php?url=%permalink%'
       ,'Rojo' => 'http://www.rojo.com/submit/?title=%title%&amp;url=%permalink%'
       ,'Shadows' => 'http://www.shadows.com/features/tcr.htm?title=%title%&amp;url=%permalink%'
       ,'Simpy' => 'http://www.simpy.com/simpy/LinkAdd.do?title=%title%&amp;href=%permalink%'
       ,'Socializer' => 'http://ekstreme.com/socializer/?title=%title%&amp;url=%permalink%'
       ,'Spurl' => 'http://www.spurl.net/spurl.php?title=%title%&amp;url=%permalink%'
       ,'StumbleUpon' => 'http://www.stumbleupon.com/submit?title=%title%&amp;url=%permalink%'
       ,'Tailrank' => 'http://tailrank.com/share/?link_href=%permalink%&amp;title=%title%'
       ,'Technorati' => 'http://www.technorati.com/faves?add=%permalink%'
       ,'Live Bookmarks' => 'https://favorites.live.com/quickadd.aspx?marklet=1&amp;mkt=en-us&amp;title=%title%&amp;url=%permalink%&amp;top=1'
       ,'Wists' => 'http://wists.com/r.php?c=&amp;title=%title%&amp;r=%permalink%'
       ,'Yahoo! Myweb' => 'http://myweb2.search.yahoo.com/myresults/bookmarklet?title=%title%&amp;popup=true&amp;u=%permalink%'
       ,'BobrDobr' => 'http://bobrdobr.ru/addext.html?url=%permalink%&amp;title=%title%'
       ,'Memori' => 'http://memori.ru/link/?sm=1&amp;u_data[url]=%permalink%&amp;u_data[name]=%title%'
       ,'Faves' => 'http://faves.com/Authoring.aspx?u=%title%&amp;t=%title%'
       ,'Favorites' => "javascript: (function (url,title) {var e; try {if (document.all&&!window.opera) window.external.AddFavorite(url, title); else if (window.opera) {var el=document.createElement(&quot;a&quot;); el.rel=&quot;sidebar&quot;;el.href=url;el.title=title;el.click();} else window.sidebar.addPanel(title, url,&quot;&quot;);}catch(e){}})(&quot;%permalink%&quot;,&quot;%title%&quot;);"
       ,'Facebook' => 'http://www.facebook.com/sharer.php?u=%permalink%&amp;t=%title%'
       ,'Newsvine' => 'http://www.newsvine.com/_tools/seed&amp;save?u=%permalink%&amp;h=%title%'
       ,'Yahoo! Bookmarks' => 'http://bookmarks.yahoo.com/toolbar/savebm?opener=tb&amp;u=%permalink%&t=%title%'
       ,'Twitter' => 'http://twitter.com/home?status=%title%:%permalink%'
       ,'myAOL' => 'http://favorites.my.aol.com/ffclient/AddBookmark?url=%permalink%&amp;title=%title%&amp;favelet=true'
       ,'Slashdot' => 'http://slashdot.org/bookmark.pl?url=%permalink%'
       ,'Fark' => 'http://cgi.fark.com/cgi/fark/submit.pl?new_url=%permalink%&amp;new_comment=%title%'
       ,'RawSugar' => 'http://www.rawsugar.com/tagger/?turl=%permalink%&amp;tttl=%title%&amp;editorInitialized=1'
       ,'LinkaGoGo' => 'http://www.linkagogo.com/go/AddNoPopup?url=%permalink%&amp;title=%title%'
       ,'Mister Wong' => 'http://www.mister-wong.de/index.php?action=addurl&amp;bm_url=%permalink%&amp;bm_description=%title%'
       ,'Wink' => 'http://www.wink.com/_/tag?url=%permalink%&amp;doctitle=%title%'
       ,'BackFlip' => 'http://www.backflip.com/add_page_pop.ihtml?url=%permalink%&amp;title=%title%'
       ,'Diigo' => 'http://www.diigo.com/post?url=%permalink%&amp;title=%title%'
       ,'Segnalo' => 'http://segnalo.com/post.html.php?url=%permalink%&amp;title=%title%'
       ,'Netvouz' => 'http://netvouz.com/action/submitBookmark?url=%permalink%&amp;title=%title%&amp;popup=no'
       ,'DropJack' => 'http://www.dropjack.com/submit.php?url=%permalink%'
       ,'Feed Me Links' => 'http://feedmelinks.com/categorize?from=toolbar&amp;op=submit&amp;url=%permalink%&amp;name=%title%'
       ,'funP' => 'http://funp.com/push/submit/add.php?url=%permalink%&amp;s=%title%'
       ,'HEMiDEMi' => 'http://www.hemidemi.com/user_bookmark/new?title=%title%&amp;url=%permalink%'
    );

  /**
   *  Constants for controlling toolbar show
   */
  var $BOOKMARKME_SHOW_OFF    = 0;
  var $BOOKMARKME_SHOW_ON     = 1;  // equals to bottom, pre-0.7 compatible
  var $BOOKMARKME_SHOW_BOTTOM = 1;
  var $BOOKMARKME_SHOW_TOP    = 2;
  var $BOOKMARKME_SHOW_BOTH   = 3;

  /**
   * return some info
   */
  function getInfo(){
      preg_match("#^.*?BookmarkMe/([^\\/]+)#"," $HeadURL: https://svn.debugger.ru/repos/common/DokuWiki/BookmarkMe/tags/BookmarkMe.v0.8/action.php $ ", $v);
      $v = preg_replace("#.*?((trunk|\.v)[\d.]+)#","\\1",$v[1]);
      $b = preg_replace("/\\D/","", " $Rev: 111 $ ");
      return array( 'author' => "Ilya Lebedev"
                   ,'email'  => 'ilya@lebedev.net'
                   ,'date'   => preg_replace("#.*?(\d{4}-\d{2}-\d{2}).*#","\\1",'$Date: 2008-12-25 22:33:15 +0300 (Чтв, 25 Дек 2008) $')
                   ,'name'   => "BookmarkMe {$v}.$b Action component."
                   ,'desc'   => "Insert toolbar with links to social bookmarking services."
                   ,'url'    => 'http://wiki.splitbrain.org/plugin:bookmarkme'
                  );
  }
  /*
   * plugin should use this method to register its handlers with the dokuwiki's event controller
   */
  function register(&$controller) {
      $controller->register_hook('TPL_ACT_RENDER','AFTER',$this,'bookmark',array("show" => $this->BOOKMARKME_SHOW_BOTTOM));
      $controller->register_hook('TPL_ACT_RENDER','BEFORE',$this,'bookmark',array("show" => $this->BOOKMARKME_SHOW_TOP));
  }
  /**
   *  Prints bookmarking icons, if allowed
   *
   *  @author Ilya Lebedev <ilya@lebedev.net>
   */
  function bookmark(&$event, $param) {
    global $ID;
    global $conf;

    if ($event->data != 'show') return; // nothing to do for us


    $show = $this->getConf('show_bookmarks');

    //Check if bookmarking is allowed
    $bm = p_get_metadata($ID,'bookmarkme');

    if (null !== $bm) {
        $bm = 'BOOKMARKME_SHOW_'.strtoupper($bm);
        $bm = (int)$this->$bm;
        if (is_numeric($bm))
            $show = $bm;
    }

    if ( !($show & $this->BOOKMARKME_SHOW_BOTTOM & $param['show'])
      && !($show & $this->BOOKMARKME_SHOW_TOP & $param['show']))
        return;

    /*
    *  assume that page does not exists
    */
    $exists = false;
    $id = $ID;
    resolve_pageid('',$id,$exists);

    /*
    *  find skip pages
    */
    $sp = join("|",explode(",",preg_quote($this->getConf('skip_ids'))));
    
    if (!$exists || preg_match("/$sp/i",$ID)) 
        return;


    if (@file_exists(dirname(__FILE__)."/bookmark.ini")) {
       $bkm = (preg_split("/(\s|[\r\n])+/",@file_get_contents(dirname(__FILE__)."/bookmark.ini")));
       $bkk = $bkv = array();
       while (list($bkk[],$bkv[]) = array_splice($bkm,0,2)){}
       $this->bookmarks = array_merge(array_filter(array_combine($bkk,$bkv)),$this->bookmarks);
    }

    $be = explode(",",$this->getConf('bookmarks'));

    $ip = dirname(__FILE__)."/img/";
    $iu = DOKU_URL."lib/plugins/bookmarkme/img/";
    $title = p_get_first_heading($ID);
    if (!$title) $title = $ID;

    $pml = wl($ID,'',true);

    $html = array('<ul class="bookmarkme">');

    /*
    *  show header only if allowed in config
    */
    if ($this->getConf('show_header')) $html[] = '<li class="head">'.$this->getLang('bookmark').'</li>';

    $book_lng = htmlspecialchars($this->getLang('bookmark_title'));

//    ksort($this->bookmarks);
    foreach ($this->bookmarks as $k=>$v) {
        $i = strtolower( str_replace( array("."," ")
                                     ,array("" ,"_")
                        ,$k)).".gif";
        if (in_array($k,$be) && file_exists($ip.$i)) {
            list($w,$h) = @getimagesize($ip.$i);
            $v = str_replace( array('%title%'        ,'%permalink%')
                             ,array(urlencode($title),urlencode($pml))
                             ,$v);
            $html[] = str_replace( "%title%"
                                  ,str_replace( array("%where%", "%what%")
                                               ,array($k       , htmlspecialchars($title))
                                               ,$book_lng
                                              )
                                  ,"<li><a href=\"$v\" ".(preg_match("#^javascript:#",$v)?"":"target=\"_blank\"")."><img src=\"$iu$i\" width=\"$w\" height=\"$h\" alt=\"%title%\" title=\"%title%\" /></a></li>"
                                 );
        }
//        if ($_GET['debug']) var_dump($html);
    }
    $html[] = '</ul>';
    if (sizeof($html)>2) echo join("\n",$html);
  }
}
