/*
serialize.js - Written by Todd Moyer - Copyright 2010, 2011.

Unauthorized use is not permitted.
*/

function removeCRLF(inStr) {
		inStr = String(inStr).split(String.fromCharCode(10));
		inStr = inStr.join('');
		inStr = String(inStr).split(String.fromCharCode(13));
		inStr = inStr.join('');
		inStr = String(inStr).split(String.fromCharCode(12));
		inStr = inStr.join('');
		return inStr;
}

function serialize(doc, indentLevel, dontEncode, dontIndent) {
	//debugOut('dontIndent: dontIndent=' + dontIndent);
	var tabString = String.fromCharCode(9);
	var indentString = tabString;
	var newlineString = String.fromCharCode(13) + String.fromCharCode(10);
	
	function removeTabs(inStr) {
		inStr = String(inStr).split(tabString);
		inStr = inStr.join('');
		return inStr;
	}

	function removeAllSpecial(inStr) {
		var retStr = '';

		// ascii
		inStr = String(inStr).split(String.fromCharCode(145));
		inStr = inStr.join("'");
		
		inStr = String(inStr).split(String.fromCharCode(146));
		inStr = inStr.join("'");

		inStr = String(inStr).split(String.fromCharCode(147));
		inStr = inStr.join('"');

		inStr = String(inStr).split(String.fromCharCode(148));
		inStr = inStr.join('"');

		// unicode
		inStr = String(inStr).split(String.fromCharCode(8220));
		inStr = inStr.join('"');

		inStr = String(inStr).split(String.fromCharCode(8221));
		inStr = inStr.join('"');

		inStr = String(inStr).split(String.fromCharCode(8216));
		inStr = inStr.join("'");
		
		inStr = String(inStr).split(String.fromCharCode(8217));
		inStr = inStr.join("'");

		for (var i=0; i<inStr.length; i++) {
			var thisCharCode = inStr.charCodeAt(i);
			var thisChar = inStr.charAt(i);
			if ((thisCharCode > 31) && (thisCharCode < 127)) retStr += thisChar;
		}
		return retStr;
	}

	function removeSpace(inStr) {
		while (String(inStr).indexOf('  ') > -1) {
			inStr = String(inStr).split('  ');
			inStr = inStr.join(' ');
		}
		return inStr;
	}
	function replaceGTLT(inStr) {
		inStr = inStr.split('<');
		inStr = inStr.join('&lt;');
		inStr = inStr.split('>');
		inStr = inStr.join('&gt;');
		return inStr;
	}
	function replaceAmp(inStr) {
		inStr = inStr.split('&amp;');
		inStr = inStr.join('&');
		inStr = inStr.split('&');
		inStr = inStr.join('&amp;');

		//inStr = inStr.split('&amp;lt;');
		//inStr = inStr.join('&lt;');

		//inStr = inStr.split('&amp;gt;');
		//inStr = inStr.join('&gt;');
		return inStr;
	}
	
	if (indentLevel == null) indentLevel = 0;
	var serializedString = '';
	

	//alert(indentLevel);

	if (doc == null) return '';
	else if (doc.nodeName == null) {
		// a collection has probably been passed
		
		var docContents = $(doc);

		if (docContents == null) return '';
		else {
			for (var i=0; i<docContents.length; i++) {
				serializedString += serialize(docContents[i], indentLevel, dontEncode, dontIndent);
			}
		}
	}
	else {
		// this level is a single element - serialize it
		//alert(doc.nodeType);
		if (doc.nodeType == 3) {
			//serializedString += replaceAmp(replaceGTLT(removeSpace(removeCRLF(removeTabs($(doc).text())))));
			
			var strippedText = removeSpace(removeAllSpecial($(doc).text()));
			
			if ((strippedText == '') || (strippedText == ' ')) serializedString += '';
			else serializedString += replaceAmp(strippedText);

		}
		else {
			//debugOut('-- ' + doc.nodeName);
			if (dontEncode) serializedString += '<' + doc.nodeName;
			else serializedString += '&lt;' + doc.nodeName;

			var attrArray = doc.attributes;
			if (attrArray != null) {
				for (var j=0; j<attrArray.length; j++) {
					var attrValue = attrArray[j].value;
					attrValue = replaceAmp(attrValue);
					serializedString += ' ' + attrArray[j].name + '="' + attrValue + '"';
				}
			}

			try {
				var interior = serialize($(doc).contents(), indentLevel + 1, dontEncode, dontIndent);
			}
			catch(e) {
				var interior = ''
			}

			if ((interior == '') && (doc.nodeName != 'textarea') && (doc.nodeName != 'iframe')) {
				serializedString += ' />';
			}
			else {
				serializedString += '>';

				if (interior != '') {
					if (interior.indexOf(newlineString) > -1) {
						serializedString += newlineString;
						if (dontIndent != true) for (var j=0; j<=indentLevel; j++) serializedString += indentString;
					}
					if (interior.charAt(interior.length - 1) == indentString) interior = interior.substr(0, interior.length - 1);
					serializedString += interior;
				}
				
				
				// closing tag
				if (dontEncode) serializedString += '</' + doc.nodeName + '>';
				else serializedString += '&lt;/' + doc.nodeName + '>';

				serializedString += newlineString;
				if (dontIndent != true) for (var j=0; j<indentLevel; j++) serializedString += indentString;
			}

		}
	}

	
	return serializedString;
}
