<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>ThomasTsoi.com &#187; PHP Scripts</title>
	<atom:link href="http://www.thomastsoi.com/category/software/php-scripts/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.thomastsoi.com</link>
	<description>My World, My Rules.</description>
	<lastBuildDate>Fri, 29 Apr 2011 09:46:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Fonoguru</title>
		<link>http://www.thomastsoi.com/software/fonoguru/</link>
		<comments>http://www.thomastsoi.com/software/fonoguru/#comments</comments>
		<pubDate>Tue, 27 Mar 2007 05:53:52 +0000</pubDate>
		<dc:creator>Thomas Tsoi</dc:creator>
				<category><![CDATA[PHP Scripts]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[IPA]]></category>
		<category><![CDATA[phonetics]]></category>
		<category><![CDATA[phonology]]></category>

		<guid isPermaLink="false">http://www.thomastsoi.com/?p=555</guid>
		<description><![CDATA[Let Fonoguru solve your phonology assignment! Simply input a set of phonetic data, and click a button, Fonoguru will automagically determine whether two or more phones are separate phonemes or allophones of the same phoneme, and state the conditioning environment for you.]]></description>
			<content:encoded><![CDATA[
<script language="JavaScript">

////////////////////////////////////////////////////////////////////
// Javascript from Randy L. Taylor
var globalCursorPos = 0; // global variabe to keep track of where the cursor was

//sets the global variable to keep track of the cursor position
function setCursorPos() {
	if (navigator.appName == "Microsoft Internet Explorer") {
		globalCursorPos = getCursorPos(document.fonoguru.input);
	}
}

//This function returns the index of the cursor location in
//the value of the input text element
//It is important to make sure that the sWeirdString variable contains
//a set of characters that will not be encountered normally in your
//text
function getCursorPos(textElement) {
	if (navigator.appName == "Microsoft Internet Explorer") {

		//save off the current value to restore it later,
		var sOldText = textElement.value;

		//create a range object and save off it's text
		var objRange = document.selection.createRange();
		var sOldRange = objRange.text;

		//set this string to a small string that will not normally be encountered
		var sWeirdString = '#%~';

		//insert the weirdstring where the cursor is at
		objRange.text = sOldRange + sWeirdString;
		objRange.moveStart('character', (0 - sOldRange.length - sWeirdString.length));

		//save off the new string with the weirdstring in it
		var sNewText = textElement.value;

		//set the actual text value back to how it was
		objRange.text = sOldRange;

		//look through the new string we saved off and find the location of
		//the weirdstring that was inserted and return that value
		for (i=0; i <= sNewText.length; i++) {
			var sTemp = sNewText.substring(i, i + sWeirdString.length);
			if (sTemp == sWeirdString) {
				var cursorPos = (i - sOldRange.length);
				return cursorPos;
			}
		}
	}
}

//this function inserts the input string into the textarea
//where the cursor was at
function insertString(stringToInsert) {
	isDigraph = false;
	for (i=0; i<diacritics.length; i++)
		if (stringToInsert == diacritics[i]) isDigraph = true;

	if (navigator.appName == "Microsoft Internet Explorer") {
		if (globalCursorPos > 0 || !isDigraph) {
			lastIsDigraph = false;
			for (i=0; i<diacritics.length; i++)
				if (document.fonoguru.input.value.charAt(globalCursorPos-1) == diacritics[i]) lastIsDigraph = true;

			if (!lastIsDigraph || !isDigraph) {
					var firstPart = document.fonoguru.input.value.substring(0, globalCursorPos);
					var secondPart = document.fonoguru.input.value.substring(globalCursorPos, document.fonoguru.input.value.length);
					document.fonoguru.input.value = firstPart + stringToInsert + secondPart;
					globalCursorPos += stringToInsert.length;
			}
		}
	}
	else {
		lastIsDigraph = false;
		for (i=0; i<diacritics.length; i++)
			if (document.fonoguru.input.value.charAt(document.fonoguru.input.value.length-1) == diacritics[i]) lastIsDigraph = true;

		if (!lastIsDigraph || !isDigraph) {
			document.fonoguru.input.value = document.fonoguru.input.value + stringToInsert;
		}
	}

}
// End set cursor
////////////////////////////////////////////////////////////////////

var diacritics = new Array("'", "’", ":", "ː", "̥", "̤", "̪", "̬", "̰", "̺", "ʰ", "̼", "̻", "̹", "ʷ", "̃", "̜", "ʲ", "ⁿ", "̟", "ˠ", "ˡ", "̠", "ˤ", "̚", "̈", "̴", "̽", "̝", "̩", "̞", "̯", "̘", "˞", "̙");


function updateList(frm) {
	chars = new Array();
	
	if (frm.input.value.match(/[ \[\]\{\}\$\^\*\.\+\?\-\(\)]/)) {
		alert("The data contains illegal characters, they will be automatically removed.");
		frm.input.value = frm.input.value.replace(/[ \[\]\{\}\$\^\*\.\+\?\-\(\)]/g, "");
	}
	
	if (frm.replace.checked == true) {
		frm.input.value = frm.input.value.replace(/g/g, "ɡ");
		frm.input.value = frm.input.value.replace(/B/g, "ʙ");
		frm.input.value = frm.input.value.replace(/G/g, "ɢ");
		frm.input.value = frm.input.value.replace(/N/g, "ɴ");
		frm.input.value = frm.input.value.replace(/R/g, "ʀ");
		frm.input.value = frm.input.value.replace(/ː/g, ":");
		frm.input.value = frm.input.value.replace(/’/g, "'");
	}
	
	if (frm.digraph.checked == true) {
		frm.input.value = frm.input.value.replace(/ts/g, "ʦ");
		frm.input.value = frm.input.value.replace(/dz/g, "ʣ");
		frm.input.value = frm.input.value.replace(/tʃ/g, "ʧ");
		frm.input.value = frm.input.value.replace(/dʒ/g, "ʤ");
	 }
	 
	text = frm.input.value;
	text = text.replace(/[\n\r ]/g, "");

	while (text.length > 0) {
		numGraph = 1;
		for (i=0; i<diacritics.length; i++) {
			if (text.charAt(1) == diacritics[i]) numGraph = 2;
			}

		chars.push(text.substr(0, numGraph));
		regex = text.substr(0, numGraph) + "+(?!["+ diacritics.join("") +"])";
		text = text.replace(new RegExp(regex, "g"), "");
		}

	chars.sort();

	for (i=frm.phone1.options.length-1;i>=0;i--) {
		frm.phone1.options[i] = null;
		frm.phone2.options[i] = null;
		frm.phone3.options[i] = null;
		frm.phone4.options[i] = null;
		frm.phone5.options[i] = null;
		}
	
	frm.phone1.options[0] = new Option("", "", false, false);
	frm.phone2.options[0] = new Option("", "", false, false);
	frm.phone3.options[0] = new Option("", "", false, false);
	frm.phone4.options[0] = new Option("", "", false, false);
	frm.phone5.options[0] = new Option("", "", false, false);

	for (i=0;i<chars.length;i++) {
		frm.phone1.options[i+1] = new Option(chars[i], chars[i], false, false);
		frm.phone2.options[i+1] = new Option(chars[i], chars[i], false, false);
		frm.phone3.options[i+1] = new Option(chars[i], chars[i], false, false);
		frm.phone4.options[i+1] = new Option(chars[i], chars[i], false, false);
		frm.phone5.options[i+1] = new Option(chars[i], chars[i], false, false);
		}
	}

function insert(symbol) {
	insertString(symbol);
	updateList(document.fonoguru);
	return false;
	}

function highlightRange(num) {
	color = 'gold';
	orig_color = 'white';
		
	if (num < 0) {
		minus1.style.color = orig_color;
		minus2.style.color = orig_color;
		minus3.style.color = orig_color;
		minus4.style.color = orig_color;
		
		minus1.style.color = color;
		if (num < -1) minus2.style.color = color;
		if (num < -2) minus3.style.color = color;
		if (num < -3) minus4.style.color = color;
		}
	else {
		plus1.style.color = orig_color;
		plus2.style.color = orig_color;
		plus3.style.color = orig_color;
		plus4.style.color = orig_color;
		
		plus1.style.color = color;
		if (num > 1) plus2.style.color = color;
		if (num > 2) plus3.style.color = color;
		if (num > 3) plus4.style.color = color;
		}
	}

function dehighlightRange() {
	color = 'gold';
	orig_color = 'white';
	
	num = document.fonoguru.from.value;
	minus1.style.color = orig_color;
	minus2.style.color = orig_color;
	minus3.style.color = orig_color;
	minus4.style.color = orig_color;
	minus1.style.color = color;
	if (num < -1) minus2.style.color = color;
	if (num < -2) minus3.style.color = color;
	if (num < -3) minus4.style.color = color;

	num = document.fonoguru.to.value;
	plus1.style.color = orig_color;
	plus2.style.color = orig_color;
	plus3.style.color = orig_color;
	plus4.style.color = orig_color;
	plus1.style.color = color;
	if (num > 1) plus2.style.color = color;
	if (num > 2) plus3.style.color = color;
	if (num > 3) plus4.style.color = color;
	}

function setRange(num) {
	if (num < 0) {
		document.fonoguru.from.value = num;
		}
	else {
		document.fonoguru.to.value = num;
		}
	}


function loadData(frm) {
	data = frm.data.options[frm.data.selectedIndex].value;
	
	var e = document.createElement("script");
	e.src = "/wp-content/custom/fonoguru/load_data.php?"+data;
	e.type="text/javascript";
	document.getElementsByTagName("head")[0].appendChild(e);
	
	}

</script>

<style>
#fonoguru {
	font: 8pt Verdana; 
	width: 900px;
	height: 550px; 
	padding: 20px; 
	border: 4px solid #0d1c3c;
	background-color: #38435B;
	background-image: url(/wp-content/custom/fonoguru/images/fonoguru-bg.jpg);	
	background-repeat: no-repeat;
	background-position: right top;
}
#fonoguru span.text {font: bold 8pt Verdana; color: black;}
#fonoguru span.title {font: bold 8pt Verdana; color: white}
#fonoguru table {border-collapse: collapse !important;}
#fonoguru td {border: 0px;}
#fonoguru .ipacell {
	border: 1px solid black !important;
	vertical-align: middle;
	}
#fonoguru .ipacell td {
	vertical-align: middle;
	}
#fonoguru td.ipa  {
	width: 20px; 
	cursor: pointer; 
	text-align: center; 
	padding: 0px; 
	color: white; 
	background-color: transparent;
	font-size: 12pt; 
	font-family: "Doulos SIL", "TITUS Cyberbit Basic", "Gentium", "Junicode", "Cardo", "Aborigonal Serif", "Arial Unicode MS"
}
#fonoguru td.ipa:hover  {
	color: black; 
	background-color: gold;
}

#fonoguru td.enter  {
	cursor: pointer; 
	color: white; 
	background-color: transparent;
}
#fonoguru td.enter:hover  {
	color: black; 
	background-color: gold;
}

#fonoguru td.emptyipa  {width: 20px; padding: 0px; color: white; font-size: 12pt; font-family: "Doulos SIL", "TITUS Cyberbit Basic", "Gentium", "Junicode", "Cardo", "Aborigonal Serif", "Arial Unicode MS"}
#fonoguru a {text-decoration: none; color: white}

#panel {
	float: left;
	width: 214px;
	height: 520px;
	background-image: url(/wp-content/custom/fonoguru/images/fonoguru-panel.jpg);	
	background-repeat: no-repeat;
	margin: 0px;
}
#buttons {
	float: left;
	width: 160px;
	height: 520px;
	margin: 0px;
}
#chart {
	float: left;
	width: 526px;	
	height: 520px;
	margin: 0px;
}

#submitimage {
	background-image: url(/wp-content/custom/fonoguru/images/fonoguru_15.gif);
	width: 105px;
	height: 110px;
	cursor: pointer;
}
#submitimage:hover {
	background-image: url(/wp-content/custom/fonoguru/images/fonoguru_15-over.gif);
}

#panel textarea {
	margin: 60px 0px 0px 25px;
}

#buttons #choice {
	margin-top:50px;	
}

#buttons #choice .phone_select {
	display: block;
	height:	40px;
	background-image: url(/wp-content/custom/fonoguru/images/fonoguru-phone.jpg);	
	background-repeat: no-repeat;
	background-position: 0px 0px;
	padding-left: 30px;
	padding-top: 10px;
}



</style>

<div id="fonoguru">

<form action="/category/software/php-scripts/feed/" method=post name="fonoguru">

	<div id="fono">
		<div id="panel"><textarea name="input" onChange="updateList(this.form); setCursorPos()" onClick="setCursorPos()" style="border: 1px solid #1F2633; background-color: transparent; color: white; font: 10pt Doulos SIL; width: 172px; height: 420px; scrollbar-face-color:#405176; scrollbar-track-color:#66738E; scrollbar-arrow-color:#000000; scrollbar-shadow-color:#222222; scrollbar-dark-shadow-color:#000000; scrollbar-3dlight-color:#627295; scrollbar-highlight-color:#8291B0"></textarea></div>	
		<div id="buttons">
			<div id="choice">
			<div class="phone_select"><span class=text>phone 1:&nbsp;</span><select name=phone1 style="background-color: #66738E; width: 40px; font: 10pt Doulos SIL"></select></div>
			<div class="phone_select"><span class=text>phone 2:&nbsp;</span><select name=phone2 style="background-color: #66738E; width: 40px; font: 10pt Doulos SIL"></select></div>
			<div class="phone_select"><span class=text>phone 3:&nbsp;</span><select name=phone3 style="background-color: #66738E; width: 40px; font: 10pt Doulos SIL"></select></div>
			<div class="phone_select"><span class=text>phone 4:&nbsp;</span><select name=phone4 style="background-color: #66738E; width: 40px; font: 10pt Doulos SIL"></select></div>
			<div class="phone_select"><span class=text>phone 5:&nbsp;</span><select name=phone5 style="background-color: #66738E; width: 40px; font: 10pt Doulos SIL"></select></div>
			</div>
		
			<div style="margin: 20px 0px 20px 20px;">
			<span style="font: bold 8pt Verdana; color: white">search range:</span><br />
			<span style="font: bold 8pt Arial; cursor: pointer; color: white"><span id=minus4 onMouseOver="highlightRange(-4);" onMouseOut="dehighlightRange();" onClick="setRange(-4);">@ </span><span id=minus3 onMouseOver="highlightRange(-3);" onMouseOut="dehighlightRange();" onClick="setRange(-3);">@ </span><span id=minus2 onMouseOver="highlightRange(-2);" onMouseOut="dehighlightRange();" onClick="setRange(-2);">@ </span><span id=minus1 onMouseOver="highlightRange(-1);" onMouseOut="dehighlightRange();" onClick="setRange(-1);">@ </span><span style="color: gold">_</span><span id=plus1 onMouseOver="highlightRange(+1);" onMouseOut="dehighlightRange();" onClick="setRange(+1);"> @</span><span id=plus2 onMouseOver="highlightRange(+2);" onMouseOut="dehighlightRange();" onClick="setRange(+2);"> @</span><span id=plus3 onMouseOver="highlightRange(+3);" onMouseOut="dehighlightRange();" onClick="setRange(+3);"> @</span><span id=plus4 onMouseOver="highlightRange(+4);" onMouseOut="dehighlightRange();" onClick="setRange(+4);"> @</span></span>
			</div>
				
			<div id="submitimage" name="button" onClick="document.fonoguru.submit();"></div>
		</div>	
		<div id="chart">
			<div align=right>
			<img SRC="/wp-content/custom/fonoguru/images/guru1.gif" width=27 height=48>
			<img SRC="/wp-content/custom/fonoguru/images/guru2.gif" width=27 height=48>
			<img SRC="/wp-content/custom/fonoguru/images/guru3.gif" width=27 height=48>
			<img SRC="/wp-content/custom/fonoguru/images/guru4.gif" width=27 height=48>
			<img SRC="/wp-content/custom/fonoguru/images/guru5.gif" width=27 height=48>
			<img SRC="/wp-content/custom/fonoguru/images/guru6.gif" width=27 height=48>
			<img SRC="/wp-content/custom/fonoguru/images/guru7.gif" width=27 height=48>
			</div>
			
			<table border=0 cellspacing=0>
			<tr>
			<td valign=top style="padding: 5px 10px">
				<span class="title">pulmonic consonants</span>
				<table>
				<tr>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('p');" title="voiceless bilabial plosive">p</td><td class=ipa onClick="insert('b');" title="voiced bilabial plosive">b</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('t');" title="voiceless alveolar plosive">t</td><td class=ipa onClick="insert('d');" title="voiced aveolar plosive">d</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ʈ');" title="voiceless retroflex plosive">ʈ</td><td class=ipa onClick="insert('ɖ');" title="voiced retroflex plosive">ɖ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('c');" title="voiceless palatal plosive">c</td><td class=ipa onClick="insert('ɟ');" title="voiced palatal plosive">ɟ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('k');" title="voiceless velar plosive">k</td><td class=ipa onClick="insert('ɡ');" title="voiced velar plosive">ɡ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('q');" title="voiceless uvular plosive">q</td><td class=ipa onClick="insert('ɢ');" title="voiced uvular plosive">ɢ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ʔ');" title="voiceless glottal plosive">ʔ</td><td class=emptyipa></td></tr></table></td>
				</tr>
				<tr>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ɸ');" title="voiceless bilabial fricative">ɸ</td><td class=ipa onClick="insert('β');" title="voiced bilabial fricative">β</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('f');" title="voiceless labiodental fricative">f</td><td class=ipa onClick="insert('v');" title="voiced labiodental fricative">v</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('θ');" title="voiceless interdental fricative">θ</td><td class=ipa onClick="insert('ð');" title="voiced interdental fricative">ð</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('s');" title="voiceless alveolar fricative">s</td><td class=ipa onClick="insert('z');" title="voiced alveolar fricative">z</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ʃ');" title="voiceless postalveolar fricative">ʃ</td><td class=ipa onClick="insert('ʒ');" title="voiced postalveolar fricative">ʒ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ʂ');" title="voiceless retroflex fricative">ʂ</td><td class=ipa onClick="insert('ʐ');" title="voiced retroflex fricative">ʐ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ç');" title="voiceless palatal fricative">ç</td><td class=ipa onClick="insert('ʝ');" title="voiced palatal fricative">ʝ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('x');" title="voiceless velar fricative">x</td><td class=ipa onClick="insert('ɣ');" title="voiced velar fricative">ɣ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('χ');" title="voiceless uvular fricative">χ</td><td class=ipa onClick="insert('ʁ');" title="voiced uvular fricative">ʁ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ħ');" title="voiceless pharyngeal fricative">ħ</td><td class=ipa onClick="insert('ʕ');" title="voiced pharyngeal fricative">ʕ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('h');" title="voiceless glottal fricative">h</td><td class=ipa onClick="insert('ɦ');" title="voiced glottal fricative">ɦ</td></tr></table></td>
				</tr>
				<tr>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ʦ');" title="voiceless alveolar affricate">ʦ</td><td class=ipa onClick="insert('ʣ');" title="voiced alveolar affricate">ʣ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ʧ');" title="voiceless postalveolar affricate">ʧ</td><td class=ipa onClick="insert('ʤ');" title="voiced postalveolar affricate">ʤ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
				</tr>
				<tr>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('m');" title="bilabial nasal">m</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ɱ');" title="labiodental nasal">ɱ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('n');" title="alveolar nasal">n</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ɳ');" title="retroflex nasal">ɳ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ɲ');" title="palatal nasal">ɲ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ŋ');" title="velar nasal">ŋ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ɴ');" title="uvular nasal">ɴ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
				</tr>
				<tr>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ʙ');" title="bilabial trill">ʙ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('r');" title="alveolar trill">r</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ʀ');" title="uvular trill">ʀ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
				</tr>
				<tr>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ɾ');" title="alveolar tap">ɾ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ɽ');" title="retroflex tap">ɽ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
				</tr>
				<tr>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ɬ');" title="voiceless alveolar lateral fricative">ɬ</td><td class=ipa onClick="insert('ɮ');" title="voiced alveolar lateral fricative">ɮ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
				</tr>
				<tr>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ʍ');" title="voiceless labio-velar approximant">ʍ</td><td class=ipa onClick="insert('w');" title="labio-velar approximant">w</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ʋ');" title="labiodental approximant">ʋ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ɹ');" title="alveolar approximant">ɹ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ɻ');" title="retroflex approximant">ɻ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('j');" title="palatal approximant">j</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ɰ');" title="velar approximant">ɰ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
				</tr>
				<tr>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('l');" title="alveolar lateral approximant">l</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ɭ');" title="retroflex lateral approximant">ɭ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ʎ');" title="palatal lateral approximant">ʎ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ʟ');" title="velar lateral approximant">ʟ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
				</tr>
				</table>
			
				<br />
				
				<span class="title">non-pulmonic consonants</span>
				<table>
				<tr>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ʘ');" title="bilabial click">ʘ</td><td class=ipa onClick="insert('ǀ');" title="dental click">ǀ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ǃ');" title="(post)alveolar click">ǃ</td><td class=ipa onClick="insert('ǂ');" title="palatal alveolar click">ǂ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ǁ');" title="alveolar lateral click">ǁ</td><td class=emptyipa></td></tr></table></td>
					<td class="ipacell"><table><tr><td class=emptyipa>&nbsp;</td><td class=emptyipa>&nbsp;</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ɓ');" title="bilabial implosive">ɓ</td><td class=ipa onClick="insert('ɗ');" title="dental / aveolar implosive">ɗ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ʄ');" title="palatal implosive">ʄ</td><td class=ipa onClick="insert('ɠ');" title="velar implosive">ɠ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ʛ');" title="uvular implosive">ʛ</td><td class=emptyipa></td></tr></table></td>
					<td class="ipacell"><table><tr><td class=emptyipa>&nbsp;</td><td class=emptyipa>&nbsp;</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('p\'');" title="bilabial ejective">p'</td><td class=ipa onClick="insert('t\'');" title="dental / alveolar ejective">t'</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('k\'');" title="velar ejective">k'</td><td class=ipa onClick="insert('s\'');" title="alveolar fricative ejective">s'</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=emptyipa>&nbsp;</td><td class=emptyipa>&nbsp;</td></tr></table></td>
				</tr>
				</table>
				
				

				<p style="font: 10pt Trebuchet MS; color: white">
				<span title="checking this will trigger the following automatic replacements: &#10;g -> ɡ &#10;B -> ʙ &#10;G -> ɢ &#10;N -> ɴ &#10;R -> ʀ"><input type=checkbox name=replace id=replace checked><label for=replace> automatically replace common letters with their IPA equivalents</label></span><br />
				<span title="checking this will trigger the following automatic replacements: &#10;ts -> ʣ &#10;tʃ -> ʦ &#10;dz -> ʧ &#10;dʒ -> ʤ"><input type=checkbox name=digraph id=digraph checked><label for=digraph> treat the digraphs <span face="Doulos SIL">ts</span>, <span face="Doulos SIL">tʃ</span>, <span face="Doulos SIL">dz</span> and <span face="Doulos SIL">dʒ</span> as affricates</label></span><br />
				<span title="this will show the relation between the different phones, identify contrastive pairs if any, and try to give an analysis on the phones and their respective allophones"><input type=checkbox name=report id=report checked value=on><label for=report> show full analysis report</label> (see Note 2)</span>
				</p>
				
			
			</td>
			<td valign=top style="padding: 5px 10px">

				<span class="title">vowels</span>
				<table>
				<tr>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('i');" title="close front unrounded vowel">i</td><td class=ipa onClick="insert('y');" title="close front rounded vowel">y</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ɨ');" title="close central unrounded vowel">ɨ</td><td class=ipa onClick="insert('ʉ');" title="close central rounded vowel">ʉ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ɯ');" title="close back unrounded vowel">ɯ</td><td class=ipa onClick="insert('u');" title="close back rounded vowel">u</td></tr></table></td>
				</tr>
				<tr>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ɪ');" title="near-close near-front unrounded vowel">ɪ</td><td class=ipa onClick="insert('ʏ');" title="near-close near-front rounded vowel">ʏ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ʊ');" title="near-close near-back rounded vowel">ʊ</td></tr></table></td>
				</tr>
				<tr>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('e');" title="close-mid front unrounded vowel">e</td><td class=ipa onClick="insert('ø');" title="close-mid front rounded vowel">ø</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ɘ');" title="close-mid central unrounded vowel">ɘ</td><td class=ipa onClick="insert('ɵ');" title="close-mid central rounded vowel">ɵ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ɤ');" title="close-mid back unrounded vowel">ɤ</td><td class=ipa onClick="insert('o');" title="close-mid back rounded vowel">o</td></tr></table></td>
				</tr>
				<tr>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ə');" title="mid central vowel">ə</td></tr></table></td>
					<td class="ipacell"></td>
				</tr>
				<tr>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ɛ');" title="open-mid front unrounded vowel">ɛ</td><td class=ipa onClick="insert('œ');" title="open-mid front rounded vowel">œ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ɜ');" title="open-mid central unrounded vowel">ɜ</td><td class=ipa onClick="insert('ɞ');" title="open-mid central rounded vowel">ɞ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ʌ');" title="open-mid back unrounded vowel">ʌ</td><td class=ipa onClick="insert('ɔ');" title="open-mid back rounded vowel">ɔ</td></tr></table></td>
				</tr>
				<tr>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('æ');" title="near-open front unrounded vowel">æ</td><td class=emptyipa></td></tr></table></td>
					<td class="ipacell"><table><tr><td class=emptyipa></td><td class=ipa onClick="insert('ɐ');" title="near-open central vowel">ɐ</td></tr></table></td>
					<td class="ipacell"></td>
				</tr>
				<tr>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('a');" title="open front unrounded vowel">a</td><td class=ipa onClick="insert('ɶ');" title="open front rounded vowel">ɶ</td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ɑ');" title="open back unrounded vowel">ɑ</td><td class=ipa onClick="insert('ɒ');" title="open back rounded vowel">ɒ</td></tr></table></td>
				</tr>
				</table>
				
				<br />
				

				<span class="title">diacritics</span>
				<table>
				<tr>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('̥');" title="voiceless">◌̥</td><td class=ipa onClick="insert('̬');" title="voiced">◌̬</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('̤');" title="breathy voiced">◌̤</td><td class=ipa onClick="insert('̰');" title="creaky voiced">◌̰</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('̩');" title="syllabic">◌̩</td><td class=ipa onClick="insert('̃');" title="nasalized">◌̃</td></tr></table></td>
				</tr>
				<tr>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ʷ');" title="labialized">ʷ</td><td class=ipa onClick="insert('ʲ');" title="palatalized">ʲ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('ˠ');" title="velarized">ˠ</td><td class=ipa onClick="insert('ˤ');" title="pharyngealized">ˤ</td></tr></table></td>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert('̴');" title="velarized or pharyngealized">◌̴</td><td class=ipa onClick="insert('ʰ');" title="aspirated">ʰ</td></tr></table></td>
				</tr>
				<tr>
					<td class="ipacell"><table><tr><td class=ipa onClick="insert(':');" title="long">:</td><td class=emptyipa></td></tr></table></td>
					<td class="ipacell"></td>
					<td class="ipacell"></td>
				</tr>
				</table>
				<br />
				
				<table>
				<tr>
					<td class="ipacell"><table><tr><td class=enter width=126 height=25 style="font: bold 8pt verdana;" align=center onClick="insert('\n');" title="ENTER key">enter ←</td></tr></table></td>
				</tr>
				</table>
				
			</td>
			</tr>
			</table>
				
				
			<div style="float: right;">
				<a href="http://scripts.sil.org/cms/scripts/page.php?site_id=nrsi&#038;item_id=DoulosSIL_download" target="_new" style="color: white; text-decoration: underline; font: 12pt Times New Roman">Download Doulos SIL (IPA font)</a>
				<img SRC="/wp-content/custom/fonoguru/images/fotoguru.gif" align=middle width=48 height=48>
			</div>
		</div>	
	</div>



	<div style="width: 100%; float: left; padding: 0px 15px">
		<select name=data style="background-color: #66738E; color: white; width:200px; font: 8pt Verdana">
			<option value="burmese">Burmese</option>
			<option value="canadianfrench">Canadian French</option>
			<option value="german">German</option>
			<option value="greek">Greek</option>
			<option value="hypothetical1">Hypothetical Language I</option>
			<option value="kimatuumbi">Kimatuumbi</option>
			<option value="korean">Korean</option>
			<option value="oldenglish">Old English</option>
			<option value="persian">Persian</option>
			<option value="russian">Russian</option>
			<option value="spanish">Spanish</option>
		</select>
		<input type=button value="load data sample" style="font: bold 8pt Verdana; color: #313B54" onClick="loadData(this.form)">
	</div>
			

	<input type=hidden name="to" value="+1">
	<input type=hidden name="from" value="-1">
	<input type=hidden name="fono_action" value="go">

	</form>
				
</div>


<p><b>Instruction:</b> Type in your data set in the text box on the left, one word on each line, or alternatively test Fonoguru with the sample data by choosing a sample data set and clicking on the “load data” button below the text box. The pull-down menus on the right will then be filled up automatically with all the phones found in the set of data. Choose the phone or phones you want to analyze, then click on “analyze data”, the environment will be presented to you in no time. It’s that easy! </p>

<p><b>Note 1:</b> You must first install the IPA font (Doulos SIL) before using Fonoguru. Follow the link above. </p>

<p><b>Note 2:</b> The analysis on phonemes and allophones is still very primitive, so study hard on your phonology to make your own judgement! </p>

	
	
<script language="JavaScript">
updateList(document.fonoguru);
dehighlightRange();
document.fonoguru.input.focus();
</script>


<div class="clear"></div>
<!--EOC-->
]]></content:encoded>
			<wfw:commentRss>http://www.thomastsoi.com/software/fonoguru/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Teca Diary Personal Edition</title>
		<link>http://www.thomastsoi.com/software/tecadiary/</link>
		<comments>http://www.thomastsoi.com/software/tecadiary/#comments</comments>
		<pubDate>Sun, 03 Aug 2003 18:11:24 +0000</pubDate>
		<dc:creator>Thomas Tsoi</dc:creator>
				<category><![CDATA[PHP Scripts]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[diary]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.thomastsoi.com/?p=388</guid>
		<description><![CDATA[Teca Diary Personal Edition is a handy and neat script to keep your own diary online. Let your friends know what you are up to, what you like and don't, what you expect for a birthday gift, and more importantly, hear what they say to your words.]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ffcc99;"><strong>This software is currently NOT maintained, </strong>but you can still download and use it at your own risk.</span></p>
<p>Teca Diary Personal Edition is a handy and neat script to keep your own diary online. Let your friends know what you are up to, what you like and don&#8217;t, what you expect for a birthday gift, and more importantly, hear what they say to your words.</p>
<h3><a id="download" href="http://www.thomastsoi.com/downloads/tecadiary_pe.zip" title="Downloaded 817 times">Download</a> (45.34 KB)</h3>

<!--EOC-->
]]></content:encoded>
			<wfw:commentRss>http://www.thomastsoi.com/software/tecadiary/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Booklistex</title>
		<link>http://www.thomastsoi.com/software/booklistex/</link>
		<comments>http://www.thomastsoi.com/software/booklistex/#comments</comments>
		<pubDate>Fri, 11 Jan 2002 14:50:11 +0000</pubDate>
		<dc:creator>Thomas Tsoi</dc:creator>
				<category><![CDATA[PHP Scripts]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[amazon]]></category>
		<category><![CDATA[book]]></category>

		<guid isPermaLink="false">http://www.thomastsoi.com/?p=474</guid>
		<description><![CDATA[Booklistex allows you create an organized list of your favourite books, you can keep one just for your pleasure, or share it with your family, students, friends, or colleagues.]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ffcc99;"><strong>This software is currently NOT maintained, </strong>but you can still download and use it at your own risk.</span></p>
<p>Booklistex allows you create an organized list of your favourite books, you can keep one just for your pleasure, or share it with your family, students, friends, or colleagues.</p>
<p>It incorporates Amazon.com&#8217;s book database and its simple interface allows you to add and delete books easily.</p>
<p>To add a book, all you need to do is to find the book at amazon.com, copy the url and paste it in the script. Booklistex will then extract the necesarry information automatically.</p>
<p>The script is very flexible, you can use a template to customize the appearence. The book list supports multi-page viewing. You can even set how many rows and columns each page shows.</p>
<p>In addition, a convertor is supplied to work with Randex. You can export the book database to a Randex database, which can show you books randomly.</p>
<h3><a id="download" href="http://www.thomastsoi.com/downloads/booklistex.zip" title="Downloaded 311 times">Download</a> (10.45 KB)</h3>

<!--EOC-->
]]></content:encoded>
			<wfw:commentRss>http://www.thomastsoi.com/software/booklistex/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Quirex PHP</title>
		<link>http://www.thomastsoi.com/software/quirex/</link>
		<comments>http://www.thomastsoi.com/software/quirex/#comments</comments>
		<pubDate>Sun, 06 Jan 2002 17:42:54 +0000</pubDate>
		<dc:creator>Thomas Tsoi</dc:creator>
				<category><![CDATA[PHP Scripts]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[quiz]]></category>

		<guid isPermaLink="false">http://www.thomastsoi.com/2010/03/25/quirex-php/</guid>
		<description><![CDATA[Quirex is a quiz system suitable for many uses. Whether you are a teacher who wishes to let your students take the quizzes, and have the reports emailed to you, or a web site developer who wants to have a quiz installed on your web site to give some fun to your visitors, Quirex is for you.]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ffcc99;"><strong>This software is currently NOT maintained, </strong><span style="color: #ffcc99;">but y</span></span><span style="color: #ffcc99;">ou can still download and use it at your own risk.</span></p>
<p>Quirex is a quiz system suitable for many uses. Whether you are a teacher who wishes to let your students take the quizzes, and have the reports emailed to you, or a web site developer who wants to have a quiz installed on your web site to give some fun to your visitors, Quirex is for you.</p>
<p>This script allows the quiz-taker to select the number of questions he wants to attemp. The script will take the number of questions randomly from the database and display them in random order. After the answers are submitted, a page of results will be displayed showing the quiz-taker&#8217;s answer and the correct answer of each question. It also counts the number of questions he has got correct.</p>
<p>In addition, the script can also keep a record of challengers, recording their names, emails, number of questions attemped and their scores, and display the results of the most recent challengers.</p>
<h3><a id="download" href="http://www.thomastsoi.com/downloads/quirex_php.zip" title="Downloaded 2348 times">Download</a> (53.85 KB)</h3>

<!--EOC-->
]]></content:encoded>
			<wfw:commentRss>http://www.thomastsoi.com/software/quirex/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Secret Messagex</title>
		<link>http://www.thomastsoi.com/software/messagex/</link>
		<comments>http://www.thomastsoi.com/software/messagex/#comments</comments>
		<pubDate>Wed, 19 Dec 2001 15:48:59 +0000</pubDate>
		<dc:creator>Thomas Tsoi</dc:creator>
				<category><![CDATA[PHP Scripts]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[messaging]]></category>

		<guid isPermaLink="false">http://www.thomastsoi.com/?p=510</guid>
		<description><![CDATA[Let your visitors send their crushes secret messages, and let them help promote you site!]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ffcc99;"><strong>This software is currently NOT maintained, </strong>but you can still download and use it at your own risk.</span></p>
<p>Let your visitors send their crushes secret messages, and let them help promote you site!</p>
<h3><a id="download" href="http://www.thomastsoi.com/downloads/messagex.zip" title="Downloaded 116 times">Download</a> (25.03 KB)</h3>

<!--EOC-->
]]></content:encoded>
			<wfw:commentRss>http://www.thomastsoi.com/software/messagex/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Randex</title>
		<link>http://www.thomastsoi.com/software/randex/</link>
		<comments>http://www.thomastsoi.com/software/randex/#comments</comments>
		<pubDate>Fri, 11 May 2001 15:53:47 +0000</pubDate>
		<dc:creator>Thomas Tsoi</dc:creator>
				<category><![CDATA[PHP Scripts]]></category>
		<category><![CDATA[Software]]></category>
		<category><![CDATA[random]]></category>

		<guid isPermaLink="false">http://www.thomastsoi.com/?p=513</guid>
		<description><![CDATA[Um, simply a random HTML displayer, easy to setup. It can also record the total number of each piece of HTML code displayed.]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ffcc99;"><strong>This software is currently NOT maintained, </strong>but you can still download and use it at your own risk.</span></p>
<p>Um, simply a random HTML displayer, easy to setup. It can also record the total number of each piece of HTML code displayed.</p>
<p><a id="download" href="http://www.thomastsoi.com/downloads/randex-php.zip" title="Downloaded 275 times">Download</a> (3.31 KB)</p>

<!--EOC-->
]]></content:encoded>
			<wfw:commentRss>http://www.thomastsoi.com/software/randex/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

