function g(a) {return document.getElementById(a);};

function toggleCode() {
  var t = g('tBox').style.display != 'none';
  g('toolbar').getElementsByTagName('button')[0].style.display = t ? 'none' : 'inline';
  g('toolbar').getElementsByTagName('button')[1].innerHTML = t ? 'End Preview' : 'Preview';
  g('toolbar').getElementsByTagName('div')[0].style.display = t ? 'none' : 'block';
  g('toolbar').getElementsByTagName('div')[1].style.display = 'none';
  g('configure').style.display = t ? 'none' : 'block';
  
  // Show preview
  if (t) {
    var s = g('tBox').value.replace(/\n/g, "<br>");
    g('previewCode').innerHTML = s;
    g('tBox').style.display = 'none';
    g('previewCode').style.display = 'block';
  }
  // Close preview
  else {
    g('tBox').style.display = 'block';
    g('previewCode').style.display = 'none';
  }
}

function replaceQuotes() {
  var temp = g('tBox').value;
  
  // Reset quotes
  temp = temp.replace(/(\&(r|l)dquo;)|“|”/g, "\"");
  temp = temp.replace(/(\&(r|l)squo;)|’|‘/g, "\'");
  temp = temp.replace(/&hellip;|…/g, "...");
  temp = temp.replace(/&copy;|©/g, "(C)");
  temp = temp.replace(/&reg;|®/g, "(R)");
  temp = temp.replace(/&mdash;|—/g, "--");
  
  // Straight quotes
  if (g('toolbar').getElementsByTagName('input')[1].checked) {
    g('tBox').value = temp;
    return;
  }
  
  if (!g('presEntities').checked) {
    temp = temp.replace(/&/gi, "&amp;");
  }
  
  temp = temp.replace(/\.\.\./g, "&hellip;");
  temp = temp.replace(/\(C\)/gi, "&copy;");
  temp = temp.replace(/\(R\)/gi, "&reg;");
  temp = temp.replace(/--/g, "&mdash;");
  
  // Undoes unwanted comment conversion
  temp = temp.replace(/<!&mdash;/g, "<!--");
  temp = temp.replace(/&mdash;>/g, "-->");
  
  var b=temp.indexOf("&mdash;", 0);
  while (b!=-1) {
    var oTag = temp.indexOf('<', b);
    var cTag = temp.indexOf('>', b);
    
    // Reverse double dash within HTML
    if (oTag>cTag || (cTag>-1 && oTag<0)) {
      temp = temp.substring(0, b) + "--" + temp.substring(b+7);
    }

    // Find next dash
    b = temp.indexOf("&mdash;", b+1);
  }

  var REP = temp.split('');
  var finalString =  "";
  var openQuote = false, tagline = false, singleHTML = false;
  for (i=0; i<REP.length; i++) {
    
    // Ignores escaped double quotes
    if (REP[i] == "\"" && REP[i-1] == "\\") {
      finalString += "\"";
      continue;
    }
    // Ignore escaped single quotes
    if (REP[i] == "\'" && REP[i-1] == "\\") {
      finalString += "\'";
      continue;
    }
    
    // Checks to see if quote is HTML attribute.
    if (REP[i] == "\"" && REP[i-1] != "=") {
      // Closes already-opened quote.
      if (openQuote) {
        finalString += "&rdquo;";
        openQuote = false;
        continue;
      }
      // Opens a new quote.
      else if (!tagline) {
        finalString += "&ldquo;";
        openQuote = true;
        continue;
      }
      // Adds straight quote that closes HTML attribute.
      else {
        finalString += REP[i];
        tagline = false;
        continue;
      }
    }
    // Does not curl HTML attribute opening quote.
    else if (REP[i]=="\"" && !tagline) {
      finalString+=REP[i];
      tagline=true; continue;
    }
    // Ignores single quotes inside HTML attributes.
    else if (REP[i] == "\'" && !tagline) {
      if (singleHTML) {
        singleHTML = false;
        finalString += REP[i];
        continue;
      }
      else if (REP[i-1] == "=") {
        singleHTML = true;
        finalString += REP[i];
        continue;
      }
      else if (REP[i-1] == " ") {
        finalString += "&lsquo;";
        continue;
      }
      else {
        finalString += "&rsquo;";
        continue;
      }
    }
    finalString += REP[i];
  }
  
  // Preserve entities
  if (g('presEntities').checked) {
    g('tBox').value = finalString;
    return;
  }
  
  // From http://javascript.internet.com/snippets/convert-html-entities.html
  var t = document.createElement('textarea');
  t.innerHTML = finalString.replace(/</g, "&lt;").replace(/>/g, "&gt;");
  g('tBox').value = t.value;
}

window.onload = function() {
  g('toolbar').getElementsByTagName('div')[1].style.display = 'none';
  var t = g('controlButtons').getElementsByTagName('input');
  
  // Shade
  t[0].onclick = function() {
    var c = g('userArea').style.display != 'none';
    g('userArea').style.display = g('toolbar').style.display = c ? 'none' : 'block';
    c ? window.resizeTo(630, 70) : window.resizeTo(630, 280);
    this.src = c ? 'max.gif' : 'min.gif';
    this.alt = c ? 'Shade Down' : 'Shade Up';
  };
  
  // Close
  t[1].onclick = function() {
    window.close();
  };
  
  // Configure
  g('configure').style.left = g('toolbar').getElementsByTagName('div')[0].offsetWidth + 5 + "px";
  g('configure').onclick = function() {
    var c = g('toolbar').getElementsByTagName('div')[1];
    c.style.display = c.style.display == 'none' ? 'block' : 'none';
    g('toolbar').getElementsByTagName('div')[0].style.display = c.style.display == 'none' ? 'block' : 'none';
  };
  
  
  t = g('toolbar').getElementsByTagName('button');
  
  // Replace Quotes
  t[0].onclick = function() {
    g('toolbar').getElementsByTagName('div')[0].style.display = 'block';
    g('toolbar').getElementsByTagName('div')[1].style.display = 'none';
    replaceQuotes();
  };
  
  // Preview
  t[1].onclick = function() {
    toggleCode();
  };
};