function getXMLHTTPRequest()
{
  var xRequest = null;
  if (window.XMLHttpRequest) {
    xRequest = new XMLHttpRequest();
  } else if (typeof ActiveXObject != "undefined") {
    xRequest = new ActiveXObject("Microsoft.XMLHTTP");
  }
  return xRequest;
}

function sendRequest(url, params, httpMethod)
{
  if (!httpMethod) {
    httpMethod = "POST";
  }
  var req = getXMLHTTPRequest();
  if (req) {
    req.open(httpMethod, url, true);
    req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    req.send(params);
  }
}

var first_word;

var littleWords = new Array("to", "in", "the", "of", "from", "a", "as", "an", "for", "and", "but", "with", "vs.", "or", "by", "if", "on", "at");

var allCaps = new Array("aba", "pdf", "html", "xml", "fcc", "nchica", "hipaa", "glb", "erisa", "ftc", "eeo", "edgar", "osha", "cobra", "eeoc", "irs", "lp", "sec", "u.s.", "uk", "ec", "cmbs", "epa", "mtv", "dvd", "aol", "jpeg", "gif", "ftp", "sms");

function changeCaseOnFirstBlur(textarea) {
    if (!textarea.alreadyBlurred) {
		changeCase(textarea);
		if (textarea.value.length > 0) {
			textarea.alreadyBlurred = true;
		}
	}
}

function changeCase(textarea) {
	first_word = true;
	var s = textarea.value;

	var str = s.toLowerCase();
	var tokens = new Array();
	tokens = str.split(" ");

	for (var i = 0; i < tokens.length; ++i) {
		var pattern = /(^[\'\"]?)(\w)([\w]*)([\.\',:;]?)(.*)/;
		var word = tokens[i];
		var result = pattern.exec(word);
		if (result != null) {
			tokens[i] = toTitleCase(result, littleWords, allCaps);
		}
		first_word = getFirstWord(tokens[i]);
	}

	var currLength = 0;
	for (var i = 0; i < tokens.length; i++) {
		currLength += tokens[i].length;
	}
	currLength += tokens.length - 1;

	s = tokens.join(" ");
	textarea.value = s;
}

function getFirstWord(word) {
	var ret = ( word.charAt(word.length-1) == ":");
	return ret;
}

function isInGroup(word, groupOfWords) {
//	word = word.replace(/:/, "");
	for (var i = 0; i < groupOfWords.length; ++i) {
		if (groupOfWords[i] == word)
			return true;
	}
	return false;
}

function getCase(word, littleWords, allCaps) {
	if (isInGroup(word, littleWords)) {
		return 1;	//return 1 if it is a little word;
	}
	if (isInGroup(word, allCaps)) {
		return 2;	//return 2 if this is an allcaps word;
	}
	return 3;		//return 3 for all other words;
}

function toTitleCase(result, littleWords, allCaps) {
	var word_temp, word_result;
//	result[0] contains the entire match
//	result[1] contains the (leading) ["'] (if any)
//	result[2] contains the first letter
//	result[3] contains the rest of the letters
//	result[4] contains the trailing punctuation (if any)
//	result[5] conains the trailing stuff and junk (if any)

	word_temp = result[2] + result[3];
	var word_case = getCase(word_temp, littleWords, allCaps);

	switch (word_case) {
		case 1:
			if (first_word) {
				first_word = false;
				word_result = result[2].toUpperCase() + result[3];
			} else {
				word_result = word_temp;
			}
			break;
		case 2:
			word_result = word_temp.toUpperCase();
			break;
		case 3:
			word_result = result[2].toUpperCase() + result[3];
			break;
	}

	word_result = result[1] + word_result;
	for (var i = 4; i < result.length; i++) {
		word_result += result[i];
	}


	return word_result;
}

