function chr( ascii ) {
	return String.fromCharCode(ascii);
}

function rand( min, max ) {
	if( max ) {
		return Math.floor(Math.random() * (max - min + 1)) + min;
	} else {
		return Math.floor(Math.random() * (min + 1));
	}
}

function implode( glue, pieces ) {
	return ( ( pieces instanceof Array ) ? pieces.join ( glue ) : pieces );
}

function is_array( mixed_var ) {
	return ( mixed_var instanceof Array );
}

function is_null( mixed_var ){
	return ( mixed_var === null );
}

function isset(v) {
	if (typeof v != 'undefined') { return true; }
	return false;
}

function is_numeric( mixed_var ) {
	return !isNaN( mixed_var );
}

function is_int( mixed_var ){
	return typeof( mixed_var )=='number'&&parseInt( mixed_var ).toString()==mixed_var.toString();
}

function is_string( mixed_var ){
	return (typeof( mixed_var ) == 'string');
}

function is_int(input){
	return typeof(input)=='number'&&parseInt(input)==input;
}

function number_format( number, decimals, dec_point, thousands_sep ) {
	var i, j, kw, kd, km, neg = "";
	if( isNaN(decimals = Math.abs(decimals)) ){
		decimals = 2;
	}
	if( dec_point == undefined ){
		dec_point = ".";
	}
	if( thousands_sep == undefined ){
		thousands_sep = ",";
	}
	i = parseInt(number = (+number || 0).toFixed(decimals)) + "";
	if (i.substr(0,1) == "-") {
		number = Math.abs(number);
		neg = "-";
		i = i.substr(1);
	}
	if ((j = i.length) > 3 ) {
		j = j % 3;
	} else {
		j = 0;
	}
	km = (j ? i.substr(0, j) + thousands_sep : "");
	kw = i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + thousands_sep);
	kd = (decimals ? dec_point + Math.abs(number - i).toFixed(decimals).replace(/-/, 0).slice(2) : "");
	return neg + km + kw + kd;
}

function ord( string ) {
	return string.charCodeAt(0);
}


function str_repeat ( input, multiplier ) {
	var buf = '';
	for (i=0; i < multiplier; i++){
		buf += input;
	}
	return buf;
}

function str_ireplace ( search, replace, subject ) {
	var i;
	if(!(replace instanceof Array)){
		replace=new Array(replace);
			if(search instanceof Array){
				while(search.length>replace.length){
					replace[replace.length]=replace[0];
				}
			}
	}
	if(!(search instanceof Array))search=new Array(search);
	while(search.length>replace.length){
		replace[replace.length]='';
	}
	if(subject instanceof Array){
		for(k in subject){
			subject[k]=str_replace(search,replace,subject[k]);
		}
		return subject;
	}
	for(var k=0; k<search.length; k++){
		reg = new RegExp(search[k], 'gi');
		subject = subject.replace(reg, replace[k]);
	}
	return subject;
}

function str_replace(search, replace, subject) {
	var __regexp_escape = function(text) {
		if (!arguments.callee.sRE) {
			var specials = ['/', '.', '*', '+', '?', '|', '(', ')', '[', ']', '{', '}', '\\' ];
			arguments.callee.sRE = new RegExp('(\\' + specials.join('|\\') + ')', 'g');
		}
		return text.replace(arguments.callee.sRE, '\\$1');
	};
	var numreplx, numon, fincods, k;
	if(!(replace instanceof Array)){
		replace = new Array(replace);
		if(search instanceof Array){
			while(search.length>replace.length){
				replace[replace.length]=replace[0];
			}
		}
	}
	if(!(search instanceof Array)){
		search = new Array( search );
	}
	while( search.length > replace.length ){ 
		replace[replace.length] = '';
	}
	if(subject instanceof Array){
		for(k in subject){
			subject[k] = str_replace(search, replace, subject[k]);
		}
		return subject;
	}
	numreplx = search.length;
	numon = 0;
	fincods = new Array();
	while( fincods.length < numreplx ){
		nsub = subject;
		for( x = 0; x < fincods.length; x++ ){
			nsub = nsub.replace(new RegExp(__regexp_escape(search[x]), "g"), "[cod"+fincods[x]+"]");
		}
		for( x = 0; x < fincods.length; x++ ){
			nsub = nsub.replace(new RegExp(__regexp_escape("[cod"+fincods[x]+"]"), "g"), replace[x]);
		}
		if( nsub.indexOf("[cod"+numon+"]") == -1 ){
			fincods[fincods.length]=numon;
		}
		numon++;
	}
	for( x = 0; x < fincods.length; x++ ){
		subject=subject.replace(new RegExp(__regexp_escape(search[x]), "g"), "[cod"+fincods[x]+"]");
	}
	for( x = 0; x < fincods.length; x++ ){
		subject=subject.replace(new RegExp(__regexp_escape("[cod"+fincods[x]+"]"), "g"), replace[x]);
	}
	return subject;
}


function strlen( string ){
	return string.length;
}

function strripos( haystack, needle, offset){
	var i = haystack.toLowerCase().lastIndexOf( needle.toLowerCase(), offset ); // returns -1
	return i >= 0 ? i : false;
}

function strpos( haystack, needle, offset){
	var i = haystack.indexOf( needle, offset ); // returns -1
	return i >= 0 ? i : false;
}

function strrev( string ){
	var ret = '', i = 0;
	for ( i = string.length-1; i >= 0; i-- ){
		ret += string.charAt(i);
	}
	return ret;
}

function stristr( haystack, needle, bool ) {
	var pos = 0;
	pos = haystack.toLowerCase().indexOf( needle.toLowerCase() );
	if( pos == -1 ){
		return false;
	} else{
		if( bool ){
			return haystack.substr( 0, pos );
		} else{
			return haystack.slice( pos );
		}
	}
}

function strstr( haystack, needle, bool ) {
	var pos = 0;
	pos = haystack.indexOf( needle );
	if( pos == -1 ){
		return false;
	} else{
		if( bool ){
			return haystack.substr( 0, pos );
		} else{
			return haystack.slice( pos );
		}
	}
}

function strtolower( str ) {
	return str.toLowerCase();
}

function strtoupper( str ) {
	return str.toUpperCase();
}

function substr( f_string, f_start, f_length ) {
	if(f_start < 0) {
		f_start += f_string.length;
	}
	if(f_length == undefined) {
		f_length = f_string.length;
	} else if(f_length < 0){
		f_length += f_string.length;
	} else {
		f_length += f_start;
	}
	if(f_length < f_start) {
		f_length = f_start;
	}
	return f_string.substring(f_start, f_length);
}

function wordwrap( str, int_width, str_break, cut ) {
	var i, j, s, r = str.split("\n");
	if(int_width > 0) for(i in r){
		for(s = r[i], r[i] = ""; s.length > int_width;
		j = cut ? int_width : (j = s.substr(0, int_width).match(/\S*$/)).input.length - j[0].length || int_width,
		r[i] += s.substr(0, j) + ((s = s.substr(j)).length ? str_break : "")
		);
		r[i] += s;
	}
	return r.join("\n");
}

function trim( str, charlist ) {
	var whitespace;
	if (str.length==0) { return ''; }
	if(!charlist){
		whitespace = ' \n\r\t\f\x0b\xa0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000';
	} else{
		whitespace = charlist.replace(/([\[\]\(\)\.\?\/\*\{\}\+\$\^\:])/g, '\$1');
	}
	for (var i = 0; i < str.length; i++) {
		if (whitespace.indexOf(str.charAt(i)) === -1) {
			str = str.substring(i);
			break;
		}
	}
	for (i = str.length - 1; i >= 0; i--) {
		if (whitespace.indexOf(str.charAt(i)) === -1) {
			str = str.substring(0, i + 1);
			break;
		}
	}
	return whitespace.indexOf(str.charAt(0)) === -1 ? str : '';
}

function count( mixed_var, mode ) {
	var key, cnt = 0;
	if( mode == 'COUNT_RECURSIVE' ) mode = 1;
	if( mode != 1 ) mode = 0;
	for (key in mixed_var){
		cnt++;
		if( mode==1 && mixed_var[key] && (mixed_var[key].constructor === Array || mixed_var[key].constructor === Object) ){
			cnt += count(mixed_var[key], 1);
		}
	}
	return cnt;
}

function strip_all_tags( str ){
	return str.replace(/<\/?[^>]+>/gi, '');
}

function strip_tags(str,tags){
	return str.replace(RegExp('<\/? *('+implode('|',explode(',',tags.replace(' ','')))+')( +[^>]*)?>', 'gi'), '');
}

function strip_all_taged(str){
	return str.replace(RegExp('<[a-z]+( [^>]*)?>.*<\/[a-z]+>', 'gi'), '');
}

function base64_decode (data) {
	var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, dec = "", tmp_arr = [];
	if (!data) {
		return data;
	}
	data += '';
	do {  // unpack four hexets into three octets using index points in b64
		h1 = b64.indexOf(data.charAt(i++));
		h2 = b64.indexOf(data.charAt(i++));
		h3 = b64.indexOf(data.charAt(i++));
		h4 = b64.indexOf(data.charAt(i++));
		bits = h1<<18 | h2<<12 | h3<<6 | h4;
		o1 = bits>>16 & 0xff;
		o2 = bits>>8 & 0xff;
		o3 = bits & 0xff;
		if (h3 == 64) {
			tmp_arr[ac++] = String.fromCharCode(o1);
		} else if (h4 == 64) {
			tmp_arr[ac++] = String.fromCharCode(o1, o2);
		} else {
			tmp_arr[ac++] = String.fromCharCode(o1, o2, o3);
		}
	} while (i < data.length);
	dec = tmp_arr.join('');
	dec = this.utf8_decode(dec);
	return dec;
}

function base64_encode (data) {
	var b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
	var o1, o2, o3, h1, h2, h3, h4, bits, i = 0, ac = 0, enc="", tmp_arr = [];
	if (!data) { return data; }
	data = this.utf8_encode(data+'');
	do { // pack three octets into four hexets
		o1 = data.charCodeAt(i++);
		o2 = data.charCodeAt(i++);
		o3 = data.charCodeAt(i++);
		bits = o1<<16 | o2<<8 | o3;
		h1 = bits>>18 & 0x3f;
		h2 = bits>>12 & 0x3f;
		h3 = bits>>6 & 0x3f;
		h4 = bits & 0x3f;
		// use hexets to index into b64, and append result to encoded string
		tmp_arr[ac++] = b64.charAt(h1) + b64.charAt(h2) + b64.charAt(h3) + b64.charAt(h4);
	} while (i < data.length);
	enc = tmp_arr.join('');
	switch (data.length % 3) {
		case 1:
			enc = enc.slice(0, -2) + '==';
		break;
		case 2:
			enc = enc.slice(0, -1) + '=';
		break;
	}
	return enc;
}

function utf8_decode ( str_data ) {
	var tmp_arr = [], i = 0, ac = 0, c1 = 0, c2 = 0, c3 = 0;
	str_data += '';
	while ( i < str_data.length ) {
		c1 = str_data.charCodeAt(i);
		if (c1 < 128) {
			tmp_arr[ac++] = String.fromCharCode(c1);
			i++;
		} else if ((c1 > 191) && (c1 < 224)) {
			c2 = str_data.charCodeAt(i+1);
			tmp_arr[ac++] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
			i += 2;
		} else {
			c2 = str_data.charCodeAt(i+1);
			c3 = str_data.charCodeAt(i+2);
			tmp_arr[ac++] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
			i += 3;
		}
	}
	return tmp_arr.join('');
}

function utf8_encode ( argString ) {
	var string = (argString+''); // .replace(/\r\n/g, "\n").replace(/\r/g, "\n");
	var utftext = "";
	var start, end;
	var stringl = 0;
	start = end = 0;
	stringl = string.length;
	for (var n = 0; n < stringl; n++) {
		var c1 = string.charCodeAt(n);
		var enc = null;
		if (c1 < 128) {
			end++;
		} else if (c1 > 127 && c1 < 2048) {
			enc = String.fromCharCode((c1 >> 6) | 192) + String.fromCharCode((c1 & 63) | 128);
		} else {
			enc = String.fromCharCode((c1 >> 12) | 224) + String.fromCharCode(((c1 >> 6) & 63) | 128) + String.fromCharCode((c1 & 63) | 128);
		}
		if (enc !== null) {
			if (end > start) {
				utftext += string.substring(start, end);
			}
			utftext += enc;
			start = end = n+1;
		}
	}
	if (end > start) {
		utftext += string.substring(start, string.length);
	}
	return utftext;
}

function urlencode ( argString ) {
	return encodeURIComponent(argString);
}

function urldecode ( argString ) {
	return decodeURI(argString);
}

function isset(v) {
	if (typeof v != 'undefined') { return true; }
	return false;
}

function parseStr(s) {
	var rv = {}, decode = window.decodeURIComponent || window.unescape;
	(s == null ? location.search : s).replace(/^[?#]/, "").replace(/([^=&]*?)((?:\[\])?)(?:=([^&]*))?(?=&|$)/g,
	function ($, n, arr, v) {
		if (n == "") { return; } n = decode(n); v = decode(v);
		if (arr) { if (typeof rv[n] == "object") { rv[n].push(v); } else { rv[n] = [v]; } } else { rv[n] = v; }
	});
	return rv;
}

function explode (delimiter, string, limit) {
	var emptyArray = {0:''};
	if (arguments.length < 2 || typeof arguments[0] == 'undefined' || typeof arguments[1] == 'undefined') { return null; }
	if (delimiter === '' || delimiter === false || delimiter === null) { return false; }
	if (typeof delimiter == 'function' || typeof delimiter == 'object' || typeof string == 'function' || typeof string == 'object') { return emptyArray; }
	if (delimiter === true) { delimiter = '1'; }
	if (!limit) {
		return string.toString().split(delimiter.toString());
	} else {
		var splitted = string.toString().split(delimiter.toString()), partA = splitted.splice(0, limit - 1), partB = splitted.join(delimiter.toString());
		partA.push(partB);
		return partA;
	}
}

function empty (data) {
	if (data!==undefined) {
		if (is_array(data) && data.length>0) { return false; }
		if (data!==null && data!="") { return false; }
	}
	return true;
}

