function M3_FindInLayers(doc, name)
{
	var ret = null;
	var list = doc.layers;
	var l;
	for (var i = 0; i < list.length; i++)
	{
		l = list[i];
		ret = M3_FindInForms(l.document, name);
		if (ret != null) break;
	}
	return ret;
}
function M3_FindInForms(doc, name)
{
	var ret = null;
	var list = doc.forms;
	var item;
	var test;
	for (var i = 0; i < list.length; i++) {
		item = list[i];
		test = item.name;
		if (item.name == name
			|| item.id == name) {
			return item;
		}
		ret = M3_FindInElements(item, name);
		if (ret != null) break;
	}
	return ret;
}
function M3_FindInElements(f, name)
{
	var ret = null;
	var list = f.elements;
	var elm;
	if (f.name == name
		|| f.id == name) {
		return f;
	}
	for (var i = 0; i < list.length; i++) {
		elm = list[i];
		if (elm.name == name
			|| elm.id == name) {
			ret = elm;
			break;
		}
		if (elm.elements) {
			ret = M3_FindInElements(elm, name);
			if (ret != null) break;
		}
	}
	return ret;
}
function M3_GetElement(id)
{
	if (typeof(id) != "string") return id;
	var parentElement = (M3_GetElement.arguments.length > 1) ? M3_GetElement.arguments[1] : document;
	var elementObj = null;
	if (parentElement.all) {
		elementObj = parentElement.all[id];
	} else {
		if (document.getElementById) {
			elementObj = document.getElementById(id);
		}
		if (!elementObj && parentElement.forms) {
			elementObj = M3_FindInForms(parentElement, id);
		}
		if (!elementObj && parentElement.layers) {
			elementObj = M3_FindInLayers(parentElement, id);
		}
		if (!elementObj && parentElement.elements) {
			elementObj = M3_FindInElements(parentElement, id);
		}
	}
	return elementObj;
}
function M3_DoPostBackEx(b,f,action) {
	var elm = null;
	var elmF = null;
	if (f != null) {
		if (typeof(f) == "string") {
			elmF = document.forms[f];
			if (!elmF) {
				elmF = M3_GetElement(f);
			}
		} else {
			elmF = f;
		}
	}
	if (!elmF) {
		if (b) {
			elmF = b.form;
			if (!elmF) {
				elmF = M3_GetElement("form");
			}
		}
		if (!elmF) {
			if (document.forms.length > 0) elmF = document.forms[0];
		}
	}
	if (elmF == null) return;
	if (action != null) {
		elm = elmF.__action;
		if (!elm) {
			elm = M3_GetElement("__action", elmF);
		}
		if (elm != null) elm.value = action;
	}
	elmF.submit();
	if (b != null) {
		if (typeof(b) == "string") {
			b = M3_GetElement(b, elmF);
		}
		b.disabled = true;
	}
}
function M3_DoPostBack(b) {
	var elm, action, elmF;
	if (!b) return;
	elmF = b.form;
	if (!elmF) {
		if (M3_DoPostBack.arguments.length > 1) {
			elmF = M3_GetElement(M3_DoPostBack.arguments[1]);
		} else {
			elmF = M3_GetElement("form");
		}
	}
	if (!elmF) return;
	elm = elmF.__action;
	if (!elm) {
		elm = M3_GetElement("__action", elmF);
	}
	if (elm) {
		action = b.name;
		if (!action) action = b.id;
		if (action) elm.value = action;
	}
	elmF.submit();
	b.disabled = true;
}

function M3_DEBUG(obj)
{
	var wnd = open("#", "_M3DEBUG", "");
	var buf = "<html><body><hr><b>" + obj.toString() + " DEBUG:</b><br><hr><font>\n";
	for (var i in obj)
	{
		buf = buf + "\"" + i + "\" = \n";
		var objVal = obj[i];
	//	objVal = objVal.replace(/</,"&lt;");
		buf = buf + objVal + "<br><hr size=1 noshade>\n";
		wnd.document.write(buf);
		buf = "";
	}
	wnd.document.write("</font></body></html>");
}

function M3_DUMP(obj)
{
	var buf = "" + obj.toString() + " DEBUG:\n";
	var x = 0;
	for (var i in obj)
	{
		buf = buf + "\"" + i + "\" = ";
		var objVal = obj[i];
		x++;
		buf = buf + objVal + (((x % 5) == 0) ? "\n| " : " | ");
	}
	return buf;
}

function M3_FormatDate(d)
{
	var pattern = null;
	if (M3_FormatDate.arguments.length > 1) {
		pattern = M3_FormatDate.arguments[1];
	}
	var i, s, ret;
	if (pattern == null) {
		i = d.getFullYear();
		ret = i.toString() + "/";
		
		i = d.getMonth() + 1;
		s = i >= 10 ? i.toString() : ("0" + i.toString());
		ret += s + "/";
		
		i = d.getDate();
		s = i >= 10 ? i.toString() : ("0" + i.toString());
		ret += s + " ";
		
		i = d.getHours();
		s = i >= 10 ? i.toString() : ("0" + i.toString());
		ret += s + ":";
		
		i = d.getMinutes();
		s = i >= 10 ? i.toString() : ("0" + i.toString());
		ret += s + ":";

		i = d.getSeconds();
		s = i >= 10 ? i.toString() : ("0" + i.toString());
		ret += s;
	} else {
		ret = pattern;
		i = d.getFullYear();
		ret = ret.replace("yyyy", i.toString());
		ret = ret.replace("yy", (i % 100).toString());
		
		i = d.getMonth() + 1;
		ret = ret.replace("MM", (i >= 10 ? i.toString() : ("0" + i.toString())));
		ret = ret.replace("M", i.toString());

		i = d.getDate();
		ret = ret.replace("dd", (i >= 10 ? i.toString() : ("0" + i.toString())));
		ret = ret.replace("d", i.toString());

		i = d.getHours();
		ret = ret.replace("HH", (i >= 10 ? i.toString() : ("0" + i.toString())));
		ret = ret.replace("H", i.toString());

		i = d.getMinutes();
		ret = ret.replace("mm", (i >= 10 ? i.toString() : ("0" + i.toString())));
		ret = ret.replace("m", i.toString());

		i = d.getSeconds();
		ret = ret.replace("ss", (i >= 10 ? i.toString() : ("0" + i.toString())));
		ret = ret.replace("s", i.toString());
	}
	return ret;
}
function M3_GetMaxDate(d)
{
	var year = d.getFullYear();
	var month = d.getMonth() + 1;
	var ret = 31;
	switch (month)
	{
		case 2:
			ret = (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) ? 29 : 28
			break;
		case 4:
		case 6:
		case 9:
		case 11:
			ret = 30;
	}
	return ret;
}
function M3_GetTodayStart() {
	var d = new Date();
	d = new Date(d.getFullYear(), d.getMonth(), d.getDate());
	return d;
}
function M3_GetTodayEnd() {
	var d = new Date();
	d = new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59);
	return d;
}
function M3_GetYesterdayStart() {
	var d = new Date();
	d.setTime(d.getTime() - (24 * 60 * 60 * 1000));
	d = new Date(d.getFullYear(), d.getMonth(), d.getDate());
	return d;
}
function M3_GetYesterdayEnd() {
	var d = new Date();
	d.setTime(d.getTime() - (24 * 60 * 60 * 1000));
	d = new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59);
	return d;
}
function M3_GetThisWeekStart() {
	var d = new Date();
	d.setTime(d.getTime() - ((24 * 60 * 60 * 1000)*d.getDay()));
	d = new Date(d.getFullYear(), d.getMonth(), d.getDate());
	return d;
}
function M3_GetThisWeekEnd() {
	var d = M3_GetThisWeekStart();
	d.setTime(d.getTime() + ((24 * 60 * 60 * 1000)*6));
	d = new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59);
	return d;
}
function M3_GetLastWeekStart() {
	var d = new Date();
	d.setTime(d.getTime() - ((24 * 60 * 60 * 1000)*(d.getDay()+7)));
	d = new Date(d.getFullYear(), d.getMonth(), d.getDate());
	return d;
}
function M3_GetLastWeekEnd() {
	var d = M3_GetLastWeekStart();
	d.setTime(d.getTime() + ((24 * 60 * 60 * 1000)*6));
	d = new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59, 59);
	return d;
}
function M3_GetThisMonthStart() {
	var d = new Date();
	d = new Date(d.getFullYear(), d.getMonth(), 1);
	return d;
}
function M3_GetThisMonthEnd() {
	var d = M3_GetThisMonthStart();
	d = new Date(d.getFullYear(), d.getMonth(), M3_GetMaxDate(d), 23, 59, 59);
	return d;
}
function M3_GetLastMonthStart() {
	var d = new Date();
	if (d.getMonth() == 0) d = new Date(d.getFullYear()-1, 11, 1);
	else d = new Date(d.getFullYear(), d.getMonth()-1, 1);
	return d;
}
function M3_GetLastMonthEnd() {
	var d = M3_GetLastMonthStart();
	d = new Date(d.getFullYear(), d.getMonth(), M3_GetMaxDate(d), 23, 59, 59);
	return d;
}

function M3_GetRandom()
{
	var max = (GetRandom.arguments.length > 0) ? GetRandom.arguments[0] : Number.MAX_VALUE;
	var flr = (GetRandom.arguments.length > 1) ? GetRandom.arguments[1] : 0;
	return Math.floor(Math.random() * (max+1-flr) + flr);
}

function M3_GetFormatNumeric(str)
{
	var buf = str.match(/./g).reverse().join("");
	buf = buf.match(/((?:^\d+\.)?\d{1,3}[-+]?)/g).join(',');
	buf = buf.match(/./g).reverse().join("");
	return buf;
}

function M3_GetFormatMoney(str)
{
	return "\\" + GetFormatNumeric(str);
}

function M3_GetElementsByTagName(tag)
{
	if (typeof(tag) != "string") return tag;
	if (document.getElementsByTagName) {
		return document.getElementsByTagName(tag);
	} else if (document.all) {
		return document.all.tags(tag);
	}

	return null;
}


function M3_GetCheckBoxValue(elm) {
	if (elm == null) return null;
	if (elm.checked) {
		return elm.value;
	} else if (elm.length) {
		// array of checkboxes
		for (var i = 0; i < elm.length; i++) {
			if (elm[i].checked) return elm.value;
		}
	}
	return null;
}

function M3_GetTextValue(elm) {
	if (elm == null) return null;
	return elm.value;
}

function M3_GetSelectValue(elm) {
	if (elm == null) return null;
	var len = elm.length;
	if (len == 0) return null;
	var selected = elm.selectedIndex;
	if (selected >= 0 && selected < len) return elm.options[selected].value;
	return null;
}

function M3_GetSelectDisplay(elm) {
	if (elm == null) return null;
	var len = elm.length;
	if (len == 0) return null;
	var selected = elm.selectedIndex;
	if (selected >= 0 && selected < len) return elm.options[selected].text;
	return null;
}

function M3_GetControlValue(elm) {
	if (elm == null) return null;
	var ret = null;
	switch (elm.type) {
		case "button":
		case "fileUpload":
		case "hidden":
		case "password":
		case "reset":
		case "submit":
		case "text":
		case "textarea":
			ret = M3_GetTextValue (elm);
			break;
		case "checkbox":
			ret = M3_GetCheckBoxValue(elm);
			break;
		case "select":
		case "select-one":
			ret = M3_GetSelectValue(elm);
			break;
	}
	return ret;
}

function M3_GetControlDisplay(elm) {
	if (elm == null) return null;
	var ret = null;
	switch (elm.type) {
		case "button":
		case "fileUpload":
		case "hidden":
		case "password":
		case "reset":
		case "submit":
		case "text":
		case "textarea":
			ret = M3_GetTextValue (elm);
			break;
		case "checkbox":
			ret = M3_GetCheckBoxValue(elm);
			break;
		case "select":
		case "select-one":
			ret = M3_GetSelectDisplay(elm);
			break;
	}
	return ret;
}

function M3_GetControlValueAsString(elm) {
	var ret = M3_GetControlValue(elm);
	return ret == null ? "" : ret.toString();
}

function M3_GetControlDisplayAsString(elm) {
	var ret = M3_GetControlDisplay(elm);
	return ret == null ? "" : ret.toString();
}
