
/*
Object.prototype.marshal = function(s) {
	var a = s.split(" ");
	for(var i = 0; i < a.length; i++)
		this[a[i]] = top[a[i]];
	return this;
}

*/

function trim(s) 
{
	if(s) {
        s = s.replace( /^\s+/gi, "" );          // nuke leading whitespace
        s = s.replace( /\s+$/gi, "" );          // nuke trailing whitespace
	}
    return s;
}


var _ =
{
	e: function(a) {
			if(a.match(/^#/))
				return document.getElementById(a.substring(1));
			return null;
		},
	v: function(a) {
		var l = this.e(a);
		return l ? l.value : null;
	},

	/*
	alert(_.dump([7, undefined, null, parseInt(null)],1));
	alert(_.dump([function(){},{x:9,y:'smeg'},["foo","bar",3],11], 1));
	alert(_.dump([9,"eat at \"joe's\"!",{foo:'bar'},[3,5]]));
	alert(_.dump("smeg"));
	alert(_.dump(2.3));
	alert(_.dump(function(){}));
	alert(_.dump(1,1));
	alert(_.dump([5,7,11],1));
	alert(_.dump({foo:'bar',baz:7,ob:{x:"y",z:0},ar:['a',3]},1));

	xxx Needs to detect recursion somehow
	*/
	dump: function(a,indent) {
		if(indent > 10)
			return null;
		var tabs = "";
		var nl = "";
		if(typeof indent === "number")
		{
			nl = "\n";
			var i = indent;
			while(i-- > 0)
			{
				tabs += "\t";
			}
			indent++;
		}
		if(a instanceof Function)
		{
			return "\"function\"";
		}
		else
		if(a instanceof Array)
		{
			var n = a.length;
			var g = "";
			for(var i = 0; i < n; i++)
			{
				if(g)
					g += ","+nl;
				g += tabs+(_.dump(a[i], indent));
			}
			return "["+nl+g+nl+(tabs.substr(1))+"]";
		}
		else
		if(a instanceof Object)
		{
			var g = "";
			for(var p in a)
			{
				if(g)
					g += ","+nl;
				g += tabs + p + ":" + _.dump(a[p], indent);
			}
			return "{"+nl+g+nl+(tabs.substr(1))+"}";
		}
		else
		if(typeof a === "string")
		{
			return "\""+(a.replace(/"/g,"\\\""))+"\"";
		}
		else
		if(typeof a === "number")
		{
			return a;
		}
		return "(?)";
	}
}

function msg(s)
{
	var o = document.getElementById("msg");
	o.innerHTML = s+"<br/>\n"+o.innerHTML;
}

function elem(id)
{
	return document.getElementById(id);
}

function elval(id)
{
	return elem(id).value;
}


function showDiv(s)
{
	var e = elem(s);
	e.style.display = "block";
}

function hideDiv(s)
{
	var e = elem(s);
	e.style.display = "none";
}


function setHTML(id, s)
{
	var e = elem(id);
	e.innerHTML = s;
}

function appHTML(id, s)
{
	var e = elem(id);
//document.write("e="+e+"<br> id="+id+"<br>s="+s+"<br>");
	e.innerHTML = e.innerHTML + s;
}


function dbg(s, descend)
{
	var e = elem("dbg");
	if(!e)
		return;
	var ih = e.innerHTML.substr(-10000);
	//if(!dbgips.match(rip))
	//	return;
	if(descend)
		e.innerHTML = s+"<br/>\n"+ih;
	else
		e.innerHTML = ih+"<br/>\n"+s;
	e.style.display = "block";
}


function dobj(obj, indent)
{
	var s = "";
	for(var n = 0; n < indent; n++)
		s = s+"&nbsp;&nbsp;";
	for(var prop in obj)
	{
		if((typeof(obj[prop]) == 'object') && (indent < 10))
		{
			dbg(s+prop+" ("+obj[prop]+")");
			dobj(obj[prop], indent+1);
		}
		else
		{
			dbg(s+prop+"="+obj[prop]);
		}
	}
}


function hasShift(evt)
{
    evt = (evt) ? evt : (window.event) ? window.event : "";
    if(evt)
    {
        evt = (evt) ? evt : (window.event) ? window.event : "";
        if(evt.modifiers)
            return (evt.modifiers & Event.SHIFT_MASK) ? true : false;
        else
            return evt.shiftKey ? true : false;
    }
    return false;
}

function hasCtrl(evt)
{
    evt = (evt) ? evt : (window.event) ? window.event : "";
    if(evt)
    {
        evt = (evt) ? evt : (window.event) ? window.event : "";
        if(evt.modifiers)
            return (evt.modifiers & Event.CONTROL_MASK) ? true : false;
        else
            return evt.ctrlKey ? true : false;
    }
    return false;
}


function jmp(url)
{
	//document.body.innerHTML = "<a href=\""+url+"\">jmp(\""+url+"\")</a>";
	document.location = url;
}


function iter(a, f)
{
    var l = a.length;
    for(var i = 0; i < l; i++)
        f(a[i], i);
}

function setData(e, t, v)
{
    e.setAttribute("data-"+t, v);
}

function getData(e, t)
{
    return e.getAttribute("data-"+t);
}

function txt2ul(txt, uc, lc)
{
    uc = uc ? "class='"+uc+"'" : "";
    lc = lc ? "class='"+lc+"'" : "";
    a = txt.split("\n");
    var s = "<ul "+uc+">\n";
    iter(a, function (e, i) {
        s += "<li "+lc+">"+e+"</li>\n";
    });
    s += "</ul>\n";
    return s;
}

function able(e, b)
{
	if(typeof e == "string")
		e = elem(e);
	e.disabled = b;
}

function disable(e)
{
	able(e, true);
}

function enable(e)
{
	able(e, false);
}

function reload()
{
	document.location.reload();
}



// expects jquery
function inpOn()
{
	$(':input').attr('disabled', false);
}
function inpOff()
{
	$(':input').attr('disabled', true);
}

function validEmail(s)
{
	return /^[A-Za-z0-9_\+-]+(\.[A-Za-z0-9_\+-]+)*@[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)*\.([A-Za-z]{2,4})$/.test(s);
}

function validCCNumber(s)
{
	/* amex #s are 15 digits long, visa/mc are 16 */
	return /^\d{15,16}$/.test(s.replace(/[^\d]/g, ""));
}

function validDateTime(s)
{
	s = trim(s);
	if(s === "")
		return 0;

	var m = s.match(/^([0-9]+)[^0-9]([0-9]+)[^0-9]([0-9]+)[^0-9]+([0-9]+)[^0-9]([0-9]+)$/);
	if(!m)
		return null;

	var d = new Date();

	if(m[3] < 0)
		return null;
	d.setFullYear(m[3]);

	if(m[1] < 1 || m[1] > 12)
		return null;
	d.setMonth(m[1] - 1);

	if(m[2] < 1 || m[2] > 31)
		return null;
	d.setDate(m[2]);

	if(m[4] < 0 || m[4] > 23)
		return null;
	d.setHours(m[4]);

	if(m[5] < 0 || m[5] > 59)
		return null;
	d.setMinutes(m[5]);

	return d;
}

function validDate(s)
{
	s = trim(s);
	if(s === "")
		return 0;

	var m = s.match(/^([0-9]+)[^0-9]([0-9]+)[^0-9]([0-9]+)$/);
	if(!m)
		return null;
	
	return validDateTime(s+" 00:00");
}

function number_format(number, decimals, dec_point, thousands_sep) {
    var n = !isFinite(+number) ? 0 : +number, 
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        s = '',
        toFixedFix = function (n, prec) {
            var k = Math.pow(10, prec);
            return '' + Math.round(n * k) / k;
        };
    // Fix for IE parseFloat(0.55).toFixed(0) = 0;
    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
    }
    return s.join(dec);
}

function pennies2bucks(pennies)
{
	pennies = parseInt(pennies);
	var s = ""+pennies;
	if(s.length == 1)
		return "0.0"+s;
	if(s.length == 2)
		return "0."+s;
	var p = s.substring(s.length - 2);
	var d = s.substring(0, s.length - 2);
	var d = number_format(d, 0, ".", ",");
	return d+"."+p;
}
