function __setPostBack(eventTarget, eventArgument)
{
	if($('frm'))
	{
		var targ = $(eventTarget);
		
		$('__eventtarget').value = (targ)? targ.id : (eventTarget || '');
		$('__eventargument').value = eventArgument;
		
		return true;
	}
	else
		return false;
}

function __doPostBack(eventTarget, eventArgument)
{
	__setPostBack(eventTarget, eventArgument);
	$('frm').submit();
}

// mode = (page|html|xml|js|json|text|other)
function __doCallback(mode, eventTarget, eventArgument, options)
{
	new Ajax.Request(document.location.href, __getCallbackOptions(mode, eventTarget, eventArgument, options));
}

function __doJSCallback(eventTarget, eventArgument, options)
{
	__doCallback('js', eventTarget, eventArgument, options);
}

function __doJSONCallback(eventTarget, eventArgument, options)
{
	__doCallback('json', eventTarget, eventArgument, options);
}

function __getCallbackOptions(mode, eventTarget, eventArgument, options)
{
	__setPostBack(eventTarget, eventArgument);
	
	options = options || {};
	options.parameters = options.parameters || $('frm').serialize(true);
	options.parameters.ouptut_mode = mode;
	
	return options;
}

Date.prototype.realYear = function()
{
	return this.getYear() + ((this.getYear() < 200)? 1900 : 0);
}

Date.prototype.realMonth = function()
{
	return this.getMonth() + 1;
}

function min(a, b)
{
	return (a < b)? a : b;
}

function max(a, b)
{
	return (a > b)? a : b;
}

function shortDate()
{
	var d = new Date();
	return ((d.getMonth()<9)? "0":"") + (d.getMonth() + 1) + ((d.getDate()<10)? "/0":"/") + d.getDate() + ((d.getYear() % 100<10)? "/0":"/") + (d.getYear() % 100);
}

function shortTime()
{
	var d = new Date();
	return ((d.getHours()<10)? "0":"") + d.getHours() + ":" + ((d.getMinutes()<10)? "0":"") + d.getMinutes();
}

function __ssrc(o,img)
{
	try
	{
		var i = eval(img);
		if(o != undefined && i != undefined) o.src = i.src;
	}
	catch(e){}
}

function addElement(oParent, tagName)
{
	var node = document.createElement(tagName);
	oParent.appendChild(node);
	return node;
}

function addTextNode(oParent, text)
{
	var node = document.createTextNode(text);
	oParent.appendChild(node);
	return node;
}

function addElementWithTextNode(oParent, tagName, text)
{
	var node = addElement(oParent, tagName);
	addTextNode(node, text);
	return node;
}

function addHiddenField(oParent, id, value)
{
	var val = document.createElement("input");
	val.setAttribute("type", "hidden");
	val.setAttribute("id", id);
	val.setAttribute("name", id);
	val.setAttribute("value", value);
	oParent.appendChild(val);
}

function addOption(oParent, text, value)
{
	var opt = addElementWithTextNode(oParent, "option", text);
	
	if(value != undefined)
		opt.setAttribute("value", value);
	
	return opt;
}

function removeChildAttribute(oParent, AttrName)
{
	for(var i = 0; i < oParent.childNodes.length; i++)
		oParent.childNodes[i].removeAttribute(AttrName);
}

function selectOneChild(oParent, index)
{
	for(var i = 0; i < oParent.childNodes.length; i++)
	{
		if(i == index)
			oParent.childNodes[i].setAttribute("selected", true);
		else
			oParent.childNodes[i].removeAttribute("selected");
	}
}

function daysInMonth(month, year)
{
	var monStart = new Date(year, month, 1);
	var diff = new Date(monStart - 86400000);
	return diff.getDate();
}

function createDateMenu(id, className, dateValue)
{
	var ev = "dateMenuChange('" + id + "');";
	var aMonths = new Array("January", "February",
	    "March", "April", "May", "June", "July", "August",
			"September", "October", "November", "December");	

	var span = document.createElement("span");
	
	var month = addElement(span, "select");
	month.setAttribute("id", id + "_month");
	month.setAttribute("class", className);
	month.setAttribute("onchange", ev);
	month.setAttribute("onkeyup", ev);
	
	for(var i = 0; i < 12; i++)
		addOption(month, aMonths[i], i + 1);

	var day = addElement(span, "select");
	var days = daysInMonth(dateValue.realMonth(), dateValue.realYear());
	day.setAttribute("id", id + "_day");
	day.setAttribute("class", className);
	day.setAttribute("onchange", ev);
	day.setAttribute("onkeyup", ev);
	
	for(var i = 1; i <= days; i++)
		addOption(day, i, i);

	var year = addElement(span, "select");
	year.setAttribute("id", id + "_year");
	year.setAttribute("class", className);
	year.setAttribute("onchange", ev);
	year.setAttribute("onkeyup", ev);
	
	for(var i = 1998; i <= 2020; i++)
		addOption(year, i, i);
	
	selectOneChild(month, dateValue.getMonth());
	selectOneChild(day, dateValue.getDate() - 1);
	selectOneChild(year, dateValue.realYear() - year.options[0].value);
	
	document.write(span.innerHTML);
	dateMenuChange(id);
}

function dateMenuChange(id)
{
	var val = $(id);
	var month = $(id + "_month");
	var day = $(id + "_day");
	var year = $(id + "_year");
	
	var daysInOldMonth = day.length;
	var daysInNewMonth = daysInMonth(month.value, year.value);
	
	if(daysInNewMonth != daysInOldMonth)
	{
		var selectedDay = (day.selectedIndex < 0)? 1 : day.selectedIndex + 1;
		day.innerHTML = "";
		
		for(var i = 1; i <= daysInNewMonth; i++)
			addOption(day, i, i);
		
		if(selectedDay > 0 && selectedDay < daysInNewMonth && selectedDay != daysInOldMonth)
		{
			val.setAttribute("value", ""+ month.value + "/" + selectedDay + "/" + year.value);
			day[selectedDay - 1].selected = true;
		}
		else
		{
			try
			{
				val.setAttribute("value", ""+ month.value + "/" + daysInNewMonth + "/" + year.value);
				day[daysInNewMonth - 1].selected = true;
			}
			catch(e){}
		}
	}
	else
		val.setAttribute("value", ""+ month.value + "/" + day.value + "/" + year.value);
}

function createMembershipList(id, legend, unselectedLabel, selectedLabel, listSize, arrayOutIDs, arrayOut, arrayInIDs, arrayIn)
{
	if(listSize < 7) listSize = 7;
	
	var s = "";
	
	if(legend.length > 0) s += "<fieldset style=\"padding:3px;\"><legend>"+legend+"</legend>";
	
	s += "<span id=\""+id+"_vals\" name=\""+id+"_vals\"></span>";
	s += "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">";
	
	s += "<tr><td width=\"50%\">";
	s += "<label class=\"formlabel\">"+unselectedLabel+"</label><br><img src=\"/1.gif\" width=\"1\" height=\"3\"><br>";
	s += "</td><td width=\"1\"></td><td width=\"50%\">";
	s += "<label class=\"formlabel\">"+selectedLabel+"</label><br><img src=\"/1.gif\" width=\"1\" height=\"3\"><br>";
	s += "</td></tr>";
	
	s += "<tr><td width=\"50%\">";
	s += "<select id=\""+id+"_out\" name=\""+id+"_out\" class=\"formentry\" style=\"width: 100%;\" size=\""+listSize+"\" multiple></select>";
	s += "</td><td width=\"1\" style=\"padding-left:5px;padding-right:5px;\">";
	s += "<button onclick=\"membershipListChange('"+id+"', 'ALL_IN');\" type=\"button\" id=\""+id+"_all_in\" name=\""+id+"_all_in\" class=\"formbutton\" style=\"width: 30px;\" title=\"Add all\">&gt;&gt;</button><br>";
	s += "<button onclick=\"membershipListChange('"+id+"', 'IN');\"type=\"button\" id=\""+id+"_sel_in\" name=\""+id+"_sel_in\" class=\"formbutton\" style=\"width: 30px;\" title=\"Add selected items\">&gt;</button><br>";
	s += "<button onclick=\"membershipListChange('"+id+"', 'OUT');\"type=\"button\" id=\""+id+"_sel_out\" name=\""+id+"_sel_out\" class=\"formbutton\" style=\"width: 30px;\" title=\"Remove selected items\">&lt;</button><br>";
	s += "<button onclick=\"membershipListChange('"+id+"', 'ALL_OUT');\"type=\"button\" id=\""+id+"_all_out\" name=\""+id+"_all_out\" class=\"formbutton\" style=\"width: 30px;\" title=\"Remove all\">&lt;&lt;</button>";
	s += "</td><td width=\"50%\">";
	s += "<select id=\""+id+"_in\" name=\""+id+"_in\" class=\"formentry\" style=\"width: 100%;\" size=\""+listSize+"\" multiple></select>";
	s += "</td></tr></table>";
	
	if(legend.length > 0) s += "</fieldset>";
	
	document.write(s);

	if(arrayOut.length)
	{
		var lst = $(id+"_out");
		for(i = 0; i < arrayOut.length; i++) addOption(lst, arrayOut[i], arrayOutIDs[i]);
	}
	
	if(arrayIn.length > 0)
	{
		var lst = $(id+"_in");
		for(i = 0; i < arrayIn.length; i++) addOption(lst, arrayIn[i], arrayInIDs[i]);
	}

	var vals = $(id + "_vals");
	var inList = $(id + "_in");	
	for(var i = 0; i < inList.length; i++) addHiddenField(vals, id + "[]", inList[i].value);
}

function membershipListChange(id, action)
{
	function moveChildElement(src, dest, index)
	{
		var child = src.removeChild(src[index]);
		var refChild = null;
		
		for(var i = 0; i < dest.length; i++)
		{
			if(dest && dest[i].innerHTML > child.innerHTML)
			{
				refChild = dest[i];
				break;
			}
		}
			
		dest.insertBefore(child, refChild);
		child.selected = true;
	}
	
	var outList = $(id + "_out");
	var inList = $(id + "_in");
	
	switch(action)
	{
		case "ALL_IN":
			for(var i = 0; i < inList.length; i++) inList[i].selected = false;
			while(outList.length > 0) moveChildElement(outList, inList, 0);
			break;
		case "IN":
			for(var i = 0; i < inList.length; i++) inList[i].selected = false;
			for(var i = outList.length - 1; i >= 0; i--) if(outList[i].selected) moveChildElement(outList, inList, i);
			for(var i = 0; i < outList.length; i++) outList[i].selected = false;
			break;
		case "OUT":
			for(var i = 0; i < outList.length; i++) outList[i].selected = false;
			for(var i = inList.length - 1; i >= 0; i--) if(inList[i].selected) moveChildElement(inList, outList, i);
			for(var i = 0; i < inList.length; i++) inList[i].selected = false;
			break;
		case "ALL_OUT":
			for(var i = 0; i < outList.length; i++) outList[i].selected = false;
			while(inList.length > 0) moveChildElement(inList, outList, 0);
			break;
	}
	
	var vals = $(id + "_vals");
	while(vals.hasChildNodes()) vals.removeChild(vals.lastChild);
	
	if(inList.length > 0)
		for(var i = 0; i < inList.length; i++) addHiddenField(vals, id + "[]", inList[i].value);
	else
		addHiddenField(vals, id + "[]", "");
}

function MetaDataList(id, legend, selectLabel, labelClass, labelAlign, dataClass, dataSize, dataMaxLength, arrayOutIDs, arrayOut, arrayInIDs, arrayIn, arrayInData)
{
	this.id = id;
	this.selectLabel = selectLabel;
	this.labelClass = labelClass;
	this.labelAlign = labelAlign;
	this.dataClass = dataClass;
	this.dataSize = dataSize;
	this.dataMaxLength = dataMaxLength;
	
	s = "<fieldset style=\"padding-bottom:3px;\"><legend>" + legend + "</legend>";
	
	s += "<span class='" + this.labelClass + "' style='margin-left: 7px;'><strong>" + this.selectLabel + "</strong></span>&nbsp;<select class='" + this.dataClass + "' id='" + this.id + "_select' name='" + this.id + "_select' onchange=\"obj_" + this.id + ".addItem();\"><option value='' selected></option>";
	for(i = 0; i < arrayOutIDs.length; i++) s += "<option value='" + arrayOutIDs[i] + "'>" + arrayOut[i];
	s += "</select>";

	s += "<table style='margin-left: 10px;' id='" + id + "_table' border='0' cellpadding='2' cellspacing='0'>";
	
	s += "<tr><th></th><th></th></tr>";
	
	for(i = 0; i < arrayInIDs.length; i++)
		s += "<tr>" +
		     "<td class='" + this.labelClass + "' align='" + this.labelAlign + "'>" + arrayIn[i] + "</td>" +
				 "<td nowrap><input name='" + this.id + "[" + arrayInIDs[i] + "]' class='" + this.dataClass + "' type='text' size='" + this.dataSize + "' maxlength='" + this.dataMaxLength + "' valueName='" + arrayIn[i] + "' value='" + arrayInData[i] + "'>" +
				 "<img style='margin-left:2px;' align='middle' width='14' height='14' border='0' src='"+WEB_ROOT+"core/images/widgets/delete_icon.gif' title='Delete this item.' onmouseover=\"this.src='"+WEB_ROOT+"core/images/widgets/delete_icon_on.gif';\" onmouseout=\"this.src='"+WEB_ROOT+"core/images/widgets/delete_icon.gif';\" onmousedown=\"this.src='"+WEB_ROOT+"core/images/widgets/delete_icon_down.gif';\" style='cursor: pointer;' onclick=\"obj_" + this.id + ".deleteItem('" + arrayInIDs[i] + "', '" + arrayIn[i] + "');\"></td>" +
				 "</tr>";
	
	s += "</table></fieldset>";
	
	document.write(s);
	return this;
}

MetaDataList.prototype.addItem = function()
{
	var dropList = $(this.id + "_select");
	
	if(dropList.selectedIndex > 0)
	{
		var child = dropList.removeChild(dropList[dropList.selectedIndex]);
		var table = $(this.id + "_table");
		
		for(i = 1; i < table.rows.length; i++)
			if(table.rows[i].childNodes[0].innerHTML > child.innerHTML) break;
		
		var row = table.insertRow(i);
		
		var cell = addElementWithTextNode(row, "td", child.innerHTML);
		cell.className = this.labelClass;
		cell.align = this.labelAlign;
		
		var cell = addElement(row, "td");
		cell.setAttribute("nowrap", "yes");
		
		var input = addElement(cell, "input");
		input.name = this.id + "[" + child.value + "]";
		input.type = "text";
		input.className = this.dataClass;
		input.size = this.dataSize;
		input.maxlength = this.dataMaxLength;
		input.valueName = child.innerHTML;
		input.value = "";
		
		var img = addElement(cell, "img");
		img.align = "middle";
		img.width = "14";
		img.height = "14";
		img.border = "0";
		img.src = WEB_ROOT+"core/images/widgets/delete_icon.gif";
		img.title = "Delete this item.";
		img.style.cursor = "pointer";
		img.style.marginLeft = "2px";
		img.onmouseover = new Function("this.src='"+WEB_ROOT+"core/images/widgets/delete_icon_on.gif'");
		img.onmouseout = new Function("this.src='"+WEB_ROOT+"core/images/widgets/delete_icon.gif'");
		img.onmousedown = new Function("this.src='"+WEB_ROOT+"core/images/widgets/delete_icon_down.gif'");
		img.onclick = new Function("obj_" + this.id + ".deleteItem('" + child.value + "', '" + child.innerHTML + "');");
	}
}

MetaDataList.prototype.deleteItem = function(id, name)
{
	var table = $(this.id + "_table");
	
	for(i = 1; i < table.rows.length; i++)
	{
		if(table.rows[i].childNodes[0].innerHTML == name)
		{
			table.deleteRow(i);
			break;
		}
	}
	
	var dropList = $(this.id + "_select");
	
	var option = addElementWithTextNode(dropList, "option", name)
	option.setAttribute("value", id);
	
	for(i = dropList.length - 1; i > 0 ; i--)
	{
		if(dropList[i].innerHTML < dropList[i - 1].innerHTML)
		{
			id = dropList[i].value;
			name = dropList[i].innerHTML;
			
			dropList[i].value = dropList[i - 1].value;
			dropList[i].innerHTML = dropList[i - 1].innerHTML;
			
			dropList[i - 1].value = id;
			dropList[i - 1].innerHTML = name;
		}
	}
}

function AttributeList(id, legend, selectLabel, labelClass, labelAlign, arrayOutIDs, arrayOut, arrayInIDs, arrayIn)
{
	this.id = id;
	this.selectLabel = selectLabel;
	this.labelClass = labelClass;
	this.labelAlign = labelAlign;
	
	s = "";
	
	if(legend != "")
	{
		s += "<fieldset style=\"padding:3px;\"><legend>" + legend + "</legend>";
		
		if(this.selectLabel)
			s += "<span class='" + this.labelClass + "' style='margin-left: 7px;'><strong>" + this.selectLabel + "</strong></span>&nbsp;";
	}
	else
	{
		if(this.selectLabel)
			s += "<span class='" + this.labelClass + "'>" + this.selectLabel + "</span>&nbsp;";
	}
	
	s += "<select class='formentry' style='margin-top:3px;' id='" + this.id + "_select' name='" + this.id + "_select' onchange=\"obj_" + this.id + ".addItem();\"><option value='' selected></option>";
	for(i = 0; i < arrayOutIDs.length; i++) s += "<option value='" + arrayOutIDs[i] + "'>" + arrayOut[i];
	s += "</select><input name='" + this.id + "[]' type='hidden' value=''>";

	if(legend != "")
		s += "<table id='" + id + "_table' border='0' cellpadding='0' cellspacing='1'>";
	else
		s += "<table id='" + id + "_table' border='0' cellpadding='0' cellspacing='1' align='left'>";
	
	s += "<tr><th></th><th></th></tr>";
	
	for(i = 0; i < arrayInIDs.length; i++)
		s += "<tr>" +
		     "<td class='" + this.labelClass + "' align='" + this.labelAlign + "'>" + arrayIn[i] + "</td>" +
				 "<td nowrap><input name='" + this.id + "[]' type='hidden' valueName='" + arrayIn[i] + "' value='" + arrayInIDs[i] + "'>" +
				 "<img style='margin-left:2px;' align='middle' width='14' height='14' border='0' src='"+WEB_ROOT+"core/images/widgets/delete_icon.gif' title='Delete this item.' onmouseover=\"this.src='"+WEB_ROOT+"core/images/widgets/delete_icon_on.gif';\" onmouseout=\"this.src='"+WEB_ROOT+"core/images/widgets/delete_icon.gif';\" onmousedown=\"this.src='"+WEB_ROOT+"core/images/widgets/delete_icon_down.gif';\" style='cursor: pointer;' onclick=\"obj_" + this.id + ".deleteItem('" + arrayInIDs[i] + "', '" + arrayIn[i] + "');\"></td>" +
				 "</tr>";
	
	s += "</table>";
	
	if(legend != "")
		s += "</fieldset>";
	
	document.write(s);
	return this;
}

AttributeList.prototype.addItem = function()
{
	var dropList = $(this.id + "_select");
	
	if(dropList.selectedIndex > 0)
	{
		var child = dropList.removeChild(dropList[dropList.selectedIndex]);
		var table = $(this.id + "_table");
		
		for(i = 1; i < table.rows.length; i++)
			if(table.rows[i].childNodes[0].innerHTML > child.innerHTML) break;
		
		row = table.insertRow(i);
		
		var cell = addElementWithTextNode(row, "td", child.innerHTML);
		cell.className = this.labelClass;
		cell.align = this.labelAlign;
		
		var cell = addElement(row, "td");
		cell.setAttribute("nowrap", "yes");
		
		var hdn = document.createElement("input");
		hdn.setAttribute("type", "hidden");
		hdn.setAttribute("name", this.id + "[]");
		hdn.setAttribute("value", child.value);
		hdn.valueName = child.innerHTML;
		cell.appendChild(hdn);
		
		var img = addElement(cell, "img");
		img.align = "middle";
		img.width = "14";
		img.height = "14";
		img.border = "0";
		img.src = WEB_ROOT+"core/images/widgets/delete_icon.gif";
		img.title = "Delete this item.";
		img.style.cursor = "pointer";
		img.style.marginLeft = "2px";
		img.onmouseover = new Function("this.src='"+WEB_ROOT+"core/images/widgets/delete_icon_on.gif'");
		img.onmouseout = new Function("this.src='"+WEB_ROOT+"core/images/widgets/delete_icon.gif'");
		img.onmousedown = new Function("this.src='"+WEB_ROOT+"core/images/widgets/delete_icon_down.gif'");
		img.onclick = new Function("obj_" + this.id + ".deleteItem('" + child.value + "', '" + child.innerHTML + "');");
	}
}

AttributeList.prototype.deleteItem = function(id, name)
{
	var table = $(this.id + "_table");
	
	for(i = 1; i < table.rows.length; i++)
	{
		if(table.rows[i].childNodes[0].innerHTML == name)
		{
			table.deleteRow(i);
			break;
		}
	}
	
	var dropList = $(this.id + "_select");
	
	var option = addElementWithTextNode(dropList, "option", name)
	option.setAttribute("value", id);
	
	for(i = dropList.length - 1; i > 0 ; i--)
	{
		if(dropList[i].innerHTML < dropList[i - 1].innerHTML)
		{
			id = dropList[i].value;
			name = dropList[i].innerHTML;
			
			dropList[i].value = dropList[i - 1].value;
			dropList[i].innerHTML = dropList[i - 1].innerHTML;
			
			dropList[i - 1].value = id;
			dropList[i - 1].innerHTML = name;
		}
	}
}

function addButtonEv(button, cssclass)
{
	if(button)
	{
		button.className = cssclass + ' btnon';
		
		button.onmouseover = new Function( "if(this)this.className='" + cssclass + " btnon';");
		button.onmouseout = new Function("if(this)this.className='" + cssclass + "';");
		button.onmousedown = new Function("if(this)this.className='" + cssclass + " btndown';");
		button.onmouseup = new Function("if(this)this.className='" + cssclass + " btnon';");
		button.onfocus = new Function("if(this)this.className='" + cssclass + " btnon';");
		button.onblur = new Function("if(this)this.className='" + cssclass + "';");
	}
}

function AddRoll(img, name, overJS, outJS, downJS)
{
	if(img)
	{
		img.onmouseover = new Function( "__ssrc(this, '" + name + "_on');" + overJS + ";");
		img.onmouseout = new Function("__ssrc(this, '" + name + "');" + outJS + ";");
		img.onmousedown = new Function("__ssrc(this, '" + name + "_down');" + downJS + ";");
	}
}