/*	Asciible.js by Jeremy Martin (blog.jeremymartin.name) 
	The code in this file is particular to the markup used in the Asciible project,
	but you are free to use and modify it to your needs.  Please just leave
	credit at the top. */

function asciible() {
	var markup = $('#textToConvert').val();
	var reg = /<|>|&|"/g;
	var startTime = new Date().getTime();
	
	/* ASCII Entities */
	
	/* Do & first to preserve other entities */
	if($('#preserveAscii').attr("checked") == true) {	
		markup = markup.replace(/&(?!(#\d{1,3};|(\w{1,5};)))/g,'&#38;');
	} else {
		markup = markup.replace(/&/g,'&#38;');
	}
	markup = markup.replace(/"/g,'&#34;')
		.replace(/'/g,'&#39;')
		.replace(/\</g,'&#60;')
		.replace(/\>/g,'&#62;')
		
		/* ISO 8859-1 Symbol Entities (ignore non-breaking space) */
		.replace(/¡/g,'&#161;')
		.replace(/¢/g,'&#162;')
		.replace(/£/g,'&#163;')
		.replace(/¤/g,'&#164;')
		.replace(/¥/g,'&#165;')
		.replace(/¦/g,'&#166;')
		.replace(/§/g,'&#167;')
		.replace(/¨/g,'&#168;')
		.replace(/©/g,'&#169;')
		.replace(/ª/g,'&#170;')
		.replace(/«/g,'&#171;')
		.replace(/¬/g,'&#172;')
		.replace(/®/g,'&#174;')
		.replace(/¯/g,'&#175;')
		.replace(/°/g,'&#176;')
		.replace(/±/g,'&#177;')
		.replace(/²/g,'&#178;')
		.replace(/³/g,'&#179;')
		.replace(/´/g,'&#180;')
		.replace(/µ/g,'&#181;')
		.replace(/¶/g,'&#182;')
		.replace(/·/g,'&#183;')
		.replace(/¸/g,'&#184;')
		.replace(/¹/g,'&#185;')
		.replace(/º/g,'&#186;')
		.replace(/»/g,'&#187;')
		.replace(/¼/g,'&#188;')
		.replace(/½/g,'&#189;')
		.replace(/¾/g,'&#190;')
		.replace(/¿/g,'&#191;')
		.replace(/×/g,'&#215;')
		.replace(/÷/g,'&#247;')
		
		/* ISO 8859-1 Character Entities*/
		.replace(/À/g,'&#192;')
		.replace(/Á/g,'&#193;')
		.replace(/Â/g,'&#194;')
		.replace(/Ã/g,'&#195;')
		.replace(/Ä/g,'&#196;')
		.replace(/Å/g,'&#197;')
		.replace(/Æ/g,'&#198;')
		.replace(/Ç/g,'&#199;')
		.replace(/È/g,'&#200;')
		.replace(/É/g,'&#201;')
		.replace(/Ê/g,'&#202;')
		.replace(/Ë/g,'&#203;')
		.replace(/Ì/g,'&#204;')
		.replace(/Í/g,'&#205;')
		.replace(/Î/g,'&#206;')
		.replace(/Ï/g,'&#207;')
		.replace(/Ð/g,'&#208;')
		.replace(/Ñ/g,'&#209;')
		.replace(/Ò/g,'&#210;')
		.replace(/Ó/g,'&#211;')
		.replace(/Ô/g,'&#212;')
		.replace(/Õ/g,'&#213;')
		.replace(/Ö/g,'&#214;')
		.replace(/Ø/g,'&#216;')
		.replace(/Ù/g,'&#217;')
		.replace(/Ú/g,'&#218;')
		.replace(/Û/g,'&#219;')
		.replace(/Ü/g,'&#220;')
		.replace(/Ý/g,'&#221;')
		.replace(/Þ/g,'&#222;')
		.replace(/ß/g,'&#223;')
		.replace(/à/g,'&#224;')
		.replace(/á/g,'&#225;')
		.replace(/â/g,'&#226;')
		.replace(/ã/g,'&#227;')
		.replace(/ä/g,'&#228;')
		.replace(/å/g,'&#229;')
		.replace(/æ/g,'&#230;')
		.replace(/ç/g,'&#231;')
		.replace(/è/g,'&#232;')
		.replace(/é/g,'&#233;')
		.replace(/ê/g,'&#234;')
		.replace(/ë/g,'&#235;')
		.replace(/ì/g,'&#236;')
		.replace(/í/g,'&#237;')
		.replace(/î/g,'&#238;')
		.replace(/ï/g,'&#239;')
		.replace(/ð/g,'&#240;')
		.replace(/ñ/g,'&#241;')
		.replace(/ò/g,'&#242;')
		.replace(/ó/g,'&#243;')
		.replace(/ô/g,'&#244;')
		.replace(/õ/g,'&#245;')
		.replace(/ö/g,'&#246;')
		.replace(/ø/g,'&#248;')
		.replace(/ù/g,'&#249;')
		.replace(/ú/g,'&#250;')
		.replace(/û/g,'&#251;')
		.replace(/ü/g,'&#252;')
		.replace(/ý/g,'&#253;')
		.replace(/þ/g,'&#254;')
		.replace(/ÿ/g,'&#255;');
	
	// convert new lines to <br />
	function insertBr(str, p1, p2, offset, s) {
		return '<br />' + str;
	}
	if($('#addBr').attr("checked") == true) {
		markup = markup.replace(/(\n\r)|(\r\n)|\n|\r/g,insertBr);
	}
	
	// strip new lines
	if($('#stripNewLine').attr("checked") == true) {
		if($('#replaceWithSpace').attr("checked") == true) {
			markup = markup.replace(/(\n\r)|(\r\n)|\n|\r/g,' ');
		} else {
			markup = markup.replace(/(\n\r)|(\r\n)|\n|\r/g,'');
		}
	}
	
	/* handle multi spaces */
	function getNonBreakingSpaces(str, p1, p2, offset, s) {
		var spaces = '';
		for(i = 0; i < str.length; i++) {
			spaces += '&nbsp;';
		}
		return spaces;
	}
	var spaceOption = $("input[@name='spaceOpts']:checked").val();
	if(spaceOption === '1') { //if convert to non-breaking 
		markup = markup.replace(/( ){2,}/g,getNonBreakingSpaces);
	} else if(spaceOption === '2') { //if trim to single space
		markup = markup.replace(/( ){2,}/g,' ');
	}
	
	/* handle tabs */
	var tabOption = $("input[@name='tabOpts']:checked").val();
	if(tabOption === '1') { //if convert to non-breaking spaces
		var spaces = '';
		for(i = 0; i < $('#tabSpaces').val(); i++) {
			spaces += '&nbsp;';
		}
		markup = markup.replace(/\t/g,spaces);
	} else if(tabOption === '2') { //if ascii encode
		markup = markup.replace(/\t/g,'&#09;');
	}
	
	var endTime = new Date().getTime();
	$('#safeText').val(markup);
	$('#divTagPreview').html(markup);
	$('#preTagPreview').html(markup);
	$('#totalTime').text((endTime - startTime) + ' milliseconds');
}

