/*************************************************************
* Document	: bwt_calendar_util.js
* Author	: Wayne J. Earl
* Created	: 2007-03-09
* Purpose	: JavaScript functions for BWT calendar
* Comment	: 
*************************************************************/
/*************************************************************
* Revised by	: Wayne J. Earl
* Revised date	: 2007-09-19
* Description	: Added conditional logic for user public view 
*************************************************************/
/*************************************************************
* Revised by	: 
* Revised date	: 
* Description	: 
*************************************************************/

var f_tweak_cal = false;
var cal_table_sfx = "_table";
var load_wrapper_sfx = "_loading_wrapper";
var load_mask_sfx = "_loading_mask";
var load_img_wrapper_sfx = "_loading_img_wrapper";
var cal_load_img_height = 100;
var f_use_show_idx = true;

function initCalendar(cal_name, f_update_only)
{
	if (typeof(cal_name) == "undefined") {
	
		cal_name = bwt_primary_calendar_name;
	}
	if (typeof(f_update_only) == "undefined") f_update_only = false;
	var cal_wrapper_id = cal_name + "_cal_wrapper";
	var elem_cal_wrapper = document.getElementById(cal_wrapper_id);
	if (elem_cal_wrapper) {

		if (f_update_only) {
		
			setupCalendar(cal_name, null);
		}
		else {
		
			if (typeof(zcal) == "function") {
			
				var functionArray = new Array();
				functionArray["year_DD_change"] = calendar_process_year;
				functionArray["month_DD_change"] = calendar_process_month;
				functionArray["date_click"] = calendar_process_date_click;

				eval(cal_name + " = new zcal(\"" + cal_name + "\", functionArray);");
			}

			alt_date_display_id = "bwt_routine_date_display";
			elem_alt_date_display = document.getElementById(alt_date_display_id);
			
			setupCalendar(cal_name);
		}
		var local_cal = getLocalCalendar();
		if (typeof(local_cal) == "object") {

			tweakCalendar();
			if ((!f_update_only) || (f_change_date)) showCal();
		}
	}
}


function setupCalendar(cal_name, flags)
{
	if (typeof(cal_name) == "string") {
	
		calendar_name = cal_name;
	}
	else {
	
		return false;
	}
	if (typeof(flags) == "undefined") {

		switch(cal_name) {
		
			case bwt_primary_calendar_name:
			
				flags = {"f_visible" : false,
						 "f_date_visible" : false,
						 "f_click_limit" : true,
						 "f_click_empty_only" : true};
				break;

			case bwt_secondary_calendar_name:
			
				flags = {"f_visible" : false,
						 "f_date_visible" : false,
						 "f_click_limit" : true,
						 "f_click_empty_only" : false};
				break;
		}
	}
	else if (!flags) {
	
		flags = {"f_visible" : null,
				 "f_date_visible" : null,
				 "f_click_limit" : null,
				 "f_click_empty_only" : null};
	}
	else {
	
		if (typeof(flags.f_visible) == "undefined") flags.f_visible = false;
		if (typeof(flags.f_date_visible) == "undefined") flags.f_date_visible = false;
		if (typeof(flags.f_click_limit) == "undefined") flags.f_click_limit = true;
		if (typeof(flags.f_click_empty_only) == "undefined") flags.f_click_empty_only = true;
	}
	
	var local_cal = getLocalCalendar();
	if (typeof(local_cal) == "object") {
	
		//initialize calendar-related values
		if (flags.f_visible != null) local_cal.f_visible = flags.f_visible;
		if (flags.f_date_visible != null) local_cal.f_date_visible = flags.f_date_visible;
		if (flags.f_click_limit != null) local_cal.f_click_limit = flags.f_click_limit;
		if (flags.f_click_empty_only != null) local_cal.f_click_empty_only = flags.f_click_empty_only;
		
		//calendar_outer_wrapper_id = calendar_name + "_cal_outer_wrapper";
		//elem_calendar_outer_wrapper = document.getElementById(calendar_outer_wrapper_id);
/*
		calendar_wrapper_id = calendar_name + "_cal_wrapper";
		elem_calendar_wrapper = document.getElementById(calendar_wrapper_id);
		calendar_date_wrapper_id = calendar_name + "_cal_date_wrapper";
		elem_calendar_date_wrapper = document.getElementById(calendar_date_wrapper_id);
		calendar_date_display_id = calendar_name + "_cal_date_display";
		elem_calendar_date_display = document.getElementById(calendar_date_display_id);
		calendar_date_id = calendar_name + "_date";
		elem_calendar_date = document.getElementById(calendar_date_id);
*/
		buildCalendarGlobals();
	}
}


function buildCalendarGlobals(cal_name)
{
	if (typeof(id) == "undefined") {
	
		cal_name = calendar_name;
	}
	else {
	
		calendar_name = cal_name;
	}
	calendar_wrapper_id = cal_name + "_cal_wrapper";
	elem_calendar_wrapper = document.getElementById(calendar_wrapper_id);
	calendar_date_wrapper_id = cal_name + "_cal_date_wrapper";
	elem_calendar_date_wrapper = document.getElementById(calendar_date_wrapper_id);
	calendar_date_display_id = cal_name + "_cal_date_display";
	elem_calendar_date_display = document.getElementById(calendar_date_display_id);
	calendar_date_id = cal_name + "_date";
	elem_calendar_date = document.getElementById(calendar_date_id);
	
	switch(cal_name) {
	
		case bwt_primary_calendar_name:

			//hide/show for forward step
			hide_current_idx = 0;
			show_next_idx = 2;
			//hide/show for backward step
			hide_back_idx = 2;
			show_back_idx = 0;
			//show for init
			show_first_idx = 0;
			break;
			
		case bwt_secondary_calendar_name:
		
			//hide/show for forward step
			hide_current_idx = 1;
			show_next_idx = 8;
			//hide/show for backward step
			hide_back_idx = 2;
			show_back_idx = 3;
			//show for init
			show_first_idx = 4;
			break;
	}
}

//When a date is clicked this happens
function calendar_process_date_click(type)
{
	//alert (type);

	if (typeof(type) == "undefined") return false;
	var local_cal = getLocalCalendar();
	if (typeof(local_cal) == "object") {
	
		var f_valid_date = true;
		if (local_cal.f_click_limit) { //limit click event handling to valid dates
		
			if (local_cal.f_click_empty_only) { //date only valid if no workouts
			
				if (type == "workout") {
				
					f_valid_date = false;
				}
			}
			else { //date only valid if at least one workout exists
			
				if (type == "workout") { //workout exists
				
					//get workout_id
					var date_format_str = "YYYY-Month-String-Day-String";
					var date_str = local_cal.Getdate(date_format_str);
					var cal_search = {"records": [{"name" : "date", "value" : date_str}]};
					var match = local_cal.getData(cal_search);
					var rec_count = 0;
					if (typeof (match) == "object") {
					
						if (typeof(match.count) == "number") rec_count = match.count;
						if (rec_count) { //at least one workout
						
							if (rec_count > 1) { //handle multiple workouts
							
							}
							else { //only one
							
								//update field(s) and button(s)
								//updateFieldValue();
								//set workout no
							}
							current_workout_no = Number(match.records[0].bs_id);
						}
						else { //nothing returned from search
						
							return false;
						}
					}
				}
				else {
				
					f_valid_date = false;
				}
			}
		}
		if (f_valid_date) {

			//alert("Click Date: " + BBcalendar.Month + "/" + BBcalendar.Day + "/" + BBcalendar.Year);
		//	var local_date = local_cal.BBDate;
		//	if (local_date) {

			/*
				var date_part = new Array();
				date_part.push(local_date["monthStr"]);
				date_part.push(local_date["dayStr"]);
				date_part.push(String(local_cal.Year));
				var date_str = date_part.join("/");
			*/
				//var date_str = local_cal.Getdate("Month-String/Day-String/YYYY");
				var date_str = local_cal.Getdate("Month-Abbr Day-Integer, YYYY");
				if (elem_calendar_date) {
				
					elem_calendar_date.value = date_str;
					//hide calendar
					//hideCal(calendar_wrapper_id);
					//hide/show for next step
					//f_warn_unload = true;
					//updateSelected(calendar_name);
				}
				//updateFieldValue(calendar_date_id);
			/*
				if (elem_alt_date_display) {
				
					elem_alt_date_display.innerHTML = date_str;
				}
				if (elem_calendar_date_display) {
				
					elem_calendar_date_display.innerHTML = date_str;
				}
			*/
				if (f_choice_mode) {
				
					hideCal(hide_current_idx, show_next_idx);
				}
				else {
				
					//user public - redirect to display selected workout details
					//var abc = this.document;
					//var def = current_workout_no;
					//var x = 'y';
					var loc = window.document.location;
					var new_loc = loc.pathname + "?opt=det&ref=" + current_workout_no;
					loc.href = new_loc;
				}
		//	}
		}
	}
}


//When the year is selected this happens
function calendar_process_year()
{
	var elem_year = document.getElementById(calendar_name + "_year_selector");
	//alert("Change Year");
	calendarChangeCall(elem_year);
}


//When the month is selected this happens
function calendar_process_month()
{
	var elem_month = document.getElementById(calendar_name + "_month_selector");
	//alert("Change Month");
	calendarChangeCall(elem_month);
}


function getLocalCalendar(cal_name)
{
	if (typeof(cal_name) == "undefined") {
	
		cal_name = calendar_name;
	}
	try {
	
		eval("var retval = " + cal_name + ";");
	}
	catch(e) {
	
		var retval = false;
	}
	return retval;
}


function showCal()
{
	if (f_change_date) { //from changeDate
	
		//hide date display
		if (typeof(steppers) != "undefined") steppers[current_step].hide(hide_back_idx);
	//	current_step --;
		//show calendar
		if (typeof(steppers) != "undefined") steppers[current_step].show(show_back_idx);
	//	f_change_date = false;
	}
	else {
		//show calendar
		if (typeof(steppers) != "undefined") steppers[current_step].show(show_first_idx);
	}
	if (calendar_name == bwt_secondary_calendar_name) { //existing workout
	
		current_workout_no = 0;
	}
	if (elem_calendar_date) {
	
		elem_calendar_date.value = "";
	}
	//update field(s)/ button(s)
	if (f_change_date) {
	
		updateFieldValue(calendar_name + "_date");
		f_change_date = false;
	}
}


function afterShowCalWrapper()
{
	window.setTimeout(afterShowCal, 200);
}


function afterShowCal()
{
	//
}


function hideCal(hide_idx, show_idx)
{
	if (typeof(hide_idx) == "undefined") hide_idx = hide_current_idx;
	if (typeof(show_idx) == "undefined") show_idx = show_next_idx;

	if (calendar_name == bwt_secondary_calendar_name) { //working w/ secondary
	
		//hide preview section
		if (typeof(showHidePreview) == "function") showHidePreview(current_preview_idx, "hide");
	}
	//hide calendar
	if (typeof(steppers) != "undefined") steppers[current_step].hide(hide_idx);
	//update field(s)/ button(s)
	updateFieldValue(calendar_name + "_date");
	if (calendar_name == bwt_primary_calendar_name) { //working w/ primary

		current_step ++;
		if (getLocalCalendar(bwt_secondary_calendar_name)) {
		
			//init cal - update only
			initCalendar(bwt_secondary_calendar_name, true);
		}
		else {
		
			//init cal - incl. create
			initCalendar(bwt_secondary_calendar_name);
		}
	}
	if (typeof(steppers) != "undefined") steppers[current_step].show(show_idx);
}


function afterHideCalWrapper()
{
	window.setTimeout(afterHideCal, 200);
}


function afterHideCal()
{
	//
}


function getWrapper(param)
{
	if (typeof(param) == "undefined") return false;
	if (typeof(param) == "string") {
	
		var elem = document.getElementById(param);
	}
	else if (typeof(param) == "object") {
	
		var elem = param;
	}
	if (elem) {

		if (elem.className == "bwt_wrapper") {
		
			return elem;
		}
		
		//get parent node
		var elem_parent = elem.parentNode;
		//find wrapper
		while((elem_parent) && (elem_parent.className != "bwt_wrapper")) {
		
			elem_parent = elem_parent.parentNode;
		}
		if (elem_parent) { //parent node found

			return elem_parent;
		}
	}
	return false;
}


function calendarChangeEvt(e)
{
	evt = (e) ? e : ((window.event) ? window.event : "");
	if (evt) {

		var elem_target = getTarget(evt);
		if (elem_target) {

			calendarChangeCall(elem_target);
		}
	}
}


function calendarChangeCall(target_param)
{
	if (typeof(target_param) == "undefined") return false;
	if (!(target_param)) return false;
	if (typeof(target_param) == "string") {
	
		var elem_target = document.getElementById(target_param);
	}
	else if (typeof(target_param) == "object") {
	
		var elem_target = target_param;
	}
	if (elem_target) {

		//get wrapper
		var elem_wrapper = getWrapper(elem_target);
		if (elem_wrapper) {

			elem_calendar_wrapper = elem_wrapper;
			calendar_wrapper_id = elem_calendar_wrapper.id;
			calendarChange();
		}
	}
}


function calendarChange(f_reset)
{
//	if (elem) {

	if (typeof(f_reset) == "undefined") f_reset = false;

	var cal_month = "";
	var cal_year = "";

	var elem_month = document.getElementById(calendar_name + "_month_selector");
	var elem_year = document.getElementById(calendar_name + "_year_selector");
	if ((elem_month) && (elem_year)) {
	
		if (f_reset) {
		
			elem_month.value = "";
			elem_year.value = "";
		}
		else {
		
			cal_month = elem_month.value;
			cal_year = elem_year.value;
			if ((typeof(bwt_base_path) == "string") && (typeof(bwt_calendar_url) == "string")) {

				var f_limit = true;
				var f_empty = true;
				var local_cal = getLocalCalendar();
				if (typeof(local_cal) == "object") {
				
					if (local_cal.f_click_limit) {
					
						if (local_cal.f_click_empty_only) {
						
							f_empty = true;
						}
						else {
						
							f_empty = false;
						}
						var f_limit = true;
					}
					else {
					
						var f_limit = false;
					}
				}
				var dt = new Date();
				var ts = dt.getTime();
				var url = bwt_base_path + "/" + bwt_calendar_url +
						  "?name=" + calendar_name +
						  "&month=" + cal_month +
						  "&year=" + cal_year +
						  "&limit=" + String(Number(f_limit)) +
						  "&empty=" + String(Number(f_empty)) +
						  "&mode=1" +
						  "&ts=" + ts;

				//show loading img
				showHideCalLoader(calendar_name);
				//make ajax call
				ajaxCall(url, handleCalendarChangeEvt);
			}
		}
	}
//	}
}


function handleCalendarChangeEvt()
{
	if (xmlHttp.readyState == 4) {
		
		handleCalendarChange();
	}
}


function handleCalendarChange()
{
	var debug = 0;
	
	var resp_str = xmlHttp.responseText;
	
	//remove the html header and footer in QA, staging, etc
	resp_str = resp_str.replace(/<bbcom_banner>.*?bbcom_banner>/g, '');
	
	var var_str = "alert('Return Vars Not Set');";
	//interpret string and create local vars
	var re = /^(var ajax_resp = \d+\;[^\x00]*)/;
	var matches = resp_str.match(re);
	//perform any necessary string replacements
	if (matches) {
		
		if (typeof(matches[1]) != 'undefined') { //
		
			var_str = matches[1];
			if (debug) alert(var_str);
			var test_val;
			var repl_val;
			var test_str;
			var repl_str;
			var re_repl;
			var test_array = [];
			var repl_array = [];
			for (idx = 0; idx < test_array.length; idx ++) {
			
				test_val = test_array[idx];
				repl_val = repl_array[idx];
				test_str = String.fromCharCode(test_val);
				repl_str = String.fromCharCode(repl_val);
				re_repl = new RegExp(test_str, "gm");
				var_str = var_str.replace(re_repl, repl_str);
			}
		}
	}
	eval(var_str);

	if (typeof(ajax_resp) != 'undefined') {
	
		if (ajax_resp == 1) {
		
			//initialize vars
			if (typeof(bwt_cal_html) == 'undefined') {
			
				bwt_cal_html = "";
			}
			else {
			
				bwt_cal_html = decodeQuotes(bwt_cal_html);
			}
			//hide loading img
			showHideCalLoader(calendar_name, 'hide');
			//update calendar html
			updateCalendar(bwt_cal_html);
			return;
		}
	}
	//hide loading img
	showHideCalLoader(calendar_name, 'hide');
}


function updateCalendar(cal_html)
{
	if (typeof(elem_calendar_wrapper) == "object") {

		var elem_alt_wrapper = getFirstChild(elem_calendar_wrapper);
		if (elem_alt_wrapper) {
		
			elem_alt_wrapper.innerHTML = cal_html;
		}
		else {
		
			elem_calendar_wrapper.innerHTML = cal_html;
		}
		var local_cal = getLocalCalendar();
		if (typeof(local_cal) == "object") {
		
			local_cal.buildData();
			tweakCalendar();
			//set up cal loader values
			//setupCalLoaders();
		}
	}
}


function tweakCalendar()
{
	if (f_tweak_cal) {
	
		if (window.event) { //IE
		
			var elem = document.getElementById('menu');
			if (elem) {
			
				var elem_table = elem.nextSibling;
				if (elem_table) {
				
					var elem_row = elem_table.rows[7];
					if (elem_row) {
					
						var elem_cell = elem_row.firstChild;
						if (elem_cell) {
						
							elem_cell.innerHTML = "&nbsp;";
							elem_cell.style.lineHeight = "4px";
						}
					}
				}
			}
		}
	}
}


function setupCalLoader(cal_name)
{
/*	var cal_names = [bwt_primary_calendar_name,
					 bwt_secondary_calendar_name];
					 
	for (var idx in cal_names) {
	
		var cal_name = cal_names[idx];
*/		//build ids
		var cal_table = cal_name + cal_table_sfx;
		var cal_load_mask = cal_name + load_mask_sfx;
		var cal_load_img_wrapper = cal_name + load_img_wrapper_sfx;
		//get elem refs
		var elem_cal_table = document.getElementById(cal_table);
		var elem_cal_load_mask = document.getElementById(cal_load_mask);
		var elem_cal_load_img_wrapper = document.getElementById(cal_load_img_wrapper);
		
		if ((elem_cal_table) && (elem_cal_load_mask) && (elem_cal_load_img_wrapper)) {

			//get table locations/dimensions
			var pos = getElementPos(elem_cal_table);
			//var top = elem_cal_table.offsetTop;
			var top = pos.top;
			//var left = elem_cal_table.offsetLeft;
			var left = pos.left;
			var width = elem_cal_table.clientWidth;
			var height = elem_cal_table.clientHeight;
			
		//assign values to loading divs
			//mask
			elem_cal_load_mask.style.top = top + "px";
			elem_cal_load_mask.style.left = left + "px";
			elem_cal_load_mask.style.width = width + "px";
			elem_cal_load_mask.style.height = height + "px";
			//img wrapper
			elem_cal_load_img_wrapper.style.top = top + "px";
			elem_cal_load_img_wrapper.style.left = left + "px";
			elem_cal_load_img_wrapper.style.width = width + "px";
			elem_cal_load_img_wrapper.style.paddingTop = Math.floor((height - cal_load_img_height) / 2) + "px";
		}
//	}
}


function showHideCalLoader(cal, mode)
{
	if (typeof(cal) == "undefined") return false;
	if (typeof(mode) == "undefined") mode = 'show';
	if ((mode != 'show') && (mode != 'hide')) mode = 'show';
	
	var cal_load_wrapper = cal + load_wrapper_sfx;
	var elem_cal_load = document.getElementById(cal_load_wrapper);
	if (elem_cal_load) {
	
		if (mode == 'show') {
		
			//set up cal loader values
			setupCalLoader(cal);
			elem_cal_load.style.display = "";
		//	elem_cal_load.style.visibility = "visible";
		}
		else {
		
		//	elem_cal_load.style.visibility = "hidden";
			elem_cal_load.style.display = "none";
		}
	}
}
