function isArray()
{
	if(typeof arguments[0] == 'object')
	{
		var criterion = arguments[0].constructor.toString().match(/array/i);
 		return (criterion != null);
 	}

 	return false;
 }

function normalizeArray(array)
{
	if(typeof arguments[0] == 'object')
	{
		var len = 0;
		for(var i in array)
			len++;
		array.length = len;
	}
	else
	{
		array= new Array();
	}
}

function trim(string)
{
	return string.replace(/^\s+|\s+$/g, "");
}

function ltrim(string)
{
	return string.replace(/^\s+/, "");
}

function rtrim(string)
{
	return string.replace(/\s+$/, "");
}

function encodeHTMLentities(string)
{
	string = string.replace(/"/g,'&quot;'); // 34 22
	string = string.replace(/&/g,'&amp;'); // 38 26
	string = string.replace(/\'/g,'&#039;'); // 39 27
	string = string.replace(/</g,'&lt;'); // 60 3C
	string = string.replace(/>/g,'&gt;'); // 62 3E
	string = string.replace(/\^/g,'&circ;'); // 94 5E
	string = string.replace(/‘/g,'&lsquo;'); // 145 91
	string = string.replace(/’/g,'&rsquo;'); // 146 92
	string = string.replace(/“/g,'&ldquo;'); // 147 93
	string = string.replace(/”/g,'&rdquo;'); // 148 94
	string = string.replace(/•/g,'&bull;'); // 149 95
	string = string.replace(/–/g,'&ndash;'); // 150 96
	string = string.replace(/—/g,'&mdash;'); // 151 97
	string = string.replace(/˜/g,'&tilde;'); // 152 98
	string = string.replace(/™/g,'&trade;'); // 153 99
	string = string.replace(/š/g,'&scaron;'); // 154 9A
	string = string.replace(/›/g,'&rsaquo;'); // 155 9B
	string = string.replace(/œ/g,'&oelig;'); // 156 9C
	string = string.replace(//g,'&#357;'); // 157 9D
	string = string.replace(/ž/g,'&#382;'); // 158 9E
	string = string.replace(/Ÿ/g,'&Yuml;'); // 159 9F
	//string = string.replace(/ /g,'&nbsp;'); // 160 A0
	string = string.replace(/¡/g,'&iexcl;'); // 161 A1
	string = string.replace(/¢/g,'&cent;'); // 162 A2
	string = string.replace(/£/g,'&pound;'); // 163 A3
	//string = string.replace(/ /g,'&curren;'); // 164 A4
	string = string.replace(/¥/g,'&yen;'); // 165 A5
	string = string.replace(/¦/g,'&brvbar;'); // 166 A6
	string = string.replace(/§/g,'&sect;'); // 167 A7
	string = string.replace(/¨/g,'&uml;'); // 168 A8
	string = string.replace(/©/g,'&copy;'); // 169 A9
	string = string.replace(/ª/g,'&ordf;'); // 170 AA
	string = string.replace(/«/g,'&laquo;'); // 171 AB
	string = string.replace(/¬/g,'&not;'); // 172 AC
	string = string.replace(/­/g,'&shy;'); // 173 AD
	string = string.replace(/®/g,'&reg;'); // 174 AE
	string = string.replace(/¯/g,'&macr;'); // 175 AF
	string = string.replace(/°/g,'&deg;'); // 176 B0
	string = string.replace(/±/g,'&plusmn;'); // 177 B1
	string = string.replace(/²/g,'&sup2;'); // 178 B2
	string = string.replace(/³/g,'&sup3;'); // 179 B3
	string = string.replace(/´/g,'&acute;'); // 180 B4
	string = string.replace(/µ/g,'&micro;'); // 181 B5
	string = string.replace(/¶/g,'&para;'); // 182 B6
	string = string.replace(/·/g,'&middot;'); // 183 B7
	string = string.replace(/¸/g,'&cedil;'); // 184 B8
	string = string.replace(/¹/g,'&sup1;'); // 185 B9
	string = string.replace(/º/g,'&ordm;'); // 186 BA
	string = string.replace(/»/g,'&raquo;'); // 187 BB
	string = string.replace(/¼/g,'&frac14;'); // 188 BC
	string = string.replace(/½/g,'&frac12;'); // 189 BD
	string = string.replace(/¾/g,'&frac34;'); // 190 BE
	string = string.replace(/¿/g,'&iquest;'); // 191 BF
	string = string.replace(/À/g,'&Agrave;'); // 192 C0
	string = string.replace(/Á/g,'&Aacute;'); // 193 C1
	string = string.replace(/Â/g,'&Acirc;'); // 194 C2
	string = string.replace(/Ã/g,'&Atilde;'); // 195 C3
	string = string.replace(/Ä/g,'&Auml;'); // 196 C4
	string = string.replace(/Å/g,'&Aring;'); // 197 C5
	string = string.replace(/Æ/g,'&AElig;'); // 198 C6
	string = string.replace(/Ç/g,'&Ccedil;'); // 199 C7
	string = string.replace(/È/g,'&Egrave;'); // 200 C8
	string = string.replace(/É/g,'&Eacute;'); // 201 C9
	string = string.replace(/Ê/g,'&Ecirc;'); // 202 CA
	string = string.replace(/Ë/g,'&Euml;'); // 203 CB
	string = string.replace(/Ì/g,'&Igrave;'); // 204 CC
	string = string.replace(/Í/g,'&Iacute;'); // 205 CD
	string = string.replace(/Î/g,'&Icirc;'); // 206 CE
	string = string.replace(/Ï/g,'&Iuml;'); // 207 CF
	string = string.replace(/Ð/g,'&ETH;'); // 208 D0
	string = string.replace(/Ñ/g,'&Ntilde;'); // 209 D1
	string = string.replace(/Ò/g,'&Ograve;'); // 210 D2
	string = string.replace(/Ó/g,'&Oacute;'); // 211 D3
	string = string.replace(/Ô/g,'&Ocirc;'); // 212 D4
	string = string.replace(/Õ/g,'&Otilde;'); // 213 D5
	string = string.replace(/Ö/g,'&Ouml;'); // 214 D6
	string = string.replace(/×/g,'&times;'); // 215 D7
	string = string.replace(/Ø/g,'&Oslash;'); // 216 D8
	string = string.replace(/Ù/g,'&Ugrave;'); // 217 D9
	string = string.replace(/Ú/g,'&Uacute;'); // 218 DA
	string = string.replace(/Û/g,'&Ucirc;'); // 219 DB
	string = string.replace(/Ü/g,'&Uuml;'); // 220 DC
	string = string.replace(/Ý/g,'&Yacute;'); // 221 DD
	string = string.replace(/Þ/g,'&THORN;'); // 222 DE
	string = string.replace(/ß/g,'&szlig;'); // 223 DF
	string = string.replace(/à/g,'&agrave;'); // 224 E0
	string = string.replace(/á/g,'&aacute;'); // 225 E1
	string = string.replace(/â/g,'&acirc;'); // 226 E2
	string = string.replace(/ã/g,'&atilde;'); // 227 E3
	string = string.replace(/ä/g,'&auml;'); // 228 E4
	string = string.replace(/å/g,'&aring;'); // 229 E5
	string = string.replace(/æ/g,'&aelig;'); // 230 E6
	string = string.replace(/ç/g,'&ccedil;'); // 231 E7
	string = string.replace(/è/g,'&egrave;'); // 232 E8
	string = string.replace(/é/g,'&eacute;'); // 233 E9
	string = string.replace(/ê/g,'&ecirc;'); // 234 EA
	string = string.replace(/ë/g,'&euml;'); // 235 EB
	string = string.replace(/ì/g,'&igrave;'); // 236 EC
	string = string.replace(/í/g,'&iacute;'); // 237 ED
	string = string.replace(/î/g,'&icirc;'); // 238 EE
	string = string.replace(/ï/g,'&iuml;'); // 239 EF
	string = string.replace(/ð/g,'&eth;'); // 240 F0
	string = string.replace(/ñ/g,'&ntilde;'); // 241 F1
	string = string.replace(/ò/g,'&ograve;'); // 242 F2
	string = string.replace(/ó/g,'&oacute;'); // 243 F3
	string = string.replace(/ô/g,'&ocirc;'); // 244 F4
	string = string.replace(/õ/g,'&otilde;'); // 245 F5
	string = string.replace(/ö/g,'&ouml;'); // 246 F6
	string = string.replace(/÷/g,'&divide;'); // 247 F7
	string = string.replace(/ø/g,'&oslash;'); // 248 F8
	string = string.replace(/ù/g,'&ugrave;'); // 249 F9
	string = string.replace(/ú/g,'&uacute;'); // 250 FA
	string = string.replace(/û/g,'&ucirc;'); // 251 FB
	string = string.replace(/ü/g,'&uuml;'); // 252 FC
	string = string.replace(/ý/g,'&yacute;'); // 253 FD
	string = string.replace(/þ/g,'&thorn;'); // 254 FE
	string = string.replace(/ÿ/g,'&yuml;'); // 255 FF
	
	return string;
}

function decodeHTMLentities(string)
{
	string = string.replace(new RegExp("&quot;","g"),'"'); // 34 22
	string = string.replace(new RegExp("&amp;","g"),'&'); // 38 26
	string = string.replace(new RegExp("&#039;","g"),'\''); // 39 27
	string = string.replace(new RegExp("&lt;","g"),'<'); // 60 3C
	string = string.replace(new RegExp("&gt;","g"),'>'); // 62 3E
	string = string.replace(new RegExp("&circ;","g"),'\^'); // 94 5E
	string = string.replace(new RegExp("&lsquo;","g"),'‘'); // 145 91
	string = string.replace(new RegExp("&rsquo;","g"),'’'); // 146 92
	string = string.replace(new RegExp("&ldquo;","g"),'“'); // 147 93
	string = string.replace(new RegExp("&rdquo;","g"),'”'); // 148 94
	string = string.replace(new RegExp("&bull;","g"),'•'); // 149 95
	string = string.replace(new RegExp("&ndash;","g"),'–'); // 150 96
	string = string.replace(new RegExp("&mdash;","g"),'—'); // 151 97
	string = string.replace(new RegExp("&tilde;","g"),'˜'); // 152 98
	string = string.replace(new RegExp("&trade;","g"),'™'); // 153 99
	string = string.replace(new RegExp("&scaron;","g"),'š'); // 154 9A
	string = string.replace(new RegExp("&rsaquo;","g"),'›'); // 155 9B
	string = string.replace(new RegExp("&oelig;","g"),'œ'); // 156 9C
	string = string.replace(new RegExp("&#357;","g"),''); // 157 9D
	string = string.replace(new RegExp("&#382;","g"),'ž'); // 158 9E
	string = string.replace(new RegExp("&Yuml;","g"),'Ÿ'); // 159 9F
	//string = string.replace(new RegExp("&nbsp;","g"),' '); // 160 A0
	string = string.replace(new RegExp("&iexcl;","g"),'¡'); // 161 A1
	string = string.replace(new RegExp("&cent;","g"),'¢'); // 162 A2
	string = string.replace(new RegExp("&pound;","g"),'£'); // 163 A3
	//string = string.replace(new RegExp("&curren;","g"),' '); // 164 A4
	string = string.replace(new RegExp("&yen;","g"),'¥'); // 165 A5
	string = string.replace(new RegExp("&brvbar;","g"),'¦'); // 166 A6
	string = string.replace(new RegExp("&sect;","g"),'§'); // 167 A7
	string = string.replace(new RegExp("&uml;","g"),'¨'); // 168 A8
	string = string.replace(new RegExp("&copy;","g"),'©'); // 169 A9
	string = string.replace(new RegExp("&ordf;","g"),'ª'); // 170 AA
	string = string.replace(new RegExp("&laquo;","g"),'«'); // 171 AB
	string = string.replace(new RegExp("&not;","g"),'¬'); // 172 AC
	string = string.replace(new RegExp("&shy;","g"),'­'); // 173 AD
	string = string.replace(new RegExp("&reg;","g"),'®'); // 174 AE
	string = string.replace(new RegExp("&macr;","g"),'¯'); // 175 AF
	string = string.replace(new RegExp("&deg;","g"),'°'); // 176 B0
	string = string.replace(new RegExp("&plusmn;","g"),'±'); // 177 B1
	string = string.replace(new RegExp("&sup2;","g"),'²'); // 178 B2
	string = string.replace(new RegExp("&sup3;","g"),'³'); // 179 B3
	string = string.replace(new RegExp("&acute;","g"),'´'); // 180 B4
	string = string.replace(new RegExp("&micro;","g"),'µ'); // 181 B5
	string = string.replace(new RegExp("&para;","g"),"¶"); // 182 B6
	string = string.replace(new RegExp("&middot;","g"),'·'); // 183 B7
	string = string.replace(new RegExp("&cedil;","g"),'¸'); // 184 B8
	string = string.replace(new RegExp("&sup1;","g"),'¹'); // 185 B9
	string = string.replace(new RegExp("&ordm;","g"),'º'); // 186 BA
	string = string.replace(new RegExp("&raquo;","g"),'»'); // 187 BB
	string = string.replace(new RegExp("&frac14;","g"),'¼'); // 188 BC
	string = string.replace(new RegExp("&frac12;","g"),'½'); // 189 BD
	string = string.replace(new RegExp("&frac34;","g"),'¾'); // 190 BE
	string = string.replace(new RegExp("&iquest;","g"),'¿'); // 191 BF
	string = string.replace(new RegExp("&Agrave;","g"),'À'); // 192 C0
	string = string.replace(new RegExp("&Aacute;","g"),'Á'); // 193 C1
	string = string.replace(new RegExp("&Acirc;","g"),'Â'); // 194 C2
	string = string.replace(new RegExp("&Atilde;","g"),'Ã'); // 195 C3
	string = string.replace(new RegExp("&Auml;","g"),'Ä'); // 196 C4
	string = string.replace(new RegExp("&Aring;","g"),'Å'); // 197 C5
	string = string.replace(new RegExp("&AElig;","g"),'Æ'); // 198 C6
	string = string.replace(new RegExp("&Ccedil;","g"),'Ç'); // 199 C7
	string = string.replace(new RegExp("&Egrave;","g"),'È'); // 200 C8
	string = string.replace(new RegExp("&Eacute;","g"),'É'); // 201 C9
	string = string.replace(new RegExp("&Ecirc;","g"),'Ê'); // 202 CA
	string = string.replace(new RegExp("&Euml;","g"),'Ë'); // 203 CB
	string = string.replace(new RegExp("&Igrave;","g"),'Ì'); // 204 CC
	string = string.replace(new RegExp("&Iacute;","g"),'Í'); // 205 CD
	string = string.replace(new RegExp("&Icirc;","g"),'Î'); // 206 CE
	string = string.replace(new RegExp("&Iuml;","g"),'Ï'); // 207 CF
	string = string.replace(new RegExp("&ETH;","g"),'Ð'); // 208 D0
	string = string.replace(new RegExp("&Ntilde;","g"),'Ñ'); // 209 D1
	string = string.replace(new RegExp("&Ograve;","g"),'Ò'); // 210 D2
	string = string.replace(new RegExp("&Oacute;","g"),'Ó'); // 211 D3
	string = string.replace(new RegExp("&Ocirc;","g"),'Ô'); // 212 D4
	string = string.replace(new RegExp("&Otilde;","g"),'Õ'); // 213 D5
	string = string.replace(new RegExp("&Ouml;","g"),'Ö'); // 214 D6
	string = string.replace(new RegExp("&times;","g"),'×'); // 215 D7
	string = string.replace(new RegExp("&Oslash;","g"),'Ø'); // 216 D8
	string = string.replace(new RegExp("&Ugrave;","g"),'Ù'); // 217 D9
	string = string.replace(new RegExp("&Uacute;","g"),'Ú'); // 218 DA
	string = string.replace(new RegExp("&Ucirc;","g"),'Û'); // 219 DB
	string = string.replace(new RegExp("&Uuml;","g"),'Ü'); // 220 DC
	string = string.replace(new RegExp("&Yacute;","g"),'Ý'); // 221 DD
	string = string.replace(new RegExp("&THORN;","g"),'Þ'); // 222 DE
	string = string.replace(new RegExp("&szlig;","g"),'ß'); // 223 DF
	string = string.replace(new RegExp("&agrave;","g"),'à'); // 224 E0
	string = string.replace(new RegExp("&aacute;","g"),'á'); // 225 E1
	string = string.replace(new RegExp("&acirc;","g"),'â'); // 226 E2
	string = string.replace(new RegExp("&atilde;","g"),'ã'); // 227 E3
	string = string.replace(new RegExp("&auml;","g"),'ä'); // 228 E4
	string = string.replace(new RegExp("&aring;","g"),'å'); // 229 E5
	string = string.replace(new RegExp("&aelig;","g"),'æ'); // 230 E6
	string = string.replace(new RegExp("&ccedil;","g"),'ç'); // 231 E7
	string = string.replace(new RegExp("&egrave;","g"),'è'); // 232 E8
	string = string.replace(new RegExp("&eacute;","g"),'é'); // 233 E9
	string = string.replace(new RegExp("&ecirc;","g"),'ê'); // 234 EA
	string = string.replace(new RegExp("&euml;","g"),'ë'); // 235 EB
	string = string.replace(new RegExp("&igrave;","g"),'ì'); // 236 EC
	string = string.replace(new RegExp("&iacute;","g"),'í'); // 237 ED
	string = string.replace(new RegExp("&icirc;","g"),'î'); // 238 EE
	string = string.replace(new RegExp("&iuml;","g"),'ï'); // 239 EF
	string = string.replace(new RegExp("&eth;","g"),'ð'); // 240 F0
	string = string.replace(new RegExp("&ntilde;","g"),'ñ'); // 241 F1
	string = string.replace(new RegExp("&ograve;","g"),'ò'); // 242 F2
	string = string.replace(new RegExp("&oacute;","g"),'ó'); // 243 F3
	string = string.replace(new RegExp("&ocirc;","g"),'ô'); // 244 F4
	string = string.replace(new RegExp("&otilde;","g"),'õ'); // 245 F5
	string = string.replace(new RegExp("&ouml;","g"),'ö'); // 246 F6
	string = string.replace(new RegExp("&divide;","g"),'÷'); // 247 F7
	string = string.replace(new RegExp("&oslash;","g"),'ø'); // 248 F8
	string = string.replace(new RegExp("&ugrave;","g"),'ù'); // 249 F9
	string = string.replace(new RegExp("&uacute;","g"),'ú'); // 250 FA
	string = string.replace(new RegExp("&ucirc;","g"),'û'); // 251 FB
	string = string.replace(new RegExp("&uuml;","g"),'ü'); // 252 FC
	string = string.replace(new RegExp("&yacute;","g"),'ý'); // 253 FD
	string = string.replace(new RegExp("&thorn;","g"),'þ'); // 254 FE
	string = string.replace(new RegExp("&yuml;","g"),'ÿ'); // 255 FF
	
	return string;
}

/**
*
*  Base64 encode / decode
*  http://www.webtoolkit.info/
*
**/

var Base64 = {

    // private property
    _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",

    // public method for encoding
    encode : function (input) {
        var output = "";
        var chr1, chr2, chr3, enc1, enc2, enc3, enc4;
        var i = 0;

        input = Base64._utf8_encode(input);

        while (i < input.length) {

            chr1 = input.charCodeAt(i++);
            chr2 = input.charCodeAt(i++);
            chr3 = input.charCodeAt(i++);

            enc1 = chr1 >> 2;
            enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
            enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
            enc4 = chr3 & 63;

            if (isNaN(chr2)) {
                enc3 = enc4 = 64;
            } else if (isNaN(chr3)) {
                enc4 = 64;
            }

            output = output +
            this._keyStr.charAt(enc1) + this._keyStr.charAt(enc2) +
            this._keyStr.charAt(enc3) + this._keyStr.charAt(enc4);

        }

        return output;
    },

    // public method for decoding
    decode : function (input) {
        var output = "";
        var chr1, chr2, chr3;
        var enc1, enc2, enc3, enc4;
        var i = 0;

        input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

        while (i < input.length) {

            enc1 = this._keyStr.indexOf(input.charAt(i++));
            enc2 = this._keyStr.indexOf(input.charAt(i++));
            enc3 = this._keyStr.indexOf(input.charAt(i++));
            enc4 = this._keyStr.indexOf(input.charAt(i++));

            chr1 = (enc1 << 2) | (enc2 >> 4);
            chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
            chr3 = ((enc3 & 3) << 6) | enc4;

            output = output + String.fromCharCode(chr1);

            if (enc3 != 64) {
                output = output + String.fromCharCode(chr2);
            }
            if (enc4 != 64) {
                output = output + String.fromCharCode(chr3);
            }

        }

        output = Base64._utf8_decode(output);

        return output;

    },

    // private method for UTF-8 encoding
    _utf8_encode : function (string) {
        string = string.replace(/\r\n/g,"\n");
        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    },

    // private method for UTF-8 decoding
    _utf8_decode : function (utftext) {
        var string = "";
        var i = 0;
        var c = c1 = c2 = 0;

        while ( i < utftext.length ) {

            c = utftext.charCodeAt(i);

            if (c < 128) {
                string += String.fromCharCode(c);
                i++;
            }
            else if((c > 191) && (c < 224)) {
                c2 = utftext.charCodeAt(i+1);
                string += String.fromCharCode(((c & 31) << 6) | (c2 & 63));
                i += 2;
            }
            else {
                c2 = utftext.charCodeAt(i+1);
                c3 = utftext.charCodeAt(i+2);
                string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
                i += 3;
            }

        }

        return string;
    }

}

