<!--
/***************************************************************************
Copyright © 2003-2007 John L. Whiteman. All rights reserved. 

Name:         Number2Indonesian.js
Version:      12/27/2006 - 01/27/2007
Author(s):    John L. Whiteman
Dependencies: N/A
Description:  Translates numbers into Indonesian words

Private:
	isWhiteSpace()
	num()
	trim()

Public:
	format()
	n1()
	n2()
	n3()
	n4()
	n5()
	n6()
	n7()
	n8()
	n9()
	n10()
	n11()
	n12()
	n13()
	n14()
	n15()
	translate()
***************************************************************************/
var Number2Indonesian = function() {

	/***********************************************************************
	 PRIVATE API
	***********************************************************************/

	var numbers1 = new Array();

	numbers1['1'] = 'satu';
	numbers1['2'] = 'dua';
	numbers1['3'] = 'tiga';
	numbers1['4'] = 'empat';
	numbers1['5'] = 'lima';
	numbers1['6'] = 'enam';
	numbers1['7'] = 'tujuh';
	numbers1['8'] = 'delapan';
	numbers1['9'] = 'sembilan';
	numbers1['10'] = 'sepuluh';
	numbers1['11'] = 'sebelas';
	numbers1['12'] = 'dua belas';
	numbers1['13'] = 'tiga belas';
	numbers1['14'] = 'empat belas';
	numbers1['15'] = 'lima belas';
	numbers1['16'] = 'enam belas';
	numbers1['17'] = 'tujuh belas';
	numbers1['18'] = 'delapan belas';
	numbers1['19'] = 'sembilan belas';

	/***********************************************************************
	 Returns true if white space or null
	***********************************************************************/
	function isWhiteSpace(token) {

		if ((token != null) && (token != '')) {

			return(false);
		}

		return(true);
	}
	/***********************************************************************
	 Extracts numbers based upon substring coordinates
	***********************************************************************/
	function num(token, 
		         start, 
		         stop) {

		return(trim(token.substring(start, (start + stop))));
	}
	/***********************************************************************
	 Trims leading and trailing whitespace
	***********************************************************************/
	function trim(token) {

		token = token.replace(/^\s*/, "");

		token = token.replace(/\s*$/, "");

		return(token);

	}  return {
	
	/***********************************************************************
	 PUBLIC API
	***********************************************************************/
	
	/***********************************************************************
	 Formats a number with commas
	***********************************************************************/
	format : function(token) {

		if (!token.match(/^[0-9]+$/)) {

			return('');
		}

		token = trim(token);

		if (token.length < 4) return(token);

		token =
			this.format(num(token, 0, token.length - 3)) + 
			"." + num(token, token.length - 3, token.length);

		return(trim(token));
	},
	/***********************************************************************
	 Translates 0-9 to Indonesian words
	***********************************************************************/
	n1 : function(token) {

		if (numbers1[token]) 
			return(numbers1[token]);

		return('');
	},
	/***********************************************************************
	 Translates 0-99 to Indonesian words
	***********************************************************************/
	n2 : function(token) {

		var translation = '';

		if (token.length == 2) {

			if (parseInt(token) > 19) {

				if (num(token, 1, 1) != '0') {

					translation = 
						this.translate(num(token, 0, 1), false) +
						' puluh ' +
						this.translate(num(token, 1, 1), false);

				} else {

					translation = 
						this.translate(num(token, 0, 1), false) +
						' puluh';
				}

			} else {

				translation = numbers1[token];
			}

		} else {

			translation = 
				this.translate(token, false);
		}

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-999 to Indonesian words
	***********************************************************************/
	n3 : function(token) {

		var translation = '';

		if (token.length == 3) {

			translation =
				this.translate(num(token, 0, 1), false) + 
				' ratus ' + 
				this.translate(num(token, 1, 2), false);

		} else {

			translation = 
				this.translate(token, false);
		}

		translation = translation.replace(/satu ratus/, 'seratus');

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-9,999 to Indonesian words
	***********************************************************************/
	n4 : function(token) {

		var translation = '';

		if (token.length == 4) {

			translation =
				this.translate(num(token, 0, 1), false) +
				' ribu ' + 
				this.translate(num(token, 1, 3), false);

		} else {

			translation = 
				this.translate(token, false);
		}

		translation = translation.replace(/satu ribu/, 'seribu');

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-99,999 to Indonesian words
	***********************************************************************/
	n5 : function(token) {

		var translation = '';

		if (token.length == 5) {

			translation =
				this.translate(num(token, 0, 2), false) +
				' ribu ' + 
				this.translate(num(token, 2, 3), false);

		} else {

			translation = 
				this.translate(token, false);
		}

		translation = translation.replace(/satu ribu/, 'seribu');

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-999,999 to Indonesian words
	***********************************************************************/
	n6 : function(token) {

		var translation = '';

		if (token.length == 6) {

			translation =
				this.translate(num(token, 0, 3), false) +
				' ribu ' + 
				this.translate(num(token, 3, 3), false);

		} else {

			translation = 
				this.translate(token, false);
		}

		translation = translation.replace(/satu ribu/, 'seribu');

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-9,999,999 to Indonesian words
	***********************************************************************/
	n7 : function(token) {

		var translation = '';

		if (token.length == 7) {

			translation =
				this.translate(num(token, 0, 1), false) +
				' juta ' + 
				this.translate(num(token, 1, 6), false);

		} else {

			translation = 
				this.translate(token, false);
		}

		translation = translation.replace(/satu juta/, 'sejuta');

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-99,999,999 to Indonesian words
	***********************************************************************/
	n8 : function(token) {

		var translation = '';

		if (token.length == 8) {

			translation =
				this.translate(num(token, 0, 2), false) +
				' juta ' + 
				this.translate(num(token, 2, 6), false);

		} else {

			translation = 
				this.translate(token, false);
		}

		translation = translation.replace(/satu juta/, 'sejuta');

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-999,999,999 to Indonesian words
	***********************************************************************/
	n9 : function(token) {

		var translation = '';

		if (token.length == 9) {

			translation =
				this.translate(num(token, 0, 3), false) +
				' juta ' + 
				this.translate(num(token, 3, 6), false);

		} else {

			translation = 
				this.translate(token, false);
		}

		translation = translation.replace(/satu juta/, 'sejuta');

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-9,999,999,999 to Indonesian words
	***********************************************************************/
	n10 : function(token) {

		var translation = '';

		if (token.length == 10) {

			translation =
				this.translate(num(token, 0, 1), false) +
				' miliar ' + 
				this.translate(num(token, 1, 9), false);

		} else {

			translation = 
				this.translate(token, false);
		}

		translation = translation.replace(/satu miliar/, 'semiliar');

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-99,999,999,999 to Indonesian words
	***********************************************************************/
	n11 : function(token) {

		var translation = '';

		if (token.length == 11) {

			translation =
				this.translate(num(token, 0, 2), false) +
				' miliar ' + 
				this.translate(num(token, 2, 9), false);

		} else {

			translation = 
				this.translate(token, false);
		}

		translation = translation.replace(/satu miliar/, 'semiliar');

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-999,999,999,999 to Indonesian words
	***********************************************************************/
	n12 : function(token) {

		var translation = '';

		if (token.length == 12) {

			translation =
				this.translate(num(token, 0, 3), false) +
				' miliar ' + 
				this.translate(num(token, 3, 9), false);

		} else {

			translation = 
				this.translate(token, false);
		}

		translation = translation.replace(/satu miliar/, 'semiliar');

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-9,999,999,999,999 to Indonesian words
	***********************************************************************/
	n13 : function(token) {

		var translation = '';

		if (token.length == 13) {

			translation =
				this.translate(num(token, 0, 1), false) +
				' triliun ' + 
				this.translate(num(token, 1, 12), false);

		} else {

			translation = 
				this.translate(token, false);
		}

		translation = translation.replace(/satu triliun/, 'setriliun');

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-99,999,999,999,999 to Indonesian words
	***********************************************************************/
	n14 : function(token) {

		var translation = '';

		if (token.length == 14) {

			translation =
				this.translate(num(token, 0, 2), false) +
				' triliun ' + 
				this.translate(num(token, 2, 12), false);

		} else {

			translation = 
				this.translate(token, false);
		}

		translation = translation.replace(/satu triliun/, 'setriliun');

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-999,999,999,999,999 to Indonesian words
	***********************************************************************/
	n15 : function(token) {

		var translation = '';

		if (token.length == 15) {

			translation =
				this.translate(num(token, 0, 3), false) +
				' triliun ' + 
				this.translate(num(token, 3, 12), false);

		} else {

			translation = 
				this.translate(token, false);
		}

		translation = translation.replace(/satu triliun/, 'setriliun');

		return(trim(translation));
	},
	/***********************************************************************
	 Translates 0-999,999,999,999,999 to Indonesian words with error checking
	 and proper conversion before sending to the n# functions
	***********************************************************************/
	translate : function(token, 
		                 checkZeroFlag) {

		var translation = '';
		var tokenSize;

		token = trim(token.toString());

		if (!token.match(/^[0-9]+$/)) {

			return(translation);
		}

		if (token.length > 1) {

			token = token.replace(/^0+/, '');
		}

		if (isWhiteSpace(token)) {

			return(translation);
		}

		switch(token.length) {

			case 1:

				if (token != '0') {

					translation = this.n1(token);

				} else {

					if (checkZeroFlag) {

						translation = 'nol';
					}
				}

				break;

			case 2:

				translation = this.n2(token);

				break;

			case 3:

				translation = this.n3(token);

				break;

			case 4:

				translation = this.n4(token);

				break;

			case 5:

				translation = this.n5(token);
	
				break;

			case 6:

				translation = this.n6(token);

				break;

			case 7:

				translation = this.n7(token);

				break;

			case 8:

				translation = this.n8(token);

				break;

			case 9:

				translation = this.n9(token);

				break;

			case 10:

				translation = this.n10(token);

				break;

			case 11:

				translation = this.n11(token);

				break;

			case 12:

				translation = this.n12(token);

				break;

			case 13:

				translation = this.n13(token);

				break;

			case 14:

				translation = this.n14(token);

				break;

			case 15:

				translation = this.n15(token);

				break;

			default:

				translation = '';
		}

		return(trim(translation));
	}
	/***********************************************************************
	***********************************************************************/
	};
}();

// -->
