/**************************************************************************
***************************************************************************
** FIELD EVENT ROUTINES
***************************************************************************
**************************************************************************/
// Copyright 2007-2008 Collaborative Bike Map Project


/*******************************************************************
// Set up event handlers for form fields.
*******************************************************************/
function setFieldEvents () {
	var fldname, elmt;
	var props;

/*

	// Loop through fields
	for (fldname in FldInfo.fields) {
		props = FldInfo.fields[fldname];
		if (props.ed) {
			elmt = document.getElementById(fldname);

			// Combo box
			if (props.tp == FT_COMBO) {
				setComboChangeHandler (elmt);				
			}
			// Text box
			else if (props.tp == FT_TEXTAREA) {
				setTextAreaKeyPressHandler (elmt);				
			}
		}
	}
	
	// Set up events for navigation fields
	elmt = document.getElementById("segnum");
	setNavFieldKeyPressHandler (elmt);		
	elmt = document.getElementById("pntnum");
	setNavFieldKeyPressHandler (elmt);	
	
	*/	
}


/*******************************************************************
// Set event handler for typing enter key in navigation number fields
*******************************************************************/
function setNavFieldEvents () {
	var elmt, i, ar;
	var i;

}


/*******************************************************************
// Define ONCHANGE handler for combo boxes.
// The handler routine saves field contents to memory model when
// the combo box value is changed.  Note that in Mozilla, 
// the arrow keys can be used to change the value displayed in the 
// combo box, yet the OnChange event is NOT triggered.
// INPUTS: elmt - HTML element (field) to attach event handler to.
*******************************************************************/
function setComboChangeHandler (elmt) {
	

	// dumpText ("Setting combo change handler for element " + elmt.id);
	
	/* if (elmt.id == "typedes")
		debugger;  */
	
	// Define the handler/listener, attach it to field element
	elmt.onchange = function (event) {
		//debugger;
		var newval, oldval;
		var ev = event || window.event;
		var obj = (ev.srcElement || ev.target);   // OR COULD USE: this.id (as in alert (this.id))
		//debugger;
		newval = elmt.value;
		dumpText ("Combo changed");
		oldval = FldInfo.getSavedValue (obj.id);
		FldInfo.saveField (obj.id);               // no checking required - just save
		if (obj.id == "typedes") {
			if (newval != oldval) {
				if (OpenRoute != null) {
					OpenRoute.redrawPolylines (true, true);
				}
			}
		}
		
	}
}


/*******************************************************************
// Define ONCHANGE handler for combo boxes.
// Temp function until we figure out how to do this dynamically.
********************************************************************/
// Define the handler/listener, attach it to field element
function comboChange (fldname) {

	if (fldname == "typedes") {
		var newval = document.getElementById("typedes").value;
		var oldval = SelectedSegment.bikeway;
		//dumpText ("Combo changed (simple handler)");
		//dumpText ("newval = " + newval + ", oldval = " + oldval);
		if (newval != oldval) {
			// dumpText ("Saving field to memory");
			FldInfo.saveField ("typedes");               // no checking required - just save
			// dumpText ("Redrawing polylines");
			OpenRoute.redrawPolylines (true, true);
		}
	}
	return true; 
}


				
/*******************************************************************
// Define ONKEYPRESS handler for text area fields. 
// Prevents user from exceeding field length, 
// or stops warns user if already over length (because can't prevent paste).
// INPUTS: elmt - HTML element (field) to attach event handler to.
********************************************************************/
function setTextAreaKeyPressHandler (elmt) {

	// dumpText ("Setting text area key press handler for element " + elmt.id);

	// Define the handler/listener, attach it to field element
	elmt.onkeypress = function (event) {
		var key_properties = new Object();   
		var ev = event || window.event;
		var obj = (ev.srcElement || ev.target);   // OR COULD USE: this.id; 
		var ch = getKeyPressed (ev, key_properties);	
		var funkey = key_properties.functionkey;			

		// dumpText ("Text area key pressed");

		/* // Following code taken from O'Reilly book...
		var code = ev.charCode || ev.keyCode;					
		if (ev.charCode == 0 || ev.ctrlKey || ev.altKey || code < 32)
			funkey = true; 
		var ch = String.fromCharCode (code);  */
		/* alert ("ev.charCode, ev.keyCode, code, ch, funkey: " + ev.charCode + ", " + ev.keyCode + ", " + 
			code + ", " + ch + ", " + funkey);	*/				

		// If not function key
		if (!funkey) {
			var maxlen = FldInfo.fields[obj.id].ln;
			var excess = obj.value.length - maxlen;
			// if exceeded length by 1, fail because we typed one too many chars
			if (excess == 1)    
				return false;      // prevents typed character from appearing
			// if exceeded length by a lot, put up warning because overflow due to pasting 
			// (error will be flagged during "TIME_NEXT" checks anyway)
			else if (excess > 1) {
				msg = "Warning: The " + FldInfo.fields[obj.id].nm + " field may be at most " + 
					FldInfo.fields[obj.id].ln + " characters long.  Please delete some characters.";
				alert (msg);
				return true;      // allows typed character to appear
			}
		}
		// Else function key - deal with normally
		else {
			return true;
		}
	}
}	


/*******************************************************************
// Define ONKEYPRESS handler for seg/point navigation fields.
// If enter key is pressed, call navigate() to go to appropriate record.
// INPUTS: elmt - HTML element (field) to attach event handler to.
********************************************************************/
function setNavFieldKeyPressHandler (elmt) {			

	// dumpText ("Setting nav field key press handler for element " + elmt.id);

	// Define the handler/listener, attach it to field element
	elmt.onkeypress = function (event) {
		var key_properties = new Object();   
		var ev = event || window.event;
		var obj = (ev.srcElement || ev.target);   // OR COULD USE: this.id; 
		// dumpText ("Nav field key pressed");	
		ch = getKeyPressed (ev, key_properties);
		var funkey = key_properties.functionkey;
		if (funkey && ch == '\r') {       // if enter typed (\r = 0x0D which is what's returned)
			if (elmt.id == "segnum") 
				navigate (SEG, "num", elmt.value);
			else
				navigate (PNT, "num", elmt.value);
		}
	}
}



/*******************************************************************
// Get information about the key pressed.
// Inputs:  ev - Keypress event object
// Outputs: key_properties - Object containing character typed (in char element)
//          and function key flag (in functionkey element) which is set to true 
//          if the character is a function key.
// Return: Character typed (same as output key_properties.char)
********************************************************************/
function getKeyPressed (ev, key_properties) {
	// Following code taken from O'Reilly book...
	//debugger;
	var code;
	key_properties.functionkey = false;
	code = ev.charCode || ev.keyCode;					
	if (ev.charCode == 0 || ev.ctrlKey || ev.altKey || code < 32)
		key_properties.functionkey = true; 
	key_properties.char = String.fromCharCode (code);
		/* alert ("ev.charCode, ev.keyCode, code, ch, funkey: " + ev.charCode + ", " + ev.keyCode + ", " + 
			   code + ", " + ch + ", " + funkey);	*/		
	return (key_properties.char);
}





