includes/clientside/static/ajax.js
author Dan
Sun, 25 Jan 2009 20:35:06 -0500
changeset 823 4596c40aaa94
parent 800 9cdfe82c56cd
child 869 58bc29c14a4d
permissions -rw-r--r--
AJAX core library: possible breaking change, readystatechange functions are now called with the XHR instance as the first parameter, to allow requests to run in parallel. This means much better stability but may break some applets (compatibility hack is included)

/*
 * AJAX applets
 */
 
window.ajaxReset = function()
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  var ns_id = strToPageID(physical_title);
  if ( ns_id[1] == 'Special' || ns_id[1] == 'Admin' )
    return false;
  enableUnload();
  setAjaxLoading();
  var redir = ( disable_redirect ) ? '&redirect=no' : '';
  ajaxGet(append_sid(scriptPath + '/ajax.php?title=' + physical_title +'&_mode=getpage&noheaders' + redir), function(ajax) {
    // Allow for 404 here, it's generated by the "page not found" error message
    // (even with noheaders specified, probably should be fixed)
    if ( ajax.readyState == 4 && ( ajax.status == 200 || ajax.status == 404 ) ) {
      unsetAjaxLoading();
      document.getElementById('ajaxEditContainer').innerHTML = ajax.responseText;
      selectButtonMajor('article');
      unselectAllButtonsMinor();
      // if we're on a userpage, call the onload function to rebuild the tabs
      if ( typeof(userpage_onload) == 'function' )
      {
        window.userpage_blocks = [];
        userpage_onload();
      }
    }
  });
}

// Miscellaneous AJAX applets

window.ajaxProtect = function(l) {
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  load_component('l10n');
  
  if(shift) {
    r = 'NO_REASON';
  } else {
    r = prompt($lang.get('ajax_protect_prompt_reason'));
    if(!r || r=='') return;
  }
  setAjaxLoading();
  document.getElementById('protbtn_0').style.textDecoration = 'none';
  document.getElementById('protbtn_1').style.textDecoration = 'none';
  document.getElementById('protbtn_2').style.textDecoration = 'none';
  document.getElementById('protbtn_'+l).style.textDecoration = 'underline';
  ajaxPost(stdAjaxPrefix+'&_mode=protect', 'reason='+ajaxEscape(r)+'&level='+l, function(ajax) {
    if ( ajax.readyState == 4 && ajax.status == 200 ) {
      unsetAjaxLoading();
      if(ajax.responseText == 'good')
        return true;
      // check for JSON error response
      var response = String(ajax.responseText + '');
      if ( response.substr(0, 1) == '{' )
      {
        response = parseJSON(response);
        if ( response.mode == 'error' )
        {
          alert(response.error);
          return true;
        }
      }
      alert(ajax.responseText);
    }
  }, true);
}

window.ajaxRename = function()
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  
  // updated - 1.1.4 to use miniPrompt
  load_component(['l10n', 'messagebox', 'flyin', 'fadefilter']);
  miniPrompt(ajaxRenameConstructDialog);
}

var ajaxRenameConstructDialog = function(div)
{
  // title
  var heading = document.createElement('h3');
  heading.appendChild(document.createTextNode($lang.get('ajax_rename_prompt_short')));
  div.appendChild(heading);
  
  // form
  var form = document.createElement('form');
  form.action = 'javascript:void(0);';
  
  // box
  var box = document.createElement('input');
  box.size = '43';
  box.style.width = '100%';
  form.appendChild(box);
  div.appendChild(form);
  
  // notice
  var notice = document.createElement('small');
  notice.appendChild(document.createTextNode($lang.get('ajax_rename_notice')));
  div.appendChild(notice);
  
  // button area
  var btndiv = document.createElement('div');
  btndiv.className = 'mp-buttons';
  
  // buttons
  var btn_submit = document.createElement('a');
  btn_submit.href = '#';
  btn_submit.appendChild(document.createTextNode($lang.get('etc_go')));
  btn_submit.className = 'abutton abutton_green';
  
  var btn_cancel = document.createElement('a');
  btn_cancel.href = '#';
  btn_cancel.appendChild(document.createTextNode($lang.get('etc_cancel')));
  btn_cancel.className = 'abutton';
  
  btndiv.appendChild(btn_submit);
  btndiv.appendChild(document.createTextNode(' | '));
  btndiv.appendChild(btn_cancel);
  div.appendChild(btndiv);
  
  // events
  btn_submit.onclick = function()
  {
    ajaxRenameSubmit(this);
    return false;
  }
  btn_cancel.onclick = function()
  {
    miniPromptDestroy(this);
    return false;
  }
  form.onsubmit = function()
  {
    ajaxRenameSubmit(this);
    return false;
  }
  
  setTimeout(function()
    {
      box.focus();
    }, 200);
}

window.ajaxRenameSubmit = function(obj)
{
  var box = miniPromptGetParent(obj);
  if ( !box )
    return false;
  
  var input = obj.getElementsByTagName('input')[0];
  console.debug(obj, input);
  if ( !input )
    return false;
  var newname = input.value;
  newname = trim(newname);
  
  if ( newname.length < 1 )
  {
    alert($lang.get('ajax_rename_too_short'));
    return false;
  }
  
  if ( !newname )
  {
    return false;
  }
  
  var innerBox = getElementsByClassName(box, 'div', 'mp-body')[0];
  var whiteout = whiteOutElement(innerBox);
  whiteout.style.width = ( $dynano(whiteout).Width() - 78 ) + 'px';
  whiteout.style.left = ( $dynano(whiteout).Left() + 44 ) + 'px';
  
  ajaxPost(stdAjaxPrefix + '&_mode=rename', 'newtitle=' + ajaxEscape(newname), function(ajax)
    {
      if ( ajax.readyState == 4 && ajax.status == 200 )
      {
        whiteout.parentNode.removeChild(whiteout);
        var response = String(ajax.responseText);
        if ( !check_json_response(response) )
        {
          handle_invalid_json(response);
          return false;
        }
        response = parseJSON(response);
        if ( response.success )
        {
          miniPromptDestroy(box, true);
          ajaxRenameDoClientTransform(newname);
          new MessageBox( MB_OK|MB_ICONINFORMATION, $lang.get('ajax_rename_success_title'), $lang.get('ajax_rename_success_body', { page_name_new: newname }) );
          mb_previously_had_darkener = false;
        }
        else
        {
          var errmsg = $lang.get('page_err_' + response.error);
          alert(errmsg);
        }
      }
    }, true);
}

window.ajaxRenameDoClientTransform = function(newname)
{
  var obj = document.getElementById('h2PageName');
  if ( obj )
  {
    obj.firstChild.nodeValue = newname;
  }
  document.title = newname;
}

window.ajaxDeletePage = function()
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  load_component(['l10n', 'messagebox', 'jquery', 'jquery-ui', 'fadefilter', 'flyin']);
  
  // stage 1: prompt for reason and confirmation
  miniPrompt(function(parent)
    {
      // heading/title
      var h3 = document.createElement('h3');
      h3.appendChild(document.createTextNode($lang.get('ajax_delete_header')));
      parent.appendChild(h3);
      
      // "please enter your reason"
      var p1 = document.createElement('p');
      p1.appendChild(document.createTextNode($lang.get('ajax_delete_prompt_reason')));
      parent.appendChild(p1);
      
      // textbox + label thereof
      var p2 = document.createElement('p');
      var tb = document.createElement('input');
      var dl = document.createElement('label');
      
      tb.type = 'text';
      tb.size = '30';
      tb.onkeyup = function(e)
      {
        if ( e )
        if ( e.keyCode )
        if ( e.keyCode == 13 )
        {
          if ( ajaxDeletePageSubmit(this) )
          {
            miniPromptDestroy(this);
          }
        }
        else if ( e.keyCode == 27 )
        {
          miniPromptDestroy(this);
        }
      }
      
      dl.appendChild(document.createTextNode($lang.get('ajax_delete_lbl_reason') + ' '));
      dl.appendChild(tb);
      p2.appendChild(dl);
      parent.appendChild(p2);
      
      // notice underneath
      var p3 = document.createElement('p');
      p3.style.fontSize = 'smaller';
      p3.appendChild(document.createTextNode($lang.get('ajax_delete_msg_confirm')));
      parent.appendChild(p3);
      
      // confirmation + submit/cancel (structure)
      var divleft  = document.createElement('div');
      var divright = document.createElement('div');
      var divclear = document.createElement('div');
      
      divleft.style.cssFloat = 'left';
      divleft.style.styleFloat = 'left';
      
      divright.style.cssFloat = 'right';
      divright.style.styleFloat = 'right';
      
      divclear.style.clear = 'both';
      
      parent.appendChild(divleft);
      parent.appendChild(divright);
      parent.appendChild(divclear);
      
      // confirmation + submit/cancel (controls)
      var cb = document.createElement('input');
      var cl = document.createElement('label');
      
      cb.type = 'checkbox';
      cb.checked = false;
      
      // a bit of a hack here, doesn't seem to work in fx3
      cb.onblur = function(e)
      {
        var parent = this.parentNode.parentNode.parentNode;
        var submitter = parent.getElementsByTagName('a')[0];
        if ( submitter )
          submitter.focus();
      }
      
      cl.appendChild(cb);
      cl.appendChild(document.createTextNode(' ' + $lang.get('ajax_delete_lbl_confirm')));
      divleft.appendChild(cl);
      
      var btn_submit = document.createElement('a');
      btn_submit.className = 'abutton abutton_red';
      btn_submit.href = '#';
      btn_submit.appendChild(document.createTextNode($lang.get('ajax_delete_btn_delete')));
      btn_submit.onclick = function()
      {
        if ( ajaxDeletePageSubmit(this) )
        {
          miniPromptDestroy(this);
        }
        return false;
      }
      
      var btn_cancel = document.createElement('a');
      btn_cancel.className = 'abutton';
      btn_cancel.href = '#';
      btn_cancel.appendChild(document.createTextNode($lang.get('etc_cancel')));
      btn_cancel.onclick = function()
      {
        miniPromptDestroy(this);
        return false;
      }
      
      divright.appendChild(btn_submit);
      divright.appendChild(document.createTextNode(' '));
      divright.appendChild(btn_cancel);
      
      var timeout = ( aclDisableTransitionFX ) ? 10 : 1000;
      setTimeout(function()
        {
          tb.focus();
        }, timeout);
    });
}

window.ajaxDeletePageSubmit = function(prompt_obj)
{
  prompt_obj = miniPromptGetParent(prompt_obj).childNodes[1];
  var inputs = prompt_obj.getElementsByTagName('input');
  var reason = inputs[0];
  var confirm = inputs[1];
  
  if ( trim(reason.value) == '' )
  {
    // flash the background of the reason entry
    $(reason.parentNode).effect("highlight", {}, 1000);
    return false;
  }
  
  if ( !confirm.checked )
  {
    // flash the background of the confirm checkbox
    $(confirm.parentNode).effect("highlight", {}, 1000);
    return false;
  }
  
  prompt_obj.innerHTML = '<img alt="loading" style="display: block; margin: 0 auto;" src="' + cdnPath + '/images/loading-big.gif" />';
  
  // tenemos la confirmación y la razón - borre la página.
  setAjaxLoading();
  ajaxPost(stdAjaxPrefix + '&_mode=deletepage', 'reason=' + ajaxEscape(trim(reason.value)), function(ajax)
    {
      if ( ajax.readyState == 4 && ajax.status == 200 )
      {
        unsetAjaxLoading();
        
        // show the response in the same prompt window
        prompt_obj.style.textAlign = 'center';
        prompt_obj.innerHTML = '';
        
        var p1 = document.createElement('div');
        p1.style.marginBottom = '15px';
        p1.appendChild(document.createTextNode(ajax.responseText));
        prompt_obj.appendChild(p1);
        
        var p2 = document.createElement('p');
        var a = document.createElement('a');
        a.className = 'abutton';
        a.href = '#';
        a.appendChild(document.createTextNode($lang.get('etc_close')));
        a.onclick = function()
        {
          miniPromptDestroy(this);
          window.location.reload();
          return false;
        }
        p2.appendChild(a);
        prompt_obj.appendChild(a);
        
        a.focus();
      }
    });
  
  return true;
}

window.ajaxDelVote = function()
{
  load_component(['l10n', 'messagebox', 'flyin', 'fadefilter']);
  
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  miniPromptMessage({
      title: $lang.get('ajax_delvote_confirm_title'),
      message: $lang.get('ajax_delvote_confirm_body'),
      buttons: [
        {
          text: $lang.get('ajax_delvote_btn_submit'),
          color: 'red',
          style: {
            fontWeight: 'bold'
          },
          onclick: function(e)
          {
            miniPromptDestroy(this);
            setAjaxLoading();
            ajaxGet(stdAjaxPrefix+'&_mode=delvote', function(ajax) {
              if ( ajax.readyState == 4 && ajax.status == 200 ) {
                unsetAjaxLoading();
                alert(ajax.responseText);
              }
            }, true);
          }
        },
        {
          text: $lang.get('etc_cancel'),
          onclick: function(e)
          {
            miniPromptDestroy(this);
          }
        }
      ]
    });
}

window.ajaxResetDelVotes = function()
{
  load_component(['l10n', 'messagebox', 'flyin', 'fadefilter']);
  
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  miniPromptMessage({
      title: $lang.get('ajax_delvote_reset_confirm_title'),
      message: $lang.get('ajax_delvote_reset_confirm_body'),
      buttons: [
        {
          text: $lang.get('ajax_delvote_reset_btn_submit'),
          color: 'red',
          style: {
            fontWeight: 'bold'
          },
          onclick: function(e)
          {
            miniPromptDestroy(this);
            setAjaxLoading();
            ajaxGet(stdAjaxPrefix+'&_mode=resetdelvotes', function(ajax) {
              if ( ajax.readyState == 4 && ajax.status == 200 ) {
                unsetAjaxLoading();
                alert(ajax.responseText);
                item = document.getElementById('mdgDeleteVoteNoticeBox');
                if(item)
                {
                  opacity('mdgDeleteVoteNoticeBox', 100, 0, 1000);
                  setTimeout("document.getElementById('mdgDeleteVoteNoticeBox').style.display = 'none';", 1000);
                }
              }
            }, true);
          }
        },
        {
          text: $lang.get('etc_cancel'),
          onclick: function(e)
          {
            miniPromptDestroy(this);
          }
        }
      ]
    });
}

// Editing/saving category information
// This was not easy to write, I hope enjoy it, and dang I swear I'm gonna
// find someone to work on just the Javascript part of Enano...

window.ajaxCatEdit = function()
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  setAjaxLoading();
  ajaxGet(stdAjaxPrefix+'&_mode=catedit', function(ajax) {
    if ( ajax.readyState == 4 && ajax.status == 200 ) {
      unsetAjaxLoading();
      edit_open = false;
      eval(ajax.responseText);
    }
  });
}

window.ajaxCatSave = function()
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  if(!catlist)
  {
    alert('Var catlist has no properties');
    return;
  }
  query='';
  for(i=0;i<catlist.length;i++)
  {
    var s = ( document.forms.mdgCatForm['mdgCat_' + catlist[i]]['checked'] ) ? true : false;
    if(s) query = query + '&' + catlist[i] + '=true';
  }
  setAjaxLoading();
  query = query.substring(1, query.length);
  ajaxPost(stdAjaxPrefix+'&_mode=catsave', query, function(ajax) {
    if ( ajax.readyState == 4 && ajax.status == 200 ) {
      unsetAjaxLoading();
      edit_open = false;
      if(ajax.responseText != 'GOOD') alert(ajax.responseText);
      ajaxReset();
    }
  });
}

// History stuff

window.ajaxHistory = function()
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  setAjaxLoading();
  ajaxGet(stdAjaxPrefix+'&_mode=histlist', function(ajax) {
    if ( ajax.readyState == 4 && ajax.status == 200 ) {
      unsetAjaxLoading();
      edit_open = false;
      selectButtonMajor('article');
      selectButtonMinor('history');
      document.getElementById('ajaxEditContainer').innerHTML = ajax.responseText;
      buildDiffList();
    }
  });
}

window.ajaxHistView = function(oldid, ttl) {
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  if(!ttl) ttl=title;
  setAjaxLoading();
  ajaxGet(append_sid(scriptPath+'/ajax.php?title='+ttl+'&_mode=getpage&oldid='+oldid), function(ajax) {
    if ( ajax.readyState == 4 && ajax.status == 200 ) {
      unsetAjaxLoading();
      edit_open = false;
      document.getElementById('ajaxEditContainer').innerHTML = ajax.responseText;
    }
  });
}

window.ajaxRollback = function(id) {
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  setAjaxLoading();
  ajaxGet(stdAjaxPrefix+'&_mode=rollback&id='+id, function(ajax) {
    if ( ajax.readyState == 4 && ajax.status == 200 ) {
      unsetAjaxLoading();
      
      var response = String(ajax.responseText + '');
      if ( !check_json_response(response) )
      {
        handle_invalid_json(response);
        return false;
      }
      
      response = parseJSON(response);
      if ( response.success )
      {
        alert( $lang.get('page_msg_rb_success_' + response.action, { dateline: response.dateline }) )
      }
      else
      {
        if ( response.action )
        {
          alert( $lang.get('page_err_' + response.error, { action: response.action }) );
        }
        else
        {
          alert( $lang.get('page_err_' + response.error) );
        }
      }
    }
  });
}

window.ajaxClearLogs = function()
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  
  load_component(['l10n', 'messagebox', 'flyin', 'fadefilter']);
  
  miniPromptMessage({
      title: $lang.get('ajax_clearlogs_confirm_title'),
      message: $lang.get('ajax_clearlogs_confirm_body'),
      buttons: [
        {
          text: $lang.get('ajax_clearlogs_btn_submit'),
          color: 'red',
          style: {
            fontWeight: 'bold'
          },
          onclick: function(e)
          {
            miniPromptDestroy(this);
            setAjaxLoading();
            ajaxGet(stdAjaxPrefix+'&_mode=flushlogs', function(ajax) {
              if ( ajax.readyState == 4 && ajax.status == 200 ) {
                unsetAjaxLoading();
                alert(ajax.responseText);
                window.location.reload();
              }
            });
          }
        },
        {
          text: $lang.get('etc_cancel'),
          onclick: function(e)
          {
            miniPromptDestroy(this);
          }
        }
      ]
    });
}

window.buildDiffList = function()
{
  arrDiff1Buttons = getElementsByClassName(document, 'input', 'clsDiff1Radio');
  arrDiff2Buttons = getElementsByClassName(document, 'input', 'clsDiff2Radio');
  var len = arrDiff1Buttons.length;
  if ( len < 1 )
    return false;
  timelist = new Array();
  for ( var i = 0; i < len; i++ )
  {
    timelist.push( arrDiff2Buttons[i].id.substr(6) );
  }
  timelist.push( arrDiff1Buttons[len-1].id.substr(6) );
  delete(timelist.toJSONString);
  for ( var i = 1; i < timelist.length-1; i++ )
  {
    if ( i >= timelist.length ) break;
    arrDiff2Buttons[i].style.display = 'none';
  }
}

window.selectDiff1Button = function(obj)
{
  var this_time = obj.id.substr(6);
  var index = parseInt(in_array(this_time, timelist));
  for ( var i = 0; i < timelist.length - 1; i++ )
  {
    if ( i < timelist.length - 1 )
    {
      var state = ( i < index ) ? 'inline' : 'none';
      var id = 'diff2_' + timelist[i];
      document.getElementById(id).style.display = state;
      
      // alert("Debug:\nIndex: "+index+"\nState: "+state+"\ni: "+i);
    }
  }
}

window.selectDiff2Button = function(obj)
{
  var this_time = obj.id.substr(6);
  var index = parseInt(in_array(this_time, timelist));
  for ( var i = 1; i < timelist.length; i++ )
  {
    if ( i < timelist.length - 1 )
    {
      var state = ( i > index ) ? 'inline' : 'none';
      var id = 'diff1_' + timelist[i];
      document.getElementById(id).style.display = state;
      
      // alert("Debug:\nIndex: "+index+"\nState: "+state+"\ni: "+i);
    }
  }
}

window.ajaxHistDiff = function()
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  var id1=false;
  var id2=false;
  for ( i = 0; i < arrDiff1Buttons.length; i++ )
  {
    k = i + '';
    kpp = i + 1;
    kpp = kpp + '';
    if(arrDiff1Buttons[k].checked) id1 = arrDiff1Buttons[k].id.substr(6);
    if(arrDiff2Buttons[k].checked) id2 = arrDiff2Buttons[k].id.substr(6);
  }
  if(!id1 || !id2) { alert('BUG: Couldn\'t get checked radiobutton state'); return; }
  setAjaxLoading();
  ajaxGet(stdAjaxPrefix+'&_mode=pagediff&diff1='+id1+'&diff2='+id2, function(ajax)
    {
      if ( ajax.readyState == 4 && ajax.status == 200 )
      {
        unsetAjaxLoading();
        document.getElementById('ajaxEditContainer').innerHTML = ajax.responseText;
      }
    });
}

// Change the user's preferred style/theme

window.ajaxChangeStyle = function()
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  load_component(['l10n', 'messagebox', 'flyin', 'fadefilter']);
  
  var inner_html = '';
  inner_html += '<p><label>' + $lang.get('ajax_changestyle_lbl_theme') + ' ';
  inner_html += '  <select id="chtheme_sel_theme" onchange="ajaxGetStyles(this.value);">';
  inner_html += '    <option value="_blank" selected="selected">' + $lang.get('ajax_changestyle_select') + '</option>';
  inner_html +=      ENANO_THEME_LIST;
  inner_html += '  </select>';
  inner_html += '</label></p>';
  var chtheme_mb = new MessageBox(MB_OKCANCEL|MB_ICONQUESTION, $lang.get('ajax_changestyle_title'), inner_html);
  chtheme_mb.onbeforeclick['OK'] = ajaxChangeStyleComplete;
}

window.ajaxGetStyles = function(id)
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  var thediv = document.getElementById('chtheme_sel_style_parent');
  if ( thediv )
  {
    thediv.parentNode.removeChild(thediv);
  }
  if ( id == '_blank' )
  {
    return null;
  }
  ajaxGet(stdAjaxPrefix + '&_mode=getstyles&id=' + id, function(ajax) {
      if ( ajax.readyState == 4 && ajax.status == 200 )
      {
        // IE doesn't like substr() on ajax.responseText
        var response = String(ajax.responseText + '');
        if ( response.substr(0,1) != '[' )
        {
          alert('Invalid or unexpected JSON response from server:\n' + response);
          return null;
        }
        
        // Build a selector and matching label
        var data = parseJSON(response);
        var options = new Array();
        for( var i in data )
        {
          var item = data[i];
          var title = themeid_to_title(item);
          var option = document.createElement('option');
          option.value = item;
          option.appendChild(document.createTextNode(title));
          options.push(option);
        }
        var p_parent = document.createElement('p');
        var label  = document.createElement('label');
        p_parent.id = 'chtheme_sel_style_parent';
        label.appendChild(document.createTextNode($lang.get('ajax_changestyle_lbl_style') + ' '));
        var select = document.createElement('select');
        select.id = 'chtheme_sel_style';
        for ( var i in options )
        {
          select.appendChild(options[i]);
        }
        label.appendChild(select);
        p_parent.appendChild(label);
        
        // Stick it onto the messagebox
        var div = document.getElementById('messageBox');
        var kid = div.firstChild.nextSibling;
        
        kid.appendChild(p_parent);
        
      }
    }, true);
}

window.ajaxChangeStyleComplete = function()
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  var theme = $dynano('chtheme_sel_theme');
  var style = $dynano('chtheme_sel_style');
  if ( !theme.object || !style.object )
  {
    alert($lang.get('ajax_changestyle_pleaseselect_theme'));
    return true;
  }
  var theme_id = theme.object.value;
  var style_id = style.object.value;
  
  if ( typeof(theme_id) != 'string' || typeof(style_id) != 'string' )
  {
    alert('Couldn\'t get theme or style ID');
    return true;
  }
  
  if ( theme_id.length < 1 || style_id.length < 1 )
  {
    alert('Theme or style ID is zero length');
    return true;
  }
  
  ajaxPost(stdAjaxPrefix + '&_mode=change_theme', 'theme_id=' + ajaxEscape(theme_id) + '&style_id=' + ajaxEscape(style_id), function(ajax)
    {
      if ( ajax.readyState == 4 && ajax.status == 200 )
      {
        if ( ajax.responseText == 'GOOD' )
        {
          var c = confirm($lang.get('ajax_changestyle_success'));
          if ( c )
            window.location.reload();
        }
        else
        {
          alert('Error occurred during attempt to change theme:\n' + ajax.responseText);
        }
      }
    }, true);
  
  return false;
  
}

window.ajaxSwapCSS = function()
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  setAjaxLoading();
  if(_css) {
    document.getElementById('mdgCss').href = main_css;
    _css = false;
  } else {
    document.getElementById('mdgCss').href = print_css;
    _css = true;
  }
  unsetAjaxLoading();
  menuOff();
}

window.ajaxSetPassword = function()
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  load_component('crypto');
  pass = hex_sha1(document.getElementById('mdgPassSetField').value);
  setAjaxLoading();
  ajaxPost(stdAjaxPrefix+'&_mode=setpass', 'password='+pass, function(ajax)
    {
      unsetAjaxLoading();
      if ( ajax.readyState == 4 && ajax.status == 200 )
      {
        alert(ajax.responseText);
      }
    }, true);
}

window.ajaxDisableEmbeddedPHP = function()
{
  // IE <6 pseudo-compatibility
  if ( KILL_SWITCH )
    return true;
  if ( !confirm($lang.get('ajax_killphp_confirm')) )
    return false;
  var $killdiv = $dynano('php_killer');
  if ( !$killdiv.object )
  {
    alert('Can\'t get kill div object');
    return false;
  }
  $killdiv.object.innerHTML = '<img alt="Loading..." src="' + scriptPath + '/images/loading-big.gif" /><br />Making request...';
  var url = makeUrlNS('Admin', 'Home', 'src=ajax');
  ajaxPost(url, 'act=kill_php', function(ajax) {
      if ( ajax.readyState == 4 && ajax.status == 200 )
      {
        if ( ajax.responseText == '1' )
        {
          var $killdiv = $dynano('php_killer');
          //$killdiv.object.innerHTML = '<img alt="Success" src="' + scriptPath + '/images/error.png" /><br />Embedded PHP in pages has been disabled.';
          $killdiv.object.parentNode.removeChild($killdiv.object);
          var newdiv = document.createElement('div');
          // newdiv.style = $killdiv.object.style;
          newdiv.className = $killdiv.object.className;
          newdiv.innerHTML = '<img alt="Success" src="' + scriptPath + '/images/error.png" /><br />' + $lang.get('ajax_killphp_success');
          $killdiv.object.parentNode.appendChild(newdiv);
          $killdiv.object.parentNode.removeChild($killdiv.object);
        }
        else
        {
          var $killdiv = $dynano('php_killer');
          $killdiv.object.innerHTML = ajax.responseText;
        }
      }
    });
}

var catHTMLBuf = false;

window.ajaxCatToTag = function()
{
  if ( KILL_SWITCH )
    return false;
  setAjaxLoading();
  ajaxGet(stdAjaxPrefix + '&_mode=get_tags', function(ajax)
    {
      if ( ajax.readyState == 4 && ajax.status == 200 )
      {
        unsetAjaxLoading();
        var resptext = String(ajax.responseText + ' ');
        resptext = resptext.substr(0, resptext.length-1);
        if ( resptext.substr(0, 1) != '{' )
        {
          handle_invalid_json(resptext);
          return false;
        }
        var json = parseJSON(resptext);
        var catbox = document.getElementById('mdgCatBox');
        if ( !catbox )
          return false;
        var linkbox = catbox.parentNode.firstChild.firstChild.nextSibling;
        linkbox.firstChild.nodeValue = $lang.get('catedit_catbox_link_showcategorization');
        linkbox.onclick = function() { ajaxTagToCat(); return false; };
        catHTMLBuf = catbox.innerHTML;
        catbox.innerHTML = '';
        catbox.appendChild(document.createTextNode($lang.get('tags_lbl_page_tags')+' '));
        if ( json.tags.length < 1 )
        {
          catbox.appendChild(document.createTextNode($lang.get('tags_lbl_no_tags')));
        }
        for ( var i = 0; i < json.tags.length; i++ )
        {
          catbox.appendChild(document.createTextNode(json.tags[i].name));
          if ( json.tags[i].can_del )
          {
            catbox.appendChild(document.createTextNode(' '));
            var a = document.createElement('a');
            a.appendChild(document.createTextNode('[X]'));
            a.href = '#';
            a._js_tag_id = json.tags[i].id;
            a.onclick = function() { ajaxDeleteTag(this, this._js_tag_id); return false; }
            catbox.appendChild(a);
          }
          if ( ( i + 1 ) < json.tags.length )
            catbox.appendChild(document.createTextNode(', '));
        }
        if ( json.can_add )
        {
          catbox.appendChild(document.createTextNode(' '));
          var addlink = document.createElement('a');
          addlink.href = '#';
          addlink.onclick = function() { try { ajaxAddTagStage1(); } catch(e) { }; return false; };
          addlink.appendChild(document.createTextNode($lang.get('tags_btn_add_tag')));
          catbox.appendChild(addlink);
        }
      }
    });
}

var addtag_open = false;

window.ajaxAddTagStage1 = function()
{
  if ( addtag_open )
    return false;
  var catbox = document.getElementById('mdgCatBox');
  var adddiv = document.createElement('div');
  var text = document.createElement('input');
  var addlink = document.createElement('a');
  addlink.href = '#';
  addlink.onclick = function() { ajaxAddTagStage2(this.parentNode.firstChild.nextSibling.value, this.parentNode); return false; };
  addlink.appendChild(document.createTextNode($lang.get('tags_btn_add')));
  text.type = 'text';
  text.size = '15';
  text.onkeyup = function(e)
  {
    if ( e.keyCode == 13 )
    {
      ajaxAddTagStage2(this.value, this.parentNode);
    }
  }
  
  adddiv.style.margin = '5px 0 0 0';
  adddiv.appendChild(document.createTextNode($lang.get('tags_lbl_add_tag')+' '));
  adddiv.appendChild(text);
  adddiv.appendChild(document.createTextNode(' '));
  adddiv.appendChild(addlink);
  catbox.appendChild(adddiv);
  addtag_open = true;
}

var addtag_nukeme = false;

window.ajaxAddTagStage2 = function(tag, nukeme)
{
  if ( !addtag_open )
    return false;
  if ( addtag_nukeme )
    return false;
  addtag_nukeme = nukeme;
  tag = ajaxEscape(tag);
  setAjaxLoading();
  ajaxPost(stdAjaxPrefix + '&_mode=addtag', 'tag=' + tag, function(ajax)
    {
      if ( ajax.readyState == 4 && ajax.status == 200 )
      {
        unsetAjaxLoading();
        var nukeme = addtag_nukeme;
        addtag_nukeme = false;
        var resptext = String(ajax.responseText + ' ');
        resptext = resptext.substr(0, resptext.length-1);
        if ( resptext.substr(0, 1) != '{' )
        {
          handle_invalid_json(resptext);
          return false;
        }
        var json = parseJSON(resptext);
        var parent = nukeme.parentNode;
        parent.removeChild(nukeme);
        addtag_open = false;
        if ( json.success )
        {
          var node = parent.childNodes[1];
          var insertafter = false;
          var nukeafter = false;
          if ( node.nodeValue == $lang.get('tags_lbl_no_tags') )
          {
            nukeafter = true;
          }
          insertafter = parent.childNodes[ parent.childNodes.length - 3 ];
          // these need to be inserted in reverse order
          if ( json.can_del )
          {
            var a = document.createElement('a');
            a.appendChild(document.createTextNode('[X]'));
            a.href = '#';
            a._js_tag_id = json.tag_id;
            a.onclick = function() { ajaxDeleteTag(this, this._js_tag_id); return false; }
            insertAfter(parent, a, insertafter);
            insertAfter(parent, document.createTextNode(' '), insertafter);
          }
          insertAfter(parent, document.createTextNode(json.tag), insertafter);
          if ( !nukeafter )
          {
            insertAfter(parent, document.createTextNode(', '), insertafter);
          }
          if ( nukeafter )
          {
            parent.removeChild(insertafter);
          }
        }
        else
        {
          alert(json.error);
        }
      }
    });
}

window.ajaxDeleteTag = function(parentobj, tag_id)
{
  var arrDelete = [ parentobj, parentobj.previousSibling, parentobj.previousSibling.previousSibling ];
  var parent = parentobj.parentNode;
  var writeNoTags = false;
  if ( parentobj.previousSibling.previousSibling.previousSibling.nodeValue == ', ' )
    arrDelete.push(parentobj.previousSibling.previousSibling.previousSibling);
  else if ( parentobj.previousSibling.previousSibling.previousSibling.nodeValue == $lang.get('tags_lbl_page_tags') + ' ' )
    arrDelete.push(parentobj.nextSibling);
  
  if ( parentobj.previousSibling.previousSibling.previousSibling.nodeValue == $lang.get('tags_lbl_page_tags') + ' ' &&
       parentobj.nextSibling.nextSibling.firstChild )
    if ( parentobj.nextSibling.nextSibling.firstChild.nodeValue == $lang.get('tags_btn_add_tag'))
      writeNoTags = true;
    
  ajaxPost(stdAjaxPrefix + '&_mode=deltag', 'tag_id=' + String(tag_id), function(ajax)
    {
      if ( ajax.readyState == 4 && ajax.status == 200 )
      {
        if ( ajax.responseText == 'success' )
        {
          for ( var i = 0; i < arrDelete.length; i++ )
          {
            try
            {
              parent.removeChild(arrDelete[i]);
            } catch(e) {}
          }
          if ( writeNoTags )
          {
            var node1 = document.createTextNode($lang.get('tags_lbl_no_tags'));
            var node2 = document.createTextNode(' ');
            insertAfter(parent, node1, parent.firstChild);
            insertAfter(parent, node2, node1);
          }
        }
        else
        {
          alert(ajax.responseText);
        }
      }
    });
}

window.ajaxTagToCat = function()
{
  if ( !catHTMLBuf )
    return false;
  var catbox = document.getElementById('mdgCatBox');
  if ( !catbox )
    return false;
  addtag_open = false;
  var linkbox = catbox.parentNode.firstChild.firstChild.nextSibling;
  linkbox.firstChild.nodeValue = $lang.get('tags_catbox_link');
  linkbox.onclick = function() { ajaxCatToTag(); return false; };
  catbox.innerHTML = catHTMLBuf;
  catHTMLBuf = false;
}

var keepalive_interval = false;

window.ajaxPingServer = function()
{
  ajaxGet(stdAjaxPrefix + '&_mode=ping', function(ajax)
    {
    });
}

window.ajaxToggleKeepalive = function()
{
  if ( readCookie('admin_keepalive') == '1' )
  {
    createCookie('admin_keepalive', '0', 3650);
    if ( keepalive_interval )
      clearInterval(keepalive_interval);
    var span = document.getElementById('keepalivestat');
    span.firstChild.nodeValue = $lang.get('adm_btn_keepalive_off');
  }
  else
  {
    createCookie('admin_keepalive', '1', 3650);
    if ( !keepalive_interval )
      keepalive_interval = setInterval('ajaxPingServer();', 600000);
    var span = document.getElementById('keepalivestat');
    span.firstChild.nodeValue = $lang.get('adm_btn_keepalive_on');
    ajaxPingServer();
  }
}

var keepalive_onload = function()
{
  if ( readCookie('admin_keepalive') == '1' )
  {
    if ( !keepalive_interval )
      keepalive_interval = setInterval('ajaxPingServer();', 600000);
    var span = document.getElementById('keepalivestat');
    span.firstChild.nodeValue = $lang.get('adm_btn_keepalive_on');
  }
  else
  {
    if ( keepalive_interval )
      clearInterval(keepalive_interval);
    var span = document.getElementById('keepalivestat');
    span.firstChild.nodeValue = $lang.get('adm_btn_keepalive_off');
  }
};

window.aboutKeepAlive = function()
{
  load_component(['messagebox', 'flyin', 'fadefilter']);
  new MessageBox(MB_OK|MB_ICONINFORMATION, $lang.get('user_keepalive_info_title'), $lang.get('user_keepalive_info_body'));
}

window.ajaxUpdateCheck = function(targetelement)
{
  if ( !document.getElementById(targetelement) )
  {
    return false;
  }
  var target = document.getElementById(targetelement);
  target.innerHTML = '';
  var img = document.createElement('img');
  img.src = cdnPath + '/images/loading.gif';
  img.alt = 'Loading...';
  target.appendChild(img);
  ajaxGet(makeUrlNS('Admin', 'Home/updates.xml'), function(ajax)
    {
      if ( ajax.readyState == 4 && ajax.status == 200 )
      {
        var releases = new Array();
        var update_available = false;
        if ( ajax.responseXML == null )
        {
          alert("Error fetching updates list:\n" + ajax.responseText);
          return false;
        }
        if ( ajax.responseXML.firstChild.tagName == 'enano' )
        {
          var enanotag = ajax.responseXML.firstChild;
          for ( var i = 0; i < enanotag.childNodes.length; i++ )
          {
            if ( enanotag.childNodes[i].tagName == 'error' )
            {
              alert(enanotag.childNodes[i].firstChild.nodeValue);
            }
            else if ( enanotag.childNodes[i].tagName == 'latest' )
            {
              // got <latest>
              var latesttag = enanotag.childNodes[i];
              for ( var j = 0; j < latesttag.childNodes.length; j++ )
              {
                var node = latesttag.childNodes[j];
                if ( node.tagName == 'release' )
                {
                  var releasedata = new Object();
                  for ( var k = 0; k < node.attributes.length; k++ )
                  {
                    releasedata[node.attributes[k].nodeName] = node.attributes[k].nodeValue;
                  }
                  releases.push(releasedata);
                }
                else if ( node.tagName == 'haveupdates' )
                {
                  update_available = true;
                }
              }
              break;
            }
          }
        }
        else
        {
          return false;
        }
        var thediv = document.getElementById(targetelement);
        thediv.innerHTML = '';
        if ( !thediv )
        {
          return false;
        }
        if ( releases.length > 0 )
        {
          thediv.className = 'tblholder';
          if ( update_available )
          {
            var infobox = document.createElement('div');
            infobox.className = 'info-box-mini';
            infobox.appendChild(document.createTextNode('An update for Enano is available. The newest release is highlighted below.'));
            infobox.style.borderWidth = '0';
            infobox.style.margin = '0 0 0 0';
            thediv.appendChild(infobox);
          }
          else
          {
            var infobox = document.createElement('div');
            infobox.className = 'info-box-mini';
            infobox.appendChild(document.createTextNode('No new updates are available. The latest available releases are shown below.'));
            infobox.style.borderWidth = '0';
            infobox.style.margin = '0 0 0 0';
            thediv.appendChild(infobox);
          }
          var table = document.createElement('table');
          table.setAttribute('border', '0');
          table.setAttribute('cellspacing', '1');
          table.setAttribute('cellpadding', '4');
          
          var tr = document.createElement('tr');
          
          var td1 = document.createElement('th');
          var td2 = document.createElement('th');
          var td3 = document.createElement('th');
          var td4 = document.createElement('th');
          
          td1.appendChild( document.createTextNode('Release type') );
          td2.appendChild( document.createTextNode('Version') );
          td3.appendChild( document.createTextNode('Code name') );
          td4.appendChild( document.createTextNode('Release notes') );
          
          tr.appendChild(td1);
          tr.appendChild(td2);
          tr.appendChild(td3);
          tr.appendChild(td4);
            
          table.appendChild(tr);
          
          var cls = 'row2';
          
          var j = 0;
          for ( var i in releases )
          {
            j++;
            if ( j > 5 )
              break;
            if ( update_available && j == 1 )
              cls = 'row1_green';
            else
              cls = ( cls == 'row1' ) ? 'row2' : 'row1';
            var release = releases[i];
            var tr = document.createElement('tr');
            
            var td1 = document.createElement('td');
            var td2 = document.createElement('td');
            var td3 = document.createElement('td');
            var td4 = document.createElement('td');
            
            td1.className = cls;
            td2.className = cls;
            td3.className = cls;
            td4.className = cls;
            
            if ( release.tag )
              td1.appendChild( document.createTextNode(release.tag) );
            
            if ( release.version )
              td2.appendChild( document.createTextNode(release.version) );
            
            if ( release.codename )
              td3.appendChild( document.createTextNode(release.codename) );
            
            if ( release.relnotes )
            {
              var a = document.createElement('a');
              a.href = release.relnotes;
              a.appendChild(document.createTextNode('View'));
              td4.appendChild( a );
            }
            
            tr.appendChild(td1);
            tr.appendChild(td2);
            tr.appendChild(td3);
            tr.appendChild(td4);
            
            table.appendChild(tr);
          }
          thediv.appendChild(table);
        }
        else
        {
          thediv.appendChild(document.createTextNode('No releases available.'));
        }
      }
    });
}

window.ajaxPluginAction = function(action, plugin_filename, btnobj)
{
  // if installing, uninstalling, or re-importing, confirm
  if ( action == 'install' || action == 'uninstall' || action == 'reimport' )
  {
    var prompt = miniPrompt(function(div)
      {
        var txtholder = document.createElement('div');
        txtholder.style.textAlign = 'center';
        txtholder.appendChild(document.createTextNode($lang.get('acppl_msg_confirm_' + action)));
        txtholder.appendChild(document.createElement('br'));
        txtholder.appendChild(document.createElement('br'));
        
        // create buttons
        var btn_go = document.createElement('a');
        btn_go.className = 'abutton abutton_red';
        btn_go.href = '#';
        btn_go._action = action;
        btn_go._filename = plugin_filename;
        btn_go._button = btnobj;
        btn_go.appendChild(document.createTextNode($lang.get('acppl_btn_' + action)));
        btn_go.style.fontWeight = 'bold';
        txtholder.appendChild(btn_go);
        
        // space
        txtholder.appendChild(document.createTextNode(' '));
        
        // cancel
        var btn_cancel = document.createElement('a');
        btn_cancel.className = 'abutton abutton_blue';
        btn_cancel.href = '#';
        btn_cancel.appendChild(document.createTextNode($lang.get('etc_cancel')));
        
        txtholder.appendChild(btn_cancel);
        div.appendChild(txtholder);
        
        btn_go.onclick = function()
        {
          ajaxPluginAction(this._action + '_confirm', this._filename, this._button);
          miniPromptDestroy(this);
          return false;
        }
        btn_cancel.onclick = function()
        {
          miniPromptDestroy(this);
          return false;
        }
      });
    return true;
  }
  action = action.replace(/_confirm$/, '');
  // white-out the plugin info box
  if ( btnobj )
  {
    var td = btnobj.parentNode.parentNode.parentNode.parentNode;
    var blackbox = whiteOutElement(td);
  }
  var request = toJSONString({
      mode: action,
      plugin: plugin_filename
    });
  ajaxPost(makeUrlNS('Admin', 'PluginManager/action.json'), 'r=' + ajaxEscape(request), function(ajax)
    {
      if ( ajax.readyState == 4 && ajax.status == 200 )
      {
        var response = String(ajax.responseText + '');
        if ( !check_json_response(response) )
        {
          handle_invalid_json(response);
          return false;
        }
        response = parseJSON(response);
        if ( response.success )
        {
          if ( blackbox )
          {
            blackbox.parentNode.removeChild(blackbox);
          }
          ajaxPage( namespace_list['Admin'] + 'PluginManager' );
          return true;
        } 
        // wait for fade effect to finish its run
        setTimeout(function()
          {
            miniPrompt(function(div)
              {
                if ( blackbox )
                {
                  blackbox.parentNode.removeChild(blackbox);
                }
                var txtholder = document.createElement('div');
                txtholder.style.textAlign = 'center';
                txtholder.appendChild(document.createTextNode(response.error));
                txtholder.appendChild(document.createElement('br'));
                txtholder.appendChild(document.createElement('br'));
                
                // close button
                var btn_cancel = document.createElement('a');
                btn_cancel.className = 'abutton abutton_red';
                btn_cancel.href = '#';
                btn_cancel.appendChild(document.createTextNode($lang.get('etc_ok')));
                
                txtholder.appendChild(btn_cancel);
                div.appendChild(txtholder);
                
                btn_cancel.onclick = function()
                {
                  miniPromptDestroy(this);
                  return false;
                }
              });
          }, 750);
      }
    });
}

window.ajaxReverseDNS = function(o, text)
{
  if(text) var ipaddr = text;
  else var ipaddr = o.innerHTML;
  rDnsObj = o;
  rDnsBannerObj = bannerOn('Retrieving reverse DNS info...');
  ajaxGet(stdAjaxPrefix+'&_mode=rdns&ip='+ipaddr, function(ajax) {
      if ( ajax.readyState == 4 && ajax.status == 200 )
      {
        off = fetch_offset(rDnsObj);
        dim = fetch_dimensions(rDnsObj);
        right = off['left'] + dim['w'];
        top = off['top'] + dim['h'];
        var thediv = document.createElement('div');
        thediv.className = 'info-box';
        thediv.style.margin = '0';
        thediv.style.position = 'absolute';
        thediv.style.top  = top  + 'px';
        thediv.style.display = 'none';
        thediv.style.zIndex = getHighestZ() + 2;
        thediv.id = 'mdgDynamic_rDnsInfoDiv_'+Math.floor(Math.random() * 1000000);
        thediv.innerHTML = '<b>Reverse DNS:</b><br />'+ajax.responseText+' <a href="#" onclick="elem = document.getElementById(\''+thediv.id+'\'); elem.innerHTML = \'\'; elem.style.display = \'none\';return false;">Close</a>';
        var body = document.getElementsByTagName('body');
        body = body[0];
        bannerOff(rDnsBannerObj);
        body.appendChild(thediv);
        thediv.style.display = 'block';
        left = fetch_dimensions(thediv);
        thediv.style.display = 'none';
        left = right - left['w'];
        thediv.style.left = left + 'px';
        thediv.style.display = 'block';
        fadeInfoBoxes();
      }
    });
}

function themeid_to_title(id)
{
  if ( typeof(id) != 'string' )
    return false;
  id = id.substr(0, 1).toUpperCase() + id.substr(1);
  id = id.replace(/_/g, ' ');
  id = id.replace(/-/g, ' ');
  return id;
}