// Replace quotes in a chunck of text with "smart" quotes
var numb = '0123456789';
var lwr = 'abcdefghijklmnopqrstuvwxyz';
var upr = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';

function isValid(parm,val) {
	if (parm == "") {
		return true;
	}
	for (i=0; i<parm.length; i++) {
		if (val.indexOf(parm.charAt(i),0) == -1) {
			return false;
		}
	}
	return true;
}

function isNumber(parm) {return isValid(parm,numb);}
function isLower(parm) {return isValid(parm,lwr);}
function isUpper(parm) {return isValid(parm,upr);}
function isAlpha(parm) {return isValid(parm,lwr+upr);}
function isAlphanum(parm) {return isValid(parm,lwr+upr+numb);} 

function smartenIt(what) {
	//take a node tree and smart quote-en it
	var i, s;
	if (what.nodeType == 3) {
		//we have a text node
		smartQuote(what);
	}
	else if (what.firstChild) {
		for (i = 0; i < what.childNodes.length; i++) {
			smartenIt(what.childNodes[i]);
		}
	}
}

function smartQuote(what) {
	var s = what.nodeValue;
	var outS = '', inSingle = false, inDouble = false, i = 0, j = 0, done = false;
	
	done  = (i == s.length);
	while (!done) {
		switch (s.charAt(i)) {
			case '"' :
				if ((i > 0) && (i < s.length-1)) {
					if (isAlphanum(s.charAt(i+1))) {
						outS += '“';
					}
					else if (isAlphanum(s.charAt(i-1))) {
						outS += '”'
					}
					else {
						outS += '"';
					}
				}
				break;
			case "'" :
				if ((i > 0) && (i < s.length-1)) {
					if (isAlphanum(s.charAt(i-1))) {
						outS += '’';
					}
					else if (isAlphanum(s.charAt(i+1))) {
						outS += '‘';
					}
					else {
						outS += "'";
					}
				}
				break;
			default :
				outS += s.charAt(i);
		}
		done = (++i == s.length);
	}
	what.nodeValue = outS;
}
