/*
 * Author: MeM
 * http://mem9.net/iphone
 * Please reference my website if you want to re-use the code.
 */

function ConnectLetters(str)
{
	var result;
	var i;
	var x;
	for (i=0; i<str.length; i++)
	{
		if (i == 0) {a = '\u0020';} else {a = str.charAt(i-1);}
		x = str.charAt(i);
		if (i == str.length-1) {b = '\u0020'} else {b = str.charAt(i+1);}
		switch (x)
		{
			case '\n':
				result += '<br />';
				break;
				
			case '\r':
				result += '<br />';
				break;
				
			case '\u000A':
				result += '<br />';
				break;
				
			case '\u2028':
				result += '<br />';
				break;
				
			case '\u2029':
				result += '<br />';
				break;
				
			// Alef (no hamza)
			case '\u0627':
				if (a == '\u0644') break;
			    switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFE8D';break;
			        case 'Final':       result += '\uFE8E';break;
			        case 'Inital':      result += '\uFE8D';break;
			        default:            result += '\uFE8E';
			    }
			break;
			// Baa
			case '\u0628':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFE8F';break;
				    case 'Final':       result += '\uFE90';break;
			    	case 'Inital':      result += '\uFE91';break;
				    default:            result += '\uFE92';
				}
			break;
			//Taa
			case '\u062A':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFE95';break;
			        case 'Final':       result += '\uFE96';break;
				    case 'Inital':      result += '\uFE97';break;
                    default:            result += '\uFE98';
                }
			break;
			//Thaa
			case '\u062B':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFE99';break;
				    case 'Final':       result += '\uFE9A';break;
				    case 'Inital':      result += '\uFE9B';break;
				    default:            result += '\uFE9C';
				}
			break;

			//Jeem
			case '\u062C':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFE9D';break;
				    case 'Final':       result += '\uFE9E';break;
				    case 'Inital':      result += '\uFE9F';break;
				    default:            result += '\uFEA0';
				}
			break;

			//7aa
			case '\u062D':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEA1';break;
				    case 'Final':       result += '\uFEA2';break;
				    case 'Inital':      result += '\uFEA3';break;
				    default:            result += '\uFEA4';
				}
			break;

			//'7aa
			case '\u062E':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEA5';break;
					case 'Final':       result += '\uFEA6';break;
				    case 'Inital':      result += '\uFEA7';break;
				    default:            result += '\uFEA8';
				}
			break;

			//Dal
			case '\u062F':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEA9';break;
					case 'Final':       result += '\uFEAA';break;
				    case 'Inital':      result += '\uFEA9';break;
				    default:            result += '\uFEAA';
				}
			break;

			//Dhal
			case '\u0630':
			    switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEAB';break;
			        case 'Final':       result += '\uFEAC';break;
				    case 'Inital':      result += '\uFEAB';break;
                    default:            result += '\uFEAC';
                }
			break;
			//Raa
			case '\u0631':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEAD';break;
					case 'Final':       result += '\uFEAE';break;
				    case 'Inital':      result += '\uFEAD';break;
				    default:            result += '\uFEAE';
				}
			break;

			//Zain
			case '\u0632':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEAF';break;
					case 'Final':       result += '\uFEB0';break;
				    case 'Inital':      result += '\uFEAF';break;
				    default:            result += '\uFEB0';
				}
			break;

			//Seen
			case '\u0633':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEB1';break;
					case 'Final':       result += '\uFEB2';break;
				    case 'Inital':      result += '\uFEB3';break;
				    default:            result += '\uFEB4';
				}
			break;

			//Sheen
			case '\u0634':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEB5';break;
					case 'Final':       result += '\uFEB6';break;
				    case 'Inital':      result += '\uFEB7';break;
				    default:            result += '\uFEB8';
				}
			break;

			//9ad
			case '\u0635':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEB9';break;
					case 'Final':       result += '\uFEBA';break;
				    case 'Inital':      result += '\uFEBB';break;
				    default:            result += '\uFEBC';
				}
			break;

			//Dhad
			case '\u0636':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEBD';break;
					case 'Final':       result += '\uFEBE';break;
				    case 'Inital':      result += '\uFEBF';break;
				    default:            result += '\uFEC0';
				}
			break;

			//6aa
			case '\u0637':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEC1';break;
					case 'Final':       result += '\uFEC2';break;
				    case 'Inital':      result += '\uFEC3';break;
				    default:            result += '\uFEC4';
				}
			break;

			//'6aa
			case '\u0638':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEC5';break;
					case 'Final':       result += '\uFEC6';break;
				    case 'Inital':      result += '\uFEC7';break;
				    default:            result += '\uFEC8';
				}
			break;

			//3ain
			case '\u0639':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEC9';break;
					case 'Final':       result += '\uFECA';break;
				    case 'Inital':      result += '\uFECB';break;
				    default:            result += '\uFECC';
				}
			break;

			//'3ain
			case '\u063A':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFECD';break;
					case 'Final':       result += '\uFECE';break;
				    case 'Inital':      result += '\uFECF';break;
				    default:            result += '\uFED0';
				}
			break;

			//Faa
			case '\u0641':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFED1';break;
					case 'Final':       result += '\uFED2';break;
				    case 'Inital':      result += '\uFED3';break;
				    default:            result += '\uFED4';
				}
			break;

			//Gaaf
			case '\u0642':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFED5';break;
					case 'Final':       result += '\uFED6';break;
				    case 'Inital':      result += '\uFED7';break;
				    default:            result += '\uFED8';
				}
			break;

			//Kaf
			case '\u0643':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFED9';break;
					case 'Final':       result += '\uFEDA';break;
				    case 'Inital':      result += '\uFEDB';break;
				    default:            result += '\uFEDC';
				}
			break;

			//Lam
			case '\u0644':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEDD';break;
					case 'Final':       result += '\uFEDE';break;
				    case 'Inital':      if (b == '\u0627') result += '\uFEFB';
				    					else if (b == '\u0623') result += '\uFEF7';
										else if (b == '\u0625') result += '\uFEF9';
										else if (b == '\u0622') result += '\uFEF5';
										else result += '\uFEDF';
										break;
				    default:            if (b == '\u0627') result += '\uFEFC';
				    					else if (b == '\u0623') result += '\uFEF8';
										else if (b == '\u0625') result += '\uFEFA';
										else if (b == '\u0622') result += '\uFEF6';
										else result += '\uFEE0';
				}
			break;

			//Meem
			case '\u0645':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEE1';break;
					case 'Final':       result += '\uFEE2';break;
				    case 'Inital':      result += '\uFEE3';break;
				    default:            result += '\uFEE4';
				}
			break;

			//Noon
			case '\u0646':
			    switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEE5';break;
			        case 'Final':       result += '\uFEE6';break;
				    case 'Inital':      result += '\uFEE7';break;
                    default:            result += '\uFEE8';
                }
			break;
			//Haa
			case '\u0647':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEE9';break;
					case 'Final':       result += '\uFEEA';break;
				    case 'Inital':      result += '\uFEEB';break;
				    default:            result += '\uFEEC';
				}
			break;

			//Waw
			case '\u0648':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEED';break;
					case 'Final':       result += '\uFEEE';break;
				    case 'Inital':      result += '\uFEED';break;
				    default:            result += '\uFEEE';
				}
			break;

			//Yaa
			case '\u064A':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEF1';break;
					case 'Final':       result += '\uFEF2';break;
				    case 'Inital':      result += '\uFEF3';break;
				    default:            result += '\uFEF4';
				}
			break;

			// Alef (hamza up)
			case '\u0623':
				if (a == '\u0644') break;
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFE83';break;
					case 'Final':       result += '\uFE84';break;
				    case 'Inital':      result += '\uFE83';break;
				    default:            result += '\uFE84';
				}
			break;

			// Alef (hamza down)
			case '\u0625':
				if (a == '\u0644') break;
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFE87';break;
					case 'Final':       result += '\uFE88';break;
				    case 'Inital':      result += '\uFE87';break;
				    default:            result += '\uFE88';
				}
			break;
			
			// Alef (hamza mamdodah)
			case '\u0622':
				if (a == '\u0644') break;
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFE81';break;
					case 'Final':       result += '\uFE82';break;
				    case 'Inital':      result += '\uFE81';break;
				    default:            result += '\uFE82';
				}
			break;

			// Alef Mag9orah
			case '\u0649':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFEEF';break;
					case 'Final':       result += '\uFEF0';break;
				    case 'Inital':      result += '\uFEEF';break;
				    default:            result += '\uFEF0';
				}
			break;

			// Hamzah
			case '\u0621':
				result += '\uFE80';
			break;
			
			// Hamzah 3la Waw
			case '\u0624':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFE85';break;
					case 'Final':       result += '\uFE86';break;
				    case 'Inital':      result += '\uFE85';break;
				    default:            result += '\uFE86';
				}
			break;

			//Hamzah 3la Korsi
			case '\u0626':
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFE89';break;
					case 'Final':       result += '\uFE8A';break;
				    case 'Inital':      result += '\uFE8B';break;
				    default:            result += '\uFE8C';
				}
			break;

			//Taa Marbo6ah
			case '\u0629':			
				switch (LetterForm(a,b))
			    {
			        case 'Isolated':    result += '\uFE93';break;
				    default:            result += '\uFE94';
				}
			break;

			default:
				result += x;
		}
	}
	
	return result;
}

function LetterForm(a,b)
{
    if (endIsNotConnectable(a) && startIsNotConnectable(b))
        return 'Isolated';
    else if (startIsNotConnectable(b))
        return 'Final';
    else if (endIsNotConnectable(a))
        return 'Inital';
    else
        return 'Middle';
}

function endIsNotConnectable(x)
{
    return ( notConnectable(x) || '\u0627\u0649\u0625\u0623\u0648\u0632\u0631\u0630\u062F\u0621\u0622\u0624'.indexOf(x) != -1  );
}

function startIsNotConnectable(x)
{
	return ( notConnectable(x) )
}

function notConnectable(x)
{
	return ( isNumber(x) || ' \r\n.*?\u061F!@#$^%&_-+=:|¦§;\\/\u060C\u2028\u2029(){}][~\'\"<>\u06AB©«»÷®±,∫∞≈≠≤≥™′″†‡“”¼½¾‰№‰′″‼‾ⁿ₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯℅ℓΩ℮⅛⅜⅝⅞∂∆∏∑√∞≈♯'.indexOf(x) != -1 );
}

function isNumber(x)
{
	return ( '0123456789'.indexOf(x) != -1 );
}