<?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, or
    (at your option) any later version.  
*/

SDV($MarkletAddTextToEnd,0);
SDV($MarkletDateFmt, '[-[%b %e, %Y (%I:%M %p)]-]');
SDV($MarkletDeleteText,'Delete');
SDV($MarkletEnableReturn, 0);
SDV($MarkletRedirectDelay, 4);

Markup('makemark', 'inline', '/\\(:marklet\\s*(.*?):\\)/e', "Keep(MarkletCreateLinks(\$pagename,'$1'))");
Markup("marklet-delete", "block", "/\(:marklet-delete-(.*?):\)/", "<a class='markletdelete' href='$ScriptUrl?n=$pagename&marklet=$1&action=marklet-delete'>".(isset($MarkletDeleteText)?$MarkletDeleteText:'Delete')."</a>"); 

$HandleActions['makemark'] = 'HandleAddMark';
$HandleActions['makemarklet'] = 'AddMarklet';
$HandleActions['marklet-delete'] = 'HandleDeleteMarklet';

function HandleDeleteMarklet() {
    global $pagename;

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

function AddMarklet($pagename, $argv) {
  global $Now, $PageRedirectFmt, $HandleActions, $HTMLHeaderFmt;
  global $MarkletRedirectDelay, $MarkletDateFmt, $MarkletAddText;
  global $MarkletRedirectMessage;
  global $HTMLStylesFmt;

  $title = $_REQUEST['title'];
  $link = $_REQUEST['url'];
  $summary = $_REQUEST['summary'];
  $category = ($_REQUEST['new_category']) 
    ? $_REQUEST['new_category'] : $_REQUEST['category'];

  $newpage = ($category) ? join('-', array($pagename, $category)) : $pagename;
  $time = strftime($MarkletDateFmt, $Now);
  $key = md5($link);
  SDV($MarkletAddText, "* [[$link|$title]] $summary $time (:marklet-delete-$key:)\n");

  $page = RetrieveAuthPage($newpage, 'edit');
  if (!$page) Abort("?cannot edit $pagename");
  $text = $page['text'];
  if (preg_match("/$key/", $text)) {
      $MarkletAddText = preg_replace("/\*/", '* %red% (duplicate)', $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=$link' />";
  MarkletRedirect($newpage, "New bookmark: $link.");
}
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 HandleAddMark($pagename) {
  global $HandleActions, $EnableAddLinkToEnd, $AddLinkText;
  Lock(2);
  
  $link = $_REQUEST['url'];
  $title = $_REQUEST['title'];
  if ($_REQUEST['hurry']) { AddMarklet($pagename, ''); }
  $form = MakeMarkForm($pagename, $link, $title);
  print $form;
}
function MakeMarkForm($pagename, $link, $title) {
  global $ScriptUrl;
  $pages = ListPages("/^$pagename-/");
  $cats = array();
  foreach ($pages as $p) {
    list(, $c) = split('-', $p);
    $cats[] = "<option>$c</option>";
  }
  sort($cats);
  array_unshift($cats, "<option selected></option>");
  $categories = join("\n", $cats);
  $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 name='category'>$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' />
<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;
}
";
    $_GET['from'] = 1;
    $PageRedirectFmt = "<div id='markletMessage'>$msg</div>";
    HandleBrowse($page);
    exit();
}