/*
 * ============================================================================
 *                   The ProQuality Inc.
 *         Rapid Efficent Low cost And Xtreme (RELAX)
 *	           Advanced Solutions Framework (ASF)
 *                  Cristian Teodorescu
 *                      Version 6.0
 * ============================================================================
 * 
 *    Copyright (C) 1999 The ProQuality Inc. Foundation. All rights reserved.
 * 
 * The use of this software in any form is strictly prohibited unless you have 
 * purchased a licence from ProQuality Inc. or you have a software agreement with 
 * ProQuality Inc.
 * 
 * Redistributions of source code must retain copyright statements
 * and notices. Redistributions must also contain a copy of this
 * document.
 *
  THIS SOFTWARE IS PROVIDED BY PROQUALITY AND CONTRIBUTORS ``AS IS'' AND
  ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
  PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PROQUALITY OR ITS
  CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
  USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
  DAMAGE.
    
 *
 */
function formatTime(timeField)
{
	origVal = timeField.value;
	formatTimeTxt(timeField);
	timeField.value = findElement(timeField,origVal);
}

function formatTimeTxt(timeField)
{
	value = timeField.value;
	amPmVal = getAmPMVal(timeField);
	// remove all spaces
	re = /\s|\D/g;
	value = value.replace(re,"");

	// invalid time
	timeValInt = parseInt(value);
	if(value==null || value.length>4 || value.length==0 || isNaN(timeValInt) || timeValInt>2359)
	{
		return;
	}
	
	re = /^0/;
	value = value.replace(re,"");
	
	// format the time numbers	
	valLength = value.length;
	if(valLength==1 || valLength==2)
	{
		amPmVal = getAmPmHourVal(timeField,amPmVal);	
		value = formatHourOnlyVal(timeField);
	}
	else if(valLength==4)
	{
		amPmVal = getAmPmHourMinuteVal(value,amPmVal);	
		value = formatHourMinuteVal(timeField,value);
	}
	
	if(isNaN(value))
	{
		return;
	}	
	
	timeValInt = parseInt(value);
	if(timeValInt < 100 || !isValidMinute(value))
	{
		return;
	}
	
	value = insertColon(value);	
	
	if(formatContainsAmPm(timeField))
	{
		value = formatAmPmVal(value,amPmVal);
	}
	
	timeField.value = value;
}

function getAmPMVal(timeField)
{
	value = timeField.value;
	amPmVal = "";
	if(formatContainsAmPm(timeField))
	{
		re = /a$|am$/i;
		if(value.search(re)!=-1)
		{
			amPmVal = " AM";
		}
		re = /p$|pm$/i;
		if(value.search(re)!=-1)
		{
			amPmVal = " PM";
		}		
	}	
	
	return amPmVal;
}

function formatAmPmVal(value,amPmVal)
{
	value = value + amPmVal;
	re = /AM|PM/;
	if(value.search(re)==-1)
	{
		re = /^10:|^11:/;
		if(value.search(re) != -1)
		{
			value = value + " AM";		
		}
		else
		{
			re = /^[1-6]{1}|^12/;
			if(value.search(re) != -1)
			{
				value = value + " PM";
			}
			else
			{
				value = value + " AM";
			}
		}
	}
	
	return value;
}

function formatHourOnlyVal(timeField)
{
	value = timeField.value;
	timeValInt = parseInt(value);		
	if(formatContainsAmPm(timeField))
	{
		if(timeValInt>23)
		{
			return;
		}
		else if(timeValInt>12)
		{
			timeValInt = timeValInt - 12;
		}
	}
	value = ""+timeValInt * 100;
	return value;
}

function formatHourMinuteVal(timeField,value)
{
	timeValInt = parseInt(value);		
	if(formatContainsAmPm(timeField))
	{
		if(timeValInt>2359)
		{
			return;
		}
		else if(timeValInt>1299)
		{
			timeValInt = timeValInt - 1200;
		}
	}		
	value = ""+timeValInt;
		
	return value;
}

function insertColon(value)
{
	// insert colon
	valLength = value.length;
	if(valLength==3)
	{
		hour = value.substr(0,1);
		minute = value.substr(1,2);		
		value = hour+":"+minute;		
	}
	else if(valLength==4)
	{
		hour = value.substr(0,2);
		minute = value.substr(2,2);		
		value = hour+":"+minute;		
	}
	
	return value;
}

function isValidMinute(value)
{
	isValid = true;
	
	timeValInt = parseInt(value);	
	minuteValInt = value % 100;
	if(minuteValInt>59)
	{
		isValid = false;
	}
	
	return isValid;
}

function getAmPmHourVal(timeField,amPmVal)
{
	value = timeField.value;
	timeValInt = parseInt(value);		
	if(formatContainsAmPm(timeField))
	{
		if(timeValInt>12)
		{
			amPmVal = "";
		}
	}
	
	return amPmVal;
}

function getAmPmHourMinuteVal(value,amPmVal)
{
	timeValInt = parseInt(value);		
	if(timeValInt>1299)
	{
		amPmVal = "";
	}
	
	return amPmVal;
}

function findElement(timeField,origVal)
{
	name = timeField.name;
	value = timeField.value;
	
	if(name.indexOf("txt") == -1)
	{
		return timeField.value;
	}
	
	if(value == "")
	{
		elem = document.getElementById(name.substr(0,name.indexOf("txt")));
		elem.value = value;
		return value;
	}
	
	amPmTyped = isAmPmTyped(origVal);
	arryName = name.substr(0,name.indexOf("txt")) + "Array";
	arry = null;
	eval("arry = "+arryName);

	if(arry.length==0)
	{
		return timeField.value;
	}
	
	amPm = value.substr(value.length-2,value.length);
	previousItem = arry[0];
	previousText = previousItem.text;
	prevAmPm = previousText.substr(previousText.length-2,previousText.length);	

	if(compareTimes(value,previousItem.text)<0 && amPm==prevAmPm)
	{
		elem = document.getElementById(name.substr(0,name.indexOf("txt")));
		elem.value = previousItem.value;
		return previousItem.text;
	}
	
	re = /^8/;
	re2 = /a$|am$/i;
	re3 = /^7/;

	for(i=1;i < arry.length;i++)
	{
		var item = arry[i];
		text = item.text;
		previousText = previousItem.text;
		prevAmPm = previousText.substr(previousText.length-2,previousText.length);
		
		if(compareTimes(value,previousText)==0 && amPm==prevAmPm)
		{
			elem = document.getElementById(name.substr(0,name.indexOf("txt")));
			elem.value = previousItem.value;
			return previousText;
		}
		else if(compareTimes(value,previousText)>0 && compareTimes(value,text)<0)
		{
			selVal = selTime(value,previousText,text);
			if(!amPmTyped && (selVal.search(re) != -1) && (selVal.search(re2)!= -1) && (origVal.search(re3)!=-1))
			{
				elem = document.getElementById(name.substr(0,name.indexOf("txt")));
				if(selVal==text)
				{
					elem.value = item.value;
				}
				else if(selVal==previousText)
				{
					elem.value = previousItem.value;
				}

			
				return selVal;
			}
			elem = document.getElementById(name.substr(0,name.indexOf("txt")));
			if(amPm==prevAmPm)
			{
				if(selVal==text)
				{
					elem.value = item.value;
				}
				else if(selVal==previousText)
				{
					elem.value = previousItem.value;
				}
				return selVal;
			}
		}

		previousItem = item;
	}
	
	if(compareTimes(value,previousItem.text)>0 && amPm==prevAmPm)
	{
		elem = document.getElementById(name.substr(0,name.indexOf("txt")));
		elem.value = previousItem.value;
		return previousItem.text;
	}
	
	
	return timeField.value;
}

function selTime(value,previousText,currentText)
{
	re = /^0*/;
	valHourInt = parseInt(value.substr(0,value.indexOf(":")).replace(re,""));
	prevValHourInt = parseInt(previousText.substr(0,previousText.indexOf(":")).replace(re,""));
	currentValHourInt = parseInt(currentText.substr(0,currentText.indexOf(":")).replace(re,""));


	valMinuteInt = parseInt(value.substr(value.indexOf(":")+1,value.length));
	prevValMinuteInt = parseInt(previousText.substr(previousText.indexOf(":")+1,previousText.length));
	currentValMinuteInt = parseInt(currentText.substr(currentText.indexOf(":")+1,currentText.length));

	val = (valHourInt*100) + ((valMinuteInt/60)*100);
	prev = (prevValHourInt*100) + ((prevValMinuteInt/60)*100);
	current = (currentValHourInt*100) + ((currentValMinuteInt/60)*100);
	
	prevDif = Math.abs(val-prev);
	currentDif = Math.abs(val-current);
	
	if(prevDif<currentDif)
	{
		return previousText;
	}
	
	return currentText;
}

function compareTimes(value,targetValue)
{
	re = /^0*/;
	hourInt = parseInt(value.substr(0,value.indexOf(":")).replace(re,""));
	if(hourInt==12)
	{
		re = /a$|am$/i;
		if(value.search(re)>0)
		{
			hourInt = 0;
		}
	}
	minuteInt = parseInt(value.substr(value.indexOf(":")+1,value.length));

	re = /^0*/;
	targetHourInt = parseInt(targetValue.substr(0,targetValue.indexOf(":")).replace(re,""));
	if(targetHourInt==12)
	{
		re = /a$|am$/i;
		if(targetValue.search(re)>0)
		{
			targetHourInt = 0;
		}
	}	
	targetMinuteInt = parseInt(targetValue.substr(targetValue.indexOf(":")+1,targetValue.length));
	
	src = (hourInt*100) + minuteInt;
	target = (targetHourInt*100) + targetMinuteInt;
	
	return src-target;
}

function formatContainsAmPm(timeField)
{
	
	return true;
}

function isAmPmTyped(origVal)
{
	amPmTyped = true;
	re = /a$|am$|p$|pm$/i;
	if(origVal.search(re)==-1)
	{
		amPmTyped = false;
	}
	
	return amPmTyped;
}