// webpad-related functions

var webPad = null; // global reference
var wpRefreshResult = -1; // overwritten by webpad refresh output

function loadJS(jsURL,onComplete,noRandomize) {
  var oJS = document.getElementById('jsData');
  // var oParent = document.getElementsByTagName('head')[0]; // oParent.removeChild() blows up when oParent is head tag.
  var oParent = document.getElementsByTagName('body')[0];
  if (oJS) {
    try {
      oParent.removeChild(oJS);
    } catch(e) {
      window.status = 'loadJS: removeChild exception.';
      setTimeout("window.status=''",2000);
      return false;
    }
  }
  oJS = document.createElement('script');
  oJS.type = 'text/javascript';
  oJS.id = 'jsData';
  if (!onComplete) {
    alert('loadJS: no onComplete handler.');
    return false;
  }
  oJS.onJSComplete = onComplete;
  oJS.onJSReadyStateChange = function() {
    if (isIE) {
      if (this.readyState == 'loaded' || this.readyState == 'complete') {
        this.onreadystatechange = function() { return false; }
        this.onJSComplete();
      }
    } else {
      this.onload = function() { return false; }
      this.onJSComplete();
    }
  }
  if (isIE) {
    oJS.onreadystatechange = oJS.onJSReadyStateChange;
  } else {
    oJS.onload = oJS.onJSReadyStateChange;
  }
  var argSeparator = jsURL.indexOf('?')+1?'&':'?';

  oJS.src = jsURL+(!noRandomize?argSeparator+'r='+parseInt(Math.random()*65535):'');
  oParent.appendChild(oJS);

}

function WebPad(containerID) {
  var self = this;

  this.baseHref = 'http://www.schillmania.com/interactive/webpad/';
  this.container = document.getElementById(containerID);
  this.content = (isIE && isMac)?null:document.getElementById(containerID+'-container');
  if (this.content) {
    this.form = this.container.getElementsByTagName('form')[0];
    this.btnSubmit = this.form.getElementsByTagName('button')[1];
    this.status = document.getElementById('wpStatus');
  }
  this.statusTypes = ['Idle','Editing','Submitting ...','Refreshing ...','Post successful','Post failed','Post/refresh broken on IE:mac.'];
  this.currentStatus = -1;

  this.setStatus = function(s) {
    if (self.currentStatus != s) {
      self.currentStatus = s;
      if (self.status) self.status.childNodes[0].nodeValue = self.statusTypes[self.currentStatus];
    }
  }

  this.refresh = function() {
    if (navigator.appName.toLowerCase().indexOf('internet explorer')+1 && navigator.platform.toLowerCase().indexOf('mac')+1) {
      if (self.content && !self.content.innerHTML) {
        self.content.innerHTML = getMessages();
      }
      self.setStatus(6);
      return false;
    }
    self.setStatus(3);
    loadJS(self.baseHref+'messages.js',self.refreshComplete);
  }

  this.refreshComplete = function() {
    if (self.content) {
      // if (APP_XHTML) {
        removeChildNodes(self.content);
        self.getMessagesDOM();
      // } else {
      //   self.content.innerHTML = getMessages();
      // }
      // transform PNG icons in anchors
      /*
      pngs = getElementsByClassName('png','a',self.content);
      for (i=0; i<pngs.length; i++) {
        pngHandler.transform(pngs[i]);
      }
      */
    }

    // Add recent Webpad posts to News tab
    if (tabContent[0]) { // test for existence of tabContent - may not if firing immediately after load via addEventHandler()
      wpTarget = tabContent[0].getElementsByTagName('ul')[1];
      wpTargetElements = wpTarget.getElementsByTagName('li');
      removeChildNodes(wpTarget);
      for (i=0;i<5;i++) {
        wpParent = document.createElement('li');
        wpA = document.createElement('a');
        wpA.id = 'entryWP'+i;
        wpA.href = 'content/react/webpad/';
        // wpA.onmouseover = contentManager.mouseoverHandler;
        wpA.onclick = contentManager.clickHandler;
        wpA.className = 'webPad';
        wpName = uName[dt.length-i-1]||'Anonymous';
        if (wpName.length>20) wpName = wpName.substr(0,18)+'..';
        wpSub = sub[dt.length-i-1]||'[ no subject ]';
        if (wpSub.length>25) wpSub = wpSub.substr(0,23)+'..';
        wpAText = document.createTextNode(wpName+': '+wpSub);
        wpA.appendChild(wpAText);
        wpParent.appendChild(wpA);
        wpTarget.appendChild(wpParent);
      }
    }

    if (wpRefreshResult<0) {
      self.setStatus(0);
    } else {
      // refresh due to post (wpRefreshResult >= 0)
      if (wpRefreshResult>0) {
        // post successful
        self.setStatus(4);
        self.form.reset();
        setTimeout("webPad.btnSubmit.disabled = false;webPad.refresh()",2000);
      } else {
        self.setStatus(5);
        self.btnSubmit.disabled = false;
      }
      wpRefreshResult = -1;
    }
  }

  this.focus = function() {
    self.setStatus(1);
  }

  this.blur = function() {
    self.setStatus(0);
  }

  this.init = function() {
    // set event handlers etc. if applicable
    if (!self.form) {
      // if form not available, refresh and ignore
      self.refresh();
      return false;
    }
    self.inputs = self.form.getElementsByTagName('input');
    for (i=0; i<this.inputs.length; i++) {
      self.inputs[i].onfocus = self.focus;
      self.inputs[i].onblur = self.blur;
    }
    // text area must be added manually for some reason.
    document.getElementById('bodyText').onfocus = self.focus;
    document.getElementById('bodyText').onblur = self.blur;
    document.getElementById('bodyText').innerText = ''; // clear textarea (XSLT leaves empty space)
    self.form.onsubmit = function() {
      self.setStatus(2);
      self.submitHandler();
      return false;
    }
    self.form.onreset = function() {
      self.btnSubmit.enabled = true; 
    }
    self.refresh();
  }

  this.submitHandler = function() {
    self.params = '';
    self.formElements = self.form.getElementsByTagName('div')[0].childNodes;
    for (i=0; i<self.formElements.length; i++) {
      if (self.formElements[i].name) {
        this.params += (self.params.length?'&':'')+self.formElements[i].name+'='+escape(self.formElements[i].value);
      }
    }
    loadJS(self.baseHref+'index.php?'+self.params,self.refresh,1);
    self.btnSubmit.disabled = true;
  }

  this.getMessagesDOM = function() {
    // New funky (yet verbose) DOM method
    if (!sub.length) return '[ data unavailable ]';
    var i = dt.length-1;
    var msgLimit = 10;
    var counter = 0;

    do { // reverse order
      if (sub[i] && dt[i] && cHr[i] && cMin[i] && tStr[i]) { // if minimal data exists
        msgC = document.createElement('div');
        msgC.className = 'message'+((counter+1)%2==0?' altcolor':'');

        msgCH = document.createElement('div');
        msgCH.className = 'header';

        msgCS = document.createElement('div');
        msgCS.className = 'subject';
        msgCStxt = document.createTextNode(' '+sub[i]);
        msgCS.appendChild(msgCStxt);
        msgCH.appendChild(msgCS);

        msgCT = document.createElement('span');
        msgCTtxt = document.createTextNode(dt[i]+' ');
        msgCT.appendChild(msgCTtxt);

        msgCTI = document.createElement('img');
        msgCTI.src = 'image/react/webpad/clock/'+cHr[i]+'_'+cMin[i]+'.gif';
        msgCTI.alt = tStr[i];
        msgCTI.title = tStr[i];
        msgCTI.style.paddingRight = '5px';
        msgCT.appendChild(msgCTI);

        msgCH.appendChild(msgCT);

        msgClr = document.createElement('div');
        msgClr.className = 'clear';
        msgClr.style.visibility = 'hidden';
        msgClrTxt = document.createTextNode('*');
        msgClr.appendChild(msgClrTxt);
        msgCH.appendChild(msgClr);

        msgC.appendChild(msgCH);

        msgP = document.createElement('p');

        if (APP_XHTML) {
          msgP.appendChild(document.importNode(new DOMParser().parseFromString('<div>'+txt[i]+'</div>', "text/xml").documentElement.childNodes[0],true));
        } else {
          msgP.innerHTML = txt[i];
        }

        msgC.appendChild(msgP);

        msgS = document.createElement('div');
        msgS.className = 'signature';
        msgStxt = document.createTextNode('- ');
        msgS.appendChild(msgStxt);
        msgSS = document.createElement('span');
        msgSStxt = document.createTextNode(uName[i]);
        msgSS.appendChild(msgSStxt);
        msgS.appendChild(msgSS);

        msgC.appendChild(msgS);

        if (uURL[i] && uURL[i] != 'http://') {
          msgA = document.createElement('a');
          msgA.href = uURL[i];
          msgA.title = uURL[i];
          msgA.className = 'png';
          msgAtxt = document.createTextNode(' ');
          msgA.appendChild(msgAtxt);
          msgC.appendChild(msgA);
        }

        msgClr2 = document.createElement('div');
        msgClr2.style.visibility = 'hidden';
        msgClr2.className = 'clear';
        msgClrTxt2 = document.createTextNode('*');
        msgClr2.appendChild(msgClrTxt2);
        msgC.appendChild(msgClr2);

      }
      self.content.appendChild(msgC);
      i--;
      counter++;
    } while (i >= 0 && (counter < msgLimit))
  }
  this.init();
}

// global init function

function webPadInit(container) {
  // create new webPad object (overwrite existing too - get new form references etc.)
  // set timeout for IE when browsing directly to webpad page, /content/react/webpad/ - causes "operation aborted" error otherwise (?)
  // likely due to timing error. (webPadInit() fires from inline addEventHandler() call in article XML before rest of content - hence, nav is not updated.)
  setTimeout("webPad = new WebPad('"+(container||'webpad')+"')",20);
}

// Revised messagelib.js
// Makes extensive use of span/div elements combined with CSS rather than tables
// Spring 2003

// Declare message structure
var sub = [];
var dt = [];
var cHr = [];
var cMin = [];
var tStr = [];

var linkImage = new Image();
linkImage.src = 'image/react/webpad/link_1.gif'; // preload link image

function openSite() {
  window.open(event.srcElement.url,'popupWindow');
}

function getMessages() {
  // Legacy innerHTML-style method
  if (!sub.length) return '[ data unavailable ]';
  var msgCode = '';
  var i = dt.length-1;
  var msgLimit = 10;
  var counter = 0;
  do { // reverse order
    if (sub[i] && dt[i] && cHr[i] && cMin[i] && tStr[i]) { // if minimal data exists

      var clr = '<div class="clear"> </div>';

      msgCode += '<div class="message'+((counter+1)%2==0?' altcolor':'')+'">';

      msgCode += ' <div class="header">';
      msgCode += '  <div class="subject">'+sub[i]+'</div>';
      msgCode += '  <span>'+dt[i]+' <img src="image/react/webpad/clock/'+cHr[i]+'_'+cMin[i]+'.gif" alt="" title="'+tStr[i]+'" /> </span>';
      msgCode += clr;
      msgCode += ' </div>';

      msgCode += ' <p>'+txt[i]+'</p>';

      msgCode += ' <div class="signature">- <span>'+uName[i] +'</span></div>';

      if (uURL[i] && uURL[i] != 'http://') {
        msgCode += '<a href="'+uURL[i]+'" title="'+uURL[i]+'" class="png"> </a>';
      }

      msgCode += clr+'</div>\n';

    }
    i--;
    counter++;
  } while (i >= 0 && (counter < msgLimit))

  return msgCode;
}


