document.observe("dom:loaded", loadHeader);
document.observe('tab:switchout', closeSearchResults);
document.observe('tab:switchdone', updatePrintButton);

document.observe('tab:switchout', function(){parentItemId = false;}); // parentItemId is only used when editing a custom meal item

Event.observe(window, 'unload', function()
{
	var date_picker = $('date_picker');
	if(date_picker !== null)
	{
		if (bodySaveTimeoutActive)
		{
			saveBodyData();
			var date = new Date();
			date.setTime(date.getTime()+(30000));
			document.cookie = "form_data="+postJson+"; expires="+date.toGMTString()+"; path=/";
		}
	}
	
	var priv_settings = $('ht_settings_privacy_area');
	if(priv_settings !== null)
	{
		if(bodySaveTimeout)
		{
			clearTimeout(bodySaveTimeout);
			ajax_save_privacy();
		}
	}
});

var ht_tab_name = 'ht_main';

var date_picker_cal;
var months = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");

//slider variables
var timeout;
var tempElem, tempValue;
var tickFrequency = 150;
var scroll = 0;
var blankoutCount = 0;

var bodySaveTimeout = false;
var bodySaveTimeoutDelay = 3000;
var bodySaveTimeoutActive = false;

var sliders = new Array();

var postJson; // used when leaving a page without saving data.

var unsavedLogChanges = new Array();

var nutritionTabs = new Array('nutrition','browse_favorites','browse_by_category','browse_my_foods', 'browse_my_meals');
var activityTabs = new Array('exercise','browse_my_exercise','browse_exercises_by_category','browse_workout');

var myWeightKg = false;
var hasStrengthSummary = true;
var openLightbox = null;

var parentItemId = false;
var deleteCustomMealURL = false;

/****** Initialization Functions ******/

function loadBody()
{
	var form = $('values');
	
	$$('div#body_wrapper div.slider').each(function(elem) 
	{
		elem = $(elem);
		var idx = elem.readAttribute('idx');
		var val_element = $('val_'+idx);
		var track = $('track_'+idx);
		var curval = val_element.value;
		if ((val_element.value === null || val_element.value == "") && !($(val_element).readAttribute('lastval') == null || $(val_element).readAttribute('lastval') == ""))
		{
			curval = $(val_element).readAttribute('lastval');
		}
		
		var val = getValue(val_element);
		var idx = new Number(val_element.readAttribute('idx'));
		var step = new Number(val_element.readAttribute('step'));
		var data = getSliderData(val,step);
		
		var slider = new Control.Slider(elem.down('.handle'), track, {
			range: $R(data.range[0],data.range[1]),
			values: data.vals,
			sliderValue: val,
			dragOnly: true,
			onChange: function(value, slider) 
			{
				updateSliderRange(tempElem, slider);
				slider.setValueSimple(slider.allowedValues[20]);
				
				clearTimeout(timeout);
				scroll = 0;
				blankoutCount = 0;
			},
			onSlide: function(value, slider)
			{
				if (val_element.readAttribute('dirty') == "0")
				{
					val_element.removeClassName("inactive");
					val_element.setAttribute('dirty','1');
				}
				else if (val_element.readAttribute('dirty') == "2" && !isOutOfBounds(value,val_element.readAttribute('min'),val_element.readAttribute('max')))
				{
					val_element.removeClassName("error");
					val_element.setAttribute('dirty','1');
				}
				
				tempElem = val_element;
				
				if(value == slider.minimum) // tick downwards if slider is pulled all the way to the left
				{
					if (scroll != -1)
					{
						tempValue = value;
						scroll = -1;
						changeElementValue();
					}
				}
				else if(value == slider.maximum) // tick up if slider is pulled all the way to the right
				{
					if (scroll != 1)
					{
						scroll = 1;
						tempValue = value;
						changeElementValue();
					}
				}
				else // else just set the value to what it is
				{
					scroll = 0;
					tempValue = value;
					changeElementValue();
				}
				
				// update the graph to show currently active value
				var idx2 = val_element.readAttribute('idx');
				if ($('HealthChart').getSelectedSeries() != idx2)
				{
					$('HealthChart').loadSeries(idx2);
				}
				
			}
		});
		
		sliders[idx] = slider;
	});
	
	var form = $('values');
	if(form !== null)
	{
		loadLastVals();
		var textInputs = form.getInputs('text');
		
		for (var i = 0; i < textInputs.length; i++)
		{
			$(textInputs[i]).observe('keydown',handleKeyPress);
			
			//adding change listener (ignoring if is set-goal box)
			if(textInputs[i].id.substr(0, 15) != 'goal_value_box_')
			{
				$(textInputs[i]).observe('keyup',updateAndValidate);
				$(textInputs[i]).observe('blur',updateAndValidate);
			}
		}
	}
	
	updateValuesFromPostData(); //TODO figure out what this does now that we're ajax loading the tabs
}


function loadNutrition()
{
	loadFoodLogItems();
}


function loadActivity()
{
	loadExerciseLogItems();
}


function loadPrivacy()
{
	var priv_settings = $('ht_settings_privacy_area');
	if(priv_settings !== null)
	{
		$$("#ht_settings_privacy_area .all_perms input", 
			"#ht_settings_privacy_area .all_perms_grp input").each(function(elem) {
			elem.observe('click', privacy_bulk_change);
		});

		$$("#ht_settings_privacy_area .perm_items input").each(function(elem) {
			elem.observe('click', privacy_item_change);
		});
	}	
}


function addContainerHover(container)
{
	container.onmouseover = function() 
	{ 
		container.childElements().each(function(item)
		{
			if(item.className.indexOf("-hover") == -1)
			{
				item.className = item.className+"-hover";
			}	

		});
	};
	
	container.onmouseout = function()
	{
		container.childElements().each(function(item)
		{
			var itemNames = item.className.split("-");
			item.className = itemNames[0];	
		});

	};	
}


function loadHeader(event) 
{
	initializeDatePicker();
	updatePrintButton();	
}


function updateValuesFromPostData()
{
	var nameEQ = "form_data=";
	var cookie_bits = document.cookie.split(';');
	for(var i=0;i < cookie_bits.length;i++) 
	{
		var c = cookie_bits[i];
		while (c.charAt(0)==' ')
		{
			c = c.substring(1,c.length);
		}
		if (c.indexOf(nameEQ) == 0)
		{
			var date = new Date();
			date.setTime(date.getTime()-1);
			document.cookie = c+"; expires="+date.toGMTString()+"; path=/";
			
			var jsonString = c.substring(10);
			var postData = jsonString.evalJSON();
			
			var form = $('values');
			var textInputs = form.getInputs('text');
		
			for (var i = 0; i < textInputs.length; i++)
			{
				var input = $(textInputs[i]);
				var lastvaldate = input.readAttribute('lastvaldate');
				var dates = form.getInputs('hidden','date');
				
				// If postData is set for the current input and the input is not a goal box 
				// AND -->
				// 		1) user  has refreshed the same day
				// 		OR
				// 		2) -->
				//			a) lastvaldate is set (meaning the current date does not have a value stored for it)
				//  		b) the date from which the data was posted is greater than or equal to the lastvaldate of the current input 
				//  		c) the date from which the data was posted is less than the current date
				// Then write in the value.
				if (typeof(postData[input.readAttribute('name')]) != 'undefined' && !$(input).hasClassName('goal_value_box')
					&& ((dateCompare($(dates[0]).value,postData.date) == 0)
						|| (lastvaldate != '' && dateCompare(lastvaldate,postData.date) >= 0 && dateCompare($(dates[0]).value,postData.date) == -1)))
				{
					input.value = postData[input.readAttribute('name')];
				}
			}
		}
	}
}


function loadLastVals()
{
	var form = $('values');
	var textInputs = form.getInputs('text');
	
	for (var i = 0; i < textInputs.length; i++)
	{
		var input = textInputs[i];
		var value = $(input).readAttribute('value');
		var lastvalue = $(input).readAttribute('lastval');
		if ((value === null || value == "") && !(lastvalue == null || lastvalue == ""))
		{
			$(input).setAttribute('value',lastvalue);
			
			// mark the input as a temp val
			$(input).addClassName("inactive");
			$(input).setAttribute('dirty','0');
		}
		$(input).observe('focus',setDirty);
	}
}

/****** End Initialization Functions ******/








/********** Date Picker Area ***********/

function initializeDatePicker(profileMode)
{
	var date_picker = $('date_picker');
	if(date_picker !== null)
	{
		var prev_link = $('load_prev_week');
		var next_link = $('load_next_week');

		if(profileMode != 'undefined' && profileMode === true)
		{
			date_picker_cal = new CalendarDateSelect('date_picker_cal_box', {year_range:19, justInitialize:true, onchange:refreshProfilePage, onrangechange:calUpdateDates});
		}
		else
		{
			date_picker_cal = new CalendarDateSelect('date_picker_cal_box', {year_range:19, justInitialize:true, onchange:refreshPage, onrangechange:calUpdateDates});
		}	
		
		prev_link.observe('click',loadDatePicker);
		next_link.observe('click',loadDatePicker);
	}
}


function loadDatePicker(event)
{
	var prev_link = $('load_prev_week');
	var next_link = $('load_next_week');
	
	prev_link.stopObserving('click',loadDatePicker);
	next_link.stopObserving('click',loadDatePicker);
	
	var url = this.readAttribute('url');
	new Ajax.Request(url, {
		method:"post",
		onSuccess:finishLoadDatePicker,
		onFailure:handleLoadDatePickerError
	});
}


function finishLoadDatePicker(ret)
{
	var date_picker = $('date_picker_items');
	date_picker.update(ret.responseText);
	initializeDatePicker();
}


function handleLoadDatePickerError(ret)
{
	alert ('Error: unable to load new week.');
	initializeDatePicker();
}


function loadDate(date)
{
	var tabNum = getSelectedTabAlias(ht_tab_name);
	var extraTab = "";
	if(tabNum != null)
	{
		extraTab = "#"+ht_tab_name+":" + tabNum;
	}
	
	window.location = "/myoh/healthtracker/date," + date + "/" + extraTab;
}


function refreshPage()
{
	var calendar_box = $('date_picker_cal_box');
	
	var date = calendar_box.innerHTML;
	var dateObject = new Date(date);
	
	var month = months[dateObject.getMonth()];
	var day = dateObject.getDate();
	var year = dateObject.getFullYear();
	
	loadDate(day + "-" + month + "-" + year);
}

/*
function refreshProfilePage()
{
	var calendar_box = $('date_picker_cal_box');
	var date = calendar_box.innerHTML;
	var dateObject = new Date(date);
	
	var postVals = { date : date };
	var month = months[dateObject.getMonth()];
	var day = dateObject.getDate();
	var year = dateObject.getFullYear();
	
	//window.location = '/member/spanyam/' + "date," + day + "-" + month + "-" + year + "/#profileHtTab:2";
}
*/


function calUpdateDates(date)
{
	if(date == undefined)
	{
		var dateObj = getPickerDate();
		var date = dateObj.getFullYear() + '-' + (dateObj.getMonth() + 1) + '-01';
	}
	var a = new Ajax.Request('/myoh/healthtracker/action,get_dates/date,'+date+'/',{
		onSuccess:calUpdateDatesHandler
	});
}


function calUpdateDatesHandler(resp)
{
	modifiedDates = resp.responseText.split(",");
	
	var dateArray = new Array();
	for (var i = 0; i < modifiedDates.length; i++)
	{
		var d = new Date();
		var dateParts = modifiedDates[i].split('-');
		d.setFullYear(dateParts[0]);
		d.setMonth(dateParts[1]-1);
		d.setDate(dateParts[2]);
		d.setMinutes(0);
		d.setHours(0);
		d.setSeconds(0);
		dateArray[i] = d;
	}
	
	if(typeof(date_picker_cal) != 'undefined')
	{	
		date_picker_cal.loadDates(dateArray);
		date_picker_cal.refresh();
	}
}


/********** End Date Picker Area ***********/








/****** Data Entry and Validation Functions ******/

function updateSliderRange(elem, slider)
{
	var val = elem.value != "" ? getValue(elem) : 0;
	var step = new Number(elem.readAttribute('step'));
	
	var data = getSliderData(val, step);
	slider.allowedValues = data.vals;
	slider.minimum = slider.allowedValues.min();
	slider.maximum = slider.allowedValues.max();
	slider.range = $R(data.range[0],data.range[1]);
}


function getSliderData(val, step)
{
	var sliderData = {};
	var precision = getPrecision(step);
	var range = new Array(val - (20), val + (20));
	
	var tempval;
	var valsArray = new Array();
	
	valsArray[0] = range[0];
	for (var i = -19; i <= 19; i++)
	{
		tempval = val + (i);
		valsArray[i+20] = new Number(tempval).toFixed(precision);
	}
	valsArray[40] = range[1];
	
	sliderData.vals = valsArray;
	sliderData.range = range;
	
	return sliderData;
}


function changeElementValue()
{	
	var idx = new Number(tempElem.readAttribute('idx'));
	var step = new Number(tempElem.readAttribute('step'));
	var precision = getPrecision(step);
	var min = tempElem.readAttribute('min');
	var max = tempElem.readAttribute('max');
	
	curPrecision = getPrecision(getValue(tempElem));
	
	if (isOutOfBounds(tempValue,min,max))
	{
		tempElem.value = getBoundedNumber(tempValue,min,max);
		$('intro_msg').value = blankoutCount;
		if(isMin(tempElem) && scroll !== 0)
		{
			blankoutCount++;
			if (blankoutCount >= 7)
			{
				tempElem.value = "";
				blankoutCount = 0;
				clearTimeout(timeout);
			}
			else
			{			
				clearTimeout(timeout);
				timeout = setTimeout('changeElementValue()',tickFrequency);
			}
		}
		else
		{
			blankoutCount = 0;
		}
	}
	else
	{
		blankoutCount = 0;
		tempElem.value = curPrecision == 0 ? new Number(tempValue).toFixed(curPrecision) : new Number(tempValue).toFixed(precision);
		if (scroll !== 0)
		{
			var tempSlider = sliders[idx];
			data = getSliderData(tempValue - (20 * scroll), step);
			
			tempSlider.allowedValues = data.vals;
			tempSlider.minimum = tempSlider.allowedValues.min();
			tempSlider.maximum = tempSlider.allowedValues.max();
			tempSlider.range = $R(data.range[0],data.range[1]);
			
			tempValue += 5 * scroll;
			
			clearTimeout(timeout);
			timeout = setTimeout('changeElementValue()',tickFrequency);
		}
	}
	
	if (bodySaveTimeoutActive)
	{
		clearTimeout(bodySaveTimeout);
	}
	bodySaveTimeout = setTimeout('saveBodyData()',bodySaveTimeoutDelay);
	bodySaveTimeoutActive = true;	
}


function getValue(elem)
{
	if (!isNaN(new Number(elem.value)) && elem.value != "")
	{
		return new Number(elem.value);
	}
	else if (!isNaN(new Number(elem.readAttribute('lastval'))) && elem.readAttribute('lastval') != "")
	{
		return new Number(elem.readAttribute('lastval'));
	}
	else if (!isNaN(new Number(elem.readAttribute('min'))))
	{
		return new Number(elem.readAttribute('min'));
	}
	else if (!isNaN(new Number(elem.readAttribute('max'))))
	{
		return new Number(elem.readAttribute('max'));
	}
	else
	{
		return 0;
	}
}


function getPrecision(val)
{
	var precision = 0;
	var strval = val.toString();
	var index = strval.lastIndexOf('.');
	
	if (index != -1)
	{
		precision = (strval.length - 1) - index;
	}
	
	return precision;
}


function getBoundedNumber(val,min,max)
{
	var new_elem_value;
	var tempMin = (min == "") ? NaN : new Number(min);
	var tempMax = (max == "") ? NaN : new Number(max);
	if (!isNaN(tempMin) && val < min)
	{
		return tempMin;
	}
	else if (!isNaN(tempMax) && val > max)
	{
		return tempMax;
	}
	else
	{
		return val;
	}
}


function isMin(elem)
{
	var value = getValue(elem);
	var min = (elem.readAttribute('min') == "") ? NaN : new Number(elem.readAttribute('min'));
	
	if(!isNaN(value) && !isNaN(min) && value.valueOf() == min.valueOf())
	{
		return true;
	}
	else
	{
		return false;
	}
}


function isMax(elem)
{
	var value = getValue(elem);
	var max = (elem.readAttribute('max') == "") ? NaN : new Number(elem.readAttribute('max'));
	
	if(!isNaN(value) && !isNaN(max) && value == max)
	{
		return true;
	}
	else
	{
		return false;
	}
}


function handleKeyPress(e)
{
	var keynum;
	var tempvalue;
	var allowedKeys = new Array(Event.KEY_BACKSPACE,Event.KEY_TAB,Event.KEY_LEFT,Event.KEY_RIGHT,Event.KEY_ESC,Event.KEY_RETURN,Event.KEY_DELETE,Event.KEY_HOME,Event.KEY_END,Event.KEY_PAGEUP,Event.KEY_PAGEDOWN);
	
	var idx = this.readAttribute('idx');
	var value = getValue(this);
	var step = new Number(this.readAttribute('step'));
	var precision = getPrecision(step);
	
	var min = this.readAttribute('min');
	var max = this.readAttribute('max');
	
	keynum = e.keyCode;
	
	var modifierKeyPressed = (e.shiftKey || e.ctrlKey || e.altKey);
	
	if(keynum == Event.KEY_UP) // increment the value in the text box by 1 step
	{
		tempvalue = value + step;
		tempvalue = getBoundedNumber(tempvalue,min,max);
		this.value = tempvalue.toFixed(precision);
	}
	else if(keynum == Event.KEY_DOWN) // decrement the value in the text box by 1 step
	{
		tempvalue = value - step;
		tempvalue = getBoundedNumber(tempvalue,min,max);
		this.value = tempvalue.toFixed(precision);
	}
	else if(keynum == Event.KEY_RETURN && this.hasClassName('goal_value_box'))
	{
		var type_id = this.readAttribute('idx');
		var type_group_id = $('type_group_id_'+type_id).value;
		saveGoal(type_id,type_group_id);
	}
	else if(allowedKeys.has(keynum) || isNumericKey(keynum, modifierKeyPressed))
	{
		return true;
		// do nothing
	}
	else
	{
		e.stop();
	}
	
	if (!this.hasClassName('data_range_input'))
	{
		if ($('HealthChart').getSelectedSeries() != idx)
		{
			$('HealthChart').loadSeries(idx);
		}
	}
}


function updateAndValidate(e)
{
	keynum = e.keyCode;
	if (keynum == Event.KEY_ESC)
	{
		this.value = this.readAttribute('curval') != "" ? this.readAttribute('curval') : (this.readAttribute('lastval') != "" ? this.readAttribute('lastval') : "");
		if (this.readAttribute('curval') == "" && this.readAttribute('lastval') != "")
		{
			this.addClassName('inactive');
		}
		this.removeClassName('error');
		this.setAttribute('dirty','0');
		this.blur();
	}
	else
	{
		var idx = new Number(this.readAttribute('idx'));
		var val = getValue(this);
		var step = new Number(this.readAttribute('step'));
		
		var tempSlider = sliders[idx];
		data = getSliderData(val, step);
		tempSlider.allowedValues = data.vals;
		tempSlider.minimum = tempSlider.allowedValues.min();
		tempSlider.maximum = tempSlider.allowedValues.max();
		tempSlider.range = $R(data.range[0],data.range[1]);
		tempSlider.setValueSimple(val);
		
		if(typeof(keynum) != "undefined")
		{
			validateInput(this,bodySaveTimeoutDelay+3000);
		}
		else
		{
			validateInput(this,bodySaveTimeoutDelay);
		}
	}
}


function validateInput(elem,timeout)
{
	checkError(elem);
	if (elem.readAttribute('dirty') == '1')
	{
		if (bodySaveTimeoutActive)
		{
			clearTimeout(bodySaveTimeout);
		}
		bodySaveTimeout = setTimeout('saveBodyData()',timeout);
		bodySaveTimeoutActive = true;
	}
}


function setDirty(event)
{
	if (this.readAttribute('dirty') == '0')
	{
		this.removeClassName("inactive");
		this.setAttribute('dirty','1');
	}
	this.select();
	event.stop();
	
	var idx = this.readAttribute('idx');
	if ($('HealthChart') && $('HealthChart').getSelectedSeries() != idx)
	{
		$('HealthChart').loadSeries(idx);
	}
}

/****** End Data Entry and Validation Functions ******/








/****** Privacy Functions ******/

function privacy_bulk_change(event)
{
	var type_group_id = this.readAttribute('type_group_id');
	var isChecked = this.checked;
	var matchStr = 'input.perm_'+this.readAttribute('perm_type');
	if(type_group_id !== null)
	{
		$$('#ht_settings_privacy_area .all_perms input').each(function(elem)
		{
			elem.checked = false;
		});
		matchStr = 'div#type_group_' + type_group_id + " " + matchStr;
	}
	else
	{
		$$('#ht_settings_privacy_area .all_perms_grp input').each(function(elem)
		{
//			alert(elem.name + ": " + elem.value);
			elem.checked = false;
		});
	}

	$$(matchStr).each(function(elem)
	{
		elem = $(elem);
		var pElem = elem.up("p.perm_items");
		if(typeof pElem == "undefined")
		{
			return;
		}
		else
		{
			elem.up("p.perm_items").down("input").writeAttribute('dirty', '1');
		}
		
		elem.checked = isChecked;
	});

	if(bodySaveTimeout)
	{
		clearTimeout(bodySaveTimeout);
	}
	
	disableCheckbox();
	bodySaveTimeout = setTimeout('ajax_save_privacy()',bodySaveTimeoutDelay);
}


function disableCheckbox()
{	
	/*
	var f = $('ht_settings_privacy_area');
	for(var n=0; n< f.elements.length; n++)
	{
		if((f.elements[n].value == 'Private' || f.elements[n].value == 'Friends') && f.elements[n].checked == true)
		{
			stayDisabled = 'true';
		}
	}*/
	if($('weight_private_radio').checked == true || $('weight_friends_radio').checked == true)
	{
		$('ht_checkbox').disabled = 'true';
		$('ht_checkbox').checked=false;
	}
	else
	{
		$('ht_checkbox').disabled = '';
	}
	
}


function privacy_item_change(event)
{
	this.up("p").down("input.hidden_type_group_id").writeAttribute('dirty', '1');
	// set dirty flag
	// start or restart timeout event
	if(bodySaveTimeout)
	{
		clearTimeout(bodySaveTimeout);
	}
	bodySaveTimeout = setTimeout('ajax_save_privacy()',bodySaveTimeoutDelay);
}


function ajax_save_privacy()
{
	var privacy_form = $('ht_settings_privacy_area').serialize(true);
	var inputs = $('ht_settings_privacy_area').getInputs('hidden');
	var changeCnt = inputs.length;
	for(var i = 0; i < inputs.length; i++)
	{
		var input = inputs[i];
		if(input.readAttribute('dirty') != "1")
		{
			--changeCnt;
			var type_id = input.readAttribute('type_id');
			delete privacy_form["type_group_id["+ type_id + "]"];
			delete privacy_form["perm["+ type_id + "]"];
			delete privacy_form["surg_perm["+ type_id + "]"];
		}
	}
	
	
	if (changeCnt > 0)
	{
		new Ajax.Request("/myoh/healthtracker/action,savesharingsettings/", {
			method: 'post',
			parameters: privacy_form,
			onSuccess: privSaveSuccessHandler,
			onFailure: privSaveErrorHandler
		});
	}
}


function privSaveSuccessHandler(transport)
{
	sendMessage("Your data has been saved!","green");
	var inputs = $('ht_settings_privacy_area').getInputs('hidden');
	for(var i = 0; i < inputs.length; i++)
	{
		inputs[0].writeAttribute('dirty', '0');
	}
	bodySaveTimeout = false;
}


function privSaveErrorHandler(transport)
{
	sendMessage("Error: Unable to save data.","red");
	bodySaveTimeout = false;
}

/****** End Privacy Functions ******/








/****** Body Data Save Functions ******/

function saveBodyData() // Ajax submit of the main form
{
	var form = $('values');
	var textInputs = form.getInputs('text');
	
	var totalInputCount = textInputs.length;
	var errorCount = 0;
	var postVals = form.serialize(true);
	
	for (var i = 0; i < textInputs.length; i++)
	{
		var input = textInputs[i];
		if (!$(input).hasClassName('goal_value_box') && (input).readAttribute('dirty') != "1") // do not submit untouched inputs
		{
			var idx = $(input).readAttribute('idx');	
			delete postVals['data_val['+idx+']'];			
			delete postVals['type_group_id['+idx+']'];
			totalInputCount--;
			
			if ($(input).readAttribute('dirty') == "2") // notify user regarding error fields
			{
				errorCount++;
			}
		}
		else if (!$(input).hasClassName('goal_value_box'))
		{
			postVals[$(input).readAttribute('name')] = $(input).value;
		}
	}
	
	if (totalInputCount > 0 && errorCount <1)
	{
		postJson = Object.toJSON(postVals);
		
		new Ajax.Request("/myoh/healthtracker/action,save/", {
			method: 'post',
			parameters: postVals,
			onSuccess: bodySuccessHandler,
			onFailure: bodyErrorHandler
		});
		
		if (bodySaveTimeoutActive)
		{
			clearTimeout(bodySaveTimeout);
		}
		bodySaveTimeoutActive = false;
	}
	if (errorCount > 0)
	{
		sendMessage("Some fields could not be saved.","red");
	}
}


function bodySuccessHandler(ret)
{
	var form = $('values');
	var textInputs = form.getInputs('text');
	
	for (var i = 0; i < textInputs.length; i++)
	{
		var input = $(textInputs[i]);
		if (input.readAttribute('dirty') == "1")
		{
			input.setAttribute('dirty','0');
			input.setAttribute('curval',input.value);
		}
	}
	
	resp = ret.responseText.evalJSON();
	myWeightKg = Number(resp.weightKg);
	
	sendMessage("Your data has been saved!","green");
	$('HealthChart').refresh();
	if($('ActivityPieChart'))
	{
		$('ActivityPieChart').refresh();
	}
}


function bodyErrorHandler(ret)
{
	sendMessage("Error: Unable to save data.","red");
}

/****** End Body Data Save Functions ******/








/******** Goal Functions ********/

function showSetGoalBox(type_id)
{
	$$('div.set_goal_box').each(function(elem)
	{
		elem = $(elem);
		elem.style.display = 'none';
	});
	
	if($('goal_val_link_'+type_id).innerHTML == 'Set Goal')
	{
		$('goal_value_box_'+type_id).value = '';
	}
	
	$('set_goal_box_' + type_id).style.display = 'block';
	
	if($('HealthChart').getSelectedSeries() != type_id)
	{
		$('HealthChart').loadSeries(type_id);
	}
}

function hideSetGoalBox(type_id)
{
	$('set_goal_box_' + type_id).style.display = 'none';
}


function saveGoal(type_id,type_group_id)
{
	if($('HealthChart').getSelectedSeries() != type_id)
	{
		$('HealthChart').loadSeries(type_id);
	}
	
	var elem = $('goal_value_box_'+type_id);
	
	var goal_value = $('goal_value_box_' + type_id).value;
	var postParams = {'type_id': type_id, 'goal_value': goal_value, 'type_group_id': type_group_id};
	
	var min = elem.readAttribute('min');
	var max = elem.readAttribute('max');
	
	if (isNaN(goal_value) || isOutOfBounds(goal_value,min,max))
	{
		sendMessage("Invalid Input. Could not save your goal.","red");
	}
	else
	{
		new Ajax.Request("/myoh/healthtracker/action,saveGoal/", {
			method: 'post',
			postBody: 'goalData='+Object.toJSON(postParams),
			onSuccess: saveGoalSuccessHandler,
			onFailure: saveGoalErrorHandler
		});
	}
}


function saveGoalSuccessHandler(ret)
{
	sendMessage("Your data has been saved!", "green");
	var goalData = ret.responseText.evalJSON();	

	//updating goal description (if empty, showing "set goal" message)
	$('goal_' + goalData.type_id).update((goalData.goal_value.length > 0 ? "Goal is<br/>" : "")
		+ "<a id=\"goal_val_link_" + goalData.type_id + "\" href=\"javascript:void(0)\" onclick=\"showSetGoalBox('" + goalData.type_id + "')\">"
		+ (goalData.goal_value.length > 0 ? goalData.goal_value + ' ' + goalData.units : "Set Goal")
		+ "</a>");

	// REVIEW: styles go to style sheet
	if(goalData.goal_value.length >= 6)
	{
		$('goal_val_link_' + goalData.type_id).addClassName("smallGoal");
	}
	else if(goalData.goal_value.length >= 5)
	{
		$('goal_val_link_' + goalData.type_id).addClassName("medGoal");
	}
	else
	{
		$('goal_val_link_' + goalData.type_id).addClassName("largeGoal");
	}

	$('HealthChart').refresh();
	//hiding set goal box
	hideSetGoalBox(goalData.type_id);
}


function saveGoalErrorHandler(ret)
{
	var msg = ret.responseText.length > 0 ? ret.responseText : 'Unable to save goal.';
	sendMessage("Error: " + msg, "red");
}

/******** End Goal Functions ********/







/****** Add/Remove Data Types functions ******/

function toggleRestoreTypes()
{
	var restore_types = $('restore_types');
	restore_types.toggleClassName('visible');
	var height = restore_types.getHeight();
	var newTop = '-' + (height - 15)+ 'px';
	restore_types.setStyle({top:newTop});
}


function warnRemove()
{
	return confirm("By removing this item, it will no longer display here, however any previously entered "
		+ "data will not be deleted. You can always re-add this item via the menu below. Click OK to continue.");
}

/****** Add/Remove Data Types functions ******/








/********* Widgets Area *********/

function updateWidget()
{
	var form = $('macronutrient_widget');
	var selectBox = $(form['date_range']);
	var days = selectBox.getValue().replace('last','');
	var selected = selectBox.options[selectBox.selectedIndex];
	var text = selected.text;
	$('my_range').innerHTML = text;
	
	var username = $(form['username']).getValue();
	
	FlashChecker.loadPlayer("/shared/flash/HTNutritionPieChart/HT_NutritionPieChart?v=4",
				375,200,"middle","NutritionPieChart","NutritionPieChart",
				"username="+username+"&trailingDays="+days,"transparent","widget_flash_container");
	
	writeEmbedCode();
}

function writeEmbedCode()
{
	var form = $('macronutrient_widget');
	$(form['embed_code']).value = $('widget_container').innerHTML;
}

/********* End Widgets Area *********/







/********* Water Area **********/
var cups = 8;
var cupsFull = 0;
var waterHoverTimeout = false;

function saveWater()
{
	var form = $('nutrition_values');
	var curCount = cupsFull; //new Number($('water_ct').getValue());
	if (!isNaN(curCount))
	{
		var postVals = {};
		postVals['data_val[57]'] = Math.round(curCount);
		postVals['type_group_id[57]'] = '3';
		postVals['cat_id[57]'] = '2';
		
		var dateObj = getPickerDate();
		var date = dateObj.getFullYear() + '-' + (dateObj.getMonth() + 1) + '-' + dateObj.getDate();
		postVals['date'] = date;
		
//		postVals = Object.toJSON(postVals);
//		alert('saving water');
		new Ajax.Request('/myoh/healthtracker/action,save/',
		{
			method : 'post',
			parameters : postVals,
			onSuccess: function(){sendMessage("Water data has been saved!","green");},
			onFail: function(){sendMessage("An error occured while saving water data.","red");}
		}
		);
	}
}

/**
 * keeps the cups from flashing when moving between cups
 * @return
 */
function removeHover()
{
	if(waterHoverTimeout)
	{
		clearTimeout(waterHoverTimeout);
	}
	waterHoverTimeout = setTimeout("waterHover(-1);", 50);
}

function waterHover(cupNumber)
{
	if(waterHoverTimeout)
	{
		clearTimeout(waterHoverTimeout);
	}
	waterHoverTimeout = false;
	
	if(cupNumber < 0)
	{
		//called by removeHover, reseting water count to previous clicked value
		cupNumber = cupsFull;
	}
	
	for(var i = 1; i <= cups; i++)
	{
		$('water-'+i).innerHTML = "&nbsp;";
		if(i <= cupNumber)
		{
			$('water-'+i).addClassName('water-full');
		}
		else
		{
			$('water-'+i).removeClassName('water-full');
		}
	}
	
	if(cupNumber > 0)
	{
		$('water-'+cupNumber).innerHTML = cupNumber;
	}
}

function clickWater(cupNumber)
{
	cupsFull = cupNumber;
	
	//removing excess rows
	if(cupNumber == 0 && cups > 8)
	{
		var cupArea = $('cup-area');
		var position = 9;
		cupArea.select('a.water').each(function(child) {
			if(child.id == 'water-' + position)
			{
				$(child).remove();
				position++;
			}
		});
		cups = 8;
	}
	
	saveWater();
}

function addWaterRow()
{
	var cupArea = $('cup-area');
	for(var i = 1; i <= 8; i++)
	{
		var idx = cups + i;
		cupArea.insert('<a id="water-' + idx + '" class="water" href="javascript:void(0);" onmouseover="waterHover(' + idx + ');" onmouseout="removeHover();" onclick="clickWater(' + idx + ');">&nbsp;</a>');
	}
	cups += 8;
}

/********* End Water Area *********/




/********* Print Area **********/



function updatePrintButton()
{
	var whichType = getSelectedTabAlias(ht_tab_name, false);
	if(whichType == 'nutrition' || whichType == 'exercise')
	{
		// only nutrition and activity pages have the print ability right now...
		$('printButton').show();
	}
	else
	{	
		if($('printButton'))
		{
			$('printButton').hide();
		}
	}
}


function showPrintMenu()
{
	$('printDropdown').toggle();
}


function printLog()
{
	var days = 1;
	if($('printDays_7').checked)
	{
		days = 7;
	}
	else if($('printDays_30').checked)
	{
		days = 30;
	}
	
	//determining current calendar date
	var dateObj = getPickerDate();
	var curDate = dateObj.getFullYear() + '-' + (dateObj.getMonth() + 1) + '-' + dateObj.getDate();	
	var mode = getSelectedTabAlias(ht_tab_name, false) == 'nutrition' ? 'nutrition' : 'exercise';

	window.open('/myoh/healthtracker/action,'+mode+'_print/date,'+curDate+'/days,'+days+'/','printwindow','width=600,toolbar=no,location=no,directories=nos,status=no,menubar=no,scrollbars=yes,copyhistory=yes,resizable=yes');
	$('printDropdown').hide();
}

/********* End Print Area **********/





/********* Find Foods Area **********/


var searchDateObj = new Date();
var searchTstamp = searchDateObj.getTime();
function getSearchItems(curPage, whichType)
{
	//grabbing user's search, loading results if search set
	var searchBox = $('tabSearchBox_' + whichType);
	var search = searchBox.getValue();
	if(search)
	{		
		//showing search window w/ processing icon
		$('tab_search_wrapper_' + whichType).style.display = 'block';
		$('item_search_results_wrap_' + whichType).style.display = 'block';
		$('item_search_results_' + whichType).innerHTML = '<h4>Loading search results...</h4>'
			+ '<div align="center"><img src="/shared/images/others/loading.gif"></div>';
	
		//setting qsParams
		var qsParams = new Hash();
		qsParams.set('q', search);
		qsParams.set('pg', curPage);
		qsParams.set('type', whichType);
		
		if(getSelectedTabAlias(ht_tab_name) == 'browse_my_meals' && parentItemId)
		{
			qsParams.set('parentItemId', parentItemId);
			qsParams.set('incCustomMeals', false);
		}
		
		qsParams.set('loc', (getParentTabAlias(ht_tab_name) == 'nutrition_main' ? 'foodlog' : 'activitylog'));
		qsParams.set('stime', searchTstamp);
		
		//adding search filters to qsParams
		var filter_form = $('item_search_filters_' + whichType);
		var catFilterField = filter_form['cat_filter'];
		var catFilter = catFilterField.options[catFilterField.selectedIndex].value;	
		qsParams.set('catFilter', catFilter);
		qsParams.set('ohItems', filter_form['oh_items'].checked ? 1 : 0);
		qsParams.set('myItems', filter_form['my_items'].checked ? 1 : 0);
		qsParams.set('userItems', filter_form['user_items'].checked ? 1 : 0);
		qsParams.set('myFavs', filter_form['my_favs'].checked ? 1 : 0);
		
		//building grab results url w/ unique hash
		var link = "/myoh/healthtracker/action,searchItems/";
		new Ajax.Request(link, {method:'get', parameters:qsParams, evalScripts:true, onSuccess:handleSearchResults, onFailure:handleSearchResultsFail});
	}
}


function handleSearchResultsFail(ret)
{
	var whichType = getParentTabAlias(ht_tab_name) == 'nutrition_main' ? 'nutrition' : 'activity';
	var msg;
	if(ret.responseText.length > 0)
	{
		msg = ret.responseText;
	}
	else
	{
		msg = "An error occurred while retrieving your search results. Please try again.";
	}
	$('item_search_results_' + whichType).update("<h4>" + msg + "</h4>");
}


function handleSearchResults(ret)
{
	var whichType = getParentTabAlias(ht_tab_name) == 'nutrition_main' ? 'nutrition' : 'activity';
	var searchResults = $('item_search_results_' + whichType);
	searchResults.innerHTML = ret.responseText;
	ret.responseText.evalScripts();

	//calculate the new size and adjust the content
	var searchWrapper = $('tab_search_wrapper_' + whichType);
	pushFooter(searchWrapper);
}


function closeSearchResults()
{
	var whichType = getParentTabAlias(ht_tab_name) == 'nutrition_main' ? 'nutrition' : 'activity';
	searchWrapper = $('tab_search_wrapper_' + whichType);
	
	$('item_search_results_wrap_' + whichType).style.display = 'none';
	
	if(searchWrapper)
	{		
		//hardcoding different height for IE
		$(searchWrapper.parentNode).setStyle({height: (document.all ? '100%' : 'auto') });
		
		searchWrapper.hide();
	}
}


function displaySearchOptions()
{
	var whichType = getParentTabAlias(ht_tab_name) == 'nutrition_main' ? 'nutrition' : 'activity';
	$('tab_search_wrapper_' + whichType).style.display = 'block';
	pushFooter($('tab_search_wrapper_' + whichType));
}

/********* End Find Foods Area **********/







/***************** add/remove favorites functions *******************/
function toggleFavorite(itemId, item)
{
	var star = "/shared/icons/star.png";
	var unstar = "/shared/icons/star-unselected.png";
	var deleteStar = "/shared/icons/star-delete.png";
	
	if(item.getAttribute("isfavorite")=="no")
	{
		$$('img.favorite_'+itemId).each(function(el){
      		el.src = star;
			el.onmouseover=function(){ this.src = deleteStar; };
			el.onmouseout=function(){ this.src = star; };
			el.writeAttribute("isfavorite", "yes");
			el.writeAttribute("alt", "unfavorite");
			el.writeAttribute("title", "unfavorite");
        });

		var action = 'yes';
	}
	else
	{
		$$('img.favorite_'+itemId).each(function(el){
			el.src = unstar;
			el.onmouseover=function(){ this.src = star; };
			el.onmouseout=function(){ this.src = unstar; };
			el.writeAttribute("isfavorite", "no");
			el.writeAttribute("alt", "make favorite");
			el.writeAttribute("title", "make favorite");
        });
        
        var action = 'no';
	}
	
	new Ajax.Request('/myoh/healthtracker/action,toggleFavorite/favorite,'+action+'/',{
		method: 'post',
		parameters: { itemId : itemId },
		onSuccess: function(ret) {
			sendMessage(ret.responseText, "green");

			if(action == 'no')
			{
				if(getSelectedTabAlias(ht_tab_name) == 'browse_favorites')
				{
					$('favorite_foods_wrapper').down('div.item_'+itemId).fade();
				}
				else if(getSelectedTabAlias(ht_tab_name) == 'browse_my_exercise')
				{
					$('favorite_exercises_wrapper').down('div.item_'+itemId).fade();
				}
			}
		},
		onFailure: handleFavoriteFail
	});
}

function handleFavoriteFail(msg)
{
	sendMessage("Failed to save. Please try again later.", "red");
}


/************** end of add/remove favorites functions ***************/







/********* Food Log Area **********/
var save_form_id = false;
function saveFoodLog(form_id, returnFoodLog, parentItemId)
{
	if(typeof form_id == 'undefined')
	{
		form_id = false;
	}
	
	if(typeof returnFoodLog == 'undefined')
	{
		returnFoodLog = true;
	}
	
	if(typeof parentItemId == 'undefined')
	{
		parentItemId = false;
	}
	
	var saveData = { return_food_log: returnFoodLog, unsavedLogChanges: unsavedLogChanges, parentItemId: parentItemId };
	save_form_id = form_id;
	
	new Ajax.Request('/myoh/healthtracker/action,saveNutrition/',{
		method: 'post',
		parameters: { saveData : Object.toJSON(saveData) },
		onSuccess: handleSaveFoodLog,
		onFailure: function(resp){
			//resetting unsaved logged changes
			unsavedLogChanges = new Array();
			button_id = 'sb_' + form_id;
			$(button_id).disabled = false;
			$(button_id).value = "Try Again";
			sendMessage('Error: '+resp.error,'red');
		}
	});
}


function handleSaveFoodLog(ret)
{
	//determining current calendar date
	var dateObj = getPickerDate();
	var curDate = dateObj.getFullYear() + '-' + (dateObj.getMonth() + 1) + '-' + dateObj.getDate();	
	
	//refreshing food log area
	var retData = ret.responseText.evalJSON();
	var food_log_div = $('daily_food_log');
	if(retData.updateFoodLog)
	{
		if(typeof(retData.parentItemId) != 'undefined' && retData.parentItemId)
		{
			$('ht_main_content_browse_my_meals').update(retData.foodLog);
		}
		else if(food_log_div)
		{
			$('daily_food_log').update(retData.foodLog);
		}
	}
	//if food log is available, tab has been loaded, and we need to refresh if clicking back to that tab
	if(getSelectedTabAlias(ht_tab_name) != 'nutrition' && $('foodlog_summary_area'))
	{
		document.observe('tab:switchdone',refreshFoodLogArea);
	}
	else
	{
		refreshFoodLogArea();
	}
	
	//closing edit item form if applicable
	if(save_form_id)
	{
		closeLogItemForm(save_form_id);
		save_form_id = false;
	}

	//resetting unsavedLogChanges array
	unsavedLogChanges = new Array();
	
	sendMessage("Your food log has been saved successfully.","green");
	closeSearchResults();
}


function refreshFoodLogArea()
{
	//checking if currently in 'Food Log' tab (OR that tab has loaded (i.e. clicked to, then away from))
	if(getParentTabAlias(ht_tab_name) == 'nutrition_main' && $('daily_food_log'))
	{
		//hiding or showing no-data message box
		displayNoDataMessage();
		
		//reloading food log items via ajax
		enableFoodLogDragDrop();
		
		refreshNutritionSummaryLabel();
		
		if($('NutritionPieChart') && typeof($('NutritionPieChart').refresh) != 'undefined')
		{
			$('NutritionPieChart').refresh();
		}
	}
}


function refreshNutritionSummaryLabel()
{
	if($('nutritionSummaryLabel'))
	{
		var dateObj = getPickerDate();
		var date = dateObj.getFullYear() + '-' + (dateObj.getMonth() + 1) + '-' + dateObj.getDate();	

		new Ajax.Updater('nutritionSummaryLabel', '/myoh/healthtracker/action,viewSummaryNutritionLabel/date,'+date+'/');
	}
}


function removeItem(divId, itemRefId, itemId, measurementId, mealId, parentItemId)
{
	if(confirm('Are you sure you wish to remove this item?'))
	{
		if(typeof parentItemId == 'undefined')
		{
			parentItemId = false;
		}
		
		var tD = getPickerDate();
		var date = tD.getFullYear() + '-' + (tD.getMonth() + 1) + '-' + tD.getDate();

		var change = { 
			item_ref_id : itemRefId,
			item_id : itemId,
			quantity : -1,
			measurement_id : measurementId,
			meal_id : mealId,
			action : 'remove',
			date : date
		};
		unsavedLogChanges.push(change);		
		
		$(divId).update("<img src=\"/shared/images/others/loading.gif\"> Deleting...");
		saveFoodLog(false, true, parentItemId);
	}
}


function loadFoodLogItems()
{
	var tD = getPickerDate();
	var date = tD.getFullYear() + '-' + (tD.getMonth() + 1) + '-' + tD.getDate();
		
	new Ajax.Updater('daily_food_log', "/myoh/healthtracker/action,foodLogSummary/date," + date + "/", {
		evalScripts : true, onComplete:enableFoodLogDragDrop
	});	 
}


function enableFoodLogDragDrop()
{
	displayNoDataMessage();

	$$('div.box-container').each(function(element) {
		addContainerHover(element);				
	});
	
	if(numFoodLogItems > 0)
	{		
		Sortable.create('daily_food_log', { tag:'div',
				only:'box-container',
				handle:'header',
				constraint:'vertical',
				overlap:'vertical',
				containment: ['daily_food_log'], 
				dropOnEmpty: true,
				onHoverInstant: true,
				scroll:window,
				onUpdate: updateMealOrder
			}
		);
	}
}


function updateMealOrder(container)
{
	var order = new Array();
	pos = 0;
	container.childElements().each(function(elem){
		order[pos++] = $(elem).readAttribute('meal_id');
	});

	//grabbing current date
	var tD = getPickerDate();
	var date = tD.getFullYear() + '-' + (tD.getMonth() + 1) + '-' + tD.getDate();	
	
	var dateObj = new Date();
	var ran_number = dateObj.getTime();	
	var params = { order: Object.toJSON(order), date: date }; 
	
	new Ajax.Request("/myoh/healthtracker/action,updateMealOrder/", {
		method : 'post',
		parameters : params,
		onSuccess : function (ret) {
			sendMessage("Your changes have been saved.", "green");
		},
		onFailure : function (ret) {
			sendMessage("An error occurred while saving your meal reordering. Please refresh the page and try again.", "red");
		}
	});
}


function displayNoDataMessage()
{
	// REVIEW: change to use style sheet
	if($('nutrientInfo'))
	{
		if($$("#daily_food_log .food_item").length > 0)
		{
			$('nutrientInfo').style.display = "block";
			$('nutrition-none').style.display = "none";
		}
		else
		{
			$('nutrientInfo').style.display = "none";
			$('nutrition-none').style.display = "block";
		}
	}
}

/********* End Food Log Area **********/




/************ custom meal item area ************/

function cancelCreateNewMeal()
{
	$('new_meal_popup').toggleClassName('hidden');
	$('mealName').value = '';
	$('mealDescription').value = '';
}


function createNewMeal()
{
	var mealName = $('mealName').value;
	var mealDescription = $('mealDescription').value;
	
	new Ajax.Request("/myoh/healthtracker/action,createCustomMeal/", {
		method : 'post',
		parameters : {mealName : mealName, mealDescription : mealDescription},
		onSuccess : function (ret) {
			$('new_meal_error').addClassName('hidden');
			var retData = ret.responseText.evalJSON();
			sendMessage("Your changes have been saved.", "green");
			
			var url = '/myoh/healthtracker/action,edit_meal/itemId,' + retData.itemId + '/';
			var tabNum = getSelectedTabAlias(ht_tab_name);
			var content = $(ht_tab_name+'_content_'+tabNum);

			overwriteTab(url,content);
			
			var hashParams = { itemId : retData.itemId };
			setHashParams(ht_tab_name,hashParams);
			
			closeSearchResults();
			$('tabSearchBox_nutrition').setFocus();
		},
		onFailure : function (ret) {
			var retData = ret.responseText.evalJSON();
			$('new_meal_error').innerHTML = retData.error;
			$('new_meal_error').removeClassName('hidden');
		}
	});
}


function deleteCustomMeal()
{
	if(!confirm('Are you sure you want to delete this meal?'))
	{
		return;
	}

	new Ajax.Request(deleteCustomMealURL, {
		onSuccess : function (ret) {
			sendMessage("Meal has been deleted.", "green");
			
			parentItemId = false;
			
			var url = '/myoh/healthtracker/action,browse_my_meals/';
			var tabNum = getSelectedTabAlias(ht_tab_name);
			var content = $(ht_tab_name+'_content_'+tabNum);

			overwriteTab(url,content);
			
			var hashParams = {};
			setHashParams(ht_tab_name,hashParams);
		},
		onFailure : function (ret) {
			sendMessage("An error has occured.", "red");
		}
	});
}


function showCustomMealEditPopup()
{
	$('edit_meal_name_backup').value = $('edit_meal_name').value;
	$('edit_meal_description_backup').value = $('edit_meal_description').value;
	
	$('meal_edit_area').toggleClassName('hidden');$('meal_header_area').toggleClassName('hidden');
}


function cancelCustomMealEdit()
{
        $('edit_meal_name').value = $('edit_meal_name_backup').value;
        $('edit_meal_description').value = $('edit_meal_description_backup').value;
	$('edit_meal_name_backup').value = '';
	$('edit_meal_description_backup').value = '';
        
        $('meal_edit_area').toggleClassName('hidden');$('meal_header_area').toggleClassName('hidden');
}


function saveCustomMealName()
{
	var description = $('edit_meal_description').value;
	var name = $('edit_meal_name').value;
	
	
	new Ajax.Request('/myoh/healthtracker/action,save_custom_meal_name/', {
		method: 'post',
		parameters: {itemId: parentItemId, name: name, description: description},
		onSuccess : function (ret) {
			var retData = ret.responseText.evalJSON();
			sendMessage("Meal information has been updated.", "green");
			
			$('meal_name').innerHTML = retData.name;
			if(typeof(retData.description) != 'undefined')
			{
				$('meal_description').innerHTML = retData.description;
			}
			else
			{
				$('meal_description').innerHTML = '';
			}

			$('meal_edit_area').toggleClassName('hidden');
			$('meal_header_area').toggleClassName('hidden');
		},
		onFailure : function (ret) {
			var retData = ret.responseText.evalJSON();
			sendMessage(retData.error, "red");
		}
	});
}
/********* custom meal Area **********/




/************ log food item form functions ************/

function saveLogItemForm(form, form_id, returnFoodLog, parentItemId)
{
	var itemId = form.itemId.value;
	var itemRefId = form.itemRefId.value;
	var comboChildId = form.comboChildId.value;
	var origMealId = form.orig_meal_id.value;
	var action = 'add';

	if(typeof(parentItemId) == 'undefined')
	{
		parentItemId = false;
		if(itemRefId)
		{
			action = 'edit';
		}
	}
	else
	{
		if(comboChildId)
		{
			action = 'edit';
		}
	}
	
	var measurementId = null;
	var quantity = null;
	if(typeof(form.quantity) !== 'undefined')
	{
		quantity = form.quantity.value;
	}
	
	if(typeof(form.measurement) !== 'undefined')
	{
		measurementId = form.measurement.value;
	}
	
	if(typeof returnFoodLog == 'undefined')
	{
		returnFoodLog = true;
	}
	
	//determining date for item being saved
	var tD = getPickerDate();
	var dateObj = form.selectedDate ? new Date(form.selectedDate.value) : tD;
	var date = dateObj.getFullYear() + '-' + (dateObj.getMonth() + 1) + '-' + dateObj.getDate();	

	//preventing food log from returning if date being updated is not currently selected date
	// otherwise, food log would be overwritten w/ date being updated's food log, not currently selected date's food log
	returnFoodLog = dateObj.getTime() != tD.getTime() ? false : true;
	
	//validation 
	if(quantity !== null && quantity.length == 0)
	{
		alert("You must specify a quantity before saving.");
	}
	else if(!dateObj)
	{
		alert("You must specify a valid date before saving.");
	}
	else
	{	
		var formMeals = form.meals;
		var meals = new Array();
		if(typeof(form.meals) !== 'undefined')
		{
			for(var i=0, pos=0; i < form.meals.length; i++)
			{
				if(form.meals[i].checked)
				{
					meals[pos++] = form.meals[i].value;
				}
			}
		}
		
		//if no meal selected, defaulting to uncategorized meal
		if(meals.length == 0)
		{
			meals[0] = null;
		}
		
		//adding/updating entry for each meal
		for(var i=0; i < meals.length; i++)
		{
			var change = { 
				item_ref_id : (parentItemId ? comboChildId : itemRefId),
				item_id : itemId,
				quantity : quantity,
				measurement_id : measurementId,
				meal_id : meals[i],
				orig_meal_id : origMealId,
				action : action, 
				date : date
			};
			unsavedLogChanges.push(change);		
		}	
	
		saveFoodLog(form_id, returnFoodLog, parentItemId);
	}
}


function getStrengthSummaryForm(wkId)
{
	var logForm = $('sslf_' + wkId);
	logForm.parentNode.style.display = 'block';
	
	//only populating log form if not already populated, always adjust page scroll though
	if(logForm.innerHTML.length > 0)
	{
		adjustLogItemForm(logForm);
	}
	else
	{
		logForm.update('<div class="loading"><img src=\"/shared/images/others/loading.gif\"> Loading...</div>');
		
		var tD = getPickerDate();
		var date = tD.getFullYear() + '-' + (tD.getMonth() + 1) + '-' + tD.getDate();
		
		var tab = getSelectedTabAlias(ht_tab_name);
		
		var dateObj = new Date();
		var ran_number = dateObj.getTime();	
		var params = "?wkId=" + wkId + "&sslf_" + wkId + '&mode=edit&' + ran_number; 
		
		var action = nutritionTabs.has(tab) ? 'logItemForm' : 'logExerciseForm';
			
		new Ajax.Request("/myoh/healthtracker/action,strengthSummaryForm/date,"+date+"/" + params, {
			method : 'get',
			parameters : params,
			evalScripts : true,
			onSuccess : function (ret) {
				logForm.innerHTML = ret.responseText;
				ret.responseText.evalScripts();
				adjustLogItemForm(logForm);
				if(nutritionTabs.has(tab) || activityTabs.has(tab))
				{
					$$('#sslf_' + wkId + ' input.quantity_input').each(function(elem){
						$(elem).observe('keydown',handleQuantityChange);
					});
				}
			}
		});
	}
}


function closeStrengthSummaryForm(wkId)
{
	if($('sslf_' + wkId) !== null && typeof($('sslf_' + wkId).parentNode) != 'undefined')
	{
		$('sslf_' + wkId).parentNode.style.display = 'none';
		$('sslf_' + wkId).update('');
	}
	
	if(openLightbox != null && typeof(openLightbox.deactivate) != 'undefined')
	{
		try
		{
			openLightbox.deactivate();
			openLightbox = null;
		}
		catch(e) 
		{
			// noop - keep page from dying if deactivate fails
		}
	}
}


//TODO: add better ajax error handling (use success/failure mode)
function getLogItemForm(divId, itemId, itemRefId, showDateSelector, parentItemId)
{
	var logForm = $('lf_' + divId);
	logForm.parentNode.style.display = 'block';
	
	if(typeof(parentItemId) == 'undefined')
	{
		parentItemId = false;
	}
	
	//only populating log form if not already populated, always adjust page scroll though
	if(logForm.innerHTML.length > 0)
	{
		adjustLogItemForm(logForm);
	}
	else
	{
		logForm.innerHTML = '<div class="loading"><img src=\"/shared/images/others/loading.gif\"> Loading...</div>';
		
		var tD = getPickerDate();
		var date = tD.getFullYear() + '-' + (tD.getMonth() + 1) + '-' + tD.getDate();
		
		var tab = getSelectedTabAlias(ht_tab_name);
		
		var dateObj = new Date();
		var ran_number = dateObj.getTime();	
		var params = "?itemId=" + itemId + "&divId=" + divId;
		
		if(parentItemId)
		{
			params += "&parentItem="+parentItemId
					+ (itemRefId ? "&comboChildId=" + itemRefId : ""); 
		}
		else
		{
			params += (itemRefId ? "&itemRefId=" + itemRefId : "");
		}
		params += "&showDateSelector=" + showDateSelector + "&date=" + date + '&' + ran_number; 
		
		var action = nutritionTabs.has(tab) ? 'logItemForm' : 'logExerciseForm';
			
		new Ajax.Request("/myoh/healthtracker/action,"+action+"/date,"+date+"/" + params, {
			method : 'get',
			evalScripts : true,
			onSuccess : function (ret) {
				logForm.innerHTML = ret.responseText;
				ret.responseText.evalScripts();
				adjustLogItemForm(logForm);
				if(nutritionTabs.has(tab) || activityTabs.has(tab))
				{
					$$('#lf_' + divId + ' input.quantity_input').each(function(elem){
						$(elem).observe('keydown',handleQuantityChange);
					});
				}
			}
		});
	}
	
//	var nextItem = $(divId).next('div.food_item');
//	if(nextItem != null)
//	{
//		var infospan = nextItem.down('span.nutritionTipWrapper');
//		infospan.setStyle({position:null});
//	}
}


function closeLogItemForm(formId)
{
	$(formId).parentNode.style.display = 'none';
	$(formId).innerHTML = '';
//	var foodItem = $(formId.replace('lf_',''));
//	var nextItem = foodItem.next('div.food_item');
//	if(nextItem != null)
//	{
//		var infospan = nextItem.down('span.nutritionTipWrapper');
//		infospan.setStyle({position:'relative'});
//	}
}


function adjustLogItemForm(logForm)
{
	if(logForm != null)
	{
		var formHeight = logForm.getHeight();
		var formTop = logForm.viewportOffset().top;
		
		if(navigator.userAgent.indexOf('MSIE') != -1)
		{
			var portDims = {
				width : document.getElementsByTagName('body')[0].clientWidth,
				height : document.getElementsByTagName('body')[0].clientHeight
			};
		}
		else
		{
			var portDims = document.viewport.getDimensions();
		}
		
		if(formTop + formHeight > portDims.height)
		{
			window.scrollBy(0,(formTop + formHeight) - portDims.height);
		}
	}
	
	var whichType = getParentTabAlias(ht_tab_name) == 'nutrition_main' ? 'nutrition' : 'activity';
	
	if(logForm.descendantOf('tab_search_wrapper_' + whichType))
	{
		pushFooter('tab_search_wrapper_' + whichType);
	}
}


function chooseMeal(uniqueId)
{
	$('mlw_' + uniqueId).style.display = 'inline'; //displaying meal list wrapper
	$('sm_' + uniqueId).style.display = 'none'; //hiding selected meal wrapper
}


function addNewMeal(divId, isLoggedItem)
{
	var addLink = $('al_' + divId).update('<img src=\"/shared/images/others/loading.gif\"> Loading...');

	var dateObj = new Date();
	var ran_number = dateObj.getTime();	
	var params = "?divId=" + divId + "&isLoggedItem=" + isLoggedItem + '&' + ran_number;
	
	new Ajax.Request("/myoh/healthtracker/action,addNewMeal/" + params, {
		method : 'get',
		parameters : params,
		onSuccess : function (ret) {
			var list = $('ml_' + divId);			
			list.innerHTML += ret.responseText;
			$('al_' + divId).style.display = 'none';
		}
	});
}


function showItemCal(itemId)
{
	var temp = window['itemAddCal_' + itemId];
	delete temp;
	window['itemAddCal_' + itemId] = new CalendarDateSelect('itemAddCal_' + itemId, {year_range:19, onrangechange:calUpdateDates});
}


/************ log food item form functions ************/








/********* Browse All items Area **********/

function showCategory(category_id, cururl)
{
	var url = cururl+'category,'+category_id+'/';
	var tabNum = getSelectedTabAlias(ht_tab_name);
	var content = $(ht_tab_name+'_content_'+tabNum);
	
	closeSearchResults();
	overwriteTab(url,content);
	
//	var whichType = getParentTabAlias(ht_tab_name) == 'nutrition_main' ? 'nutrition' : 'activity';
//	if($('tab_search_wrapper_' + whichType))
//	{
//		pushFooter('tab_search_wrapper_' + whichType);
//	}
	
	var hashParams = { category : category_id };
	setHashParams(ht_tab_name,hashParams);
}


function showCategoriesList()
{
	var tabNum = getSelectedTabAlias(ht_tab_name);
	var link = $(ht_tab_name + '_tabitem_' + tabNum);
	var url = link.readAttribute('ajax');
	var content = $(ht_tab_name + '_content_' + tabNum);
	
	if(url == null)
	{
		url = "/myoh/healthtracker/action,browse_all_foods/";
	}
	
	url = url.replace(/page,.*?\//,"");
	url = url.replace(/category,.*?\//,"");
	
	closeSearchResults();
	overwriteTab(url,content);
//	var whichType = getParentTabAlias(ht_tab_name) == 'nutrition_main' ? 'nutrition' : 'activity';
//	if($('tab_search_wrapper_' + whichType))
//	{
////		pushFooter('tab_search_wrapper_' + whichType);
//	}
	
	clearHash(ht_tab_name);
	resetTabLinks(link);
}

/********* End Browse All items Area **********/









/********* Utility Functions *********/


function sendMessage(msg,color) 
{
	var mb = createMessageBox();
	mb.initialize();
	mb.setHeight(document.messageBoxHeight);
	mb.setColor(color);
	mb.message(msg,4000);
	
	document.messageBoxNum = mb.id;
	document.messageBoxes['mb_'+mb.id] = mb;		
}


// Takes a prototype extended element as an argument
function checkError(elem)
{
	var value = new Number(elem.value);
	
	var min = elem.readAttribute('min');
	var max = elem.readAttribute('max');
	
	if (isNaN(value) || isOutOfBounds(value,min,max))
	{
		elem.addClassName('error');
		elem.setAttribute('dirty','2');
	}
	else if(elem.readAttribute('dirty') != '0')
	{
		elem.removeClassName('error');
		elem.setAttribute('dirty','1');
	}
}


function isOutOfBounds(val, min, max)
{
	var min = (min == "") ? NaN : new Number(min);
	var max = (max == "") ? NaN : new Number(max);
	
	if (!(isNaN(min) || isNaN(max)) && (val < min || val > max))
	{
		return true;
	}
	else
	{
		return false;
	}
}


function getPage(page, cururl)
{
	var ajax_url = cururl + 'page,' + page + '/';
	
	var tabNum = getSelectedTabAlias(ht_tab_name);	
	var content = $(ht_tab_name+'_content_'+tabNum);
	
	closeSearchResults();
	overwriteTab(ajax_url,content);
	
//	var whichType = getParentTabAlias(ht_tab_name) == 'nutrition_main' ? 'nutrition' : 'activity';
//	
//	if($('tab_search_wrapper_' + whichType))
//	{
//		pushFooter('tab_search_wrapper_' + whichType);
//	}
	
	var hashParams = getHashParams(ht_tab_name);
	hashParams['page'] = page;
	
	setHashParams(ht_tab_name,hashParams);
}


function resetHash(event)
{
	clearHash(ht_tab_name);
	resetTabLinks(event.element());
	document.stopObserving('tab:switchout',resetHash);
}


function resetTabLinks(element)
{
	element = $(element);
	if(element.id == ht_tab_name+'_tabitem_browse_favorites'
		|| element.id == ht_tab_name+'_tabitem_browse_by_category'
		|| element.id == ht_tab_name+'_tabitem_browse_exercises_by_category'
		|| element.id == ht_tab_name+'_tabitem_browse_my_foods'
	)
	{
		//remove page# from ajax if it's present
		var ajax = element.readAttribute('ajax');
		if(ajax != null)
		{
			ajax = ajax.replace(/page,.*?\//,"");
			if(element.id == ht_tab_name+'_tabitem_browse_by_category' || element.id == ht_tab_name+'_tabitem_browse_exercises_by_category')
			{
				ajax = ajax.replace(/category,.*?\//,"");
			}
			element.writeAttribute('ajax',ajax);
		}
		
		//remove page# from href if it's present
		var href = element.readAttribute('href');
		if(href != null && href.search('javascript') === -1)
		{
			href = href.replace(/page,.*?\//,"");
			if(element.id == ht_tab_name+'_tabitem_browse_by_category' || element.id == ht_tab_name+'_tabitem_browse_exercises_by_category')
			{
				href = href.replace(/category,.*?\//,"");
			}
			element.writeAttribute('href',href);
		}
	}
}


function changeTickerAction(event)
{
	var elem = event.element();
	if(elem.id == ht_tab_name+'_tabitem_tickers')
	{
		new Ajax.Request('/myoh/healthtracker/action,get_ticker_action/',{
			method: 'post',
			onSuccess: function(ret) {
				var ajax = elem.readAttribute('ajax');
				if(ajax != null)
				{
					elem.writeAttribute('ajax','/myoh/healthtracker/action,'+ret.responseText);
				}
				
				//remove page# from href if it's present
				var href = elem.readAttribute('href');
				if(href != null && href.search('javascript') === -1)
				{
					elem.writeAttribute('href','/myoh/healthtracker/action,'+ret.responseText);
				}
				
				document.stopObserving('tab:switchout',changeTickerAction);
			}
		});
	}
}


function loadHTTab(tabAction)
{
	if(tabAction != 'body')
	{
		var link = $(ht_tab_name+'_tabitem_'+tabAction);
	}
	else
	{
		var link = $('body_tab_link');
	}
	if(link != null && link != 'undefined')
	{
		// basically simulates switching to another tab by firing a 'click' event on the desired tab.
		tab_tabClickByElement($(link),ht_tab_name);
	}
}


function getPickerDate()
{
	var calendar_box = $('date_picker_cal_box');
	
	var date = calendar_box.innerHTML;
	var tmpDate = new Date(date);
	return tmpDate;
}

/********* End Utility Functions *********/








/********* Item detail functions *********/
var tooltipItemId;
var popupIframe;
function getItemTooltipData(event)
{
	// close all other nutrition labels first
	$$('div.visibleLabel').each(function(elem){
		$(elem).removeClassName('visibleLabel');
		$(elem).setStyle({ display : 'none' });
		$(elem).up('span.nutritionTipWrapper').setStyle({position:""});
		if(navigator.userAgent.indexOf('MSIE') != -1)
		{
			$(elem).setStyle({ zIndex : "" });
			if(popupIframe != null)
			{
				$(popupIframe).remove();
				popupIframe = null;
			}
		}
	});
	
	$$('div#daily_food_log div.box-container').each(function(elem){
		$(elem).setStyle({ zIndex : "" });
	});
	
	var itemId = this.readAttribute('item_id');
	var foodItem = this.next('div.nutritionLabel');
	foodItem.up('span.nutritionTipWrapper').setStyle({position:'relative'});
	foodItem.addClassName('visibleLabel');
	foodItem.setStyle({ display : 'inline' });
	
	//making it so that the nutrition label shows up on top of the subtabs
	var content_area = foodItem.up('div.content_area');
	if(content_area != null && content_area != "undefined" && !foodItem.up('div.item_search_wrapper'))
	{
		content_area.setStyle({zIndex:20, position:'relative'});
	}
	
	if(getSelectedTabAlias(ht_tab_name) == 'browse_my_meals')
	{
		$('items_list_wrapper').setStyle({ position : 'relative', zIndex:3 });
	}
	
	var link = this;
	
	var mouseX = event.clientX;
	var mouseY = event.clientY;
	
	//TODO: check to see if the classes are already populated
	//if the last thing populated is the same as this, do nothing
	//else do the call to populate them
	if(foodItem.readAttribute('initialized') == null)
	{
		new Ajax.Request('/myoh/healthtracker/action,ajaxNutritionLabel/id,'+itemId+'/',{
			method:'post',
			onSuccess:function(ret) {
				var results = ret.responseText.evalJSON();
				var detailOutput = results.detailOutput;
				itemId = results.itemId;
				var foodItems = document.getElementsByClassName('foodItem_'+itemId);
			
				for (var i = 0; i < foodItems.length; i++)
				{
					$(foodItems[i]).update(detailOutput);	
					$(foodItems[i]).writeAttribute('initialized','true');
				}
				
				repositionNutritionLabel(link,foodItem,mouseX,mouseY);
			}
		});
	}
	else
	{
		repositionNutritionLabel(link,foodItem,mouseX,mouseY);
	}
	
	document.observe('click',closeVisibleLabels);
}


function repositionNutritionLabel(link,label,mouseX,mouseY)
{
	if(navigator.userAgent.indexOf('MSIE') != -1)
	{
		var portDims = {
			width : document.getElementsByTagName('body')[0].clientWidth,
			height : document.getElementsByTagName('body')[0].clientHeight
		};
	}
	else
	{
		var portDims = document.viewport.getDimensions();
	}
	
	// avoid the evil footer
	var footerDims = $('footer-outer-wrap').viewportOffset();
	if(footerDims.top < portDims.height)
	{
		portDims.height = footerDims.top;
	}
	
	var elemDims = link.viewportOffset();
	if(navigator.userAgent.indexOf('MSIE 6') != -1 && link.up('td.item_id-value') != null)
	{
		elemDims.top = mouseY;
	}
	
	label = $(label);
	var labelDims = label.getDimensions();
	
	if(elemDims.top + labelDims.height > portDims.height)
	{
		label.setStyle({
			top : (portDims.height - (elemDims.top + labelDims.height))
		});
	}
	else
	{
		label.setStyle({
			top : 0
		});
	}

	var labelDefaultLeft = 17;
	if(elemDims.left + labelDefaultLeft + labelDims.width > portDims.width)
	{
		label.setStyle({
			left : 0,
			marginLeft : -(labelDims.width)
		});
	}
	else
	{
		label.setStyle({
			left : labelDefaultLeft,
			marginLeft : 0
		});
	}
	
	//Add iframe underneath if IE
	if(navigator.userAgent.indexOf('MSIE') != -1)
	{
		label.style.zIndex = label.style.zIndex + 1;
		var containerBox = label.up('div.box-container');
		if(containerBox != null && containerBox != "undefined")
		{
			containerBox.setStyle({
				zIndex : 1000
			});
		}
		
		var iFrame = document.createElement("IFRAME");
		iFrame.setAttribute("src","");
		
		$(iFrame).setStyle({
			position : "absolute",
			left : label.offsetLeft,
			top : label.offsetTop,
			width : label.getWidth(),
			height : label.getHeight()
		});
		
		label.insert({
			'after' : iFrame
		});
		popupIframe = iFrame;
	}
}


function closeVisibleLabels(event)
{
	var target = $(event.element());
	var label = $(document.getElementsByClassName('visibleLabel')[0]); // we assume that only one label will ever be open at a time.
	if(label != null)
	{
		if(!(target.descendantOf(label) || target == label || target.hasClassName('tooltip')) || target.hasClassName('closeLabel'))
		{
			label.removeClassName('visibleLabel');
			label.setStyle({ display : 'none' });
			label.up('span.tooltipWrapper').setStyle({position:""});
			
			var content_area = label.up('div.content_area');
			if(navigator.userAgent.indexOf('MSIE') != -1 && content_area != null && content_area != "undefined")
			{
				content_area.setStyle({zIndex:1,position:""});
			}
	
			if(getSelectedTabAlias(ht_tab_name) == 'browse_my_meals')
			{
				$('items_list_wrapper').setStyle({ position:"", zIndex:"" });
			}
			
			if(navigator.userAgent.indexOf('MSIE') != -1)
			{
				label.setStyle({ zIndex : "" });
				if(popupIframe != null)
				{
					$(popupIframe).remove();
					popupIframe = null;
				}
				var containerBox = label.up('div.box-container');
				if(containerBox != null && containerBox != "undefined")
				{
					containerBox.setStyle({
						zIndex : ""
					});
				}
			}
		}
	}
}


function getItemDetailPage(itemId, isComboItem)
{
	var tD = getPickerDate();
	var date = tD.getFullYear() + '-' + (tD.getMonth() + 1) + '-' + tD.getDate();

	if(isComboItem)
	{
		if(getParentTabAlias(ht_tab_name) == 'nutrition_main')
		{
			var url = '/myoh/healthtracker/action,edit_meal/itemId,' + itemId + '/';
			var content = $(ht_tab_name+'_content_browse_my_meals');
			
			var link = $(ht_tab_name+'_tabitem_browse_my_meals');
			tab_tabSwitch(link,ht_tab_name);
			overwriteTab(url,content);
			
			var hashParams = { itemId : itemId };
			setHashParams(ht_tab_name,hashParams);
			closeSearchResults();
			$('item_search_results_wrap_nutrition').style.display = 'none';
		}
	}
	else
	{
		var curUrl = window.location.href;
		var itemDetailUrl = "/myoh/healthtracker/action,viewItemDetail/item_id,"+itemId+"/?ref="+escape(curUrl);
		window.location = itemDetailUrl;
	}
}


function itemDetailShowEditForm()
{
	$('item_detail_edit_form').style.display = 'block';
	Sortable.create('measurements_list',{	tag:'li',
		constraint:false,
		overlap:'vertical',
		containment: ['measurements_list'], 
		dropOnEmpty: true,
		onHoverInstant: true			 								
		}
	);
}


function itemDetailSaveEdit(itemId)
{
	var title = $('item_title_box').value;
	var search_meta_data = $('item_search_meta_data_box').value;
	
	new Ajax.Request('/myoh/healthtracker/action,itemDetailSaveEdit/',{
		method: 'post',
		parameters: { itemId : itemId, title: title, searchMetaData: search_meta_data, priority : Sortable.serialize('measurements_list') },
		onSuccess: handleEditItemSuccess,
		onFailure: handleEditItemFailure
	});
}


function handleEditItemSuccess(ret)
{
	var results = ret.responseText.evalJSON();
	$('itemDetailTitle').innerHTML = results.title;
	itemDetailCloseEditForm();
	
	sendMessage("Your changes have been saved.", "green");
}


function handleEditItemFailure(ret)
{
	var msg;
	if(ret.responseText.length > 0)
	{
		msg = ret.responseText;
	}
	else
	{
		msg = "An error occurred while saving your changes. Please try again.";
	}
	sendMessage(msg, "red");
}


function itemDetailCloseEditForm()
{
	$('item_detail_edit_form').style.display = 'none';
	Sortable.destroy('measurements_list');
}


function checkCalorieData()
{
	var calories = $('nutrition_table_Calories').value;
	var totalFat = $('nutrition_table_Total_Fat').value;
	var protein = $('nutrition_table_Protein').value;
	var carbohydrates = $('nutrition_table_Total_Carbohydrate').value;
	var alcohol = $('nutrition_table_Alcohol').value;
	
	if(calories != '' && totalFat != '' && protein != '' && carbohydrates != '')
	{
		var totalFatCalories = totalFat * 9;
		var proteinCalories = protein * 4;
		var carbCalories = carbohydrates * 4;
		var alcoholCalories = alcohol * 7;
		
		var calculatedCalories = totalFatCalories + proteinCalories + carbCalories + alcoholCalories;
		
		var allowableCalories = calories;
		if((calculatedCalories > allowableCalories * 1.15) || calculatedCalories < (allowableCalories * 0.85))
		{
			//send the message
			$('calorieCalculationNotification').update(
					'<img src="/shared/icons/calculator_error.png" alt="Calorie Warning"/> Based on fat, carbohydrates, protein, and alcohol, Calories should be approximately ' 
					+ calculatedCalories + ".");
			$('calorieCalculationNotification').style.display = "block";
			$('is_suspect').value = "1";
		}
		else
		{
			$('calorieCalculationNotification').hide();
			$('is_suspect').value = "0";
		}
	}
	else
	{
		$('calorieCalculationNotification').hide();
		$('is_suspect').value = "0";
	}
	
}


function startEditItem()
{
	checkCalorieData();
	 $('nutrition_table_Calories').observe('keyup',checkCalorieData);
	 $('nutrition_table_Total_Fat').observe('keyup',checkCalorieData);
	 $('nutrition_table_Protein').observe('keyup',checkCalorieData);
	 $('nutrition_table_Total_Carbohydrate').observe('keyup',checkCalorieData);
	 $('nutrition_table_Alcohol').observe('keyup',checkCalorieData);
	
}


function changeDailyValues(multiplier)
{
	
	var multiplyValues = document.getElementsByClassName('multiplyValue');
	var dailyPercentages = document.getElementsByClassName('dailyPercentage');
	for (var i = 0; i < multiplyValues.length; i++)
	{		
		var arrayKey = $(multiplyValues[i]).identify().replace('nutValue_', '');
		var multiplyValue = nutLabelTypes[arrayKey]['normalized_value'];
		var total = multiplyValue * multiplier;
		if(total > 100)
		{
			$(multiplyValues[i]).innerHTML = temp = Math.round(total);
		}
		else
		{
			$(multiplyValues[i]).innerHTML = temp = parseFloat(total.toFixed(1));
		}
		
		var recommendation = nutLabelTypes[arrayKey]['recommended_value'];
		
		if(arrayKey != 'Calories')
		{
			if (recommendation < 1) 
			{
				$(dailyPercentages[i]).innerHTML = "&nbsp;";
			}
			else if (recommendation >= 1 && temp == 0)
			{
				$(dailyPercentages[i]).innerHTML = "0%";
			}
			else
			{
				$(dailyPercentages[i]).innerHTML = Math.round((temp / recommendation) * 100) + '%';
			}
		}
	}	
}

/****** End Item detail functions *****/








/****** Init Values Functions ******/


function changeUnits(elem)
{
	$('heightWeightInfo').style.display = "block";
	dispUnits = elem.value;
	$('initValues').disabled = false;
	var impItems = document.getElementsByClassName('imperial'); // REVIEW $$(
	var metItems = document.getElementsByClassName('metric');
	for( i=0; i < impItems.length ; i++)
	{
		if(dispUnits == 'imperial')
			impItems[i].style.display = "block";// REVIEW .show() .hide()	
		else
			impItems[i].style.display = "none";	
	}
	
	for( i=0; i < metItems.length ; i++)
	{
		if(dispUnits == 'metric')
			metItems[i].style.display = "block";	
		else
			metItems[i].style.display = "none";	
	}
}

/****** End Init Values functions ******/









/****** Activity Functions ******/
var unsavedExerciseLogChanges = new Array();

function showAdvancedOptions(itemId)
{
	var optionsElement = $('advanced_options_' + itemId);
	var linkElement = $('advanced_options_link_' + itemId);
	if(optionsElement.hasClassName('hide_advanced_options'))
	{
		optionsElement.removeClassName('hide_advanced_options');
		linkElement.innerHTML = 'hide advanced options';
	}
	else
	{
		optionsElement.addClassName('hide_advanced_options');
		linkElement.innerHTML = 'show advanced options';
	}
}

function loadExerciseLogItems()
{
	var tD = getPickerDate();
	var date = tD.getFullYear() + '-' + (tD.getMonth() + 1) + '-' + tD.getDate();
	
	new Ajax.Request("/myoh/healthtracker/action,getExerciseLogItems/date,"+date+"/",{
		method : 'post',
		evalScripts : true,
		onSuccess : updateExerciseLog,
		onFailure : handleExerciseLogError
	});
}


function updateExerciseLog(ret)
{
	$('exercise_log_left').update(ret.responseText);
	
	$$('div.box-container').each(function(element) {
		addContainerHover(element);				
	});
	
	if($('ActivityPieChart') && typeof($('ActivityPieChart').refresh) != 'undefined')
	{
		$('ActivityPieChart').refresh();
	}

	updateActivityNoDataMessage();	

	hasStrengthSummary = ($$('#exercise_log_left div.strength_summary').length > 0);
}

function handleExerciseLogError(ret)
{
	alert('Failure!');
}

function getActivityTooltipData(event)
{
	// close all other nutrition labels first
	$$('div.visibleLabel').each(function(elem){
		$(elem).removeClassName('visibleLabel');
		$(elem).setStyle({ display : 'none' });
		$(elem).up('span.activityTipWrapper').setStyle({position:""});
		if(navigator.userAgent.indexOf('MSIE') != -1)
		{
			$(elem).setStyle({ zIndex : "" });
			if(popupIframe != null)
			{
				$(popupIframe).remove();
				popupIframe = null;
			}
		}
	});
	
//	$$('div#daily_food_log div.box-container').each(function(elem){
//		$(elem).setStyle({ zIndex : "" });
//	});
	
	var itemId = this.readAttribute('item_id');
	var exerciseItem = this.next('div.activityLabel');
	exerciseItem.up('span.activityTipWrapper').setStyle({position:'relative'});
	exerciseItem.addClassName('visibleLabel');
	exerciseItem.setStyle({ display : 'inline' });
	
	//making it so that the nutrition label shows up on top of the subtabs
	var content_area = exerciseItem.up('div.content_area');
	if(navigator.userAgent.indexOf('MSIE') != -1 && content_area != null && content_area != "undefined")
	{
		content_area.setStyle({zIndex:11, position:'relative'});
	}
	var link = this;
	
	var mouseX = event.clientX;
	var mouseY = event.clientY;
	
	//TODO: check to see if the classes are already populated
	//if the last thing populated is the same as this, do nothing
	//else do the call to populate them
	if(exerciseItem.readAttribute('initialized') == null)
	{
		new Ajax.Request('/myoh/healthtracker/action,ajaxActivityLabel/id,'+itemId+'/',{
			method:'post',
			onSuccess:function(ret) {
				var results = ret.responseText.evalJSON();
				var detailOutput = results.detailOutput;
				itemId = results.itemId;
				var exerciseItems = document.getElementsByClassName('exerciseItem_'+itemId);
			
				for (var i = 0; i < exerciseItems.length; i++)
				{
					$(exerciseItems[i]).update(detailOutput);	
					$(exerciseItems[i]).writeAttribute('initialized','true');
				}
				
				repositionNutritionLabel(link,exerciseItem,mouseX,mouseY);
			}
		});
	}
	else
	{
		repositionNutritionLabel(link,exerciseItem,mouseX,mouseY);
	}
	
	document.observe('click',closeVisibleLabels);
}


function removeExerciseItem(divId, itemRefId, itemId)
{
	if(confirm('Are you sure you wish to remove this item?'))
	{
		var tD = getPickerDate();
		var date = tD.getFullYear() + '-' + (tD.getMonth() + 1) + '-' + tD.getDate();

		var change = { 
				item_ref_id : itemRefId,
				item_id : itemId,
				action : 'remove', 
				date : date,
				values : {}
		};
		unsavedExerciseLogChanges.push(change);		
		
		$(divId).update("<img src=\"/shared/images/others/loading.gif\"> Removing...");
		saveExerciseLog();
	}
}


function saveExerciseLogItemForm(form, form_id, returnExerciseLog, button)
{
	var itemId = form.itemId.value;
	var itemRefId = form.itemRefId.value;	
	
	var action = itemRefId ? 'edit' : 'add';

	if(typeof returnExerciseLog == 'undefined')
	{
		returnExerciseLog = true;
	}
	
	//determining date for item being saved
	var tD = getPickerDate();
	var dateObj = form.selectedDate ? new Date(form.selectedDate.value) : tD;
	var date = dateObj.getFullYear() + '-' + (dateObj.getMonth() + 1) + '-' + dateObj.getDate();	

	//preventing exercise log from returning if date being updated is not currently selected date
	// otherwise, exercise log would be overwritten w/ date being updated's exercise log, not currently selected date's exercise log
	returnExerciseLog = dateObj.getTime() != tD.getTime() ? false : true;

	
	//validation 
	
	var change = { 
		item_ref_id : itemRefId,
		item_id : itemId,
		action : action, 
		date : date,
		attributes : {},
		sets : {}
	};
	
	if($(form['hours']) != null)
	{
		var hours = Number($(form.hours).getValue());
		var mins = Number($(form.mins).getValue());
		var secs = Number($(form.secs).getValue());
		var time = hours * 3600 + mins * 60 + secs;
		change['attributes'][100] = {};
		change['attributes'][100]['value'] = time;
		change['attributes'][100]['units'] = "";
	}
	
	var formDiv = $(button).up('div.log_item_form');
	var inputs = formDiv.getElementsByClassName('exercise_detail');
	
	var tmpInput;
	for(var i=0; i<inputs.length; i++)
	{
		tmpInput = $(inputs[i]);
		var name = tmpInput.name.replace(/(values\[)/,"");
		var name = name.replace(/\]/,"");
		
		if(name == 'notes')
		{
			change['attributes']['notes'] = tmpInput.getValue();
		}
		else
		{
			var typeId = Number(name);
			
			if(change['attributes'][typeId] == 'undefined' || change['sets'][typeId] == null)
			{
				change['attributes'][typeId] = {};
			}
			change['attributes'][typeId]['value'] = tmpInput.getValue();
			
			var unitsSelect = $(form['units['+typeId+']']);
			if(unitsSelect != null)
			{
				change['attributes'][typeId]['units'] = unitsSelect.getValue();
			}
			else
			{
				change['attributes'][typeId]['units'] = "";
			}
		}
	}
	
	var setData = formDiv.getElementsByClassName('set_field');
	for(var i=0; i<setData.length; i++)
	{
		tmpInput = $(setData[i]);
		var name = tmpInput.name.replace(/(values\[)/,"");
		var name = name.replace(/\]/g,"");
		
		var typeId = Number(name.split('[')[0]);
		var setNum = Number(name.split('[')[1]);
		if(change['sets'][setNum] == 'undefined' || change['sets'][setNum] == null)
		{
			change['sets'][setNum] = {};
		}
		if(change['sets'][setNum][typeId] == 'undefined' || change['sets'][setNum][typeId] == null)
		{
			change['sets'][setNum][typeId] = {};
		}
		change['sets'][setNum][typeId]['value'] = tmpInput.getValue();
		
		var unitsSelect = $(form['units['+typeId+']['+setNum+']']);
		if(unitsSelect != null)
		{
			change['sets'][setNum][typeId]['units'] = unitsSelect.getValue();
		}
	}
	
//	alert(Object.toJSON(change));
	
	unsavedExerciseLogChanges.push(change);
	saveExerciseLog(form_id, returnExerciseLog);
}

function saveExerciseLog(form_id, returnExerciseLog)
{
	if(typeof form_id == 'undefined')
	{
		form_id = false;
	}
	
	if(typeof returnExerciseLog == 'undefined')
	{
		returnExerciseLog = true;
	}
	
	//TODO: set workout id once workouts are implemented
	var wkId = 0;	
	
	var strengthSummary = false;
	if($('strength_summary_' + wkId + '_time'))
	{
		var dateObj = getPickerDate();
		var curDate = dateObj.getFullYear() + '-' + (dateObj.getMonth() + 1) + '-' + dateObj.getDate();	
		
		var hours = Number($('strength_summary_' + wkId + '_hours').getValue());
		var mins = Number($('strength_summary_' + wkId + '_mins').getValue());
		var secs = Number($('strength_summary_' + wkId + '_secs').getValue());
		$('strength_summary_0_time').value = hours * 3600 + mins * 60 + secs;
		
		strengthSummary = {date: curDate, 
							time: $('strength_summary_' + wkId + '_time').value, 
							intensity: $('strength_summary_' + wkId + '_mets').value, // intensity is stored as a met value
							calories: $('strength_summary_' + wkId + '_cals').value,
							cals_units: $('strength_summary_' + wkId + '_cals_units').value};
	}
	
	//checking if user is saving strength summary and they said don't show this popup to me again
	var disablePopupElement = $('strength_summary_' + wkId + '_hide_form');
	var disableStrengthSummaryPopup = disablePopupElement && disablePopupElement.checked ? true : false;
	
	var saveData = { 
		return_exercise_log: returnExerciseLog, 
		unsavedExerciseLogChanges: unsavedExerciseLogChanges, 
		unsavedStrengthSummaryChanges: strengthSummary,
		disableStrengthSummaryPopup: disableStrengthSummaryPopup
	};
	save_form_id = form_id;
	
	new Ajax.Request('/myoh/healthtracker/action,saveExercise/',{
		method: 'post',
		parameters: { saveData : Object.toJSON(saveData) },
		onSuccess: handleSaveExerciseLog,
		onFailure: function(ret){
			//resetting unsaved logged changes
			unsavedExerciseLogChanges = new Array();
			button_id = 'sb_' + form_id;
			$(button_id).disabled = false;
			$(button_id).value = "Try Again";
			sendMessage('Error: '+ret.error,'red');
		}
	});
}


function handleSaveExerciseLog(ret)
{
	//refreshing exercise log area
	var exercise_log_div = $('exercise_log_left');
	if(ret.responseText.length > 0)
	{
		var resp = ret.responseText.evalJSON();
		if(exercise_log_div && resp.returnExerciseLog)
		{
			exercise_log_div.update(resp.exerciseLog);
			$$('div.box-container').each(function(element) {
				addContainerHover(element);				
			});
		}
	}

	//if exercise log is available, tab has been loaded, and we need to refresh if clicking back to that tab
	if(getSelectedTabAlias(ht_tab_name) != 'exercise' && exercise_log_div)
	{
//		document.observe('tab:switchdone',refreshFoodLogArea);
	}
	else
	{
//		refreshFoodLogArea();
	}
	
	//closing edit item form if applicable
	if($(save_form_id))
	{
		closeLogItemForm(save_form_id);
		save_form_id = false;
	}
	
	sendMessage("Your exercise log has been saved successfully.","green");
	
	closeSearchResults();
	if($('ActivityPieChart') && typeof($('ActivityPieChart').refresh) != 'undefined')
	{
		$('ActivityPieChart').refresh();
	}
	
	updateActivityNoDataMessage();

	// display the strength summary box if it wasn't there already (and it hasn't been disabled)
	var showSSPopup = false;
	
	if(typeof(resp.showStrengthSummaryPopup) == 'undefined')
	{
		// we have to do a js check to see if we want to display popup
		showSSPopup = (!hasStrengthSummary && $$('#exercise_log_left div.strength_summary').length > 0);
	}
	else
	{
		// server has checked for us... just do what it says
		showSSPopup = resp.showStrengthSummaryPopup;
	}

	if(showSSPopup)
	{
		var date = unsavedExerciseLogChanges[0].date;
		var strURL = '/myoh/healthtracker/action,strengthSummaryForm/date,'+ date +'/?wkid=0';
		openLightbox = new lightbox(strURL);
		openLightbox.activate();
	}
	hasStrengthSummary = ($$('#exercise_log_left div.strength_summary').length > 0);
	
	unsavedExerciseLogChanges = new Array();
}


function addSet(itemId, formId)
{
	if($(formId))
	{
		var idx = $(formId).getElementsByClassName('set').length;
		new Ajax.Request("/myoh/healthtracker/action,logItemSet/itemId,"+itemId+"/idx,"+idx+"/",{
			method: 'post',
			onSuccess: function(ret) {
				$(formId).down('div.sets').insert({
					'bottom' : ret.responseText
				});
			}
		});
	}
}

function removeSet(setDiv, itemId)
{
	var formDiv = $(setDiv).up('div.log_item_form');
	var idx = Number($(setDiv).readAttribute('idx'));
	
	var form = formDiv.down('input').form;
	
	// rearrange remaining sets
	var sets = {};
	var setData = formDiv.getElementsByClassName('set');
	var setNum = 0;
	for(var i=0; i<setData.length; i++)
	{
		if(i != idx)
		{
			var set = $(setData[i]);
			var setFields = set.getElementsByClassName('set_field');
			for(var j=0; j<setFields.length; j++)
			{
				var tmpInput = $(setFields[j]);
				var name = tmpInput.name.replace(/(values\[)/,"");
				var name = name.replace(/\]/g,"");
				
				var typeId = Number(name.split('[')[0]);
				if(sets[setNum] == 'undefined' || sets[setNum] == null)
				{
					sets[setNum] = {};
				}
				if(sets[setNum][typeId] == 'undefined' || sets[setNum][typeId] == null)
				{
					sets[setNum][typeId] = {};
				}
				sets[setNum][typeId]['value'] = tmpInput.getValue();
				
				var unitsSelect = $(form['units['+typeId+']['+setNum+']']);
				if(unitsSelect != null)
				{
					sets[setNum][typeId]['units'] = unitsSelect.getValue();
				}
			}
			setNum++;
		}
	}
	
	new Ajax.Request("/myoh/healthtracker/action,logItemSet/itemId,"+itemId+"/",{
		method: 'post',
		parameters: { setData : Object.toJSON(sets) },
		onSuccess: function(ret) {
			formDiv.down('div.sets').update(ret.responseText);
		}
	});
}


function calcExerciseCalories(itemFormDiv)
{
	if($(itemFormDiv + '_hours').value == '' && $(itemFormDiv + '_mins').value == '' && $(itemFormDiv + '_secs').value == '')
	{
		$(itemFormDiv + '_cals_auto').innerHTML = '0';
		
		return false;
	}
	else
	{
		var mets = $(itemFormDiv + '_mets').value;
		var hours = new Number($(itemFormDiv + '_hours').value) + new Number($(itemFormDiv + '_mins').value) / 60; // seconds are too small to factor into this calc
		
		var cals = new Number(mets*myWeightKg*hours).toFixed(0);
		$(itemFormDiv + '_cals_auto').innerHTML = cals;
	}
	
	var autoCals = $(itemFormDiv + '_cals_auto').innerHTML;
	var isAutoCalcMode = $(itemFormDiv + '_cals_auto_wrap').style.display=='none' ? false : true;
	$(itemFormDiv + '_cals').value = isAutoCalcMode && !isNaN(autoCals) ? autoCals : $(itemFormDiv + '_cals_manual').value;
	$(itemFormDiv + '_cals_units').value = isAutoCalcMode && !isNaN(autoCals) ? 'Cal' : 'manualCal';
}


function switchCalcMode(itemFormDiv, newMode)
{
	$(itemFormDiv + '_cals_auto_wrap').style.display = (newMode == 'auto' ? 'inline' : 'none');
	$(itemFormDiv + '_cals_manual_wrap').style.display = (newMode == 'auto' ? 'none' : 'inline');
	
	var autoCals = $(itemFormDiv + '_cals_auto').innerHTML;
	var calsFormField = $(itemFormDiv + '_cals');
	calsFormField.value = (newMode == 'auto' && !isNaN(autoCals) ? autoCals : $(itemFormDiv + '_cals_manual').value);
}


function initCalcExerciseCalories(itemFormDiv)
{
	var manualCals = $(itemFormDiv + '_cals_manual').value;
	if(manualCals && manualCals != $(itemFormDiv + '_cals_auto').innerHTML)
	{
		$(itemFormDiv + '_cals_auto_wrap').style.display = 'none';
		$(itemFormDiv + '_cals_manual_wrap').style.display = 'inline';
	}
	else
	{
		$(itemFormDiv + '_cals_auto_wrap').style.display = 'inline';
		$(itemFormDiv + '_cals_manual_wrap').style.display = 'none';
	}
}


function getActivityPage(page,url)
{
	var ajax_url = url + 'page,' + page + '/';
	
	if(url.indexOf('favorite') != -1)
	{
		overwriteTab(ajax_url,$('favorite_exercises'));
	}
	else if(url.indexOf('my_created_exercise') != -1)
	{
		overwriteTab(ajax_url,$('my_created_exercises'));
	}
	
	var whichType = getParentTabAlias(ht_tab_name) == 'nutrition_main' ? 'nutrition' : 'activity';
	
	if($('tab_search_wrapper_' + whichType))
	{
		pushFooter('tab_search_wrapper_' + whichType);
	}
}


function updateActivityNoDataMessage()
{
	// REVIEW: change to use style sheet
	if($('exercise_log_right'))
	{
		if($$('#exercise_log_left div.activity_item').length > 0)
		{
			$('exercise_log_right').removeClassName('nodisplay');
			$('activity-none').addClassName('nodisplay');
		}
		else
		{
			$('exercise_log_right').addClassName('nodisplay');
			$('activity-none').removeClassName('nodisplay');
		}
	}
}


function toggleCalcCaloriesOptions(elem)
{
	if(elem.checked)
	{
		$('calc_cals_mets').show();
	}
	else
	{
		$('calc_cals_mets').hide();
	}
}


function toggleMetsOptions(elem)
{
	if(elem.value == '1')
	{
		$('calc_mets').show();
	}
	else
	{
		$('calc_mets').hide();
	}
}


function toggleHideFormMsg(elem,wkId)
{
	if(elem.checked)
	{
		$('strength_summary_'+wkId+'_hide_form_msg').removeClassName('hidden');
	}
	else
	{
		$('strength_summary_'+wkId+'_hide_form_msg').addClassName('hidden');
	}
}

/****** End Activity Functions ******/
