var JMFMIN = {};

JMFMIN.Convert = {
	_ISOtoUTF:{0x80:0x0080,0x81:0x00813,0x82:0x0082,0x83:0x0083,0x84:0x0084,0x85:0x0085,0x86:0x0086,0x87:0x0087,0x88:0x0088,0x89:0x0089,0x8A:0x008A,0x8B:0x008B,0x8C:0x008C,0x8D:0x008D,0x8E:0x008E,0x8F:0x008F,0x90:0x0090,0x91:0x0091,0x92:0x0092,0x93:0x0093,0x94:0x0094,0x95:0x0095,0x96:0x0096,0x97:0x0097,0x98:0x0098,0x99:0x0099,0x9A:0x009A,0x9B:0x009B,0x9C:0x009C,0x9D:0x009D,0x9E:0x009E,0x9F:0x009F,0xA0:0x00A0,0xA1:0x0104,0xA2:0x02D8,0xA3:0x0141,0xA4:0x00A4,0xA5:0x013D,0xA6:0x015A,0xA7:0x00A7,0xA8:0x00A8,0xA9:0x0160,0xAA:0x015E,0xAB:0x0164,0xAC:0x0179,0xAD:0x00AD,0xAE:0x017D,0xAF:0x017B,0xB0:0x00B0,0xB1:0x0105,0xB2:0x02DB,0xB3:0x0142,0xB4:0x00B4,0xB5:0x013E,0xB6:0x015B,0xB7:0x02C7,0xB8:0x00B8,0xB9:0x0161,0xBA:0x015F,0xBB:0x0165,0xBC:0x017A,0xBD:0x02DD,0xBE:0x017E,0xBF:0x017C,0xC0:0x0154,0xC1:0x00C1,0xC2:0x00C2,0xC3:0x0102,0xC4:0x00C4,0xC5:0x0139,0xC6:0x0106,0xC7:0x00C7,0xC8:0x010C,0xC9:0x00C9,0xCA:0x0118,0xCB:0x00CB,0xCC:0x011A,0xCD:0x00CD,0xCE:0x00CE,0xCF:0x010E,0xD0:0x0110,0xD1:0x0143,0xD2:0x0147,0xD3:0x00D3,0xD4:0x00D4,0xD5:0x0150,0xD6:0x00D6,0xD7:0x00D7,0xD8:0x0158,0xD9:0x016E,0xDA:0x00DA,0xDB:0x0170,0xDC:0x00DC,0xDD:0x00DD,0xDE:0x0162,0xDF:0x00DF,0xE0:0x0155,0xE1:0x00E1,0xE2:0x00E2,0xE3:0x0103,0xE4:0x00E4,0xE5:0x013A,0xE6:0x0107,0xE7:0x00E7,0xE8:0x010D,0xE9:0x00E9,0xEA:0x0119,0xEB:0x00EB,0xEC:0x011B,0xED:0x00ED,0xEE:0x00EE,0xEF:0x010F,0xF0:0x0111,0xF1:0x0144,0xF2:0x0148,0xF3:0x00F3,0xF4:0x00F4,0xF5:0x0151,0xF6:0x00F6,0xF7:0x00F7,0xF8:0x0159,0xF9:0x016F,0xFA:0x00FA,0xFB:0x0171,0xFC:0x00FC,0xFD:0x00FD,0xFE:0x0163,0xFF:0x02D9},
	_Entities:';/?:@&=+$,&\|[]{}^+&%<>',
	_HtmlEntities:{chr:'<>"\'&\\',ent:['lt','gt','quot','#x27','amp','#x5C']},
	_UTFtoISO :{0x0080:0x80,0x0081:0x81,0x0082:0x82,0x0083:0x83,0x0084:0x84,0x0085:0x85,0x0086:0x86,0x0087:0x87,0x0088:0x88,0x0089:0x89,0x008A:0x8A,0x008B:0x8B,0x008C:0x8C,0x008D:0x8D,0x008E:0x8E,0x008F:0x8F,0x0090:0x90,0x0091:0x91,0x0092:0x92,0x0093:0x93,0x0094:0x94,0x0095:0x95,0x0096:0x96,0x0097:0x97,0x0098:0x98,0x0099:0x99,0x009A:0x9A,0x009B:0x9B,0x009C:0x9C,0x009D:0x9D,0x009E:0x9E,0x009F:0x9F,0x00A0:0xA0,0x0104:0xA1,0x02D8:0xA2,0x0141:0xA3,0x00A4:0xA4,0x013D:0xA5,0x015A:0xA6,0x00A7:0xA7,0x00A8:0xA8,0x0160:0xA9,0x015E:0xAA,0x0164:0xAB,0x0179:0xAC,0x00AD:0xAD,0x017D:0xAE,0x017B:0xAF,0x00B0:0xB0,0x0105:0xB1,0x02DB:0xB2,0x0142:0xB3,0x00B4:0xB4,0x013E:0xB5,0x015B:0xB6,0x02C7:0xB7,0x00B8:0xB8,0x0161:0xB9,0x015F:0xBA,0x0165:0xBB,0x017A:0xBC,0x02DD:0xBD,0x017E:0xBE,0x017C:0xBF,0x0154:0xC0,0x00C1:0xC1,0x00C2:0xC2,0x0102:0xC3,0x00C4:0xC4,0x0139:0xC5,0x0106:0xC6,0x00C7:0xC7,0x010C:0xC8,0x00C9:0xC9,0x0118:0xCA,0x00CB:0xCB,0x011A:0xCC,0x00CD:0xCD,0x00CE:0xCE,0x010E:0xCF,0x0110:0xD0,0x0143:0xD1,0x0147:0xD2,0x00D3:0xD3,0x00D4:0xD4,0x0150:0xD5,0x00D6:0xD6,0x00D7:0xD7,0x0158:0xD8,0x016E:0xD9,0x00DA:0xDA,0x0170:0xDB,0x00DC:0xDC,0x00DD:0xDD,0x0162:0xDE,0x00DF:0xDF,0x0155:0xE0,0x00E1:0xE1,0x00E2:0xE2,0x0103:0xE3,0x00E4:0xE4,0x013A:0xE5,0x0107:0xE6,0x00E7:0xE7,0x010D:0xE8,0x00E9:0xE9,0x0119:0xEA,0x00EB:0xEB,0x011B:0xEC,0x00ED:0xED,0x00EE:0xEE,0x010F:0xEF,0x0111:0xF0,0x0144:0xF1,0x0148:0xF2,0x00F3:0xF3,0x00F4:0xF4,0x0151:0xF5,0x00F6:0xF6,0x00F7:0xF7,0x0159:0xF8,0x016F:0xF9,0x00FA:0xFA,0x0171:0xFB,0x00FC:0xFC,0x00FD:0xFD,0x0163:0xFE,0x02D9:0xFF},
	_HexStr:'0123456789ABCDEF',
   /**
    * Converts number to hexadecimal representation
    * @param {Number} number Number to convert
    * @return {String} Hex string
    */
	toHex:function(number) {
		if(typeof(number)!='number' || number < 0) {
      	throw new Error('toHex allows only numbers > 0 to be converted');
		}	
      var mod,hexStr='';
      while(number) {
      	mod = number%0x10;
      	hexStr = this._HexStr.charAt(mod) + hexStr;
      	number = (number-mod)/0x10;
      }    
		return hexStr;
	},
   /**
    * Converts utf entities to iso8859-2 ents (#xNN)
    * @param {String} str String to encode
    * @param {Boolean} ignore If true, characters that cannot be converted are ignored, otherwise they are changed to '?'
    * @param {String} divider Character that is placed before hex entity. Default is '&', but entity with ampersand is changed during http request in charcode
    * @return {String} Encoded string
    */
	utf2isoEntities:function(str,ignore,divider) {
		var retStr = '';
		if(typeof(divider) == 'undefined') {
			divider = '&';
		}
		var code=0;
		for(var i=0;i<str.length;i++) {
			code = str.charCodeAt(i);
			if(this._UTFtoISO[code]) {
				retStr += divider+'#x'+this.toHex(this._UTFtoISO[code])+';';
			} 
			else if(code < 0xFF && this._Entities.indexOf(String.fromCharCode(code))!=-1) {
				retStr += divider+'#x'+this.toHex(this._Entities.charCodeAt(this._Entities.indexOf(String.fromCharCode(code))))+';';
			}
			else if(code < 0xFF) {
				retStr += str.charAt(i);
			} else if(!ignore) {
				retStr += '?'; 
			}
		}
		return retStr; 
	},
	  iso2utf:function(str) {
  		var c,ret = '';
  		
  		for(var i=0,len=str.length;i<len;i++) {
  			c = str.charCodeAt(i);
  			if(JMFMIN.Convert._ISOtoUTF[c]) {
  				ret += String.fromCharCode(JMFMIN.Convert._ISOtoUTF[c]);
  			} else {
  				ret += str.charAt(i);
  			}
  		}
  		return ret;
  	},	
	/**
	 * Replaces html entities with html neutral ones (generally it replaces <> and so on characters with entities)
	 * @param {String} str String to remove ents
	 * @return {String}
	 */
	htmlEntities:function(str) {
		var retStr = '';
		var pos;
		for(var i=0;i<str.length;i++) {
			if(str.charCodeAt(i)<0xFF && (pos = this._HtmlEntities.chr.indexOf(str.charAt(i)))!=-1) {
				retStr += '&'+this._HtmlEntities.ent[pos]+';';
			} else {
				retStr += str.charAt(i);
			}
		}
		return retStr;
	}
};


   function serializer(sdata,encode) {
		var sString = ''; 	
		var tData = typeof(sdata);
		switch(tData) {
			case 'undefined':
			case 'unknown':
				sString = 'N;';
			break;
			case 'string':
				if(encode) {
					sdata = encodeURI(sdata);
				}
				sString = 's:'+sdata.length+':"'+sdata+'";';
			break;
			case 'object':
				if(sdata === null) {
					sString = 'N;';
					break;
				}
				var tabCnt = 0;
				var inArr = '';
				/*jslint forin: false */
				for(var i in sdata) {
					var inArrData = serializer(sdata[i],encode);				
					if(inArrData) {
						tabCnt++;
						if(i==parseInt(i,10)) {
							inArr += 'i:'+i+';';
						}
						else {
							inArr += 's:'+i.length+':"'+i+'";';
						}
						inArr  += inArrData;
					}
					if(tabCnt) {
					 sString = 'a:'+String(tabCnt)+':{'+inArr+'}';
					}
				}
				/*jslint forin: true */
			break;
			case 'number':
            if(isNaN(sdata)) {
               sString = 'N;';	
               break;
            }
            
				if(sdata != Math.floor(sdata)) {
					sString = 'd:'+String(sdata) + ';';
				}
				else {
					sString = 'i:'+String(sdata) + ';';
				}
			break;
			case 'boolean':
				sString = 'b:'+(sdata?'1':'0')+';';
			break;
		}
		
		return sString;
	}
