/*
 *
 *	Author: Ashutosh Raghuwanshi.
 *	E-Mail: ashutosh@pragya.cjb.net
 *	URL   : http://pragya.cjb.net
 *  Notice: You may freely use this script as long as you keep this banner as it is.
 *
 */
/*@cc_on @*/
/*@if (@_jscript_version >= 5)
   try{window.status = "Using JScript version " + @_jscript_version;}catch(exception){}
   @else @*/
   alert("You need a more recent script engine.\nMinimum Internet Explorer 5.0 is required.");
/*@end @*/

function GetChar(){
var RetCode = 0;
	if(this.Position >= this.DataString.length)
		return '\0';
	else{
		RetCode = this.DataString.charCodeAt(this.Position++);
		switch(RetCode){
			case 0x20AC: RetCode = 0x80; break;
			case 0x201A: RetCode = 0x82; break;
			case 0x0192: RetCode = 0x83; break;
			case 0x201E: RetCode = 0x84; break;
			case 0x2026: RetCode = 0x85; break;
			case 0x2020: RetCode = 0x86; break;
			case 0x2021: RetCode = 0x87; break;
			case 0x02C6: RetCode = 0x88; break;
			case 0x2030: RetCode = 0x89; break;
			case 0x0160: RetCode = 0x8A; break;
			case 0x2039: RetCode = 0x8B; break;
			case 0x0152: RetCode = 0x8C; break;
			case 0x017D: RetCode = 0x8E; break;
			case 0x2018: RetCode = 0x91; break;
			case 0x2019: RetCode = 0x92; break;
			case 0x201C: RetCode = 0x93; break;
			case 0x201D: RetCode = 0x94; break;
			case 0x2022: RetCode = 0x95; break;
			case 0x2013: RetCode = 0x96; break;
			case 0x2014: RetCode = 0x97; break;
			case 0x02DC: RetCode = 0x98; break;
			case 0x2122: RetCode = 0x99; break;
			case 0x0161: RetCode = 0x9A; break;
			case 0x203A: RetCode = 0x9B; break;
			case 0x0153: RetCode = 0x9C; break;
			case 0x017E: RetCode = 0x9E; break;
			case 0x0178: RetCode = 0x9F; break;
		}
		return RetCode;
	}
}

function PutChar(CharData){
var RetCode = CharData;
	switch(CharData){
		case 0x80: RetCode = 0x20AC; break;
		case 0x82: RetCode = 0x201A; break;
		case 0x83: RetCode = 0x0192; break;
		case 0x84: RetCode = 0x201E; break;
		case 0x85: RetCode = 0x2026; break;
		case 0x86: RetCode = 0x2020; break;
		case 0x87: RetCode = 0x2021; break;
		case 0x88: RetCode = 0x02C6; break;
		case 0x89: RetCode = 0x2030; break;
		case 0x8A: RetCode = 0x0160; break;
		case 0x8B: RetCode = 0x2039; break;
		case 0x8C: RetCode = 0x0152; break;
		case 0x8E: RetCode = 0x017D; break;
		case 0x91: RetCode = 0x2018; break;
		case 0x92: RetCode = 0x2019; break;
		case 0x93: RetCode = 0x201C; break;
		case 0x94: RetCode = 0x201D; break;
		case 0x95: RetCode = 0x2022; break;
		case 0x96: RetCode = 0x2013; break;
		case 0x97: RetCode = 0x2014; break;
		case 0x98: RetCode = 0x02DC; break;
		case 0x99: RetCode = 0x2122; break;
		case 0x9A: RetCode = 0x0161; break;
		case 0x9B: RetCode = 0x203A; break;
		case 0x9C: RetCode = 0x0153; break;
		case 0x9E: RetCode = 0x017E; break;
		case 0x9F: RetCode = 0x0178; break;
	}
	this.DataString += String.fromCharCode(RetCode);
}

function Stream(InitString){
	this.DataString	= (Stream.arguments.length >= 1) ? Stream.arguments[0] : "";
	this.Position	= 0;
	this.GetChar	= GetChar;
	this.PutChar	= PutChar;
}

function UTF8_to_UCS2(UTF_Stream){
var CharOctet;
var RetStr = "";
var i, SequenceLength = 1;

	while((CharOctet = UTF_Stream.GetChar()) != '\0'){
		if(CharOctet <= 0x7F){		// Single Byte Sequence
			RetStr += String.fromCharCode(CharOctet);
			continue;
		} else if(CharOctet >= 0xC0 && CharOctet <= 0xDF)	SequenceLength = 2;	// Two Bytes Sequence
		else if(CharOctet >= 0xE0 && CharOctet <= 0xEF)	SequenceLength = 3;	// Three Bytes Sequence

// Note - SequenceLength > 3 is irrelevant because JScript as well as Windows Xp doesn't support UCS-4.

		else if(CharOctet >= 0xF0 && CharOctet <= 0xF7)	SequenceLength = 4;	// Four Bytes Sequence
		else if(CharOctet >= 0xF8 && CharOctet <= 0xFB)	SequenceLength = 5;	// Five Bytes Sequence
		else if(CharOctet >= 0xFC && CharOctet <= 0xFD)	SequenceLength = 6;	// Six Bytes Sequence

		CharOctet = ((0x7F>>SequenceLength) & CharOctet) << (6*(SequenceLength-1));
		for(i=1; i<SequenceLength; i++)
			CharOctet |= ((0x3F) & UTF_Stream.GetChar()) << (6*(SequenceLength-i-1));
		RetStr += String.fromCharCode((CharOctet > 0xFFFF) ? 0x3F : CharOctet);
	}

	return RetStr;
}

function UCS2_to_UTF8(UCS_Stream){
var UCS_Char;
var tmpStream = new Stream("");
var i, SequenceLength = 1, tmp;

	while((UCS_Char = UCS_Stream.GetChar()) != '\0'){
		if(UCS_Char <= 0x7F){		// Single Byte Sequence
			tmpStream.PutChar(UCS_Char);
			continue;
		} else if(UCS_Char >= 0x80 && UCS_Char <= 0x7FF)	SequenceLength = 2;	// Two Bytes Sequence
		else if(UCS_Char >= 0x800 && UCS_Char <= 0xFFFF)	SequenceLength = 3;	// Three Bytes Sequence

// Note - SequenceLength > 3 is irrelevant because JScript as well as Windows Xp doesn't support UCS-4.

		else if(UCS_Char >= 0x10000 && UCS_Char <= 0x1FFFFF)	SequenceLength = 4;	// Four Bytes Sequence
		else if(UCS_Char >= 0x200000 && UCS_Char <= 0x3FFFFFF)	SequenceLength = 5;	// Five Bytes Sequence
		else if(UCS_Char >= 0x4000000 && UCS_Char <= 0x7FFFFFFF)	SequenceLength = 6;	// Six Bytes Sequence

		tmpStream.PutChar(((0xFF<<(8-SequenceLength)) & 0xFF) | (UCS_Char >> (6*(SequenceLength-1))));
		for(i=1; i<SequenceLength; i++){
			tmpStream.PutChar(0x80 | (0x3F & (UCS_Char >> (6*(SequenceLength-i-1)))));
		}
	}

	return tmpStream.DataString;
}

