<?php if (!defined('PmWiki')) exit();
/*
  EditTitle (v 0.4)
  
  Waylan Limberg (waylan@gmail.com)
  
  Description: Adds an Title input field to the edit form of PmWiki.
  For more info and instructions go to http://www.pmwiki.org/wiki/Cookbook/EditTitle
*/


# define pointers to functions
$HandleActions[edit] = 'EditTitleHandleEdit';
array_unshift($EditFunctions, 'AddTitle');
array_unshift($EditFunctions, 'RequireTitle');
array_unshift($EditFields, 'title');

  
# redefine HandleEdit funtion as EditTitleHandleEdit
function EditTitleHandleEdit($pagename, $auth = 'edit') {
  global $IsPagePosted, $EditFields, $ChangeSummary, $EditFunctions, 
    $EnablePost, $FmtV, $Now, 
    $PageEditForm, $HandleEditFmt, $PageStartFmt, $PageEditFmt, $PageEndFmt;
  if ($_POST['cancel']) { Redirect($pagename); return; }
  Lock(2);
  $IsPagePosted = false;
  $page = RetrieveAuthPage($pagename, $auth, true);
  if (!$page) Abort("?cannot edit $pagename"); 
  PCache($pagename,$page);
  $new = $page;
  // note $EditFields here
  foreach((array)$EditFields as $k) 
    if (isset($_POST[$k])) $new[$k]=str_replace("\r",'',stripmagic($_POST[$k]));
  if ($ChangeSummary) $new["csum:$Now"] = $ChangeSummary;
  $EnablePost &= (@$_POST['post'] || @$_POST['postedit']);
  // note $EditFunctions here
  foreach((array)$EditFunctions as $fn) $fn($pagename,$page,$new);
  Lock(0);
  if ($IsPagePosted && !@$_POST['postedit']) { Redirect($pagename); return; }
  $FmtV['$DiffClassMinor'] = 
    (@$_POST['diffclass']=='minor') ?  "checked='checked'" : '';
  # Added call to RemoveTitle here
  $FmtV['$EditText'] = 
    str_replace('$','&#036;',htmlspecialchars(RemoveTitle(@$new['text']),ENT_NOQUOTES));
  $FmtV['$EditBaseTime'] = $Now;
  if (@$PageEditForm) {
    $form = ReadPage(FmtPageName($PageEditForm, $pagename), READPAGE_CURRENT);
    $FmtV['$EditForm'] = MarkupToHTML($pagename, $form['text']);
  }
  SDV($PageEditFmt, "<div id='wikiedit'>
    <h1 class='wikiaction'>$[Editing {\$FullName}]</h1>
    <form method='post' action='\$PageUrl?action=edit'>
    <input type='hidden' name='action' value='edit' />
    <input type='hidden' name='n' value='\$FullName' />
    <input type='hidden' name='basetime' value='\$EditBaseTime' />
    \$EditMessageFmt
    <textarea id='text' name='text' rows='25' cols='60'
      onkeydown='if (event.keyCode==27) event.returnValue=false;'
      >\$EditText</textarea><br />
    <input type='submit' name='post' value=' $[Save] ' />");
  SDV($HandleEditFmt, array(&$PageStartFmt, &$PageEditFmt, &$PageEndFmt));
  PrintFmt($pagename, $HandleEditFmt);
}

# RemoveTitle pulls title from markup and sets it to display in text input field
function RemoveTitle($text){
  global $InputTags;
  # pattern should be same as defined in markup
  $pattern = '/\\(:title\\s(.*?):\\)/';
  # Find title to display in field
  preg_match($pattern, $text, $matches);
  # Define Title input field
  SDVA($InputTags['e_title'], array(
  ':html' => "<input type='text' \$InputFormArgs />",
  'name' => 'title', 'size' => '60' ,'value' => $matches[1]));
  # return text without title markup
  return trim(preg_replace($pattern, '', $text));
}

# AddTitle adds title back into markup before saving
function AddTitle($pagename, &$page, &$new){
  if ($new[title] > '') $new[text] = "(:title $new[title]:)\n$new[text]";
  return;
}

# Require that a title be defined on each page
function RequireTitle($pagename, &$page, &$new){
  global $EnablePost, $MessagesFmt, $ForceTitle;
  if ($ForceTitle && isset($new[text]) && trim($new[title]) == '') {
    $EnablePost = 0;
    $MessagesFmt[] = '<h3 class="wikimessage">A Title must be defined for this page</h3>';
  }
  return;
}