// ==UserScript==
// @namespace     http://shog9.com/greasemonkey/scripts/
// @name          CPInplaceDelete
// @author        Joshua Heyer
// @description   Allow deleting posts without loading a separate confirmation page
// @version       1.0
// @include       http://*.codeproject.com/*
// @include       http://*.codetools.com/*
// @include       http://*.thecodeproject.com/*
// ==/UserScript==

// no sense loading anything if this isn't even a forum - do a quick test for a forum table
var forumTable = document.getElementById('ForumTable');
if ( forumTable )
{
   forumTable.addEventListener("click", function(event)
   {
      var target = event.target;
      while (target && !target.href)
         target = target.parentNode;
      if ( target && 
         target.href.match(/\/script\/comments\/owner_delete_pw.asp/) &&
         target.href.match(/forumid=(\d*)\S*select=(\d*)|select=(\d*)\S*forumid=(\d*)/) )
      {
         event.preventDefault();
         var forumId = RegExp.$1;
         var msgId = RegExp.$2;
         if ( !forumId )
            forumId = RegExp.$4;
         if ( !msgId )
            msgId = RegExp.$3;
         quickDelete(forumId, msgId);
      }
   }, true);
}

//
// Tries to retrieve the password for a given post. If successful, calls doDelete() to perform actual deletion.
//
function quickDelete(forumId, postId)
{
   GM_xmlhttpRequest({
      method: 'GET',
      url: "http://" + document.location.host + "/script/comments/owner_delete_pw.asp?forumid=" + forumId + "&select=" + postId,      
      onload: function(responseDetails) 
      {
         if ( responseDetails.status == 200 )
         {
            var err = checkError(responseDetails.responseText);
            if ( err )
            {
               alert("Failed to delete message: " + err);
               return;
            }
            var tmpDiv = document.createElement("DIV");
            tmpDiv.style.display = "none";
            tmpDiv.innerHTML = responseDetails.responseText;
            var pass = document.evaluate(".//input[@name='ArticlePassword']/@value", tmpDiv, null, XPathResult.STRING_TYPE, null).stringValue;
            if ( pass )
               doDelete(forumId, postId, pass);
         }
         else
         {
            alert('Failed to delete message: ' + responseDetails.status + ' ' + responseDetails.statusText);
         }
      }
   });
}

//
// Actually delete the message. Three things needed: forum, post, password.
//
function doDelete(forumId, postId, pass)
{
   var subject = document.evaluate("//a[@name='"+postId+"']/b | //tr[td/a[@name='xx"+postId+"xx']]/td/b/span | //a[@name='"+postId+"']", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
   var body = document.evaluate("//tr[@id='"+postId+"_h1']/td/table/tbody/tr/td[2]", document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
   
   var prompt = "Delete message - are you SURE?";
   if ( subject )
      prompt = "Delete message: \n\t" + subject.textContent + "\n - are you SURE?";
   if ( !confirm(prompt) )
      return;
     
   var request = new Object();
   request.method = 'POST';
   request.url = "http://" + document.location.host + "/script/comments/app/owner_do_delete.asp?forumid="+forumId+"&main=/script/comments/forums.asp";
   request.headers = { 'Content-Type' : 'application/x-www-form-urlencoded' };
   request.data = "id="+postId+"&ArticlePassword="+pass;
   request.onload = function(responseDetails) 
   {
      if ( responseDetails.status == 200 )
      {
         var err = checkError(responseDetails.responseText);
         if ( err )
         {
            alert("Failed to delete message: " + err);
            return;
         }
         if ( subject )
            subject.innerHTML = "<i>[Message deleted]</i>";
         if ( body )
            body.innerHTML = "";
      }
      else
      {
         alert('Failed to delete message: ' + responseDetails.status + ' ' + responseDetails.statusText);
      }
   };
   
   GM_xmlhttpRequest(request);
}

//
// Look for an error message in the response text, extract it if found
//
function checkError(responseText)
{
   if ( responseText.indexOf("<b>An Error occured!</b>") >= 0)   // look for error message
   {
      var error;
      if ( responseText.match(/<p>Error description:<\/p>\s*(<blockquote>[\s\S]*(?:<\/blockquote))/gi) )
         error = RegExp.$1;
      if ( error )
      {
         var tmp = document.createElement("DIV");
         tmp.style.display = "none";
         tmp.innerHTML = error;
         error = tmp.textContent;
         return error;
      }
   }
   return false;
}
