
function trim(s)
{
	var re_start, re_end;
	
	if (arguments.length > 1)
	{
		re_start = new RegExp("^"+arguments[1]+"+");
		re_end = new RegExp(arguments[1]+"+$");
	}
	// default is trim whitespace
	else
	{
		re_start = new RegExp("^\\s+");
		re_end = new RegExp("\\s+$");
	}
	s = s.replace(re_start, "");
	return s.replace(re_end, "");
}

function ucfirst(str)
{
	if (str && str.length)
	{
		switch (str.length)
		{
			case (0): return str;
			case (1): return str[0].toUpperCase();
			default:  return str[0].toUpperCase() + str.substr(1);
		}
	}
	return str;
}

function simple_text(str)
{
	return str.toLowerCase().replace(/ /g, '_');
}

function in_array(a, elem)
{
	var i;
	
	for (i = 0; i < a.length; ++i)
	{
		if (a[i] == elem)
		{
			return true;
		}
	}
	return false;
}

function format(n, decimals)
{
	var i, d;
	
	n = String(Math.round(n * Math.pow(10, decimals)) * Math.pow(10, -decimals));
	
	d = n.indexOf(".");
	
	if (d == -1)
	{
		n += ".";
		for(i = 0; i < decimals; i++) n += "0";
		return n;
	}
	
	if (d == 0)
	{
		n = "0" + n;
		d++;
	}
	
	if (d == 1 && n.substring(0, 1) == "-")
	{
		n = "-0" + n.substring(1, n.length);
		d++;
	}
	
	n = n.substring(0, d + decimals + 1);
	
	while (n.length <= d + decimals) n += "0";
	return n;
}

function format_dollars(n)
{
	var i, lang, thousands_separator, decimal_symbol, currency_symbol, show_cents;
	
	if (isNaN(n)) return n;
	n = format(n, 2);
	
	thousands_separator = ",";
	decimal_symbol = ".";
	currency_symbol = "$";
	
	// default is to show cents, if 2nd arg is passed in, don't show cents
	show_cents = (arguments.length == 1);
	
	n = n.replace(/\./, decimal_symbol);
	for (i = n.indexOf(decimal_symbol) - 3; i > 0; i -= 3)
	{
		n = n.substring(0, i) + thousands_separator + n.substr(i);
	}
	if (!show_cents)
	{
		n = n.substr(0, n.indexOf(decimal_symbol));
	}
	return currency_symbol + n;
}

function ajax_post(server_func, call_back_func, request_data, data_type)
{
	if (empty(data_type)) data_type = "json";
	request_data._ajax_func_ = server_func;
	$.post(String(window.location), request_data, function(response) { call_back_func(request_data, response); }, data_type);
}

function dbg()
{
	var i, str;
	
	str = '';
	for (i = 0; i < arguments.length; ++i)
	{
		str += '('+arguments[i]+')';
	}
	$('body').append('<p>'+str+'</p>');
}

function Point(_x, _y)
{
	if (arguments.length > 2)
	{
		this[arguments[2]] = _x;
		this[arguments[3]] = _y;
	}
	else
	{
		this.x = _x;
		this.y = _y;
	}
}

function empty(v)
{
	var i, type;
	
	type = typeof(v);
	switch (type)
	{
		case ('string'): return (v.match(/^\s*$/gi) != null || v == '0');
		case ('number'): return (v == 0);
		case ('boolean'): return !v;
		case ('undefined'): return true;
		case ('object'):
			for (i in v) return false;
			return true;
	}
	
	// some unknown type, return false
	return false;
}

function $empty(selector)
{
	return ($(selector).length == 0);
}

function $dom(selector)
{
	return ($empty(selector)) ? {} : $(selector)[0];
}

// jquery style getter/setter for form inputs
function $f(name)
{
	var elem;
	// set
	if (arguments.length > 1)
	{
		if ($empty('#f [name="'+name+'"]')) $('#f').append('<input type="hidden" name="'+name+'" value="'+arguments[1]+'" />');
		else $('#f [name="'+name+'"]').val(arguments[1]);
	}
	
	// get
	else
	{
		elem = $('#f [name="'+name+'"]');
		if (elem.is('[type=radio]')) return elem.filter(':checked').val();
		else return elem.val();
	}
}

function f_submit()
{
	$dom('#f').submit();
}

function f_set_action(url_parts)
{
	var s, part;
	
	s = '';
	for (i = 0; i < url_parts.length; ++i)
	{
		part = url_parts[i];
		if (!empty(part)) s += part+'/';
	}
	// default is for action to be absolute, if a 2nd argument is passed in, don't make it absolute
	if (arguments.length == 1) s = g_www_root+s;
	$dom('#f').action = s;
	f_submit();
}

function f_multi_select_value(selector, dst_name)
{
	var options, i, selected;
	
	
	options = $(selector+' option:selected');
	if (options.length == 0) return;
	selected = [];
	for (i = 0; i < options.length; ++i)
	{
		selected.push(options[i].value);
	}
	$f(dst_name, selected.join('\t'));
}

function str_pad(str, len, pad_char, left_right)
{
	str = String(str);
  while (str.length < len)
		str = (left_right == "LEFT") ? (pad_char + str) : (str + pad_char);
	
	return str;
}

function set_cookie(k, v, s)
{
	var d;
	
	if (s == 0)
	{
		document.cookie = k+"="+v+"; path=/";
	}
	else
	{
		d = new Date();
		d = new Date(d.getTime() + (s * 1000));
		document.cookie = k+"="+v+"; expires="+d.toUTCString()+"; path=/";
	}
}

function get_cookie(key)
{
	var cookie_str, i1, i2;
	
	cookie_str = document.cookie;
	i1 = cookie_str.indexOf(key + '=');
	if (i1 == -1) return null;
	if (i1 > 0 && cookie_str.charAt(i1 - 1) != " ") return null;
	i2 = cookie_str.indexOf(';', i1);
	if (i2 == -1) i2 = cookie_str.length;
	
	return cookie_str.substring(i1 + key.length + 1, i2);
}

function parse_query()
{
	var q, kv_pairs, kv_pair, i, r, loc;
	
	loc = (arguments.length > 0) ? arguments[0] : String(window.location);
	
	// check url for query
	i = loc.indexOf("?");
	if (i == -1) return {};
	
	q = loc.substr(i + 1);
	r = {};
	kv_pairs = q.split("&");
	for (i = 0; i < kv_pairs.length; ++i)
	{
		kv_pair = kv_pairs[i].split("=");
		r[kv_pair[0]] = unescape(kv_pair[1]);
	}
	return r;
}

function object_to_str(o)
{
	var str, i, separator;
	
	separator = (arguments.length > 1) ? arguments[1] : ", ";
	str = "";
	for (i in o)
	{
		if (!empty(str)) str += separator;
		str += i+"="+o[i];
	}
	return str;
}

function query_clear()
{
	var i, loc;
	
	loc = String(window.location);
	
	// check url for query
	i = loc.indexOf("?");
	
	// no query, just add query and set x=y
	if (i == -1)
	{
		return loc;
	}
	else
	{
		return loc.substr(0, i);
	}
}

function query_set(q)
{
	var i, loc;
	
	loc = String(window.location);
	
	// check url for query
	i = loc.indexOf("?");
	
	// no query, just add query and set x=y
	if (i == -1)
	{
		return (loc+"?"+q);
	}
	else
	{
		return loc.substr(0, i + 1)+q;
	}
}

function query_replace(x, y)
{
	var q, i, loc, reg_exp, matches;
	
	loc = (arguments.length > 2) ? arguments[2] : String(window.location);
	// check url for query
	i = loc.indexOf("?");
	
	// no query, just add query and set x=y
	if (i == -1)
	{
		return (loc+"?"+x+"="+escape(y));
	}
	else
	{
		reg_exp = new RegExp("(\\?|&)"+x+"=.*?(&|$)");
		matches = reg_exp.exec(loc);
		return (matches) ? loc.replace(matches[0], matches[1]+x+"="+escape(y)+matches[2]) : (loc + "&"+x+"="+escape(y));
	}
}
