includes/clientside/static/editor.js
changeset 336 bfa2e9c23f03
parent 335 67bd3121a12e
child 348 87e08a6e4fec
--- a/includes/clientside/static/editor.js	Thu Dec 27 22:09:33 2007 -0500
+++ b/includes/clientside/static/editor.js	Thu Dec 27 23:32:11 2007 -0500
@@ -80,12 +80,15 @@
           return false;
         }
         
-        ajaxBuildEditor(response.src, (!response.auth_edit), response.time);
+        // do we need to enter a captcha before saving the page?
+        var captcha_hash = ( response.require_captcha ) ? response.captcha_id : false;
+        
+        ajaxBuildEditor(response.src, (!response.auth_edit), response.time, captcha_hash);
       }
     });
 }
 
-function ajaxBuildEditor(content, readonly, timestamp)
+function ajaxBuildEditor(content, readonly, timestamp, captcha_hash)
 {
   // Set flags
   // We don't want the fancy confirmation framework to trigger if the user is only viewing the page source
@@ -255,6 +258,47 @@
     tr2.appendChild(td2_1);
     tr2.appendChild(td2_2);
     
+    if ( captcha_hash )
+    {
+      // generate captcha field (effectively third row)
+      var tr4 = document.createElement('tr');
+      var td4_1 = document.createElement('td');
+      var td4_2 = document.createElement('td');
+      td4_1.className = 'row2';
+      td4_2.className = 'row1';
+      
+      td4_1.appendChild(document.createTextNode($lang.get('editor_lbl_field_captcha')));
+      td4_1.appendChild(document.createElement('br'));
+      var small2 = document.createElement('small');
+      small2.appendChild(document.createTextNode($lang.get('editor_msg_captcha_pleaseenter')));
+      small2.appendChild(document.createElement('br'));
+      small2.appendChild(document.createElement('br'));
+      small2.appendChild(document.createTextNode($lang.get('editor_msg_captcha_blind')));
+      td4_1.appendChild(small2);
+      
+      var img = document.createElement('img');
+      img.src = makeUrlNS('Special', 'Captcha/' + captcha_hash);
+      img._captchaHash = captcha_hash;
+      img.id = 'enano_editor_captcha_img';
+      img.onclick = function()
+      {
+        this.src = makeUrlNS('Special', 'Captcha/' + this._captchaHash + '/' + Math.floor(Math.random() * 100000));
+      }
+      img.style.cursor = 'pointer';
+      td4_2.appendChild(img);
+      td4_2.appendChild(document.createElement('br'));
+      td4_2.appendChild(document.createTextNode($lang.get('editor_lbl_field_captcha_code') + ' '));
+      var input = document.createElement('input');
+      input.type = 'text';
+      input.id = 'enano_editor_field_captcha';
+      input._captchaHash = captcha_hash;
+      input.size = '9';
+      td4_2.appendChild(input);
+      
+      tr4.appendChild(td4_1);
+      tr4.appendChild(td4_2);
+    }
+    
     // Third row: controls
     var tr3 = document.createElement('tr');
     var td3 = document.createElement('th');
@@ -302,6 +346,10 @@
     
     metatable.appendChild(tr1);
     metatable.appendChild(tr2);
+    if ( captcha_hash )
+    {
+      metatable.appendChild(tr4);
+    }
     metatable.appendChild(tr3);
   }
   tblholder.appendChild(metatable);
@@ -339,6 +387,14 @@
 {
   ajaxSetEditorLoading();
   var ta_content = $('ajaxEditArea').getContent();
+  
+  if ( ta_content == '' || ta_content == '<p></p>' || ta_content == '<p>&nbsp;</p>' )
+  {
+    new messagebox(MB_OK|MB_ICONSTOP, $lang.get('editor_err_no_text_title'), $lang.get('editor_err_no_text_body'));
+    ajaxUnSetEditorLoading();
+    return false;
+  }
+  
   var edit_summ = $('enano_editor_field_summary').object.value;
   if ( !edit_summ )
     edit_summ = '';
@@ -351,6 +407,21 @@
     minor_edit: is_minor,
     time: timestamp
   };
+  
+  // Do we need to add captcha info?
+  if ( document.getElementById('enano_editor_field_captcha') )
+  {
+    var captcha_field = document.getElementById('enano_editor_field_captcha');
+    if ( captcha_field.value == '' )
+    {
+      new messagebox(MB_OK|MB_ICONSTOP, $lang.get('editor_err_need_captcha_title'), $lang.get('editor_err_need_captcha_body'));
+      ajaxUnSetEditorLoading();
+      return false;
+    }
+    json_packet.captcha_code = captcha_field.value;
+    json_packet.captcha_id = captcha_field._captchaHash;
+  }
+  
   json_packet = ajaxEscape(toJSONString(json_packet));
   ajaxPost(stdAjaxPrefix + '&_mode=savepage_json', 'r=' + json_packet, function()
     {
@@ -374,6 +445,21 @@
         // This will be used if the PageProcessor generated errors (usually security/permissions related)
         if ( response.mode == 'errors' )
         {
+          // This will be true if the user entered a captcha code incorrectly, thus
+          // invalidating the code and requiring a new image to be generated.
+          if ( response.new_captcha )
+          {
+            // Generate the new captcha field
+            var img = document.getElementById('enano_editor_captcha_img');
+            var input = document.getElementById('enano_editor_field_captcha');
+            if ( img && input )
+            {
+              img._captchaHash = response.new_captcha;
+              input._captchaHash = response.new_captcha;
+              img.src = makeUrlNS('Special', 'Captcha/' + response.new_captcha);
+              input.value = '';
+            }
+          }
           var errors = '<ul><li>' + implode('</li><li>', response.errors) + '</li></ul>';
           new messagebox(MB_OK | MB_ICONSTOP, $lang.get('editor_err_save_title'), $lang.get('editor_err_save_body') + errors);
           return false;
@@ -392,14 +478,17 @@
           setAjaxLoading();
           editor_open = false;
           enableUnload();
+          changeOpac(0, 'ajaxEditContainer');
           ajaxGet(stdAjaxPrefix + '&_mode=getpage&noheaders', function()
             {
               if ( ajax.readyState == 4 )
               {
                 unsetAjaxLoading();
-                document.getElementById('ajaxEditContainer').innerHTML = '<div class="usermessage">' + $lang.get('editor_msg_saved') + '</div>' + ajax.responseText;
                 selectButtonMajor('article');
                 unselectAllButtonsMinor();
+                
+                document.getElementById('ajaxEditContainer').innerHTML = '<div class="usermessage">' + $lang.get('editor_msg_saved') + '</div>' + ajax.responseText;
+                opacity('ajaxEditContainer', 0, 100, 1000);
               }
             });
         }