/*
 *	JChar Converter 1.0
 * File: jchar10.js
 *	Date: 2/4/03
 *	All Rights Reserved (C) JChar Laboratory (C) VooDoo Lounge 2002
 *
 * Following codes are not copyable nor modifiable for any commercial uses.
 * Only personal use or possibly educational purpose is an acceptable secondary use.
 * Even in the acceptable case, you have to notice the author
 * your purposes, locations and resposible persons/organizations.
 *
 * Contents of JChar Laboratory are provided "as is" without warranty of any kind whatsoever.
 * JChar Laboratory, and the author thereof, shall not be held responsible or liable, under any circumstances,
 * for any damages resulting from the use or inability to use the information within. 
 */

/*
 *	Name:			jcharIt
 *	Purpose:		Main function to be called at first.
 *	Param:			mform - form object
 *	Comment:
 */
function jcharIt(mform) {
	var tokenArr = new Array();
	var letTypeArr = new Array();
	tokenizeIt(tokenArr, letTypeArr);
	convertIt(tokenArr, letTypeArr, mform);
} // jcharIt

/*
 *	Name:			tokenizeIt
 *	Purpose:		Tokenize the entire input string by the wrap-up rules.
 *	Param:			tokenArr - an array holding the input string
 *						letTypeArr - an array to hold Hiragana/Katakana info						
 *	Comment:	The wrap-up rules are
 *						-vowel found
 *						-non-alphabet found
 *						-two consecutive 'n's found
 *						-'n' followed by a consonant except 'y' found
 *						-end of the string
 */
function tokenizeIt(tokenArr, letTypeArr){
	var inStr;
	var inStrLen;
	var let, llet;
	var proceed = true;
	var token = "";
	var tokenArrIn = 0;
	
//	inStr = document.convForm.input.value;
inStr = escape(document.convForm.input.value);
	inStrLen = inStr.length;

	for ( var i = 0; i < inStrLen && proceed; i++ ) {
		let = inStr.charAt(i);
		llet = let.toLowerCase();
		if( isValid( let ) ){
			if(isVowel( llet ) ){
				token += let;
				tokenArr[tokenArrIn] = token; 
				letTypeArr[tokenArrIn] = isKatakana(tokenArr[tokenArrIn]); 
				tokenArrIn++;
				token = "";
			} else if(!( isAlpha( let ) ) ){
				if(token.length != 0){
					tokenArr[tokenArrIn] = token; 
					letTypeArr[tokenArrIn] = isKatakana(tokenArr[tokenArrIn]); 
					tokenArrIn++;
				}
				if(let == "%"  ){
					tokenArr[tokenArrIn] = let + inStr.charAt(i+1)+ inStr.charAt(i+2);
					i = i+2;
				} else {
					tokenArr[tokenArrIn] = let; 
					letTypeArr[tokenArrIn] = isKatakana(token); 
				}
				tokenArrIn++;
				token = "";
			} else if(token.charAt(token.length - 1).toLowerCase() == "n" && llet != "y"){
				if(token.length > 1){
					tokenArr[tokenArrIn] = token.substring(0, token.length - 1);
					letTypeArr[tokenArrIn] = isKatakana(tokenArr[tokenArrIn]);
					tokenArrIn++;
					token = token.substring(1, token.length);
				}
				if(llet == "n"){
					tokenArr[tokenArrIn] = token + let; 
					letTypeArr[tokenArrIn] = isKatakana(tokenArr[tokenArrIn]);
					token = "";
				} else if(llet != "y"){
					tokenArr[tokenArrIn] = token; 
					letTypeArr[tokenArrIn] = isKatakana(tokenArr[tokenArrIn]);
					token = let;
				}
				tokenArrIn++;
			} else if(i ==  inStrLen - 1){
				token += let;
				tokenArr[tokenArrIn] = token; 
				letTypeArr[tokenArrIn] = isKatakana(tokenArr[tokenArrIn]);
				tokenArrIn++;
				token = "";
			} else {token += let;}
		} else {
			proceed = false;
			document.convForm.result.value = "Invalid character found";
		}
	}
} // tokenizeIt

/*
 *	Name:			convertIt
 *	Purpose:		Depending on types of token, find out a corresponding external conversion table.
 *						Append matched JChar(s) or a unchanged token to 'out' by calling 'searchIt().'
 *						Call 'printIt()' to print the final output.
 *	Param:			tokenArr - an array holding the input string
 *						letTypeArr - an array to hold Hiragana/Katakana info						
 *						mform - form object						
 *	Comment:	
 */
function convertIt(tokenArr, letTypeArr, mform){
	var out = "";
	var token;
	var tokenlen;
	var last;
	
	for(var i = 0; i < tokenArr.length; i++){
		token = tokenArr[i];
		tokenlen = token.length;
		last = token.charAt(tokenlen-1).toLowerCase();
		
		if(tokenlen == 1)
			if(isAlpha(token))
				out += searchIt(conv_v, token, 0, letTypeArr[i]);
			else{
				out += searchIt(conv_s, token, 0, false);
			}
		else if(token.toLowerCase() == "nn")
			out += searchIt(conv_v, token, 0, letTypeArr[i]);
		else if(tokenlen == 3 && token.charAt(0) == "%")
			out += token;
		else
			switch(last){
				case "a":	out += searchIt(conv_a, token, 1, letTypeArr[i]); break;
				case "i":	out += searchIt(conv_i, token, 1, letTypeArr[i]); break;
				case "u":	out += searchIt(conv_u, token, 1, letTypeArr[i]); break;
				case "e":	out += searchIt(conv_e, token, 1, letTypeArr[i]); break;
				case "o":	out += searchIt(conv_o, token, 1, letTypeArr[i]); break;
				default:	out += token; break;
			}
		token = "";
		last = "";
	}
	printIt(out);
	if(navigator.appName == "Microsoft Internet Explorer" && mform.cpy.checked)
		copyTxt(mform);
} // convertIt
				
/*
 *	Name:			searchIt
 *	Purpose:		Search a corresponding JChar from a conversion table.
 *						Take care 'soku-on' case.
 *	Param:			arr - a JChar array found in an external file
 *						token - a token
 *						kk - boolean value indicating if the token is Hiragana/Katakana
 *	Return			JChar(s) found or an unchanged token or both						
 *	Comment:	
 */
function searchIt(arr, token, rem, kk){
	var found;
	var retVal = token;
	var conlen = token.length - rem;
	var con = token.substring(0, conlen).toLowerCase();
	for(var i = 0; i < conlen && !found; i++){
		con = token.substring(i, conlen).toLowerCase();
		for(var j = 0; j < arr.length && !found; j=j+3){
			if(arr[j] == con){
				found = true;
				if(i != 0)
					if(token.charAt(i-1) == token.charAt(i))
						if(kk)
							retVal = token.substring(0, i-1) + "ƒb";
						else
							retVal = token.substring(0, i-1) + "‚Á";
					else
						retVal = token.substring(0,i);
				else
					retVal = "";
				if(kk)
					retVal += arr[j+2];
				else
					retVal += arr[j+1];
			}
		}
	}
	return retVal;
} // searchIt

/*
 *	Name:			printIt
 *	Purpose:		Printout converted string
 *						take care carraige return here
 *	Param:			out - converted string
 *	Comment:	
 */
function printIt(out){
	for(i=0; i<out.length; i++){	
	 	if(out.indexOf("“‚OD“‚OƒA") > -1)
			out=out.replace("“‚OD“‚OƒA","%0D%0A")
		else if(out.indexOf("“‚OƒA") > -1)
			out=out.replace("“‚OƒA","%0A")
		else if(out.indexOf("“‚OD") > -1)
			out=out.replace("“‚OD","%0D")
	}
	document.convForm.result.value = unescape(out);
	out="";
} //printIt

/*
 *	Name:			copyTxt
 *	Purpose:		copy the output to system's clipboard
 *	Param:			mform - form object
 *	Comment:	
 */
function copyTxt(mform){
	mform.copyArea.value = mform.result.value;
	var r = mform.copyArea.createTextRange();
	r.select();
	r.execCommand('copy');
} //copyTxt

/*
 * bool functions
 */
function isVowel(c){ return (c == 'a' || c == 'i' || c== 'u' || c == 'e' || c == 'o'); }
function isValid(c){ return (c >= ' ' && c <= '~'); }
function isAlpha(c){ return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')); }
function isUpper(c){ return (c >= 'A' && c <= 'Z');}
function isKatakana(token){
	var found;
	for(var i = 0; i < token.length && !found; i++)
		if(isUpper(token.charAt(i)))
			found = true;
	return found;
} //bool functions
