	//global, hexa chars	
	var g_szHex = "0123456789abcdef";	
	function key_gen(str)
	{
		var s = new String(str);
		s = s.toUpperCase();
		var key=0;
		for(i=0; i<s.length; ++i)
			key += s.charCodeAt(i);
		return key%255;
	}
	
	//to hexa string
	function encode(str, szKey)
	{		
		var key = key_gen(szKey);
		var s = new Array(str.length);
		var szOut = new String("");
		for(i=0; i<s.length; ++i)
		{
			s[i] = str.charCodeAt(i);
			s[i] ^= key; //mask with the key
			szOut += dec2hex(s[i]);
		}			
		return szOut;
	}
	
	function encode2(str)
	{				
		var szKey = dec2hex(eval(str.length));
		var key = key_gen(szKey);		
		var s = new Array(str.length);
		var szOut = new String("");
		for(i=0; i<s.length; ++i)
		{
			s[i] = str.charCodeAt(i);
			s[i] ^= key; //mask with the key
			szOut += dec2hex(s[i]);
		}
				
		return szOut + szKey + dec2hex(eval(szKey.length));
	}
	
	function decode2(str)
	{
		var s = new String(str);
		var key_length = hex2dec(s.substring(s.length-2, s.length));
		var szKey = s.substring(s.length-2-key_length, s.length-2);
		return decode(s.substring(0, s.length-2-key_length), szKey);
	}
	
	//to dec string from hex string
	function decode(str, szKey)
	{
		var key = key_gen(szKey);			
		var s = new Array(str.length/2);
		var szOut = new String("");
		//convert to dex string
		for(i=0; i<str.length/2; ++i)
		{
			s[i] = hex2dec(str.substring(i*2, i*2 + 2));
			s[i] ^= key; //un-mask the decoded string-->original string
			szOut += String.fromCharCode(s[i]);
		}		
		return szOut;
	}
	
	//covert an unsigned char (8 bits) from dec to a hex values. Ex: 255->ff
	function dec2hex(digit)
	{
		if(digit>255)
			return NaN;
		return g_szHex.charAt(digit/16) + g_szHex.charAt(digit%16);
	}
	
	//convert an unsigned char (8 bits) from hex to dec. Ex: ff->255
	function hex2dec(hexStr)
	{
		hexStr = hexStr.toLowerCase();
		if(hexStr.length>2 || isNaN("0x" + hexStr))
			return NaN;
		if(hexStr.length==1)
			hexStr = "0" + hexStr;
		return (g_szHex.indexOf(hexStr.charAt(0)) * 16) + g_szHex.indexOf(hexStr.charAt(1));
	}