function MakeFormFromRow(obj){
	var td = MFFR_getParentByType(obj, "TD");
	var tr = MFFR_getParentByType(obj, "TR");
	var tby = MFFR_getParentByType(obj, "TBODY");
	var table = MFFR_getParentByType(obj, "TABLE");
	var frm = MFFR_getParentByType(obj, "FORM");
	var bdy = MFFR_getParentByType(obj, "BODY");
	//clear forms
	for(var i=0;i<bdy.getElementsByTagName("TR").length;i++){
		var mytr = bdy.getElementsByTagName("TR").item(i);
		if(mytr.form){MFFR_CancelForm(mytr)}
	}
	Element.cleanWhitespace(td);
	td.style.whiteSpace = "nowrap";
	var cancelButton = document.createElement("IMG");
	cancelButton.src = "imgs/cancel.gif";
	cancelButton.className = "button";
	cancelButton.alt = "Cancel";
	MFFR_addEvent(cancelButton, "click", MFFR_Cancel);
	td.insertBefore(cancelButton, obj);
	var saveButton = document.createElement("IMG");
	saveButton.src = "imgs/save.gif";
	saveButton.className = "button";
	saveButton.alt = "Save";
	MFFR_addEvent(saveButton, "click", MFFR_Save);
	td.insertBefore(saveButton, obj);
	obj.style.display = "none";
	MFFR_RemoveJunk(td);
	MFFR_CreateForm(tr);
}

function MFFR_Cancel(event){
	var obj = MFFR_getObj(event);
	var td = MFFR_getParentByType(obj, "TD");
	var tr = MFFR_getParentByType(td, "TR");
	MFFR_CancelButtons(td);
	MFFR_RemoveJunk(td);
	MFFR_CancelForm(tr);
}
function MFFR_CancelButtons(td){
	var tr = MFFR_getParentByType(td, "TR");
	for(var i=0;i<td.getElementsByTagName("IMG").length;i++){
		var img = td.getElementsByTagName("IMG").item(i);
		if(img.style.display == "none"){img.style.display = "inline";}
		if(img.alt == "Cancel" || img.alt == "Save"){
			td.removeChild(img);
			i--;
		}
	}
}
function MFFR_CreateForm(tr){
	tr.form = 1;
	var frm = MFFR_getParentByType(tr, "FORM");
	for(var i=0;i<tr.getElementsByTagName("TD").length;i++){
		var td = tr.getElementsByTagName("TD").item(i);
		var name = MFFR_collectAttribute(td,"name")
		if(typeof name == "string"){
			var myArr = name.split("|");
			if(myArr[1]){
				var val = MFFR_getCellContents(td);
				td.value = td.innerHTML;
				td.innerHTML = "";
				var obj = MFFR_ReturnFormElement(myArr[0],myArr[1], val, td.offsetWidth)
				td.appendChild(obj);
				td.style.width = obj.offsetWidth+4+"px";
				// check checked again because IE sucks
				if(obj.type == "checkbox" && val.toUpperCase() == "Y"){obj.checked = "checked";}
			}
			//deal with color chooser
			if(name=="color"){
				for(var j=0;j<td.getElementsByTagName("DIV").length;j++){
					var div = td.getElementsByTagName("DIV").item(j);
					div.currColor = div.style.backgroundColor;
					MFFR_addEvent(div, "click", MFFR_Popup_Color);
				}
			}
		}
		//create hidden elements
		var Hidden = MFFR_collectAttribute(td,"hiddenValues");
		if(Hidden && Hidden != ""){
			var hiddenItems = eval('(' + Hidden + ')');
			for(var j=0;j<hiddenItems.length;j++){
				var hidObj = new MFFR_ReturnHidden(hiddenItems[j].value);
				hidObj.name = hiddenItems[j].name;
				td.appendChild(hidObj);
			}
		}
	}
	
}
function MFFR_Popup_Color(event){
	var div = MFFR_getObj(event);
	var frm = MFFR_getParentByType(div, "FORM");
	popup_color(frm.name,'Color',div.id);
}
function MFFR_ReturnFormElement(name, type, value, width){
	var returnObj = null;
	switch (type){
		case "text":
			returnObj = MFFR_ReturnTextBox( value);
			break;
		case "textarea":
			returnObj = MFFR_ReturnTextArea( value);
			break;
		case "checkbox":
			returnObj = MFFR_ReturnCheckbox( value);
			break;
		case "selectbox":
			var newArray = new Array();
			try{newArray = eval(name)}catch(err){newArray = null}
			try{returnObj = MFFR_ReturnSelectBox(newArray, name, value);}catch(err){}
			break;
		case "selectboxboolean":
			var newArray = new Array();
			try{newArray = eval(name)}catch(err){newArray = null}
			try{returnObj = MFFR_ReturnSelectBoxBoolean(newArray, name, value);}catch(err){}
			break;
		case "lookup":
			returnObj = MFFR_ReturnLookUp(name, value);
			break;
		default : alert("Broken: MFFR_ReturnFormElement \nUnknown Type");
	}
	returnObj.style.width = (width - 10) + "px";
	returnObj.name = name;
	return returnObj;
}
function MFFR_ReturnTextArea(value){
	var obj = document.createElement("TEXTAREA");
	obj.innerHTML = value;
	return obj;
}
function MFFR_ReturnTextBox(value){
	var obj = document.createElement("INPUT");
	obj.type = "text";
	var tempVal = value;
	tempVal = tempVal.replace(/\$/g, "");
	tempVal = tempVal.replace(/,/g, "");
	if(MFFR_DataType(tempVal)=="date" || MFFR_DataType(tempVal)=="number"){
		obj.style.textAlign = "right";
		value = tempVal;
	}
	obj.value = MFFR_TrimString(value);
	return obj;
}
function MFFR_ReturnCheckbox(value){
	var obj = document.createElement("INPUT");
	obj.type = "checkbox";
	obj.value = 1;
	value = MFFR_TrimString(value).toUpperCase();
	if(value=="Y"){obj.checked = true;}else{obj.checked = false;}
	return obj;
}
function MFFR_ReturnSelectBox(arr, name, value){
	var sel = document.createElement("SELECT");
	//sel.name = name;
	if(arr && arr.length>0){
		sel.options[0] = new Option("Select One", "");
		sel.options[0].style.color = "gray"
		for(var i=0;i<arr.length;i++){
			var opt = new Option(arr[i].display, arr[i].value);
			sel.options[i+1] = opt;
			if(MFFR_TrimString(arr[i].value) == value){sel.selectedIndex = i+1;}
		}
	}else{
		sel.options[0] = new Option("No Options Available", "");
		sel.disabled = true;
	}
	return sel;
}
function MFFR_ReturnSelectBoxBoolean(arr, name, value){
	var sel = document.createElement("SELECT");
	//sel.name = name;
	if(arr && arr.length>0){
		for(var i=0;i<arr.length;i++){
			var opt = new Option(arr[i].display, arr[i].value);
			sel.options[i] = opt;
			if(MFFR_TrimString(arr[i].display) == value){sel.selectedIndex = i;}
		}
	}else{
		sel.options[0] = new Option("No Options Available", "");
		sel.disabled = true;
	}
	return sel;
}
function MFFR_ReturnLookUp(name, value){
	// name : display : form : value
	var arrTemp =  eval('(' + name + ')');
	//make a div to hold this whole mess
	var div = document.createElement("SPAN");
	//create hidden element
	var hid = MFFR_ReturnHidden(arrTemp.value);
	hid.name = arrTemp.name;
	//create display element
	var inp = MFFR_ReturnTextBox(value);
	inp.name = arrTemp.display;
	inp.readOnly = "readonly";
	//append them to the form
	div.appendChild(inp);
	div.appendChild(hid);
	div.className = "popup";
	div.appendChild(document.createElement("BR"));
	var a1 = document.createElement("A");
	a1.href="javascript: popup_person('" + arrTemp.form + "', '" + arrTemp.name+ "','" + arrTemp.display+ "');";
	//a1.href="javascript: popup_person('fEditWorkedHours_table', 'PersonID','PersonName');";
	a1.appendChild(document.createTextNode("Find Person"));
	a1.style.marginRight = "5px"
	var a2 = document.createElement("SPAN");
	MFFR_addEvent(a2, "click", MFFR_ClearValues)
	a2.appendChild(document.createTextNode("Clear"));
	div.appendChild(a1);
	div.appendChild(a2);
	return div;
}
function MFFR_ClearValues(event){
	var obj = MFFR_getObj(event);
	var span = MFFR_getParentByType(obj, "SPAN");
	for(var i=0;i<span.getElementsByTagName("INPUT").length;i++){
		span.getElementsByTagName("INPUT").item(i).value ="";
	}
}
function MFFR_ReturnHidden(value){
	var obj = document.createElement("INPUT");
	obj.type = "hidden";
	obj.value = value;
	return obj;
}
function MFFR_CancelForm(tr){
	for(var i=0;i<tr.getElementsByTagName("TD").length;i++){
		var td = tr.getElementsByTagName("TD").item(i);
		tr.form = 0;
		var name = MFFR_collectAttribute(td,"name")
		if(typeof name == "string"){
			var myArr = name.split("|");
			if(myArr[1]){
				td.innerHTML = td.value;
			}
			//deal with color chooser
			if(name=="color"){
				for(var j=0;j<td.getElementsByTagName("DIV").length;j++){
					var div = td.getElementsByTagName("DIV").item(j);
					div.style.backgroundColor = div.currColor;
					MFFR_removeEvent(div, "click", MFFR_Popup_Color);
				}
			}
		}
		//check for the action class to let me know to process the buttons
		if(td.className == "action"){
			MFFR_CancelButtons(td);
		}
		//remove any hidden inputs or any other inputs
		for(var j=0;j<td.getElementsByTagName("INPUT").length;j++){
			var input = td.getElementsByTagName("INPUT").item(j--);
			input.parentNode.removeChild(input);
		}
	}
}

function MFFR_Save(event){
	var obj = MFFR_getObj(event);
	//var td = MFFR_getParentByType(obj, "TD");
	var tr = MFFR_getParentByType(obj, "TR");
	//var table = MFFR_getParentByType(obj, "TABLE");
	var frm = MFFR_getParentByType(obj, "FORM");
	//clear form of any elements not in this row or outside table
	MFFR_OnSubmit_ClearAllRows(tr)
	//validate
	
	//save 
	/*for(var i=0;frm.getElementsByTagName("INPUT");i++){
		//alert(frm.getElementsByTagName("INPUT").item(i))
	}*/
	frm.submit();
	
}

function MFFR_OnSubmit_ClearAllRows(tr){
	var tby = MFFR_getParentByType(tr, "TBODY");
	for(var i=0;i<tby.getElementsByTagName("TR").length;i++){
		var mytr = tby.getElementsByTagName("TR").item(i);
		if(mytr != tr){
			for(var j=0;j<mytr.getElementsByTagName("INPUT").length;j++){
				var input = mytr.getElementsByTagName("INPUT").item(j--);
				input.parentNode.removeChild(input);
			}
		}
	}
}
/*
base object stuff
*/
function MFFR_DataType(val){
	//if it's a date...
	if (!isNaN(Date.parse(val))) { 
		return "date";
	//if it's a number...
	} else if(!isNaN(val)) {
		return "number";
	//if it's alpha ...
	} else {
		return "alpha";
	}
}
		
function MFFR_RemoveJunk(obj){
	for(var i=0;i<obj.childNodes.length;i++){
		if(obj.childNodes[i].nodeType == 3){
			obj.removeChild(obj.childNodes[i--]);
		}else{
			obj.childNodes[i].style.marginLeft = "2px";
			obj.childNodes[i].style.marginRight = "2px";
		}
	}
}
function MFFR_getObj(event) {
	if (window.event) {
		target = window.event.srcElement;
	}else{
		if (event.target.tagName)
			target = event.target;
		else
			target = null;
  }
	return target;
}
	
function MFFR_getParentByType(obj, objType){
	while(obj.parentNode){
		obj = obj.parentNode;
		if (obj.tagName == objType) {return obj;}
	}
	return false;
}
function MFFR_collectAttribute(obj, p_name){
	try{var p_val = obj.getAttribute(p_name);}catch(err){p_val = ""}
	return p_val;
}

// got this super handi functions from http://www.scottandrew.com he is pretty dang smart ***********************
function MFFR_addEvent(obj, evType, fn, useCapture){
	if (obj.addEventListener){
		obj.addEventListener(evType, fn, useCapture);
		return true;
	} else if (obj.attachEvent){
		var r = obj.attachEvent("on"+evType, fn);
		return r;
	} else {
		alert("Handler could not be attached");
	}
}
function MFFR_removeEvent(obj, evType, fn, useCapture){
  if (obj.removeEventListener){
    obj.removeEventListener(evType, fn, useCapture);
    return true;
  } else if (obj.detachEvent){
    var r = obj.detachEvent("on"+evType, fn);
    return r;
  } else {
    alert("Handler could not be removed");
  }
}

function MFFR_TrimString (str) {
  str = this != window? this : str;
  return str.replace(/^\s+/g, '').replace(/\s+$/g, '');
}
function MFFR_getCellContents(cell){
	if (typeof cell == "string") return cell;
	if (typeof cell == "undefined") { return cell };
	if (cell.innerText) return MFFR_TrimString (cell.innerText);	//Not needed but it is faster
	var str = "";
	
	var cs = cell.childNodes;
	var l = cs.length;
	for (var i = 0; i < l; i++) {
		//showError(typeof cell)
		switch (cs[i].nodeType) {
			case 1: //Element Node
				if(cs[i].tagName == "INPUT"){
					str += MFFR_TrimString (cs[i].value);
				}else{
					str += MFFR_getCellContents(cs[i]);
				}
				break;
			case 3:	//Text Node
				str += MFFR_TrimString (cs[i].nodeValue);
				break;
		}
	}
	return str;
}

///
function CreateNewForm(obj, action){
	var form = CNF_ReturnForm(obj.id, action, "post");
	obj.appendChild(form);
	
	alert(form.parentNode.innerHTML)
	obj.style.display = "block";
	obj.innerHTML = "BOOOO"
	
}
function CNF_ReturnForm(name, action, method){
	var form = document.createElement("FORM");
	form.name = name;
	form.action = action;
	form.method = method;
	
	return form;
}