<?php if (!defined('PmWiki')) exit();
/*  Copyright 2006 Ben Wilson

    This file is marklets.php; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published
    by the Free Software Foundation; either version 2 of the License.
*/

SDV($MarkletAddTextToEnd, 0);
SDV($MarkletCategories, array());
SDV($MarkletDateFmt, '[-[%b %e, %Y (%I:%M %p)]-]');
SDV($MarkletDeleteText,'Delete');
SDV($MarkletDuplicateMark, '%red% (duplicate)');
SDV($MarkletEnableReturn, 0);
SDV($MarkletRedirectDelay, 4);
#SDV($MarkletCategorySplitPoint, '.Bookmarks');
#SDV($MarkletCategorySplitPoint, '\.');
SDV($MarkletCategorySplitPoint, '-'); # Default
SDV($MarkletCategoriesFunction, 'MarkletDefaultCategories');
SDV($MarkletMultiple, 0);

Markup('markletdupe', 'inline', '/\(:marklet-dup:\)/', $MarkletDuplicateMark);
Markup('makemark', 'inline', '/\\(:marklet-codelets\\s*(.*?):\\)/e', "Keep(MarkletCreateLinks(\$pagename,'$1'))");
Markup("marklet-delete", "<if", '/\(:marklet-delete-(.*?):\)/e', "MarkletDeleteMarkup('$pagename', '$1');"); 

$HandleActions['makemark'] = 'MarkletHandleAdd';
$HandleActions['makemarklet'] = 'MarkletAdd';
$HandleActions['marklet-delete'] = 'MarkletHandleDelete';

function MarkletDeleteMarkup($pagename, $argv) {
    global $ScriptUrl, $MarkletDeleteText;
    $text = (isset($MarkletDeleteText)) ? $MarkletDeleteText : 'Delete';
    $link =  "<a class='markletdelete' href='$ScriptUrl"
            ."?n=$pagename&action=marklet-delete&mid=$argv"
            ."'>$text</a>"; 
    $html = "(:if auth edit:)[=$link=](:if:)";
    return $html;
}
function MarkletHandleDelete() {
    global $pagename;

    if (isset($_REQUEST['mid'])) {
        $mid = $_REQUEST['mid'];
        $mid = stripmagic($mid);
        $page = RetrieveAuthPage($pagename, 'edit', true);
        if (!$page) Abort('?cannot read $pagename');
        $new = $page;
        $new['text'] = preg_replace("/^(.*?)\(:marklet-delete-$mid:\).*?\n/m", 
                       '', $page['text'], 1);
        PostPage($pagename, $page, $new);
        MarkletRedirect($pagename, "Deleted");
    }
    else {
        Redirect($pagename);
    }
}
function MarkletSplitPagename($page) {
  global $MarkletCategorySplitPoint;
  return split($MarkletCategorySplitPoint, $page);
}

function MarkletAdd($pagename, $argv) {
  global $Now, $PageRedirectFmt, $HandleActions; 
  global $HTMLStylesFmt, $HTMLHeaderFmt;
  global $MarkletRedirectDelay, $MarkletDateFmt, $MarkletAddText;
  global $MarkletRedirectMessage, $MarkletAddTextToEnd;
  global $MarkletCategorySplitPoint, $MarkletCategories;

  $title = stripslashes($_REQUEST['title']);
  $url = $_REQUEST['url'];
  $summary = $_REQUEST['summary'];

  $category = ($_REQUEST['new_category']) 
    ? $_REQUEST['new_category'] : $_REQUEST['category'];

  list($pre, $post) = MarkletSplitPagename($pagename);

  $time = strftime($MarkletDateFmt, $Now);
  $key = md5($url);
  $link = ($title) ? "[[$url|$title]]" : "[[$url]]";
  SDV($MarkletAddText, "* $link $summary $time (:marklet-delete-$key:)\n");
  $MarkletAddText = stripslashes($MarkletAddText);

  if (!$category) $category = $post;

  foreach((array) $category as $cat) {
    $newpage = ($cat) 
      ? join($MarkletCategorySplitPoint, array($pre, $cat)) 
      : $pagename;
    $page = RetrieveAuthPage($newpage, 'edit');
    if (!$page) Abort("?cannot edit $pagename");
    $text = $page['text'];
    if (preg_match("/$key/", $text)) {
        $MarkletAddText = preg_replace("/(\* )/", "$1(:marklet-dup:)", $MarkletAddText);
    }
    if (@$_REQUEST['url']) {
      $text = (IsEnabled($MarkletAddTextToEnd,0))
          ? "$text$MarkletAddText"
          : "$MarkletAddText$text";
    }
    $page['text'] = $text;
    $page['text'] .= $vote;
    WritePage($newpage, $page);
  }
  $newpage = preg_replace('/\./', '/', $newpage);
  if ($_REQUEST['return']) {
    $HTMLHeaderFmt['marklet'] =  "<meta http-equiv='Refresh' "
        ."Content='$MarkletRedirectDelay; URL=$url' />";
  }
  MarkletRedirect($newpage, "New bookmark: $url.");
}
function MarkletDuplicateCheck($test, $key) {
  #MarkletDuplicateCheck($test, $key);
}
# function to create the bookmarklet
function MarkletCreateLinks($pagename, $linkpage) {
  global $MarkletEnableReturn;
  $return = ($MarkletEnableReturn) ? '&return=1' : '';
  if ($linkpage) $pagename = MakePageName($pagename, $linkpage);
  $first = FmtPageName("<a href=\"javascript:document.location.href='\$PageUrl?action=makemark&url='+encodeURIComponent(document.location.href)+'$return&title='+encodeURIComponent(document.title),'bookmark'\">+=$pagename</a>", $pagename);
  $first .= FmtPageName("<br /><a href=\"javascript:document.location.href='\$PageUrl?action=makemark&hurry=1$return&url='+encodeURIComponent(document.location.href)+'&title='+encodeURIComponent(document.title),'bookmark'\">+=$pagename (hurrymode)</a>", $pagename);
  return $first;
}

# function to handle ?action=addlink (prepends the url to the page and
# then passes control to the edit function).
function MarkletHandleAdd($pagename) {
  global $HandleActions, $EnableAddLinkToEnd, $AddLinkText;
  Lock(2);
  
  $link = $_REQUEST['url'];
  $title = stripslashes($_REQUEST['title']);
  if ($_REQUEST['hurry']) { MarkletAdd($pagename, ''); }
  $form = MakeMarkForm($pagename, $link, $title);
  print $form;
}
function MakeMarkForm($pagename, $link, $title) {
  global $ScriptUrl;
  global $MarkletCategorySplitPoint, $MarkletCategories;
  global $MarkletCategoriesFunction, $MarkletMultiple;
  $cats = array();
  $categories = $MarkletCategoriesFunction($pagename);

  foreach($categories as $c) $cats[] = "<option>$c</option>";
  $return = ($_REQUEST['return']) 
    ? "<input type='hidden' name='return' value='1' />"
    : '';

  array_unshift($cats, "<option selected></option>");
  $categories = join("\n", $cats);
  if ($MarkletMultiple) {
    $multiple = "multiple size='$MarkletMultiple' name='category[]'";
  }
  else {
    $multiple = "name='category'";
  }
  $form =<<<MAKELINKFORM
  <form id='' class='odoform' action='$ScriptUrl/$pagename' method='post'>
    <table border='0' >
      <tr><td>Title:</td><td><input type='text' size='60' name='title' value='$title' /></td></tr>
      <tr><td>Link:</td><td><input type='text' size='60' name='url' value='$link' /></td></tr>
      <tr><td>Create in Category:</td><td><select $multiple>$categories</select></td></tr>
      <tr><td>Add Category: </td><td><input type='text' size='40' name='new_category' /></td></tr>
      <tr><td valign='top'>Summary: </td>
      <td><input type='hidden' name='action' value='makemarklet' />$return
<textarea cols='60' rows='5' name='summary'>
</textarea></td></tr>
      <tr><td colspan='2'><input type='submit' /></td></tr>
    </table>
</form>
MAKELINKFORM;
  return $form;
}
function MarkletRedirect($page, $msg) {
    global $PageRedirectFmt, $HTMLStylesFmt;

    $HTMLStylesFmt[marklets] = "
/* styling of marklet messages */
#markletMessage {
  padding: 0.5em;
  margin-bottom: 1em;
  background: #FFD;
  border: 3px double red;
  text-align: center;
}
";
    $_GET['from'] = 1;
    $PageRedirectFmt = "<div id='markletMessage'>$msg</div>";
    HandleBrowse($page);
    exit();
}
function MarkletDefaultCategories($pn) {
    global $MarkletCategories;
    $cats = array();
    if (sizeof((array)$MarkletCategories)
        && $MarkletCategories[0] !='') 
    {
      foreach((array)$MarkletCategories as $c) $cats[] = $c;
    }
    else {
      $pages = ListPages("/^$pn*/");
      foreach ($pages as $p) {
        list(, $c) = MarkletSplitPagename($p);
        if ($c != '') $cats[] = $c;
      }
    }
    sort($cats);
    return $cats;
}