function JS_Concat(arr_parts,str_delim) {
	var str_result = '';
	for (var i=0;i<arr_parts.length;i++) {
		if (typeof(arr_parts[i]) == "string" && arr_parts[i].length > 0) {
			if (str_result.length > 0) str_result += str_delim;
			str_result += arr_parts[i];
		}
	}
	return str_result;
}
function JS_JString(s) {
	var r = new String(s);
	var t = {'\b':'\\b','\t':'\\t','\n':'\\n','\f':'\\f','\r':'\\r','"' :'\\"','\\':'\\\\'};
	var e = new RegExp('[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]','g');
	e.lastIndex = 0;
	return e.test(r) ? r.replace(e,function (a) {
		var c = t[a];
		return typeof(c) === 'string' ? c : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
	}) : r;
}
function JS_isDate(str_in) {
	return !isNaN(Date.parse(str_in));
}
function JS_fDate(s,f) {
	var d;
	if (s instanceof Date) {
		d = s;
	} else
	if (s instanceof Number) {
		d = new Date(s);
	} else {
		var i = Date.parse(s);
		if (!isNaN(i)) d = new Date(i);
	}
	var r = '';
	if (d) {
		r = f ? new String(f) : '{yyyy}-{mm}-{dd}';
		var t = {
			'yyyy':d.getFullYear(),
			'yy':d.getFullYear().toString().substr(2),
			'm':d.getMonth() + 1,
			'cc':['January','February','March','April','May','June','July','August','September','October','November','December'][d.getMonth()],
			'd':d.getDate(),
			'ww':['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'][d.getDay()],
			'H':d.getHours(),
			'n':d.getMinutes(),
			's':d.getSeconds()
		};
		t['c'] = t['cc'].substr(0,3);
		t['w'] = t['ww'].substr(0,3);
		t['p'] = t['H'] > 11 ? 'pm' : 'am';
		t['P'] = t['p'].toUpperCase();
		t['h'] = t['H'] > 12 || t['H'] == 0 ? Math.abs(t['H'] - 12) : t['H'];
		var p = ['m','d','H','h','n','s'];
		for (var i=0;i<p.length;i++) t[p[i] + p[i]] = _Pad(t[p[i]],2,'0');
		for (var i in t) r = r.split('{' + i + '}').join(t[i]);
	}
	return r;
}
function JS_fCurrency(v) {
	v = new String(v).replace(/\$|\,/g,'');
	if(isNaN(v)) v = "0";
	var s = (v == (v = Math.abs(v)));
	v = Math.floor(v*100+0.50000000001);
	var c = v%100;
	v = Math.floor(v/100).toString();
	if (c<10) c = '0' + c;
	for (var i = 0; i < Math.floor((v.length - (1 + i)) / 3);i++) v = v.substring(0,v.length - (4 * i + 3)) + ',' + v.substring(v.length - (4 * i + 3));
	return (((s) ? '' : '-') + '$' + v + '.' + c);
}
function _Pad(s,l,c) {
	var r = new String(s);
	if (r.length < l) {
		r = new Array(l - r.length + 1).join(c) + r;
	}
	return r;
}
function JS_Sort(o,t) {
	if ('|string|number|date|'.indexOf('|' + t + '|') < 0) t = 'string';
	var a = [];
	for (n in o) a.push({n:n,v:o[n]});
	a.sort(function(a,b){
		var an = a.n, bn = b.n;
		if (t == 'number') { an = an * 1.0; bn = bn * 1.0; }
		if (t == 'date') { an = new Date(Date.parse(an)); bn = new Date(Date.parse(bn)); }
		if (an < bn) return -1;
		if (an > bn) return 1;
		return 0;
	});
	var r = {};
	for (var i=0;i<a.length;i++) r[new String(a[i].n)] = a[i].v;
	return r;
}
function JS_inCSV(s1,s2,t) {
	t = t || ',';
	s1 = (s1) ? new String(s1) : '';
	s1 = t + s1 + t;
	return (s1.indexOf(t + s2 + t) >= 0);
}
function JS_Replace(str_sup,str_bef,str_aft) {
	return str_sup.split(str_bef).join(str_aft);
}
function JS_StartsWith(str_sup,str_sub) {
	return (str_sup.toLowerCase().indexOf(str_sub.toLowerCase()) == 0);
}
function JS_EndsWith(str_sup,str_sub) {
	return (str_sup.toLowerCase().indexOf(str_sub.toLowerCase()) == str_sup.length - str_sub.length);
}
function JS_ReplaceHead(str_sup, str_bef, str_aft) {
	if (JS_StartsWith(str_sup,str_bef)) {
		return str_aft + str_sup.substr(str_bef.length);
	}
	return str_sup;
}
function JS_ReplaceTail(str_sup, str_bef, str_aft) {
	if (JS_EndsWith(str_sup,str_bef)) {
		return str_sup.substr(0,str_sup.length - str_bef.length) + str_aft;
	}
	return str_sup;
}
function JS_UrlEncode(str_input) {
	return escape(str_input).replace(/\+/g,'%2B');
}
function JS_UrlDecode(str_input) {
	return unescape(str_input.replace(/\+/g,'%20'));
}
function JS_Obj2QS(obj_params) {
	var str_result = '';
	if (typeof(obj_params) == 'object') {
		for (var str_item in obj_params) str_result += '&' + JS_UrlEncode(str_item) + '=' + JS_UrlEncode(obj_params[str_item]);
		if (str_result.length > 0 ) {
			str_result = str_result.substr(1);
		}
	}
	return str_result;
}
function JS_QS2Obj(str_qs) {
	var obj_result = {};
	var arr_terms = str_qs.split('&');
	for (var i=0;i<arr_terms.length;i++) {
		var arr_nv = arr_terms[i].split('=');
		if (arr_nv.length == 2) obj_result[JS_UrlDecode(arr_nv[0])] = JS_UrlDecode(arr_nv[1]);
	}
	return obj_result;
}
function JS_d2h(d) {return d.toString(16);}
function JS_h2d(h) {return parseInt(h,16);}

