//==================================================================================================
//== displayMessageOnField
//==	Displays a message underneath a field specified as the pID. Right now this is only used
//==	for error messages, but could be used for validation errors and such.
//==================================================================================================
function displayFieldError(pID, pMessage)
{
		//alert(pID+' '+pMessage);
	//-----------------------------------------------------------------------------
	// Field may already exist from a previous message.
	// Clear field first, just in case
	//-----------------------------------------------------------------------------
	//---clearDisplayFieldMessage(pID)
	var vTargetElement = document.getElementById(pID);
	vTargetElement.className = vTargetElement.className + '_flderror';
	vTargetElement.setAttribute('error',true);
	var vNewElement = document.createElement("span");
	vNewElement.id = "flderror_" + pID;
	vNewElement.className = "fielderror";
	vNewElement.appendChild(document.createElement("br"));
	vNewElement.appendChild(document.createTextNode(unescape(pMessage)));
	//-----------------------------------------------------------------------------
	//SMR- vNewElement.parentElement.appendChild(vNewElement);
	//SMR- Can't use the W3C appendChild here because the parent element of the error field
	//SMR-   (a TD element in most cases) might not have an ID attribute.
	//-----------------------------------------------------------------------------
	vTargetElement.parentNode.appendChild(vNewElement);
}

//==================================================================================================
//== clearFieldErrors
//==
//==	Clears all field errors from the form. 
//==================================================================================================

function deleteSpans(){
		
}
function clearFieldErrors()
{
	var vSpanArray = document.getElementsByTagName("span");
	for(i=0;i<vSpanArray.length;i++){
		if(vSpanArray[i].id.substr(0,9) == "flderror_"){
			for(ii=0;ii<vSpanArray[i].parentNode.childNodes.length;ii++){
				tempobj=vSpanArray[i].parentNode.childNodes.item(ii);
				if(tempobj.error){
					var oldstring=tempobj.className;
					var oldlength=oldstring.length;
					var tomatch=/_flderror$/;
					var is_a_match=tomatch.test(oldstring);
					if (is_a_match){
						var newString=oldstring.substring(0, oldlength-9);
						tempobj.className=newString;
						tempobj.removeAttribute('error');
					}
					break;
				}
			}
			vSpanArray[i].style.display='none';
		}
	}
	var gForm=document.forms[0];
    for (i=0;i<gForm.length;i++) 
         {
         var tempobj=gForm.elements[i];
		 var oldstring=tempobj.className;
		 var oldlength=oldstring.length;
		 var tomatch=/_flderror$/;
		 var is_a_match=tomatch.test(oldstring);
         if (is_a_match){
			var newString=oldstring.substring(0, oldlength-9);
			tempobj.className=newString;
		 }
	} 
}

//==================================================================================================
//== ValidationError
//==
//==	Takes the input from a coldfusion invoked validation error and reformats the input to
//==	call the display field error function
//==================================================================================================
function ValidationError(form, field, value, message){
	if (field.name){var vFieldName=field.name;}
	else{var vFieldName=field;}
	displayFieldError(vFieldName, message);
}

//==================================================================================================
//== checkrequired
//==
//==	Scans through all fields that have a class of field_required and calls the displayFieldError
//==	function if there is no value in the field. Also, clears all field errors prior to showing
//==  	new errors
//==================================================================================================
function checkrequired(vFormName) 
{
clearFieldErrors();
var gForm=document.getElementById(vFormName);
var pass=true;
if (document.images) 
    {
    for (i=0;i<gForm.length;i++) 
         {
         var tempobj=gForm.elements[i];
         if ((tempobj.className=="field_required")||(tempobj.className=="littlefield_required"))
              {
				if (tempobj.value=='')
                   {
                   displayFieldError(tempobj.name, 'Required Field.');
				   if(pass) {
						// If this element is in a hidden tab, we will need to focus on the tab
						var encompassing_tabs = getEncompassingTabs(tempobj);
						if(encompassing_tabs.length > 0) {
							for(var i = 0; i < encompassing_tabs.length; i++) {
								switchToTab(encompassing_tabs[i]);
							}
						}
				   
						// See if this is an item inside a hidden row
						var encompassing_row = getEncompassingRow(tempobj);
						if(encompassing_row.style.display == 'none') {
							encompassing_row.style.display = '';
						}
				   
						tempobj.focus();  
						scrolledTo(tempobj);
				   }
				   var pass=false;
					} 
              }
         }   
 	} 
return pass;
}

function scrolledTo(obj) {
	// Get the position of the object
	var x = findPosX(obj);
	var y = findPosY(obj);

	var newXpos = 0;
	var newYpos = 0;
	
	if(window.pageXOffset) {
		if(x >= window.pageXOffset && x <= window.pageXOffset + self.screen.width) {
			// No x scrolling needed
			newXpos = window.pageXOffset;
		}
		else {
			newXpos = x - 100;
		}

		if(y >= window.pageYOffset && y < window.pageYOffset + self.screen.height) {
			// No y scrolling needed
			newYpos = window.pageYOffset;
		}
		else {
			newYpos = y - 150;
		}

		scroll(newXpos, newYpos);
	}
	else {
		if(x >= document.body.scrollLeft && x <= document.body.scrollLeft + self.screen.width) {
			newXpos = document.body.scrollLeft;
		}
		else {
			newXpos = x - 100;
		}

		if(y >= document.body.scrollTop && y < document.body.scrollTop + self.screen.height) {
			newYpos = document.body.scrollTop;
		}
		else {
			newYpos = y - 150;
		}
		
		scroll(newXpos, newYpos);
	}
	
	return false;
}


function findPosX(obj) {
	var curleft = 0;
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			curleft += obj.offsetLeft
			obj = obj.offsetParent;
		}
	}
	else if (obj.x)
		curleft += obj.x;
	return curleft;
}

function findPosY(obj) {
	var curtop = 0;
	//var printstring = '';
	if (obj.offsetParent) {
		while (obj.offsetParent) {
			//printstring += ' element ' + obj.tagName + ' has ' + obj.offsetTop;
			curtop += obj.offsetTop
			obj = obj.offsetParent;
		}
	}
	else if (obj.y)
		curtop += obj.y;
	//window.status = printstring;
	return curtop;
}

function getEncompassingRow(obj) {
	var parent = obj.parentNode;
	
	while(parent != document) {
		if(('' + parent).toLowerCase().indexOf("tablerow") > -1 || ('' + parent.outerHTML).toLowerCase().indexOf("</tr>") > -1) {
			return parent;
		}
		parent = parent.parentNode;
	}
}

function getEncompassingTabs(obj) {
	var et = new Array();
	
	var parent = obj.parentNode;
	
	while(parent != document) {
		if(parent.className == 'TabControlTabItem') {
			et.push(parent);
		}

		parent = parent.parentNode;
	}
	
	return et;
}

function switchToTab(tab) {
	// We can actually find the prefix better from the tabs parent
	var displayDiv = tab.parentNode;
	var prefix = displayDiv.id.substring(0, displayDiv.id.length-10);

	// Find the active tab
	var active = tab.id.substring(prefix.length, tab.id.length-3);
	
	swapDiv(prefix, active,'')
}

//==================================================================================================
//== checkDIV
//==
//==	Scans through all fields in a DIV that have a class of field_required and calls the displayFieldError
//==	function if there is no value in the field. DOES NOT CLEAR FIELD ERRORS BEFORE FUNCTIONING!
//==================================================================================================
function checkDIV(vDIVName) 
{
var gDIV=document.getElementById(vDIVName);
var pass=true;
if (gDIV.style.display=='block') 
    {
    for (i=0;i<gDIV.getElementsByTagName('input').length;i++) 
         {
         var tempobj=gDIV.getElementsByTagName('input')[i];
         if ((tempobj.className=="field_required")||(tempobj.className=="littlefield_required")) 
              {
				if (tempobj.value=='')
                   {
                   displayFieldError(tempobj.name, 'Required Field.');
				   var pass=false;
    				} 
              }
         }   
    for (i=0;i<gDIV.getElementsByTagName('select').length;i++) 
         {
         var tempobj=gDIV.getElementsByTagName('select')[i];
         if ((tempobj.className=="field_required")||(tempobj.className=="littlefield_required")) 
              {
				if (tempobj.value=='')
                   {
                   displayFieldError(tempobj.name, 'Required Field.');
				   var pass=false;
    				} 
              }
         }    
 	} 
return pass;
}