var m_bIsInAutoSave = false;
var m_bIsInCallBack = false;
var m_strParamsForCallBack; //nsaha : Added (Reviewed by C Sudheer)

function FAFGetParams(sURL){
	var oParams = new Object();
	var nPos = sURL.indexOf("?");
	if(nPos != -1){
		var sParams = sURL.substr(nPos + 1);
		var aTmp = sParams.split("&");
		var aParam;
		for(var i=0; i<aTmp.length; i++){
			aParam = aTmp[i].split("=");
			oParams[aParam[0]] = unescape(aParam[1]);
		}
	}
	return oParams; // return the object even if empty
}


function setFAFStatus(sMsg)
{

	if(sMsg){
			window.status = sMsg;
			if (!window.top.FAFStatusWindow) {
				
				//--- Create the status window ---
				var iWinHeight = 100;
				var iWinWidth = 300;
				var iWinLeft = document.body.clientLeft + ((window.screen.availWidth - iWinWidth)/2);	//250;
				var iWinTop = document.body.clientTop + ((window.screen.availHeight - iWinHeight)/2);	//200;
				window.top.FAFStatusWindow = window.open('','winFAFBusyStatus',
					'fullscreen=no,toolbar=no,location=no,directories=no,status=no'
					+',menubar=no,resizable=no,width='+iWinWidth+',height='+iWinHeight+',left='+iWinLeft+',top='+iWinTop);
				
				var sHTML = '<html><head><title>One moment please...</title>'
							+'<link rel="stylesheet" href="../Styles2/aSDK.css" type="text/css">'
							+'</head><body bgcolor="#d0d0d0" style="cursor:wait;"><center>'
						+ '<span id="spanBusyStatusText" style="height:100%; margin-top:40px; margin-bottom:20px;'
								+' font-height:14pt; font-weight:bold; color:#202090">'
							+ sMsg 
						+'</span>'
					+'</center></body></html>';
				
				window.top.FAFStatusWindow.document.write(sHTML);
			}else{

				//--- Status window already exists... update existing span ---
				window.top.FAFStatusWindow.spanBusyStatusText.innerHTML = sMsg;
			}
			}
	else if(window.top.FAFStatusWindow)
	{
		try{window.top.FAFStatusWindow.close()}catch(e){};
		window.top.FAFStatusWindow = null;
		window.status = "";
	}
	else
		window.status = "";
	
}
document.setStatus = setFAFStatus;

function FAFSetLocalDate(elementID,vValue)
{
	var localDate = ToLocalTime(vValue);
	if( localDate)
	{
		var sLocalDate = formatDate(localDate,"mm-dd-yyyy");
		var eControl = document.all.item(elementID);
		if(eControl.tagName == "input")
			eControl.value = sLocalDate;
		else
			eControl.innerText = sLocalDate;
	}
}
function FAFSetLocalTime(elementID,vValue)
{
	var localDate = ToLocalTime(vValue);
	if( localDate)
	{
		var sLocalTime = formatTime(localDate);
		var eControl = document.all.item(elementID);
		if(eControl.tagName == "input")
			eControl.value = sLocalTime;
		else
			eControl.innerText = sLocalTime;
	}
}
function ToLocalTime(vValue)
{
	var tempDate = new Date(vValue);
	if( tempDate.toString() != "NaN" )
	{
		var gmtDate = new Date(Date.UTC(tempDate.getFullYear(),tempDate.getMonth(),tempDate.getDate(),tempDate.getHours(),tempDate.getMinutes(),tempDate.getSeconds(),tempDate.getMilliseconds()));
		var localDate = new Date(gmtDate.toLocaleString());
		return localDate;
	}
	else
		return null

}

function FAFSetLocalDateTime(elementID,vValue)
{
	var localDate = ToLocalTime(vValue);
	if( localDate)
	{
		var sLocalDate = formatDate(localDate,"mm/dd/yyyy");
		var sLocalTime = formatTime(localDate);
		sDate = sLocalDate + " " + sLocalTime;
		var eControl = document.all.item(elementID);
		if(eControl.tagName == "input")
			eControl.value = sDate;
		else
			eControl.innerText = sDate;
	}
}
function IsObservingDLT()
{
  var dlt, st;
  dlt = new Date("5/5/2004");
  st = new Date("1/1/2004");
  dltoffset = dlt.getTimezoneOffset();
  stoffset = st.getTimezoneOffset();
  if(dltoffset == stoffset)
	return false;
else
	return true;
	}
function getUserTimeZoneCode(lDate)
{
	var sDate = lDate.toString();
	var aTime = sDate.split(" ");
	var sTZA = aTime[4];
	if(sTZA.substr(0,3) == "UTC")
	{
		// Only the following TimeZone Abbreviations are supported 
		var sOffSet = sTZA.substring(3);
		if(sOffSet == "+0530")
			sTZA = "IST";
		else if(sOffSet == "+0500")
			sTZA = "ZP5";
		else if(sOffSet == "+0800")
			sTZA = "PHT";
		else if(sOffSet == "-0800" && IsObservingDLT())
			sTZA = "AKDT";
		else if(sOffSet == "-0900" && IsObservingDLT())
			sTZA = "AKST";
		else if(sOffSet == "-0300" && IsObservingDLT())
			sTZA = "ADT";
		else if(sOffSet == "-0400" && IsObservingDLT())
			sTZA = "AST";
		else if(sOffSet == "-0200" && IsObservingDLT())
			sTZA = "MAST";
		else if(sOffSet == "-0100" && IsObservingDLT())
			sTZA = "MADT";
		else if(sOffSet == "-0230" && IsObservingDLT())
			sTZA = "NDT";
		else if(sOffSet == "-0330" && IsObservingDLT())
			sTZA = "NST";
		else if(sOffSet == "-1000")
			sTZA = "HST";
		
	}
	return sTZA;
}
function formatTime(localDate)
{
	try
	{
		/*var sDate = localDate.toString();
		var aTime = sDate.split(" ");
		var sTZA = aTime[4];
		if(sTZA.substr(0,3) == "UTC")
		{
			// only unknown TimeZone Abbreviations supported are "IST" and "PHT"
			var sOffSet = sTZA.substring(3);
			if(sOffSet == "+0530")
				sTZA = "IST";
			if(sOffSet == "+0800")
				sTZA = "PHT";
		}*/
		sTZA = getUserTimeZoneCode(localDate);
		var sTime = localDate.toLocaleTimeString();
		var aTime = sTime.split(":");
		var sHour = aTime[0];
		if(sHour.length < 2)
			sHour = "0" + sHour;
		var sMin = aTime[1];
		var sAMPM = aTime[2].split(" ")[1];
		sTime = sHour + ":" + sMin + " " + sAMPM;
	}
	catch(e)
	{
		alert(e);
	}
	return sTime + " " + sTZA;
}

function FAFConvertDateTimeIfRequired(elementID)
{	
	//This function will be called from the onSubmit event
	// of the form and this will get called even during the normal FAFCallbakcs.
	// To prevent this, do this conversion to GMT only during AutoSave and not during
	// normal FAFCallbacks. 
	
	if (m_bIsInCallBack==true && m_bIsInAutoSave==false)
		return true;
		
	var eDate = document.all.item(elementID);
	var sDate = eDate.value;
	var eTime = document.all.item(elementID + "_0");
	var sTime = eTime.value;
	var varesptime=sTime.split(" ");
	var std=varesptime[0] + " " + varesptime[1];
	if(Date.parse(sDate + " " + std) > 0)
	{
		if(std.length > 0)
		{
			var localDate = new Date(sDate + " " + std);
			var utlDate = new Date();
			localDate.setMinutes (localDate.getMinutes () + localDate.getTimezoneOffset());
			eDate.value = formatDate(localDate);
			eTime.value = formatTime(localDate);
		}
	}
}
function FAFShowModalChild(sID, sTitle, sURL, vArguments, sFeatures)
{
	return document.FAFContext.showModalChild(sID, sTitle, sURL, vArguments, sFeatures);
}

function FAFSetReturnArray(arrRetVal)
{
	document.FAFContext.setReturnArray(arrRetVal);
}

function FAFGetReturnArray()
{
	return document.FAFContext.getReturnArray();
}

function FAFShowAbsolute(sFQID, sURL)
{
	document.FAFContext.showAbsolute(sFQID, sURL);
}

//smaiti: Added for .Net Migration 6.0 (Approved by Sudheer)
function FAFGetUser()
{
	return document.FAFContext.getUser();
}
var colControlsToValidate = new aCollection();
function FAFValidateControls()
{
	var nCount = colControlsToValidate.getCount();
	for(var i=0; i<nCount; i++)
	{
		var oElement = colControlsToValidate.getItem(i);
		if(oElement.getError())
		{
			alert("Please correct invalid data entered.");
			return false;
		}
	}
	return true;
}

function QueryStringData(strURL){
	var objParams = new Object();

	//--- Strip off the leading URL, up to the '?' beginning of query string ---
	var numPos = strURL.indexOf("?");
	if(numPos != -1){
		var strParams = strURL.substr(numPos + 1);
		//-- Convert to an array of key=value pairs and process into an
		//-- associatiave array.  (e.g.   objParams["key"] = value )
		var arrTmp = strParams.split("&");
		var arrParam;
		for(var i=0; i<arrTmp.length; i++){
			arrParam = arrTmp[i].split("=");
			objParams[arrParam[0]] = unescape(arrParam[1]);
		}
	}
	return objParams; // return the object even if empty
}

function GetUserID()
{
	var arrQSParams = QueryStringData(document.location.href);
	var cBUID = arrQSParams["CBUID"];
	var buIDInfo = cBUID.split(",");
	return buIDInfo[2];
}
function GetRegionID()
{
	var arrQSParams = QueryStringData(document.location.href);
	var cBUID = arrQSParams["CBUID"];
	var buIDInfo = cBUID.split(",");
	return buIDInfo[0];
}

function SerCurrentFile(fileInfo)
{
	var arr = fileInfo.split(",");
	document.FAFContext.currFile.set(arr[0]);
	document.FAFContext.showSibling('OE_QOD', '../aspFileMgmt/FileHomePage.asp');
	
}

function FAFOnSubmit()
{
	if(FAFValidateControls() == false) 
	{
		document.stopDataPosting = true;
	}
	else
	{
		window._canUnload = true;
	}
	
}
function IPage_Populate()
{
	setFAFStatus();
	setFAFContext();
	var eFocus = document.all[document.all.FAFFocusControl.value];
	try{if(eFocus)eFocus.focus();} catch(e){};
	if (typeof(IFAFPage_Populate ) == "string")
    {
		try { eval(IFAFPage_Populate) } catch (e) {};
    }
    else if (typeof(IFAFPage_Populate) != "undefined" && IFAFPage_Populate != null)
	{
		try { IFAFPage_Populate() } catch (e) {};
	}
	if (typeof(SmartNav_Populate ) == "string")
    {
		try { eval(SmartNav_Populate) } catch (e) {};
    }
    else if (typeof(SmartNav_Populate) != "undefined" && SmartNav_Populate != null)
	{
		try { SmartNav_Populate() } catch (e) {};
	}
}

function IPage_QueryUnload(sUnloadReason)
{
	var bRet = false;
    if (typeof(IFAFPage_QueryUnload) != "undefined" && IFAFPage_QueryUnload != null)
	{
		try { bRet = IFAFPage_QueryUnload(sUnloadReason) } catch (e) {};
	}
	else
		bRet = true;
	
		if(bRet && document.forms[0] && document.forms[0].FAFIsUpdatablePage && (document.forms[0].FAFIsUpdatablePage.value=="True") && typeof(document.FAFIsPostBack) == "undefined")
	{
		var response = FAFCallMsgHandler("REMOVETIMESTAMP");
	}
	
	return bRet;
}


function IPage_Validate()
{
	var bValid = true;
	if(FAFValidateControls() == false) return false;
	if (typeof(IFAFPage_Validate) == "string")
    {
		try { bValid = eval(IFAFPage_Validate) } catch (e) {alert(e);bValid = false;};
    }
    else if (typeof(IFAFPage_Validate) != "undefined" && IFAFPage_Validate != null )
	{
		try { bValid = IFAFPage_Validate() } catch (e) {alert(e); bValid = false;};
	}
	return bValid;
}


function IPage_Save()
{
	if (typeof(IFAFPage_Save) == "string" && document.dataChanged)
    {
		try { return eval(IFAFPage_Save) } catch (e) {};
    }
    else if (typeof(IFAFPage_Save) != "undefined" && IFAFPage_Save!= null && document.dataChanged)
	{
		try { return IFAFPage_Save() } catch (e) {};
	}
	return true;
}
function IPage_Done()
{
	if(IPage_Validate())
	{
		if (typeof(IFAFPage_Done) == "string" && document.dataChanged)
		{
			try { return eval(IFAFPage_Done) } catch (e) {};
		}
		else if (typeof(IFAFPage_Done) != "undefined" && IFAFPage_Done!= null && document.dataChanged)
		{
			try { return IFAFPage_Done() } catch (e) {};
		}
		else
		{
			document.FAFContext.showParent()
			return true;
		}
	}
	else
		return false;
	
}


// ***************************************************************
// Client TextBox (Input)
// ***************************************************************
// Extended properties are in a separate object so they don't show in the outerHTML 
function _I_Prop(){}
_I_Prop.prototype.sOrigTitle = "";
_I_Prop.prototype.nAbsCarretPos = -1;
_I_Prop.prototype.bRaiseChange = false;
_I_Prop.prototype.sPrevEvent = "";
_I_Prop.prototype.sError = "";
_I_Prop.prototype.sErrValue = ""

_I_Prop.prototype.sDataType = "";
_I_Prop.prototype.sFormat = "";
_I_Prop.prototype.bRequired = false;
_I_Prop.prototype.vPrevValue = null; // Valid value at focus
_I_Prop.prototype.vMaxValue = null; 
_I_Prop.prototype.vMinValue = null;
_I_Prop.prototype.bHasFocus = false;
_I_Prop.prototype.sText = ""; // current text
_I_Prop.prototype.bChanging = false;
_I_Prop.prototype.bIsNegative = false; //Negative currency


// Focus Event (Initialize Input control if needed)
function _IFE(eI, oEvent, sDataType, sFormat, bRequired){
	if(eI.type != "password")
	{
		initInput(eI);
		eI.onfocus(oEvent);
		setCurrentControl(eI.id);
	}
	else
	{
		eI.onfocus = null;
		eI.onchange = _I_Password_OnChange;
	}
}

function initInput(eI){
	if(eI._Prop) return;
	if(eI.type != "text"){
		alert("Cannot use initInput() on: " + eI.name);
		return;
	}
	if(!eI.onfocus) return;
	var sFocusFunc = eI.onfocus.toString();
	var nStart = sFocusFunc.indexOf("event,",0)
	if(-1 == nStart) return;
	nStart += 6; 
	var nEnd = sFocusFunc.indexOf(');\n',nStart);
	var sParams = sFocusFunc.substring(nStart,nEnd);
	eval("var aParam = new Array(" + sParams + ")");	
	
	// Initialize Input control
	eI._Prop = new _I_Prop();
	eI._Prop.sDataType = aParam[0];
	eI._Prop._sPrevValue = eI.value;
	if(!eI._Prop.sDataType) eI._Prop.sDataType = "string";
	eI._Prop.bRequired = aParam[2];
	// Shubhankar -- Added for supporting negative currency
	if(aParam[0] == "number")
	    eI._Prop.bIsNegative = aParam[2];
	//    
	eI._Prop.sOrigTitle = eI.title;
	if(eI.onchange)
		eI.orig_onchange = eI.onchange;
	eI.onchange = _I_OnChange;	
	eI.onfocus = _I_OnFocus;
	eI.onpropertychange = _I_OnPropertyChange;
	if(eI.onblur)
		eI.orig_onblur = eI.onblur;
	eI.onblur = _I_OnBlur;
	/*eI.onkeydown = _I_OnKeyDown;
	eI.onkeypress = _I_OnKeyPress;
	eI.onkeyup = _I_OnKeyUp;
	eI.hasFocus = _I_HasFocus;
	eI.undo = _I_Undo;
	eI.getReadOnly = _I_GetReadOnly;
	eI.setReadOnly = _I_SetReadOnly;
	*/
	eI.getValue = _I_GetValue;
	eI.setValue = _I_SetValue;
	eI.getError = _I_GetError;
	eI.setError = _I_SetError;
	eI.getFormat = _I_GetFormat;
	eI.setFormat = _I_SetFormat;
	eI.validate = _I_Validate;
	eI.setFormat(aParam[1]); 
	colControlsToValidate.add(-1,'',eI);
}
function _I_OnPropertyChange()
{
	if(event.propertyName == "value" && this._Prop._sPrevValue != this.value)
	{
		document.dataChanged = 1;
		this._Prop._sPrevValue = this.value;
	}
	
}
/*05 Apr 2005   Rajupeta Prasanna		if the data type is phone, set Format to "".*/


function _I_OnFocus(oEvent){
	if(!oEvent) oEvent = window.event;
	setCurrentControl(this.id);
	this._Prop.bHasFocus = true;
	if((this.style)&&(!this.readOnly)){
		this._Prop.sPrevAlign = this.style.textAlign;
		this.style.textAlign = "left";
	}
	
	if(this._Prop.sError){ 
		this.value = this._Prop.sErrValue; // previous typed 
		this.setError(); // clear
	}else{
		this.vPrevValue = this.getValue();
		this.setValue(this.vPrevValue);
	}
	if(this.style) this.style.backgroundColor = "";
			if(this._Prop.sDataType =='Phone')
	{
	 this._Prop.sFormat="";
	 }
	this.select();
	
	//CE(0, this, oEvent); 
}

function _I_GetValue(){
	var oMask = _getMaskObject(this._Prop.sDataType, this._Prop.sFormat);
	return oMask.parseText(this.value);
}
function _I_SetValue(vValue){
	var oMask = _getMaskObject(this._Prop.sDataType, this._Prop.sFormat);
	this.setError();
	this.value = oMask.formatValue(vValue, this._Prop.bHasFocus);
}

function _I_Password_OnChange(oEvent)
{
	document.dataChanged = 1;
}
 /*20 Apr 2005   Rajupeta Prasanna		if the data type is phone, do not call validate() function.*/
function _I_OnChange(oEvent){
	if(!oEvent) oEvent = window.event;
	document.dataChanged = 1;
	if(this._Prop.sDataType!="Phone") 
		this.validate();
	if(oEvent.srcElement.orig_onchange)
	{
//		alert("oEvent.srcElement.orig_onchange - " + oEvent.srcElement.orig_onchange);
		oEvent.srcElement.orig_onchange();
	}
	//	CE(0, this, oEvent); 
	//this.vPrevValue = this.getValue();
}
function _I_OnBlur(oEvent){
	if(!oEvent) oEvent = window.event;
	this._Prop.bHasFocus = false;

	this.scrollLeft = 0; 
	this._Prop.sPrevEvent = oEvent.type;
	if((this.style)&&(!this.readOnly)){
		this.style.textAlign = this._Prop.sPrevAlign;
	}
	this.validate();
	if(oEvent.srcElement.orig_onblur)
	{
		oEvent.srcElement.orig_onblur();	
	}

	if(this.attributes["Required"].value=="True" && this.value=="")
		if(this.style) this.style.backgroundColor = "#ffe0e0";
	else
		if(this.style) this.style.backgroundColor = "";
	
	//if(this.vPrevValue != this.getValue()){
	//	CE(0, this, "change"); 
	//}
	//CE(0, this, oEvent); 
}


function _I_GetFormat(){
	return this._Prop.sFormat;
}
function _I_SetFormat(sFormat){
	this._Prop.sFormat = sFormat;
	// update max length
	var oMask = _getMaskObject(this._Prop.sDataType, sFormat);
	
	if("undefined" == typeof(this.maxLength)) this.maxLength = oMask.maxLength;
	if(2147483647 == this.maxLength) this.maxLength = oMask.maxLength;
	
	// update default min max values
	this._Prop.vMinValue = oMask.vMinValue;
	this._Prop.vMaxValue = oMask.vMaxValue;
	// validate using new format	
	this.validate();
}
 /*05 Apr 2005   Rajupeta Prasanna		if the data type is phone format the text for domestic/international 
 *										depending on the first character.*/
// returns value error is set 
function _I_Validate(){

		if(this._Prop.sDataType=='Phone')
		{
				var mode,phone,phoneLength;
				phone=this.value;
				mode=phone.substring(1,0);
			//	var flag=0;
				if(phone!="")
				{
					if(mode=="+")
					{
						this._Prop.sFormat="";
					}
					else
					{	
						
						/*for(var count=0;count<phone.length;count++)
						{
							if(!IsValidPhoneNumber(phone.charAt(count),count))
							{
								flag=1;		
							}
						}
						if(flag==1)
							this.value="";
						else*/
							this._Prop.sFormat='(###)###-####';
							//this.value = oMask.formatValue(vValue, this._Prop.bHasFocus);
							//alert(this.value);
							//return this.value;
					}
				}
			 
		}
	var oMask = _getMaskObject(this._Prop.sDataType, this._Prop.sFormat);
	var vValue = oMask.parseText(this.value);
	// Shubhankar -- Included parameter this._Prop.bIsNegative for supporting negative currency
	var sErr = oMask.validate(vValue, '', this._Prop.bRequired, this._Prop.vMinValue, this._Prop.vMaxValue, this._Prop.bIsNegative);
	if(sErr){
		if(!this.getError()) this._Prop.sErrValue = this.value;
		this.setError(sErr);
		if(false == this._Prop.bHasFocus){
			var sDispErr = oMask.getDisplayError();
			if(!sDispErr) sDispErr = "?";
			this.value = sDispErr;
		}		
	}else{
		this.setError();
		this.value = oMask.formatValue(vValue, this._Prop.bHasFocus);
	}
	
	return vValue;
}

function _I_GetError(){
	return this._Prop.sError;
}

function _I_SetError(sError){
	if(sError){
		this._Prop.sError = sError;
		this.title = sError;
		if(this.style)this.style.backgroundColor = "#ffe0e0";
	}else{
		if(this._Prop.sError){
			if(this.style) this.style.backgroundColor = "";
			this.title = this._Prop.sOrigTitle;
		}
		this._Prop.sError = "";
	}
}


// ***************************************************************
//		Client TextArea
// ***************************************************************
function _TAFE(eTA, oEvent, bRequired){
	initTextArea(eTA);
}

function initTextArea(eTA){
	if(eTA._Prop)return;
	if(!eTA.onfocus) return;
	eTA._sPrevValue = eTA.value;
	eTA.onpropertychange = _TA_OnPropertyChange;
	setCurrentControl(eTA.id);
}
function _TA_OnPropertyChange()
{
	if(event.propertyName == "value" && this._sPrevValue != this.value) 
	{
		document.dataChanged = 1;
		this._sPrevValue = this.value;
	}
}

// ***************************************************************
//		Client CheckBox
// ***************************************************************
function _CFE(eSpan, oEvent){
	var eC = event.srcElement;
	if(eC.initDone) return;
	if(eC.onclick)
		eC.onOrigClick = eC.onclick;
	eC.onclick = _C_OnChange;
	setCurrentControl(eC.id);
	eC.initDone = true;
}

function _C_OnChange(oEvent){
	if(!oEvent) oEvent = window.event;
	var eC = event.srcElement;
	document.dataChanged = 1;
	if(eC.onOrigClick) eC.onOrigClick();
}

// ***************************************************************
// Mask Base Object
// ***************************************************************
function _Mask(){}

function _Mask_ParseText(sText){	
	this.sLastError = "";
	return sText;
}

function _Mask_FormatValue(vValue){
	return vValue;
}

function _Mask_OnKeyPress(oEvent){
}

// returns the error string
function _Mask_Validate(vValue, sFieldName, bRequired, vMinValue, vMaxValue){
	// undefined, null, blank or 0
	if((bRequired)&&(!vValue)){
		if(!sFieldName) sFieldName = "Field";
		return sFieldName + " is Required";
	}
	return; //ok  
}

function _Mask_GetDisplayError(){
}

function _Mask_PadZeros(sText, nLength, bAfter){
	for(var i=sText.length; i<nLength; i++){
		if(bAfter){
			sText += "0";
		}else{
			sText = "0" + sText;
		}
	}
	return sText;
}


_Mask.prototype.maxLength = 2147483647; // default;
_Mask.prototype.sLastError = "";
_Mask.prototype.vMinValue = null;
_Mask.prototype.vMaxValue = null;

// Friend
_Mask.prototype._padZeros = _Mask_PadZeros;
// Public
_Mask.prototype.parseText = _Mask_ParseText;
_Mask.prototype.formatValue = _Mask_FormatValue;

_Mask.prototype.onKeyPress = _Mask_OnKeyPress;
_Mask.prototype.validate = _Mask_Validate;
_Mask.prototype.getDisplayError = _Mask_GetDisplayError;

// **************************************************************
// Email Mask object
// **************************************************************

function _MaskEmail()
{

}
function _MaskEmail_Validate(nValue, sFieldName, bRequired, nMinValue, nMaxValue)
{
	var email = trim(nValue);
	if (email.length != 0)
	{
		if (ValidateEmail(email) != 0)
		{
			return("Email address is invalid.\nValid Examples:\n\txyz@abc.com\n\txyz@abc.com.uk\n\txyz_123@abc.com\n\txyz-12.wuv@abc.cnn.edu.uk");
		}
	}
}

_MaskEmail.prototype = new _Mask();
_MaskEmail.prototype.validate = _MaskEmail_Validate;
// **************************************************************
// Phone Mask object
// **************************************************************

var _NULL_CHAR = '\xA0';

// Mask Info Object
function _MIO(){}
_MIO.prototype.bLiteral = false;
_MIO.prototype.sChangeCase = ''; //U:Upper L:Lower '':Same
_MIO.prototype.sChar = '';

 
_MaskPhone.prototype = new _Mask();
_MaskPhone.prototype.validate = _MaskPhone_Validate; 
// Override
_MaskPhone.prototype.formatValue = _MaskPhone_FormatPhone;
_MaskPhone.prototype.parseText = _MaskPhone_ParseText;
_MaskPhone.prototype._isValidChar = _MaskPhone_IsValidChar;
_MaskPhone.prototype.getDisplayError = _MaskPhone_GetDisplayError;
function _MaskPhone_GetDisplayError(){
 
	if(!this.sFormat) return;
	
    var nLength = this.aMaskInfos.length;
    if(0 == nLength) return;
	
    var sOut = "";
    for(var nIndex=0; nIndex<nLength; nIndex++){
        if(this.aMaskInfos[nIndex].bLiteral){
            sOut += this.aMaskInfos[nIndex].sChar;
        }else{
            sOut += "?";
        }
    }
    return sOut;
}




function _MaskPhone_ParseText(sText){
	if(!this.sFormat) return sText;
	
    var nLength = this.aMaskInfos.length;
    if(0 == nLength){
        // Variable length String
        switch(this.sFormat){
        case ">": 
			return sText.toUpperCase();
        case "<": 
			return sText.toLowerCase();
		default:
			return sText;
        }
    }
    // Fixed Length String
    var nPos = 0;
	var sOut = "";
    for(var nIndex=0; nIndex<nLength; nIndex++){
        var sChar = sText.substr(nPos, 1);
        if(0 == sChar.length) sChar = _NULL_CHAR;
        if('_' == sChar) sChar = _NULL_CHAR;
            
        if(this.aMaskInfos[nIndex].bLiteral){
            if(sChar == this.aMaskInfos[nIndex].sChar){
                nPos++;
            }else{
                sChar = this.aMaskInfos[nIndex].sChar;
            }
            sChar = "";
        }else{
            // find first valid Char
            while(true){
                switch( this.aMaskInfos[nIndex].sChangeCase){
                case "U":
					sChar = sChar.toUpperCase();
				break;
                case "L":
					sChar = sChar.toLowerCase();
				break;
                }
                if(this._isValidChar(sChar, this.aMaskInfos[nIndex])) break;
                nPos++;
                sChar = sText.substr(nPos, 1);
				if(0 == sChar.length) sChar = _NULL_CHAR;
				if("_" == sChar) sChar = _NULL_CHAR;
            }
            nPos++;
        }
        if(_NULL_CHAR == sChar) sChar = ""; //sChar = "_";
        sOut = sOut + sChar;
    }
    return sOut;
}





function _MaskPhone_Validate(nValue, sFieldName, bRequired, nMinValue, nMaxValue)
{	
	var result,result1,flag;
	var len=nValue.length;
	if (len != 0)
	{
		result=ValidatePhone(nValue);
		if(result==2)
		{
			
			if(len < 10)
				return("Field is invalid");
				
				var oMask = _getMaskObject("Phone","(###)###-####");
				result1 = oMask.formatValue(nValue, true);
				if(result1.length!=13)
				{
					return("Field is invalid");
				}
			/*else
			{
				var sChar = "";
				 flag=0;
				for(var nIndex=0; nIndex<nValue.length; nIndex++)
				{
					sChar = nValue.charAt(nIndex);
					result1=IsValidPhoneNumber(sChar,nIndex);
					if(!result1)
						flag=1;
					
				}
					 if(flag)
						return("Field is invalid");
			}*/
			   
    
				 
			   if((nValue.charAt(0) =="(") && (nValue.charAt(4) ==")") &&(nValue.charAt(8)=="-") && (len < 13))
			   {
					return("Field is invalid");
			   }
    	   
			 
			   
		}
		else
		if ( result!= 0)
		{
			return("International Phone numbers must be a minimum of 1 character following the +.");
		}
	}
}
 
 function IsValidPhoneNumber(sChar,Position) 
 {
	var nCode = sChar.charCodeAt(0);
    if(isNaN(nCode)) nCode = 0;
    if((Position==0)&& (sChar=="("))
    {
		return true;
    }
    if((Position==4)&& (sChar==")"))
    {
		return true;
    }
    if((Position==8)&& (sChar=="-"))
    {
		return true;
    }
    
   
		if((nCode >= 48)&&(nCode <= 57)) return true;


		if((nCode >= 48)&&(nCode <= 57)) return true;


    return false;
} 
// _MaskPhone Constructor
 
 function _MaskPhone(sFormat)
 {
	this.sFormat = sFormat;
	if(sFormat != "")
	{
			// build mask Infos Array
			var aMaskInfos = new Array();
			if(sFormat)
			{
				var sCase = "";
				var bNextCharAsLiteral = false;
				var nLength = sFormat.length;
				var nPos = -1;
				for(var nIndex=0; nIndex<nLength; nIndex++)
				{
						if(bNextCharAsLiteral)
						{
							bNextCharAsLiteral = false;
							nPos++;
							var oMaskInfo = new _MIO();
							aMaskInfos[nPos] = oMaskInfo;
							oMaskInfo.bLiteral = true;
							oMaskInfo.sChar = this._Prop.sFormat.substr(nIndex, 1);
						}
						else
						{
						    switch(sFormat.substr(nIndex, 1))
								{
							case "#": //"#" Digit placeholder.
									nPos++;
									var oMaskInfo = new _MIO();
									aMaskInfos[nPos] = oMaskInfo;
									oMaskInfo.sChangeCase = sCase;
									oMaskInfo.sChar = "#";
								break;    
							default: // Literal All other symbols are displayed as literals; that is, as themselves.
									nPos++;
									var oMaskInfo = new _MIO();
									aMaskInfos[nPos] = oMaskInfo;
									oMaskInfo.bLiteral = true;
									oMaskInfo.sChangeCase = sCase;
									oMaskInfo.sChar = sFormat.substr(nIndex, 1);
								break; 
								}
					    }
				}
			}
				
			// Determin fix length of Value and associate it with the aMaskInfos array
				aMaskInfos.nMaskFixValueLen = 0;
				for(var nIndex=0; nIndex<aMaskInfos.length; nIndex++)
					{
						if(!aMaskInfos[nIndex].bLiteral)
							{
								aMaskInfos.nMaskFixValueLen++;
							}
					}
		    
			// Set max Length for fixed lenght strings
			if(aMaskInfos.nMaskFixValueLen) this.maxLength = this.sFormat.length;
			
			this.aMaskInfos = aMaskInfos;
	}
}
 

function _MaskPhone_FormatPhone(sValue, bEditing){
	
	if(!this.sFormat) return sValue;
	
	
	// Ensure is a string and convert Null to empty string
	if("Phone" != typeof(sValue)){
		if(null == sValue){
			sValue = "";
		}else{
			sValue = sValue.toString();
		}
	}

    var nLength = this.aMaskInfos.length;
    
	
    // Fixed Length String
    var bShowInputPos = false;
    var sOut = '';
    var sChar = "";
    var nPos = -1;
    var bFound = false;
    for(var nIndex=0; nIndex<nLength; nIndex++){
        if(this.aMaskInfos[nIndex].bLiteral){
            sOut = sOut + this.aMaskInfos[nIndex].sChar;
        }else{
            // find first valid Char
            while(true){
				nPos++;
				sChar = sValue.charAt(nPos);
				if((!sChar)||(_NULL_CHAR == sChar)||('_' == sChar)){
					if(bShowInputPos){
						sChar = "_";
					}else{
						//sChar = _NULL_CHAR;
						sChar = "";
					}
					break;
				}
                switch(this.aMaskInfos[nIndex].sChangeCase){
                case "U":
					sChar = sChar.toUpperCase();
				break;
                case "L":
					sChar = sChar.toLowerCase();
				break;
                }
                if(this._isValidChar(sChar, this.aMaskInfos[nIndex])) break;
            }
			if(sChar.length){
                sOut = sOut + sChar;
                bFound = true;
			}else{
				break; // stop building the string
			}
        }
    }
    
    // if not complete remove last literal(s);
    if(sOut.length < nLength){
		for(var i=sOut.length-1; i>=0;i--){
	        if(this.aMaskInfos[i].bLiteral){
				nLength = i;
	        }else{
				break;
	        }
		}

		sOut = sOut.substr(0, nLength);
    }   
       return sOut;
}

 function _MaskPhone_IsValidChar(sChar, oMaskInfo){
    if(oMaskInfo.bLiteral) return (oMaskInfo.sChar == sChar);
    if(_NULL_CHAR == sChar) return true;
    switch(oMaskInfo.sChangeCase){
		case "U":
			if(sChar.toUpperCase() != sChar) return false;
		break;
        case "L":
			if(sChar.toLowerCase() != sChar) return false;
		break;
    }
    var nCode = sChar.charCodeAt(0);
    if(isNaN(nCode)) nCode = 0;
    switch(oMaskInfo.sChar.charCodeAt(0)){
    case 35: //"#"    Digit placeholder.
		if((nCode >= 48)&&(nCode <= 57)) return true;
	break;
   /* case 38: //"&"    Character placeholder
		if((nCode >= 32)&&(nCode <= 126)) return true;
		if((nCode >= 128)&&(nCode <= 255)) return true;
	break;
    case 65: //"A"    Alphanumeric character placeholder (entry required)
		if((nCode >= 65)&&(nCode <= 90)) return true;
		if((nCode >= 97)&&(nCode <= 122)) return true;
		if((nCode >= 48)&&(nCode <= 57)) return true;
	break;
    case 97: //"a"    Alphanumeric character placeholder (entry optional)
		if(nCode == 0) return true;
		if(nCode == 32) return true;
		if((nCode >= 65)&&(nCode <= 90)) return true;
		if((nCode >= 97)&&(nCode <= 122)) return true;
		if((nCode >= 48)&&(nCode <= 57)) return true;
	break;*/
    case 57: //"9"    Digit placeholder (entry optional)
		if(nCode == 0) return true;
		//if(nCode == 32) return true;
		if((nCode >= 48)&&(nCode <= 57)) return true;
	break;
    /*case 67: //"C" Character or space placeholder (entry optional)
		if(nCode == 0) return true;
		if((nCode >= 32)&&(nCode <= 255)) return true;
	break;
    case 63: //?      'Letter placeholder. For example: a  –  z or A  – Z
		if((nCode >= 65)&&(nCode <= 90)) return true;
		if((nCode >= 97)&&(nCode <= 122)) return true;
	break;*/
    }
} 









 
 /**05 Apr 2005   Rajupeta Prasanna		Added a case for data type = phone
 *27 Apr 2005   Rajupeta Prasanna		Modified the function for the case phone*/

// ***************************************************************
var _mMasks = new Object();
function _getMaskObject(sDataType, sFormat){
    var sKey = sDataType + ":" + sFormat;
    var oMask = _mMasks[sKey];
    if("undefined" == typeof(oMask)){
        switch(sDataType){
            case "number":
				if("function" != typeof(_MaskNumber)) alert("cMaskNumber.js is not included");
				oMask = new _MaskNumber(sFormat);
			break;            
            case "date":
				if("function" != typeof(_MaskDate)) alert("cMaskDate.js is not included");
				oMask = new _MaskDate(sFormat);
			break;            
            case "string":
				if(sFormat){
					if("function" != typeof(_MaskString)) alert("cMaskString.js is not included");
					oMask = new _MaskString(sFormat);
				}else{
					oMask = new _Mask();
				}
			break;            
			case "Phone":
					oMask = new _MaskPhone(sFormat);
			break;
			case "email":
				oMask = new _MaskEmail();
				break;
			default:
				if(sFormat) alert("DataType " + sDataType + " not supported");
				oMask = new _Mask(); // default base class
			break;
        }
        _mMasks[sKey] = oMask;
    }
    return oMask;
}


// ***************************************************************
//		Client Select
// ***************************************************************
// Select Focus Event
function _SFE(eS, oEvent)
{
	initSelect(eS);
}

function initSelect(eS)
{
	if(eS.initDone) return;
	eS.onOrigchange = eS.onchange;
	eS.onchange = _S_OnChange;
	eS.onfocus = _S_OnFocus;
	setCurrentControl(eS.id);
	eS.initDone=true;
}
function _S_OnFocus(oEvent){
	if(!oEvent) oEvent = window.event;
	var eS = oEvent.srcElement;
	eS.sPrevIndex = eS.selectedIndex;
	setCurrentControl(eS.id);
}

function _S_OnChange()
{
	var oEvent = window.event;
	var eS = oEvent.srcElement;
	if(eS.onOrigchange) eS.onOrigchange();
	document.dataChanged = 1;
	eS.sPrevIndex = eS.selectedIndex;
}

function setCurrentControl(sElementID)
{
	document.all.FAFFocusControl.value = sElementID;
}

// Return Position of element relative to the body or screen
function getDOMElementPosition(oElement, bScreen){	
    var oPoint = new Object();
	oPoint.x = 0;
	oPoint.y = 0;
	// find absolute position of element relative to the body;	
	var eSrc = oElement;
	while(eSrc.tagName != 'BODY'){
		oPoint.x  += eSrc.offsetLeft - eSrc.scrollLeft;
		oPoint.y  += eSrc.offsetTop - eSrc.scrollTop;
		eSrc = eSrc.offsetParent;
	}
	if(bScreen){
		//adjust for document scroll position
		oPoint.x -= document.body.scrollLeft;	
		oPoint.y -= document.body.scrollTop;	
		// convert from window to screen coordinates
		oPoint.x  = oPoint.x + window.screenLeft + document.body.clientLeft;
		oPoint.y  = oPoint.y + window.screenTop + document.body.clientTop;
	}
	return oPoint;
}

// Helper function
function GetCurrentVirtualDir()
{
	var pathName = window.location.pathname;
	var virDirEnd = pathName.indexOf("/",3);
	var virtualDir = pathName.substring(0,virDirEnd);
	return virtualDir;
}

// Callback Handler support

function __FAFCallBackHelper(pageUrl,postData)
{
    var xmlRequest = new ActiveXObject("Microsoft.XMLHTTP");

    var decodedUrl = DecodeUrl(pageUrl);
    
    xmlRequest.open("POST", decodedUrl, false);
    xmlRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    xmlRequest.send(postData);

    var response = xmlRequest.responseText;
    
    if (response.charAt(0) == "s") 
    {
		return response.substring(1);
    }
    else
		throw response.substring(1);

}

var __FAFtheFormPostData = "";
function __FAFdoCallback(eventTarget, eventArgument,bNoScreenData)
{
	m_bIsInCallBack = true;
	try
	{
		// We are simulating the postback. So make sure onsubmit is handled and is returning true;
		var bSubmit = true;
		if(window.event)
			window.event.returnValue = true;
		
		//bSubmit = document.forms[0].onsubmit();
		bSubmit = WebForm_OnSubmit();
		
		window._canUnload = false; // Reset _canunload
		if(window.event)
		{
			if(window.event.returnValue == false)
			{
				bSubmit = false;
				//Clear event target
				document.all("__EVENTTARGET").value="";
			}
			else
			{
				bSubmit = true;
			}
		}
		
		//EventTarget is clered to remove the previous event, in case of any validation error
		//If window.event is NULL, then use stopDataPosting to check the validation error and make 
		// the Callback decision accordingly.
		if(bSubmit==false)
		{
			document.all("__EVENTTARGET").value="";
		}
			
		if(bSubmit)
		{
			if(!bNoScreenData)
				__FAFinitCallback();
			re = new RegExp("\\x2B", "g");
			postData = "";
			
			if(!bNoScreenData)
			{
				postData = __FAFtheFormPostData; 
			}
			if(bNoScreenData)
			{	
				if (typeof(IFAFPage_AddCustomCallbackData) == "function")
				{
					try { 
							var str = IFAFPage_AddCustomCallbackData(); 							
							postData += str;
						} catch (e) {};
				}
			}
		
			postData +=	"__FAFCALLBACKID=" + eventTarget +
						"&__FAFCALLBACKPARAM=" + escape(eventArgument).replace(re, "%2B");
		   
		    m_bIsInCallBack = false;
			return __FAFCallBackHelper(pageUrl,postData);
		}
		//else
			//throw "onsubmit failed";
	}
	catch(e){
		m_bIsInCallBack = false;
		throw e;
	}
	m_bIsInCallBack = false;
}

function DecodeUrl(strPageUrl)
{
	while (strPageUrl.indexOf("&amp;") > 0)
	{
		strPageUrl = strPageUrl.replace("&amp;","&");
	}
	return strPageUrl;
}



function __FAFinitCallback() {

    __FAFtheFormPostData = "";
    count = theForm.elements.length;
    var element;
    var strSelectValue="";
    for (i = 0; i < count; i++) {
        element = theForm.elements[i];
        var elementTag = element.tagName.toLowerCase();
        
        // Special handling is required for checkbox & radio. only checked checkboxes are posted.
        if (elementTag == "input" && (element.type == "checkbox" || element.type == "radio"))
		{
			if(element.checked)
				__FAFtheFormPostData += element.name + "=" + GetEncodedInputValue(element.value) + "&";								
		}
		// Special handling is required for multiple select box
		else if(element.type == "select-multiple")
		{
			for( j = 0; j < element.length; j++){ 
				if(element.options[j].selected) {
					if (strSelectValue == "") 
						strSelectValue = GetEncodedInputValue(element.options[j].value); 
					else 
						strSelectValue = strSelectValue + "," + GetEncodedInputValue(element.options[j].value);
				} 
			}
			if(strSelectValue!="")
				__FAFtheFormPostData += element.name + "=" + strSelectValue + "&";
			strSelectValue = "";
		}
			
		else if(elementTag == "input" || elementTag == "select" || elementTag == "textarea") {
				__FAFtheFormPostData += element.name + "=" + GetEncodedInputValue(element.value) + "&";
		}
    }
}

function GetEncodedInputValue(strVal)
{
	 var re = new RegExp("\\x2B", "g");
	 strVal = strVal.replace(re, "%2B");
	 strVal = strVal.replace(/&/g, "%26");
	 return strVal;
	 
}

function FAFCallMsgHandler(sArg)
{
	if (sArg == 'AutoSave')
	{
		m_bIsInAutoSave = true;
	}
	
	var response;
	try
	{
		response = __FAFdoCallback("__FAFMsgHandler",sArg);
	}
	catch(e)
	{
		if(e.description)
			response = e.description;
		else
			response = e.toString();
	}
	m_bIsInAutoSave = false;
	return response;
}

function FAFAutoSavePage()
{
	try
	{
		if(document.dataChanged)
		{
		
			var response = FAFCallMsgHandler("AutoSave");
			if (response == null)
			{
				return false;
			}
			
			if(response.length > 0)
			{
				DisplayPageErrorMessage(response);
				return false;
			}
			else
			{
				document.dataChanged = 0;
				if (typeof(FAFOnAfterAutoSave) != "undefined" && FAFOnAfterAutoSave != null )
					return FAFOnAfterAutoSave();
				else
					return true;
			}
		}
		else
			return true;
			
	}
	catch(e)
	{
		alert(e);
		return false;
		
	}
	
}

function FAFGridView(eName,bDynamicRowAdd)
{
	this._init(eName);
	if(bDynamicRowAdd)
		this._initDynamicRowAdd();
}
function _FAFGridView_Init(eName)
{
	this._eTable = document.all(eName);
	this._oRows = new FAFGridRows(this._eTable);
	var divBody = this._eTable.parentElement;
	while(divBody!= null && (divBody.id == null || divBody.id != "divGridBody"))
		divBody = divBody.parentElement;
	if(divBody != null)
	{
		var nMaxScrollHeight = divBody.getAttribute("MHDiv"); 
	//	sadfds
		if((nMaxScrollHeight)&&(this._eTable.offsetHeight > nMaxScrollHeight)){
			// Limit client area height
			divBody.style.height = nMaxScrollHeight;
			divBody.style.overflowY = "scroll";
		}else{
			divBody.style.height = this._eTable.offsetHeight + 2;
			divBody.style.overflowY = "";
		}
	}

}
function _FAFGridView_getRows()
{
	return this._oRows;
}
function _FAFGridView_getCellElement(rowNumber,colNumber,elementNumber)
{
	var oRow = this._oRows.getRow(rowNumber);
	var oCell = oRow.cells(colNumber);
	var oCellSpan = oCell.all(0);
	if(elementNumber)
		return oCellSpan.all(elementNumber);
	else
		return oCellSpan.all(0);
}
function _FAFGridView_getCellElementFromRow(oRow,colNumber,elementNumber)
{
	var oCell = oRow.cells(colNumber);
	var oCellSpan = oCell.all(0);
	if(elementNumber)
		return oCellSpan.all(elementNumber);
	else
		return oCellSpan.all(0);
}
function _FAFGridView_getCellElements(rowNumber,colNumber)
{
	var oRow = this._oRows.getRow(rowNumber);
	var oCell = oRow.cells(colNumber);
	var oCellSpan = oCell.all(0);
	return oCellSpan.all;
}

function _FAFGridView_getCellTD(rowNumber,colNumber)
{
	var oRow = this._oRows.getRow(rowNumber);
	var oCell = oRow.cells(colNumber);
	return oCell;
}

function _FAFGridView_getSelectedRow()
{
	var oRows = this.getRows();
	if("undefined" != oRows && oRows.getRowCount() >=0)
	{
		var rowCount = oRows.getRowCount();
		var selRowNum = null;
		var sSelRowEval = "selRowNum = rowFor" + this._eTable.id + ";"
		try{eval(sSelRowEval);}catch(e){};
		
		if(selRowNum != null)
			return oRows.getRow(selRowNum+1);
		else
			return null;
	}	
}
function _FAFGridView_initDynamicRowAdd()
{
	var iRowCount = this.getRows().getRowCount();
	if(iRowCount > 0)
	{
		var _lastRow = this.getRows().getRow(iRowCount);
		if(_lastRow)
		{
			this._savedLastRow = _lastRow.cloneNode(true);
			//alert(this._savedLastRow.outerHTML);
		}
	}
	
}
function _FAFGridView_AddRowUsingCallback(rowName,lastElement)
{
	if(event.ctrlKey || event.shiftKey || event.altKey || event.keyCode != 9) // tab keycode is 9
		return;
		
	try
	{
		
	
		// Get the New Index and other info
		var sCallBackRet = __FAFdoCallback(rowName,this._eTable.id,true);
		if(typeof(sCallBackRet)=="undefined")
			return;
		event.cancelBubble = true;	
		var iRowCount = this.getRows().getRowCount();
		var lastRow = this.getRows().getRow(iRowCount);
		
		// Could not use cloneNode, becaz the name attribute can not be changed in the input element inside TD.
		//var oTRNew = lastRow.insertAdjacentElement("afterEnd",lastRow.cloneNode(true)); 
		
		var oTRNew = this._eTable.insertRow();

		var sNewID = null;
		var sNewName = null;
		var sRetArray = sCallBackRet.split("_");
		var iNewIndex = parseInt(sRetArray[0],10);
		var iOldIndex = 0;
		
		if(this._savedRowIndex>=0)
			iOldIndex = this._savedRowIndex;
		else
		{			
			//var sJS = "document.forms[0].SS_" + this._eTable.GridName + ".value";
			//var sRet = eval(sJS);
			//sRetArray = sRet.split("_");
			//iOldIndex = parseInt(sRetArray[0],10);
			iOldIndex=parseInt(iRowCount-1);
			this._savedRowIndex = iOldIndex;			
		}
		var reIndex = new RegExp(iOldIndex.toString(),"ig");
		
		if(iNewIndex != NaN)
		{
			sNewName = this._savedLastRow.Name.replace(reIndex,iNewIndex);
			sNewID = this._savedLastRow.id.replace(reIndex,iNewIndex);
		}
		var reID = new RegExp(this._savedLastRow.id,"ig");
		/*
             * 2.0 Migration Fix:
             ":" is replaced by "$" in this._savedLastRow.Name
        */	
		var savedLastRowName = this._savedLastRow.Name;
		var reChar = new RegExp("\\$","ig");
		savedLastRowName = savedLastRowName.replace(reChar, "\\$");
		
		//var reName = new RegExp(this._savedLastRow.Name,"ig");
		var reName = new RegExp(savedLastRowName,"ig");
		
		var bFocusSet = false;
		var oFirstChild = null;
		
		// Copy the last row as new row
		for (var i = 0; i < this._savedLastRow.attributes.length; i++)
		{
			var oAttrib = this._savedLastRow.attributes[i];
			if(oAttrib.nodeValue)
			{
				oTRNew.setAttribute(oAttrib.nodeName, oAttrib.nodeValue.replace(reIndex,iNewIndex), 0);
			}
		}
		var attribNames = "";
		for (j=0; j < this._savedLastRow.children.length; j++) 
		{
			var oNewCell = oTRNew.insertCell(j);
			var oOldCell = this._savedLastRow.children.item(j);
			for (var i = 0; i < oOldCell.attributes.length; i++)
			{
				var oAttrib = oOldCell.attributes[i];
				if(oAttrib.nodeValue)
					oNewCell.setAttribute(oAttrib.nodeName, oAttrib.nodeValue, 0);
			}
			if(oOldCell.style.cssText)
				oNewCell.style.cssText = oOldCell.style.cssText;
			
			if(oOldCell.className)
				oNewCell.className = oOldCell.className;
				
			var sinnerCellHTML = oOldCell.innerHTML.replace(reID,sNewID);
			oNewCell.innerHTML = sinnerCellHTML.replace(reName,sNewName);
			
			// Clear the data
			var oAllChildren = oNewCell.all;
			for(var iChild = 0 ; iChild < oAllChildren.length; iChild++)
			{
				var oChild = oAllChildren.item(iChild);
				
				if(oChild.tagName)
				{
					var sTagName = oChild.tagName.toUpperCase();
					if(	sTagName == "INPUT" ||
						sTagName == "TEXTAREA")
					{
					
						if(oChild.type)
						{
							var sType = oChild.type.toUpperCase();
							if(	sType == "CHECKBOX" ||
								sType == "FILE" ||
								sType == "HIDDEN" ||
								sType == "PASSWORD" ||
								sType == "RADIO" ||
								sType == "TEXT")
								{
									oChild.value = "";
									if(bFocusSet == false)
									{
										bFocusSet = setFocus(oChild);
										oFirstChild = oChild;
										
									}
								}
							else
							{
								oChild.value = "";
								if(bFocusSet == false)
								{
									bFocusSet = setFocus(oChild);
									oFirstChild = oChild;
									
								}
							}
						}
						else
						{
							oChild.value = "";
							if(bFocusSet == false)
							{
								bFocusSet = setFocus(oChild);
								oFirstChild = oChild;
							}
						}
					}
					else if(sTagName == "SELECT")
					{
						oChild.selectedIndex = -1;
						if(bFocusSet == false)
						{
							bFocusSet = setFocus(oChild);
							oFirstChild = oChild;
						}
					}
				}
			}
        }

		// Remove the old JS to add row
		var sTemp = lastElement.onkeydown.toString();
		var onblurStart = sTemp.indexOf("__FAF_");
		var onblurEnd = sTemp.indexOf(");",onblurStart);
		var sOnBlurString = sTemp.substring(0,onblurStart) + sTemp.substring(onblurEnd+2);
		lastElement.onkeydown = sOnBlurString;
		
		// Commented this part to Fix the Defect #27460 as there is no additional Change in  the LastElement Onfocus for addrow
		//sTemp = lastElement.onfocus.toString();
		//var onfocusStart = sTemp.indexOf("__FAF_");
		//var onfocusEnd = sTemp.indexOf(");",onfocusStart);
		//var sOnFocusString = sTemp.substring(0,onfocusStart) + sTemp.substring(onfocusEnd+2);
		//lastElement.onfocus = sOnFocusString;	
		
		oTRNew.onclickEventJS = this._savedLastRow.onclick.toString().replace(reIndex,iNewIndex);
		oTRNew.attachEvent("onclick",GridTRonclickFunction);
		if(this._savedLastRow.ondblclick!=null)
		{
			oTRNew.ondblclickEventJS=this._savedLastRow.ondblclick.toString().replace(reIndex,iNewIndex);
			oTRNew.attachEvent("ondblclick",GridTRondblclickFunction);
		}
		
		// Client event handling
		if(lastElement.getAttribute("__FAFNewRowOnTabOutClientJS") != null)
			eval(lastElement.getAttribute("__FAFNewRowOnTabOutClientJS") + "(oTRNew,sCallBackRet)");
		oTRNew.click();
		if(oFirstChild)
			oFirstChild.focus();
		document.dataChanged = true;
		event.returnValue = false;
		//alert("OldRow:\n" + this._savedLastRow.outerHTML + "\n\n" + "NewRow:\n" + oTRNew.outerHTML);
	}
	catch(e)
	{
	
		alert("Please correct invalid data entered.");
		lastElement.focus();
		
		
	}
}

function GridTRonclickFunction()
{
	var oTR = event.srcElement;
	if(oTR.tagName.toUpperCase() != "TR")
		oTR = GetTR(oTR);
	// ignore "function anonymous()"
	var sFn = oTR.onclickEventJS.substring(20);
	eval(sFn);
}

function GridTRondblclickFunction()
{
	var oTR = event.srcElement;
	if(oTR.tagName.toUpperCase() != "TR")
		oTR = GetTR(oTR);
	// ignore "function anonymous()"
	var sFn = oTR.ondblclickEventJS.substring(20);
	eval(sFn);
}
function GetTR(eventSrcElement)
{
	var parentElem = eventSrcElement.parentElement;
	if(parentElem != null)
	{
		if(parentElem.tagName.toUpperCase() == "TR")
			return parentElem;
		else
			return GetTR(parentElem);
	}
	else
		return null;
}


function setFocus(oChild)
{
	try
	{
		oChild.focus();
		return true;
	}
	catch(e)
	{
		return false;
	}
}

FAFGridView.prototype = new Object();
FAFGridView.prototype._oRows = null;
FAFGridView.prototype._eTable = null;
FAFGridView.prototype._savedLastRow = null;
FAFGridView.prototype._init = _FAFGridView_Init;
FAFGridView.prototype.getRows = _FAFGridView_getRows;
FAFGridView.prototype.getSelectedRow = _FAFGridView_getSelectedRow;
FAFGridView.prototype.getCellElement = _FAFGridView_getCellElement;
FAFGridView.prototype.getCellElements = _FAFGridView_getCellElements;
FAFGridView.prototype.getCellElementFromRow = _FAFGridView_getCellElementFromRow;
FAFGridView.prototype.getCellTD =_FAFGridView_getCellTD;
FAFGridView.prototype.addRowUsingCallback = _FAFGridView_AddRowUsingCallback;
FAFGridView.prototype._initDynamicRowAdd = _FAFGridView_initDynamicRowAdd;


function FAFGridRows(eTable)
{
	this._oRows=eTable.rows;
}

function _FAFGridRows_getRow(rowNumber)
{
	return this._oRows(rowNumber);
}

function _FAFGridRows_getRowCount()
{
	return this._oRows.length - 1;
}

FAFGridRows.prototype = new Object();
FAFGridRows.prototype._oRows = null;
FAFGridRows.prototype.getRow = _FAFGridRows_getRow;
FAFGridRows.prototype.getRowCount = _FAFGridRows_getRowCount;


//Function added to make call to Calculator
function fnCalculateCollection(strItems)
{
	var virtualDir = GetCurrentVirtualDir();
	var pageUrl= virtualDir + "/ECGUIComponents/Calculator.aspx";
	re = new RegExp("\\x2B", "g");
	__FAFtheFormPostData="";
	var element=theForm.elements["FAFDataChanged"];
	var oParameters = new Array(2);
	oParameters[0] = "CalculateCollection";
	oParameters[1] = strItems;
	__FAFtheFormPostData += element.name + "=" + GetEncodedInputValue(element.value)+"&";
	postData =  __FAFtheFormPostData+"__FAFCALLBACKID=" + pageUrl +
	"&__FAFCALLBACKPARAM=" + escape(oParameters).replace(re, "%2B");
	var strReturn = __FAFCallBackHelper(pageUrl,postData);
	return strReturn;
}

//function added for getting the CBOM Calculator
function fnCBOMCalculator()
{
      var m_oCalc;
      m_oCalc = document.BC.createObject('Calculator');     
      return m_oCalc;
}

//This function displays the error meesage on the Error pane on the page
function DisplayPageErrorMessage(errMessage)
{
	var eErrorMsg = document.all["__FAFErrorMessageList"];
	if (eErrorMsg != null)
	{
		eErrorMsg.innerHTML = errMessage;
		eErrorMsg.style.height = "50px";
		eErrorMsg.style.width = "100%";
		eErrorMsg.style.overflowY = "scroll";
		alert("Error(s) occured. See Message pane.");
		eErrorMsg.focus();
		document.dataChanged = 1;
	}
}

///This function is used to Update the data in the Grid as and when we type.
function UpdateDataToGrid(SourceControl,GridName,lblName,ShowText)
{
	ParentValues=document.all("ParentValues_"+GridName).value
	SS_GridName="SS_"+ParentValues
	var aGridRow = document.Form1[SS_GridName].value;
	var CurrentRowNum = aGridRow.split("_")[0];

	/*
             * 2.0 Migration Fix:
             "$" is replaced by "_" 
    */	
	var reChar = new RegExp("\\$","ig");
	ParentValues = ParentValues.replace(reChar, "_");

	if(document.all(ParentValues+"_"+CurrentRowNum+"_"+lblName)!=null)
	{
		if(SourceControl.type=="text")
			document.all(ParentValues+"_"+CurrentRowNum+"_"+lblName).innerHTML=SourceControl.value;
		else if(SourceControl.type=="select-one")
			document.all(ParentValues+"_"+CurrentRowNum+"_"+lblName).innerHTML=SourceControl.options[SourceControl.selectedIndex].text;
		else if(SourceControl.type=="checkbox")
		{
			if(SourceControl.checked==true)
				document.all(ParentValues+"_"+CurrentRowNum+"_"+lblName).innerHTML="Yes"
			else
				document.all(ParentValues+"_"+CurrentRowNum+"_"+lblName).innerHTML="No"
		}
		else if(SourceControl.type=="radio")
		{
			document.all(ParentValues+"_"+CurrentRowNum+"_"+lblName).innerHTML=ShowText
		}
	}
}

//The following function prepares the postData for FAFCallback to a different ASPX Page	
function FAFGetPostDataForCallBack(oParameters)
{
    var postData ="";
   
    re = new RegExp("\\x2B", "g");
    
    var element=theForm.elements["FAFDataChanged"];

    postData = element.name + "=" + GetEncodedInputValue(element.value)+"&";
    postData += "__FAFCALLBACKID=" + pageUrl + "&__FAFCALLBACKPARAM=" + escape(oParameters).replace(re, "%2B");

     return postData;
}

function _Sort_Validate(){
    if (typeof(Sort_Validate) == "function"){
        try {  
            if(!Sort_Validate()){
                document.stopDataPosting = true;
                document.all("__EVENTTARGET").value="";
                return false;
            }
        } catch (e) {};
    }
}

// FASTView Support
function IsInFASTView()
{
	if(document.queryString["__FastView"])
		return true;
	else
		return false;
}

//nsaha : Added (Reviewed by C Sudheer.)
function IFAFPage_AddCustomCallbackData()
{
	var arrParams = m_strParamsForCallBack.split(',');
	var sExpression ;
	var sFinalExpression = "";
	
	for (i = 0; i<arrParams.length; i++)
	{	
		sExpression = eval("document.all['"+arrParams[i]+"'].value");
		sExpression = sExpression.toString() + "&";	
		sExpression = arrParams[i].toString() + "=" + sExpression;	
		sFinalExpression += sExpression;	
		
	}	
	return sFinalExpression;
}

function setParamsForCallback(str)
{	
	m_strParamsForCallBack = str;	
}

function appendParamsForCallback(str)
{
	if (m_strParamsForCallBack.indexOf(str) == -1)
		m_strParamsForCallBack += "," + str;	
		
}

function _INPUT_IMAGE_Click(oTextBox){
	if(!oTextBox.disabled){
		if (typeof(ProcessInputImageClick) == "function"){
		try {
			if(!ProcessInputImageClick(oTextBox))
				return false;
			} catch (e) {};
		}
		var oPoint = getDOMElementPosition(oTextBox,true);
		var y = oPoint.y + oTextBox.offsetHeight ;
		var sFeatures= 'dialogHeight: 9; dialogWidth: 10;dialogLeft: ' + oPoint.x + 'px;dialogTop: ' + y + 'px; center:no; help:no; status:no; titlebar:no';
		var aParams = new Array();aParams[0]='';aParams[1]=window;aParams[2]='mm-dd-yyyy';var ret = window.showModalDialog("../GUIUtils/FAFCalendar.htm", null, sFeatures);
		if(ret){
			if(oTextBox.setValue)
				oTextBox.setValue(ret);
			else
				oTextBox.value = ret;
			document.dataChanged = 1;
			oTextBox.focus();
		}
	}
}
// to fix KB912945 issue - support for direct use of the OBJECT tag in html pages have been removed
// dummy function to write the OBJECT tag using string and being invoked from the existing html files
function WriteScriptlet(strObjectTag)
{
	document.write(strObjectTag);
}
