var debug = 0;
var doSign = 1;
var line = new Array();

function count(str) {
  c = 0;
  s = str;
// Detect and handle apostrophes.
  re = /'/;
  if (re.test(s)) {
    // -n't only adds a syllable when it doesn't follow a vowel.
    re = /[^aeiou]n't$/i;
	if (re.test(s)) {
if (debug) {alert("n't")};
	  s = s.replace(/([^aeiou])n't$/i,"$1");
	  c++;
    }
	// subtract a syllable when 're or 've follows a vowel.
    re = /[aeiou]'[vr]e$/i;
	if (re.test(s)) {
if (debug) {alert("('[vr]e does not add a syllable.)")};
	  c--;
    }
	// 's only adds a syllable if it follows a ce, se, or z.
    re = /((ce)|(se)|z)'s$/i;
    if (re.test(s)) {
if (debug) {alert("'s")};
      s = s.replace(/((ce)|(se)|z)'s$/i,"$1");
      c++;
	}
  }
// Remove superfluous U's.
  s = s.replace(/(qu)|(gu([aei]))/gi,"g$3");
// Remove -ing and count it separately.  It interferes with "doing," "fleeing," etc.
  re = /(.+)ings?$/gi;
  if (re.test(s)) {
    s = s.replace(re,"$1");
	c++;
  }
// ...and sometimes Y.
  re = /^y[^aeiou]/i;
  if (re.test(s)) {
if (debug) {alert("y")};
    c++
  };
  re = /([^aeiou])y([^aeiou])/i;
  while (re.test(s)) {
    s = s.replace(re,"$1$2");
if (debug) {alert("y")};
    c++;
  }
  re = /[^aeiou]y$/i;
  if (re.test(s)) {
if (debug) {alert("y")};
    c++
  };
  re = /(a[aeiu])|(eau)|(e[aeiuy])|([ct]ial)|(ie)|((ci|ti)?ous)|(o[aeiouy])|(tion)|(sion)|(u[ey])|([aeiou])/i;
  while (re.test(s)) {
if (debug) {alert(RegExp.lastMatch)};
    s = s.replace(re,"");
    c++;
  }
  s = str;
// Strip off any suffix that might interfere with silent E detection.  (Don't add one to account for stripping it off; it's already been counted.)
  re = /(ful(ly?)?)|(ly)|(land)|(ments?)|(man)|(ness)|(less)|('[emrst])$/i;
  if (re.test(s)) {s = s.replace(re,"")};
// Detect silent -e, -es, -ed.
  re = /[aeiouy](([lmnrwy]?[^aeiou])|([gq]u)|(dg))e$/i;
  if (re.test(s)) {
    c--;
  } else {
    re = /[aeiouy](([^aeioucsx]h?)|([gq]u))es$/i;
    if (re.test(s)) {
      c--;
    } else {
      re = /[aeiouy](([lmnrwy]?[^aeioudt])|((t|s)?c?h)|([gq]u)|(dg))ed$/i;
      if (re.test(s)) {c--};
      re = /[aeiou]nce?$/i;
      if (re.test(s)) {c--};
	}
  }
  s = str;
// Vowelless syllables, like in -ism and Mc-.
  re = /(^mc)|(sm$)/i;
  if (re.test(s)) {c++};
// "littLest," etc.
  re = /[aeiouy]+[^aeiouy]+le((st)|r)$/i;
  if (re.test(s)) {
    c++
  } else {
    // -ette.
    re = /ettes?$/i;
    if (re.test(s)) {c--};
  }
// Handle the true exceptions to the dipthong and silent E conventions.
  s = str;
  re = /^([dp]iet)|(biped$)|(quadruped$)|(epitome$)|(Socrates$)|(arguabl)|(albeit)|(cooperat)|(segue)|(poem)|(poet)|(everyone)|(element)|(true[rs])|(nauseat)|(creat[^u])|(alien)/i;
  if (re.test(s)) {c++};
  re = /(gorgeous)|(people)|(cheesecake)|(^Worcester)|(^Gloucester)|(every)|(some.)|(favorite)|(fluor)|(^boing)|(business)|(^suit)/i;
  if (re.test(s)) {c--};
// Future enhancement: Words like "fire," "dual," "hour," "dial," "marked," "nausea" contain optional syllables.
//                     They've been counted using the lower value, so detect them and add a "soft" one.
  return c;
}

function total(line) {
  reWords = /[a-z\']+/i;
  var t = 0;
  while (reWords.test(line)) {
    t = t + count(RegExp.lastMatch);
    line = line.replace(reWords,"");
  }
  return t;
}

function validate() {
  s = document.forms[0].haiku.value;
  reLines = /^[^\r\n]+[\r\n]*/i;
  l = 0;
  line = new Array();
  var counts = new Array();
  while (reLines.test(s)) {
    line[l++] = RegExp.lastMatch;
	s = s.replace(reLines,"");
  }
  for (i in line) {
    counts[i] = total(line[i]);
  }
  expected = new Array("5","7","5");
  valid = 1;
  doColor = 1;
  for (i in counts) {
    if (document.getElementById) {
	  elm = document.getElementById("ct" + i);
	} else {
	  if (document.all) {
	    elm = document.all["ct" + i];
	  } else {
	    if (document.ids) {
		  elm = document.ids["ct" + i];
		} else {
		  doColor = 0;
		}
	  }
	}
	if (doColor) {
	  elm.innerHTML = counts[i];
	  if (counts[i] == expected[i]) {
		elm.style.color = "#009900";
	  } else {
		elm.style.color = "#FF6666";
		valid = 0;
	  }
	}
  }
  if (valid) {
    if (document.forms[0].sig.value == "") {
	  alert("Don't forget to enter your name.");
	  window.focus(document.forms[0].sig);
	  return;
	} 
    if (doSign) {sign()};
  } else {
	if (!doColor) {
	  alert("Syllable counts:\n   " + counts[0] + "\n   " + counts[1] + "\n   " + counts[2] + "\n\nIf this count is inaccurate, please let me know.");
	}
  }
}

function sign() {
  document.forms[1].auth.value = document.forms[0].sig.value;
  if (document.forms[0].url.value){
	document.forms[1].uri.value = document.forms[0].url.value;
  }
  re = /[\n\r]+/gm;
  h = document.forms[0].haiku.value.replace(re,'^');
  // remove trailing carets
  re = /\^+$/;
  document.forms[1].hku.value = h.replace(re,'');
  document.forms[1].submit();
}
