﻿var currRow = new Array();
var m_XrefSpecs=new Array();
var m_XrefRows=new Array();
var m_Tabupvisible=0,m_Tabdownvisible=0;
var m_groupVisibleDown=null,m_groupVisibleUp=null;
// astea-trans=text;TXTVIRTUAL$back_t_vx;N;
var txtBack = "Back";
// astea-trans=text;TXTASP$loading.._vx;N;
var txtLoading = "Loading...";
var m_previousGroup,m_previousPage;	
var aComm=new Array();	// For communication engine
var m_deleteAll="false";
var m_sessionClosed=false;
var m_XrefTableLength=new Array();
var m_DoChanges=true;
var m_StartOnZoom=new Array();
var m_TabControl="";
var glb_SaveOrApply;
// New functions
var m_show = true;
var m_LogoImg=null; //Obsolete 
var m_CustomLogo=null;
var m_currentUrl = null;
var m_GroupAliases = new Array();
var m_ElementsIDs = new Array();
var	m_GroupTitles = new Array();
//var m_PageAttributes = new Array();
var m_HotLinkAlt = new Array();
var m_HotLinkImg = new Array();
var m_HotLinkAct = new Array();
var m_HotLinkAlias = new Array();
var m_HotLinkType = new Array();
var m_currentAlias = null;
var m_curGroupAlias = null;
var m_PageTitles = new Array();
var m_EntityName = null;
var m_QueryName = null;
var m_searchFields = new Array();
var m_currentRow = new Array();
//var m_primaryXML = null;
var m_primaryXSL = null;
var m_primaryXSLCache = null;
var m_primaryXrefXSL = null;
var m_scrollerName = null;
var m_actvElement = null;
var	m_Arguments = new Array();
var m_NavigateTo = new Array();
var m_ReportParams=new Array(); 
m_ReportParams[0]=new Array();
var m_ClusterTitle = "";
var m_ModuleTitle = "";
var m_ModuleSubTitle = "";
var m_argumentForReport="";
var m_pageBOs;
var m_columnListBOs;
var currTab = 0;
var currXMLDoc=null;
var m_currentColumn = new Array();
var m_searchString;
var m_TotalRecordCount=null;
var m_TotalPagesCount=null;
var m_QuickSaveInNewModules=false;
var m_SearchFunctionName="";
////////////////////////////
//Tamir Onchange
var old_active_element_id="";
var old_active_element_value="";
var ExecInlineCode_executed;
var aliasLoaded="", groupAliasLoaded="";
var m_XSLURL="";
var _searchInterval = -1;
var _useCommSetting = true;
var m_skipFocusOnFirst = false;
var m_pageLoaded = false;
var m_funcToRunOnFinish = new Array();
var m_ServerAct=false;
var m_BOPagging = null;
var m_pageRecreate = false;
var m_currentPageNumber = null;
var m_invalidStateId = null;

//validation object for java script vars
function ContructAOFunction()
{
    m_BOPagging = null;
	currRow = new Array();
	m_XrefSpecs=new Array();
	m_XrefRows=new Array();
	m_Tabupvisible=0,m_Tabdownvisible=0;
	m_groupVisibleDown=null,m_groupVisibleUp=null;
	// astea-trans=text;TXTVIRTUAL$back_t_vx;N;
	txtBack = "Back";
	m_previousGroup,m_previousPage;	
	aComm=new Array();	// For communication engine
	m_deleteAll="false";
	m_sessionClosed=false;
	m_XrefTableLength=new Array();
	m_DoChanges=true;
	m_StartOnZoom=new Array();
	m_TabControl="";
	glb_SaveOrApply;
	// New functions
	m_show = true;
	m_LogoImg=null; //Obsolete 
	m_CustomLogo=null;
	m_currentUrl = null;
	m_GroupAliases = new Array();
	m_ElementsIDs = new Array();
	m_GroupTitles = new Array();
	//m_PageAttributes = new Array();
	m_HotLinkAlt = new Array();
	m_HotLinkImg = new Array();
	m_HotLinkAct = new Array();
	m_HotLinkAlias = new Array();
	m_HotLinkType = new Array();
	m_currentAlias = null;
	m_curGroupAlias = null;
	m_PageTitles = new Array();
	m_EntityName = null;
	m_QueryName = null;
	m_searchFields = new Array();
	m_currentRow = new Array();
	m_primaryXML = null;
	m_primaryXSL = null;
	m_primaryXSLCache = null;
	m_primaryXrefXSL = null;
	m_scrollerName = null;
	var	m_Arguments = new Array();
	m_NavigateTo = new Array();
	m_ReportParams=new Array(); 
	m_ReportParams[0]=new Array();
	m_ClusterTitle = "";
	m_argumentForReport="";
	m_pageBOs;
	m_columnListBOs;
	currTab = 0;
	currXMLDoc=null;
	m_currentColumn = new Array();
	m_searchString;
	m_TotalRecordCount=null;
	m_TotalPagesCount=null;
	m_QuickSaveInNewModules=false;
	m_SearchFunctionName="";
	////////////////////////////
	//Tamir Onchange
	old_active_element_id="";
	old_active_element_value="";
	ExecInlineCode_executed;
	aliasLoaded="", groupAliasLoaded="";
	m_XSLURL="";
	_searchInterval = -1;
	m_skipFocusOnFirst = false;
	m_ServerAct=false;
	m_invalidStateId = null;
}

function AO_SetSearchFunction(a_searchFunctionName)
{
//ASAP #IL0412060026
//id="btn_prev_scrl" onclick="ScrollerRetrieve(null,'prev')" 
//id="btn_next_scrl" onclick="ScrollerRetrieve(null,'next')"
//id="btnSearch" onclick="return ScrollerRetrieve(null,null)"

	var strSearch="ScrollerRetrieve";
	var paramSearch="(null,null)",
		paramSearchNext="(null,'next')",
		paramSearchPrev="(null,'prev')";
	var searchBtn=document.getElementById("btnSearch"),
		nextBtn=document.getElementById("btn_next_scrl"),
		PrevBtn=document.getElementById("btn_prev_scrl");
	
	if (a_searchFunctionName==null || a_searchFunctionName=="")
		a_searchFunctionName=m_SearchFunctionName;
	if (a_searchFunctionName==null || a_searchFunctionName=="")
		a_searchFunctionName=strSearch;
	if (a_searchFunctionName.indexOf("(")>-1)
	{
		paramSearch=paramSearchNext=paramSearchPrev="";
	}
	if (searchBtn!=null)
	{
		searchBtn.onclick=new Function("return "+a_searchFunctionName+paramSearch)
	}
	if (nextBtn!=null)
	{
		nextBtn.onclick=new Function("return "+a_searchFunctionName+paramSearchNext)
	}
	if (PrevBtn!=null)
	{
		PrevBtn.onclick=new Function("return "+a_searchFunctionName+paramSearchPrev)
	}		
}
function PrintTimer(href)
{
	return false;
	var doc = new ActiveXObject("MSXML2.DOMDocument");
	doc.async = false
	doc.load(href) 
}



function AO_CheckIfPageIsDisabled(xslPage) //ASAP #IL0406020025
{
	if (xslPage==null) return false;
	if (xslPage.xml=="") return false;
	
	if( validateObj.IsDefined(AS_ShouldPageBeDisabled) )
	{
		return AS_ShouldPageBeDisabled(xslPage,true);
	}
	else
	{
		return false;	
	}
	
}

//this function return the XSLTemplate object
//param 1 -string- xsl alias
function GetXSLCacheDocument(XSLAlias,xslDocument,OverrideXSL)
{
    if ( AS_GetPagePermission(null,"modify")=="true" ) return null;
   
	var processor = null;
	OverrideXSL = typeof(OverrideXSL)=="undefined"||OverrideXSL==null?true:OverrideXSL;
	if(typeof(m_XSLPath) == "undefined")
	{
		return processor;
	}
	try
	{
		var m_XSLCache = m_ControlFrame.m_XSLCache[m_CurrentPageName];
		var rtnObj = new Object();
		var objXSLT = null;
		var xslTemplate = null;

		if(m_XSLCache == null || m_XSLCache[XSLAlias] == null)
		{
			try
			{
				objXSLT=new ActiveXObject('MSXML2.FreeThreadedDOMDocument');
				objXSLT.async = false;
				objXSLT.validateOnParse = AS_IsDebugMode();
				objXSLT.loadXML(xslDocument.xml);
			
				objCache   = new ActiveXObject("MSXML2.XSLTemplate");
				objCache.stylesheet = objXSLT;
				AS_CheckXSLError(objXSLT);
				m_XSLCache[XSLAlias] = objCache;
				xslTemplate = m_XSLCache[XSLAlias];
			}
			catch(e)
			{
				// Ignore the error - in this case xsl template won't be stored in cache, and will be parsed every access.
				return null;
			}
		}
		else
		{
			xslTemplate = m_XSLCache[XSLAlias];
			if(OverrideXSL)
			{
				objXSLT=new ActiveXObject('MSXML2.FreeThreadedDOMDocument');
				objXSLT.async = false;
				objXSLT.validateOnParse = AS_IsDebugMode();
				objXSLT.loadXML(xslDocument.xml);
				xslTemplate.stylesheet = objXSLT;
				AS_CheckXSLError(objXSLT);
			}
		}
	
		processor = xslTemplate.createProcessor();
	}
	catch(err)
	{
		processor = null;
	}
	return processor;
}

//this function return the XML document (that we load from the XSL source) from the cahce 
//if the XML Document not exists we create new XML document and XSLTemplate Object
//Notice XSLTemplate created in order to improve the transformation performance
//param 1 -string- xsl alias
function GetXSLDocument(XSLAlias,direction)
{
	var XSLDocument=null;
	try
	{
		var frmLoader=null;
		{
			XSLDocument=document.all(XSLAlias);
			if (XSLDocument!=null)
				m_XSLURL=XSLDocument.src;
		}

		var m_XSL = AO_GetPrimaryWindow().top.control_frame.m_XSL[_GetCurrentPageName()];
		//var m_XSLCache = AO_GetPrimaryWindow().top.control_frame.m_XSLCache[_GetCurrentPageName()];
		if (typeof(m_XSLPath) != "undefined")
		{
			try
			{
				if(m_XSL[XSLAlias] == null);
			}
			catch(e)
			{
				m_XSL = new Array();
				//m_XSLCache = new Array();
			}
		    var skipDisable = false;
			if(m_XSL[XSLAlias] == null || typeof(m_XSL[XSLAlias].documentElement) == "unknown")
			{
				var doc = new ActiveXObject("MSXML2.DOMDocument");
				doc.async = false
				doc.validateOnParse = AS_IsDebugMode();
				doc.load(m_XSLPath[XSLAlias]);
				AS_CheckXSLError(doc);
				XSLDocument = _addIncludes(doc);
				if ( AS_GetPagePermission(null,"modify")=="true" )
				{
				    m_XSL[XSLAlias] = XSLDocument;
				}
				skipDisable = true;
			}
			else
			{
				m_XSL[XSLAlias]=AS_ReadGridLayout(m_XSL[XSLAlias],true);
				XSLDocument = m_XSL[XSLAlias];
			}
			
			m_XSLURL=m_XSLPath[XSLAlias];
			
			if( !skipDisable ) XSLDocument = _CheckDisable(m_XSL[XSLAlias],true);
			if(AS_IsPaggingEnabled() && CheckCaller(GetXSLDocument.caller))
			{
                if(typeof(direction)=="undefined")
                {
                  XSLDocument = SetOriginalSelect(XSLDocument);
                }
				XSLDocument = ConstructXSLPaging(XSLDocument,direction);
			}
			return XSLDocument;
		}
	
		if (frmLoader!=null)
		{
			XSLDocument=frmLoader.document.all(XSLAlias);
			m_XSLURL=XSLDocument.src;
		}
		if (XSLDocument!=null) XSLDocument=XSLDocument.XMLDocument;
		XSLDocument = _addIncludes(XSLDocument);
	}
	catch(err)
	{/*do nothing*/}
	return XSLDocument;
}

//this class manage the initalization of the xsl cache object 
//and the creation of xsl out put
//all function in the system that display transform content
//should use this interface
function TransformClass()
{
	//class memeber
	var strHtmlContent = "";
	var activeXsl = null;
	var docFragment = null;
	var divObj = null;
	//private method
	function insertToFragmentDoc(objPage)
	{
	    if(objPage==null) return;
		if( docFragment == null )
		{
			docFragment = document.createDocumentFragment();
			divObj = docFragment.createElement("DIV");
		}
		
		divObj.innerHTML = "";
		divObj.insertAdjacentHTML("afterBegin",strHtmlContent);
		objPage.innerHTML = "";
		objPage.appendChild(divObj.firstChild);
	}
	
	function __SetXslCache(alias,direction)
	{
		m_primaryXSL =GetXSLDocument("_" + alias + "XSL",direction);
		try
		{
			m_primaryXSLCache = GetXSLCacheDocument("_" + alias + "XSL",m_primaryXSL,AO_OverrideXSLCache(alias));
		}
		catch(e){m_primaryXSLCache=m_primaryXSL;m_primaryXSLCache=AS_ReadGridLayout(m_primaryXSLCache,true);}
	}

	function __TransformXsl()
	{
		try
		{
			if(m_primaryXSLCache!=null)
			{
				try
				{
					//changed by eli harel 13-3-2005
					//getting ref to the template object and the style object
					//in order to be able creating createProcessor	
				    m_primaryXSLCache.input = m_primaryXML;
					m_primaryXSLCache.transform();
					strHtmlContent = m_primaryXSLCache.output;
					activeXsl = m_primaryXSLCache.stylesheet;
				}catch(e)
				{
					strHtmlContent = m_primaryXML.transformNode(m_primaryXSL);
					activeXsl = m_primaryXSL;
				}
			}
			else
			{
				strHtmlContent = m_primaryXML.transformNode(m_primaryXSL);
				activeXsl = m_primaryXSL;
			}
		}
		catch(err)
		{
			//
		}
	}
	
	//public methods
	this.SetXslOutput = function _SetXslOutput(objPage)
	{
		var createdPage = false;
		try
		{
			if( activeXsl != null )
			{
				var scriptsCollection = activeXsl.selectNodes("//xsl:if[@expr='CheckAsyncScript()==0']");
				
				if( scriptsCollection.length > 0 )
				{
					insertToFragmentDoc(objPage);
					createdPage = true;
					for(var i=0;i<scriptsCollection.length;i++)
					{	
						var scriptnode = scriptsCollection[i].firstChild;	
						eval(scriptnode.firstChild.text);
					}
				}
				else
				{
					if(objPage!=null) objPage.insertAdjacentHTML("afterBegin",strHtmlContent);
					createdPage = true;
				}
			}
		}
		catch(err)
		{
			//
		}
		finally
		{
			if(!createdPage)
			{
				objPage.insertAdjacentHTML("afterBegin",strHtmlContent);
			}
		}
		return strHtmlContent;
	}
	
	this.SetXslCache = function _SetXslCache(alias,direction)
	{
		__SetXslCache(alias,direction);
	}
	
	this.TransformXsl = function _TransoftXsl()
	{
		__TransformXsl();
	}
	
	this.TransformEx = function _TransformEx(alias)
	{
		__SetXslCache(alias)
		__TransformXsl();
		return this.strHtmlContent;
	}
	this.TransformScroller = function _TransformScroller(containerObj)
	{
		__TransformXsl();
		insertToFragmentDoc(containerObj);
		return strHtmlContent;
	}
}



var m_TransformObj = new TransformClass();

function get_PrimaryBoIndex(currTab){
	var first=m_PageAttributes[currTab].indexOf(";");
	if (first>-1) return  m_PageAttributes[currTab].substr(0,first);
	
	return m_PageAttributes[currTab];
}

//this method return the related bo name for the specified page alias
//param 1 -string- page alias name
//return the bo related to the page alias
function get_PrimaryBoByPageAlias(pageAlias){
	var boName = null;
	
	for(var i=0;i<m_PageAliases.length;i++)
	{
		if( m_PageAliases[i] == pageAlias )
		{
			boName = m_aliases[parseInt(m_PageAttributes[i].split(";")[0])];
			break;
		}
	}
	return boName;
}

function _Prev(){
	return AO_HotLink(m_previousGroup,m_previousPage);
}

function Trim(str)
{
        return str.trim();
}

var glbPreventOnChange = false;

function AO_ItemBeforedeactivate(obj,tmpRow,elmID) {
	if(window.event.toElement != null){
		if((window.event.toElement.id == obj.id + "_lup") || (window.event.toElement.id == obj.id + "_link")){
			glbPreventOnChange = true;
		}
		else{
			glbPreventOnChange = false;
		}
	}
}

/// <summary>
/// This function set the function on the next input element, used for internal purpose
/// in order to set the focus on the next input element according to the current tab index
/// after page is recreate and all reference and events routing is lost.
/// </summary>
function FocusOnNextInput(elementName)
{
    
    function GetFields()
    {
        var fields = new Array();
        var elamentsArr = _TabControl.all.tags("input");
	    for (var i=0;i<elamentsArr.length;i++)fields[i]=elamentsArr[i];
	    elamentsArr = _TabControl.all.tags("select");
	    for (var j=0;j<elamentsArr.length;j++,i++)fields[i]=elamentsArr[j];
	    elamentsArr = _TabControl.all.tags("textarea");
	    for (var k=0;k<elamentsArr.length;k++,j++,i++)fields[i]=elamentsArr[k];
	    elamentsArr=null;
	    return fields;
	}
    var currentElement = document.getElementById(elementName);
    if(currentElement.onkeydown!=null)
    {
        currentElement.onkeydown();
        return;
    }
    var collection  = GetFields();
    var tabIndex = currentElement.tabIndex+1;
    
    for(var index=0;index<collection.length;index++)
    {
        if(collection[index].getAttribute("group") == m_curGroupAlias)
        {
            if(collection[index].tabIndex == tabIndex) 
            {
                try
                {
                    collection[index].focus();
                    collection[index].focus();
                }
                catch(err){}
                finally
                {
                    break;
                }
            }
        }
    }
}

///check if the value of the lookup input is equal to the current data value of the
/// element in the state, if true call onchange for the input element
function IsOnChange(textObj,tmpRow)
{
    try
    {
        if(textObj.onchange == null) return;
        var tmpArr=AO_GetBOAliasFromID(textObj.id);
    	
	    var objBOAlias=tmpArr[0];
	    var name = tmpArr[1];
	    if (name=="") name = textObj.name;
	    var parent = m_primaryXML.selectNodes('/root/' + objBOAlias);
	    var node=null;
    	
	    if (parent.length)
		    node = parent(0).selectSingleNode("row[@number="+String(tmpRow+1)+"]/"+name);
    	
	    if (node==null) return;
    	
	    var nodeDT=node.dataType;
	    if (nodeDT==null) nodeDT=node.getAttribute("dt:dt");	
	    var previousData=m_primaryXML.selectSingleNode("/root/"+objBOAlias+"/row[@number="+String(tmpRow+1)+"]/"+name);		
	    if(previousData.text == textObj.value) return;
	    textObj.onchange();
	}
	catch(err){}
}
//// <summary>
/// This function automatically subscribes to the onchange event of each input element (on statefull module new, maint)
/// that reflects the value from the state. This function is called when the onchange event occurs (when the content of input is changed).
/// The function calls the following hook functions:
/// 1.f_col_validate - before applying the changes on the state validate the content, if the hook returns error message,
/// display the message and roll back the changes.
/// 2.f_col_populate - called after the changes committed to the state, put business logic in this function.
/// </summary>
/// <param name="textObj">[required]Called input element that dispatches the event</param>
/// <param name="tmpRow">[required]row id</param>
/// <param name="elmID">[optional]Delegates the call to different input by specifying the element ID.</param>
/// <returns>true/false</returns>
function ItemChange(textObj,tmpRow,elmID) 
{
    function compareFunc(a,b)
    {
        var index1 = a.tabIndex;
        var index2 = b.tabIndex;
        if(index1<index2) return -1;
        if(index1>index2) return 1;
        return 0;
    }
	function GetNextInputBox(rowID)
	{
		if( m_XrefSpecs[currTab] != null ) return;
		//var pageObj = m_action=="new"?document.getElementById("_TabControl"):document.getElementById(m_currentAlias);
		var lastFocusedObj = document.all(rowID);
		if( typeof(lastFocusedObj.length) != "undefined")
		{
			lastFocusedObj = lastFocusedObj[currRow[currTab]];
		}
		var tableRowObj = lastFocusedObj.parentNode.parentNode;
		
		var inputCollection = new Array();
		var elamentsArr = _TabControl.all.tags("input");
		for (var i=0;i<elamentsArr.length;i++)inputCollection[i]=elamentsArr[i];
		elamentsArr = _TabControl.all.tags("select");
		for (var j=0;j<elamentsArr.length;j++,i++)inputCollection[i]=elamentsArr[j];
		elamentsArr = _TabControl.all.tags("textarea");
		for (var k=0;k<elamentsArr.length;k++,j++,i++)inputCollection[i]=elamentsArr[k];
		elamentsArr=null;
		inputCollection.sort(compareFunc);
		var len = inputCollection.length;
		for(var i=0;i<len;i++)
		{
			if(inputCollection[i].id==(lastFocusedObj.id) && (i<(len-1)))
			{
				return inputCollection[i+1];
			}
		}
	}
	try
	{
	    if(textObj.getAttribute("is_disabled") == "true") return;
	    var tagNameStr = textObj.tagName;
	    if(textObj.parentNode == null)textObj=document.getElementById(textObj.id);
		if( textObj.getAttribute("OnlyWhenDataChanged") == "true" || 
		    (textObj.parentNode.getAttribute("OnlyWhenDataChanged") == "true"))
		{
			if( textObj.getAttribute("PreservedPreviousData") != textObj.value)
				textObj.setAttribute("PreservedPreviousData",textObj.value);
			else
				return;
		}
		//invoke hook
		validateObj.InvokeHook("RunCodeBeforeItemChange",textObj,tmpRow,elmID);
		if(glbPreventOnChange){
			window.status=textObj.id+" not changed";
			glbPreventOnChange = false;
			return;
		}
		//get element from point
		var objFromPt = null;
		//check which event raise the onchange event
		//ASAP IL0710100025        
		if(textObj.getAttribute("tabkey")=="true")
		{
		    textObj.removeAttribute("tabkey")
		}
		else
		{
		    objFromPt = validateObj.IsNothing(window.event)?null:document.elementFromPoint(window.event.x, window.event.y);
		}
		var objUniqueId = null;
		var objId = null;
		if( objFromPt != null )
		{
			try
			{
				//check if the element is button input with onclick event
				objFromPt = objFromPt.parentElement.parentElement.parentElement.parentElement;
				//only for struct button
				if(!validateObj.IsNothing(objFromPt.id) && objFromPt.tagName.toLowerCase() == "button" 
					&& !validateObj.IsNothing(objFromPt.onclick) && objFromPt.getAttribute("PreserveObjectEvent")==null)
				{
				    //var re = new RegExp();
	            	//re.compile("(function anonymous\\(\\)\\{return DeleteRow\\(.*)|(function anonymous\\(\\)\\{return DeleteXrefRow\\(.*)","gi");
	            	re = /(return DeleteRow\(.*)|(return DeleteXrefRow\(.*)/gi;
	            	var sFunc = objFromPt.onclick.toString();
	            	
	            	if(re.exec(sFunc)!=null) return false;
					objUniqueId = objFromPt.uniqueID;
					objId = objFromPt.id;
				}
			}
			catch(err)
			{/*do nothing*/}
		}
		var value = textObj.value;
		var textObjPreserve = new Object();
		textObjPreserve.id = textObj.id;
		textObjPreserve.uniqueID = textObj.uniqueID;
		var className = textObj.className;
		var tmpArr;
		if (elmID==null) tmpArr=AO_GetBOAliasFromID(textObj.id);
		else tmpArr=AO_GetBOAliasFromID(elmID);
		var objBOAlias=tmpArr[0];
		var name = tmpArr[1];
		if (window.event)window.event.cancelBubble=true;
		if (name=="") name = textObj.name;
		AO_ShowElementID(textObj,tmpRow,objBOAlias);
		var parent = m_primaryXML.selectNodes('/root/' + objBOAlias);
		//var isActiveElement = document.activeElement.id==
		var node=null;
		
		try{
			if (parent.length)
				node = parent(0).selectSingleNode("row[@number="+String(tmpRow+1)+"]/"+name);
			
			if (node==null) 
			{
				WriteError ("Field '"+ name +"' does not exist in the XML of '" + objBOAlias + "' in row " + String(tmpRow+1) + "." );	
			}
			var nodeDT=node.dataType;
			if (nodeDT==null) nodeDT=node.getAttribute("dt:dt");	
			var previousData=m_primaryXML.selectSingleNode("/root/"+objBOAlias+"/row[@number="+String(tmpRow+1)+"]/"+name);		
			if (textObj.type!=null && textObj.type.toLowerCase()=="checkbox") 
			{
				if (textObj.checked) value="on";
				else value="off";
			}		
			var val=value;
			
			switch(nodeDT){	
				case "time":
				    if( textObj.getAttribute("time") != null ) 
				    {
				        val=value=textObj.getAttribute("time");
				    }
					if (val.trim()!="")
					{
						var match=value.match(/^([0-9]|[0-1]\d|2[0-3])(\:[0-5]\d{0,1}){1,2}(\s*[a|p|A|p][m|M]){0,1}$/);
						if (match==null) 
						{
							WriteError(":MSK005");
    						textObj.value=AO_FormatDateTime(previousData.nodeTypedValue,"time");
							return false;
						}
					}
					break;			
				case "date": case "datetime":
					break;
				case "number": case "float": case "double": case "r4": case "r8": case "int":	
				case "integer":				
					var val=AS_String2Num(value);
					if (isNaN(val)) 
					{
						WriteError(":"+val);
						textObj.value=AS_Num2String(previousData.nodeTypedValue);
						return false;
					}
					
											
			}
			var errMsg = validateObj.InvokeHook("f_col_validate",objBOAlias,name,val,String(tmpRow+1));
			if (errMsg.trim().length) {
				if (previousData!=null) {
					var txt=previousData.text;
					var val;
					switch (textObj.type.toLowerCase()){
						case "checkbox":
							val=m_primaryXML.selectSingleNode("/root/ddlb/"+name);
							if (val!=null){
								if (txt==val.getAttribute("on"))textObj.checked=true;
								else textObj.checked=false;						
							}			
							else
							{
								if (textObj.value_on!=null) 
									if (txt==textObj.value_on)textObj.checked=true;
							}		
							break;
						default:
							var nodeDT=previousData.dataType;
							if (nodeDT==null) nodeDT=previousData.getAttribute("dt:dt");						
							switch(nodeDT){						
								case "date":
									var tmpDate=AO_UDF(txt);														
									if (tmpDate.charAt(0)==":") {
										return false;
									}
									textObj.value=tmpDate;
									break;
								case "time":
									if (txt!="")
										textObj.value=AO_FormatDateTime(txt,"time");
									else //added by Alex to handle the case when the previous value was an emty one. In case of error insert previous empty value
										textObj.value="";
									break;
								case "number": case "float": case "double": case "r4": case "r8": case "int":	
								case "integer":												
									textObj.value=(textObj.tagName.toLowerCase() == "select"?previousData.nodeTypedValue:AS_Num2String(previousData.nodeTypedValue));
									break;
								default:
									if (textObj.getAttribute("maxlength")!=null) txt=(""+txt).substr(0,textObj.getAttribute("maxlength"));
									textObj.value = txt;
									if(className!=null)
									{		
										if( className.indexOf("input_numeric") > -1 || className.indexOf("input_numeric1")> -1
											|| className.indexOf("positive_numeric")> -1 || className.indexOf("input_mod") > -1)
										{
											textObj.value=!isNaN(AS_String2Num(txt))?txt:AS_Num2String(txt);
										}
									}								
							}												
					}
				}
				errMsg=errMsg.trim(); if (errMsg.toLowerCase()=="boxxxx") return false;
				try
				{
				    textObj.focus();
				}
				catch(err){/*do nothing*/}
				invalidData=true;
				WriteError(errMsg);
				return false;
			}
		}
		catch(e){
			//Just Continue...
		}
		//check validation
		if(textObj.getAttribute("ValidateType")!=null)
		{
			switch(textObj.getAttribute("ValidateType"))
			{
				case "Email":
					if(!validator.VlidateEmail(textObj.value))
					{
						AO_custMsg("A2MT0144","","");
						textObj.focus();
					}
					break;
				case "Phone":
				    if(!validator.VlidatePhone(textObj.value))
					{
					    AO_custMsg("A2MT0653","","");
						textObj.focus();
					}

				default:
					//
			}
		}
		if (!CreateXMLDOM()) return false;
		if (parent.length){ //var node = parent(0);
			node = parent(0).selectSingleNode("row[@number="+String(tmpRow+1)+"]/"+name);
			if (node==null) 
			{
	// astea-trans=placeholder;placeholder;N;astea-trans=placeholder;placeholder;N;astea-trans=text;TXTASP$doesnt_exist_vx;N;
				throw ("Field '"+ name +"'"+" does not exist in the XML of '"+objBOAlias+"' in row " + String(tmpRow+1) + ".");
			}
			var byteLength=node.getAttribute("len");
			if (byteLength==null || byteLength=="") byteLength=-1;
			byteLength=parseFloat(byteLength);
			var msgMax="Maximum allowed length is"+" "+byteLength;
			var msgNumber="Invalid numeric format:";
			switch (textObj.type.toLowerCase()){
				case "checkbox":
					var arrValues=AO_GetCheckBoxOnOffValues(textObj,name);
					var value_on="Y",value_off="N";
					if (arrValues!=null)
					{
						value_on=arrValues["on"];
						value_off=arrValues["off"];
					}
					value=(textObj.checked)?value_on:value_off;
					if ((byteLength>-1) && ((""+value).length>byteLength))
						throw msgMax;					
						
					node.text=value;
					break;
				default:
					try{				
						if ((""+value).trim().length==0) {						
							node.text="";
						}
						else{
							var nodeDT=node.dataType;
							if (nodeDT==null) nodeDT=node.getAttribute("dt:dt");						
							switch(nodeDT){		
											
								case "date": case "time" : case "datetime":
									var tmpDate=AO_FormatDateTime(value,nodeDT);														
									if (tmpDate.charAt(0)==":") {
									    WriteError(AO_GetMesg(tmpDate.substr(1)));
							            textObj.value=DisplayDateMask(node.text);
										return false;
									}
									if (node.dataType=="date") node.nodeTypedValue=tmpDate; 
									else node.text =tmpDate; 					
									break;
								case "number": case "float": case "double": case "r4": case "r8": case "int":	
								case "integer":		
									//handle modulo number	
									var val=(className.indexOf("input_mod") > -1)?parseInt(AS_String2Num(value)):AS_String2Num(value);	
									if( className.indexOf("input_mod") > -1 )
									{
										textObj.value = AS_Num2String(val);
									}
									if (isNaN(val)) throw AO_GetMesg(val);
									node.nodeTypedValue = val;					
									value=val;
									break;								
									
								default:
									if ((byteLength>-1) && ((""+value).length>byteLength)) 
										throw msgMax							
									node.text = value;	
									if(className!=null)
									{		
										if( className.indexOf("input_numeric") > -1 || className.indexOf("input_numeric1")> -1
											|| className.indexOf("positive_numeric")> -1 || className.indexOf("input_mod") > -1)
										{
											//handle modulo number
											var val =(className.indexOf("input_mod") > -1)?parseInt(AS_String2Num(value)):AS_String2Num(value);
											if (isNaN(val)) throw AO_GetMesg(val);
											node.nodeTypedValue = val;
											if( className.indexOf("input_mod") > -1 )
											{
												textObj.value = AS_Num2String(val);
											}
										}
									}										
							}					
						}
					}catch(e){
						var descr;
						name=name+"_t";
						var e_descr="";
						if (typeof(e)=="string") e_descr=e;
						else e_descr=e.description;
						name=document.all(name);
						descr=(name!=null)? name.innerText.replace(/:|\*/g,""):node.nodeName;
						WriteError(descr+":"+e_descr);
						if (msgMax != e_descr)					
							textObj.value=node.text;
						textObj.focus();
						return false;
					}
			}
						
			_RefreshTitle();
			if (m_DoChanges) SetFieldStatus(node,8,objBOAlias,tmpRow);
			else  SetFieldStatus(node,0,objBOAlias,tmpRow);
			if(!m_lockManager.CliamLock(textObj.uniqueID))return;
			//SetStatusUpdated(objBOAlias, tmpRow);
			var newVal = ""+node.text;
			var textObjUniID = textObj.id==""?null:document.getElementById(textObj.id).uniqueID;
			m_pageRecreate = false;
			//activate hook function
			validateObj.InvokeHook("f_col_populate",objBOAlias,name,newVal,String(tmpRow+1));
			//activate hook function
			validateObj.InvokeHook("_CalculateField",textObj.compfield);
			//get the input element and check if he recreated
			objFromPt = document.getElementById(objId);
			if((objUniqueId != null) && (objId != null) && 
				(objFromPt != null) && (objFromPt.uniqueID != objUniqueId))
			{
				//invoke the onclick event
				var eventObj = document.createEventObject();
				objFromPt.fireEvent("onclick",eventObj);
			}
			if (typeof(currRow[currTab]) != "undefined") 
			{
			        var originalObj = document.all(textObjPreserve.id);
			        if( originalObj != null && typeof(originalObj.length) != "undefined" )
			        {
	    		        if( typeof(currRow[currTab])!= "undefined" && typeof(originalObj.length) != "undefined" && typeof(originalObj.tagName)=="undefined")
    				        {
		    		            if ((typeof(tmpRow) != "undefined") && (tmpRow < originalObj.length)) originalObj = originalObj[tmpRow];
			    	            else originalObj = originalObj[currRow[currTab]];
				            }
				        if( typeof(originalObj.length) != "undefined" && typeof(originalObj.tagName)=="undefined" && originalObj.length < tmpRow )originalObj = originalObj[tmpRow];
				        if( typeof(originalObj.uniqueID)!= "undefined" && textObjPreserve.uniqueID != originalObj.uniqueID )
				        {
					        var inputToFocus = null;
					        if(!m_tabKeyDown)
					        {
					            inputToFocus = document.all(textObjPreserve.id);
					            if(typeof(inputToFocus.length) != "undefined")
					            {
					                inputToFocus = inputToFocus[tmpRow];
					            }
					        }
					        else inputToFocus = GetNextInputBox(textObjPreserve.id);
					        if(inputToFocus!=null)
					        {
						        try
						        {
							        if(tagNameStr == inputToFocus.tagName)
						            {
							            inputToFocus.focus();
							            inputToFocus.focus();
							            m_skipFocusOnFirst = true;
							        }
						        }
						        catch(err)
						        {/*do nothing*/}
					        }
				        }
			        }
			}
			m_tabKeyDown = false;
  			return true;
		}
	}
	catch(err)
	{
		WriteError(err);
		return false;
	}	
	finally
	{
		m_lockManager.ReleaseLock(textObj.uniqueID);
		//if the page was recreated while on change event occur call the function that
        //set the focus on the next input element
        if(m_action == "new" && m_pageRecreate 
        && ItemChange.caller.caller==null) 
            FocusOnNextInput(textObj.id);
	}
}

function SetStatusDeleted(label, row) {
	return SetRowStatus(label, row, 2);
}

function SetStatusNew(label, row) {
	return SetRowStatus(label, row, 4);
}

function SetStatusUpdated(label, row) {
	return SetRowStatus(label, row, 8);
}

function AddRow(label, strXML) {
	try
	{
		var oXMLNode = new ActiveXObject("MSXML2.DOMDocument");
		oXMLNode.loadXML(strXML);

		var parent = currXMLDoc.getElementsByTagName(label);	
		parent(0).appendChild(oXMLNode.selectSingleNode("row"));

		parent = null;	
		oXMLNode = null;
	}
	catch(err)
	{/*do nothing*/}
	return true;
}

function UpdateRow(label, oldNode, strXML) 
{
	try
	{
		var oXMLNode = new ActiveXObject("MSXML2.DOMDocument");
		oXMLNode.loadXML(strXML);

		var parent = currXMLDoc.getElementsByTagName(label);
		var newNode = oXMLNode.selectSingleNode("row");
		
		parent(0).replaceChild(newNode, oldNode);

		parent = null;	
		newNode = null;
		oXMLNode = null;
	}
	catch(err)
	{/*do nothing*/}
	
	return true;
}
/// <summary>
/// Modifies the status of row.
/// </summary>
/// <param name="label">[required]bo name</param>
/// <param name="row">[required]row number</param>
/// <param name="status">[required]status</param>
/// <returns>true/false</returns>		
function SetRowStatus(label, row, status) 
{
	try
	{
		var rowNode;
		if (!CreateXMLDOM()) return false;
		var parent = currXMLDoc.getElementsByTagName("root/"+label);

		if (currTab != "row")
 			rowNode = parent(0).selectSingleNode("row[@number="+String(row+1)+"]");
 		else
 			rowNode = parent(0);	 	
		if (!(parseInt(rowNode.getAttribute("status")) & 2))
			rowNode.setAttribute("status",rowNode.getAttribute("status") | status);

		parent = null;	
		rowNode = null;
	}
	catch(err)
	{/*do nothing*/}
	return true;
}

/// <summary>
/// Modifies the specified field according to the specify status. For example, for update by bitwise operation,
/// field_id status equals 4, and the field was deleted. The field status was modified by the 4|2 operation.
/// To modify the row status we must pass the BO name and the row number.
/// </summary>
/// <param name="field">[required]the field XML element</param>
/// <param name="status">[required]the status</param>
/// <param name="boAlias">[optional]bo name</param>
/// <param name="row">[optional]row number</param>
/// <returns>true/false</returns>
function SetFieldStatus(field,status,boAlias,row)
{
	try
	{
		var attr=field.getAttribute("status");
		
		if (!(parseInt(attr) & 2)){
			if (status==0) attr=0;		
			field.setAttribute("status", attr | status);
			if ((row!=null) && (boAlias!=null)){
					return SetRowStatus(boAlias, row, status);			
			}
		}
	}
	catch(err)
	{/*do nothing*/}
	return false;
}


function AO_SetNextPrevScrollerButtons(a_localFunctionName)
{
	if (a_localFunctionName==null || (""+a_localFunctionName).trim()=="") return;
	var elm=document.getElementById("btn_prev_scrl");
	if (elm!=null) elm.onclick=new Function(a_localFunctionName+"('prev')");
	elm=document.getElementById("btn_next_scrl");
	if (elm!=null) elm.onclick=new Function(a_localFunctionName+"('next')");
}

/// <summary>
/// Collects the fields from the QBE ond to build and execute the search criteria, and displays the results on the scroller.
/// section.
/// </summary>
/// <param name="noRetrieve">[optional, default false] if true do not execute the retrive and return the search criteria</param>
/// <param name="direction">[required] the execution direction prev or next</param>
/// <param name="superSortHash">[optional] supporting the server side sorting. this param is filled only if called from "AO_Sort" and 
///  and trasnfers 3 server search params: sort value, sort direction, and forced sort (if the sort buttons were pressed or search. default - false.)</param>
/// <returns>true/false, if noRetrieve is false return the search criteria</returns>
function ScrollerRetrieve(noRetrieve,direction,superSortHash) 
{
    if(CheckQbeMandatory(_searchTop)) return;
	m_PageIndicator.Busy();
	var pos;
	var field;
	var elementsArr;
	var fields=new Array();
	var colName;
	var strHTML;
	var indx = 0;
	var strContent;
	var strFields = new Array();
	var strValues = new Array();
  	var strTypes=new Array();
  	var strOperators=new Array();
	m_currentRow[currTab] = null;
	currRow[currTab] = null;
	//ASAP #IL0802180004       
	//get the currently active element, and return to it after the retrieve is executed
	try
	{
	    m_actvElement = document.activeElement.id; 
	}catch(err){}
	var searchXML=GetXSLDocument("searchXML"+m_BCName);
	var fieldName="";
	var currentPageNum=1,pagesCount;
	var searchCustomFilter = null;
	
	var userData = m_ControlFrame.m_userData;
	try{	
	    
		elamentsArr = _searchTop.all.tags("input");
		for (var i=0;i<elamentsArr.length;i++)fields[i]=elamentsArr[i];
		elamentsArr = _searchTop.all.tags("select");
		for (var j=0;j<elamentsArr.length;j++,i++)fields[i]=elamentsArr[j];
		elamentsArr = _searchTop.all.tags("textarea");
		for (var k=0;k<elamentsArr.length;k++,j++,i++)fields[i]=elamentsArr[k];
		elamentsArr=null;
		if (fields.length == 0) return;

		for (i = 0; i < fields.length, field = fields[i]; i++)
		{
			with (field){
				if (type == "button") continue;
				if (type == "checkbox")
				{
					var arrValues=AO_GetCheckBoxOnOffValues(field,name);
					
					if (arrValues!=null)
					{
						value_on=arrValues["on"];
						value_off=arrValues["off"];
						value=checked?value_on:value_off;
					}
				}
				//check if there is a mandatory field in QBE
				if ((field.className).indexOf("mandatory")!=-1)
				{
					if(field.value=='')
					{
						alert('You must fill the mandatory fields!');
						return false;
					}
				}
				//if ((value.length > 0) && (field.className.length > 0))
				//removing ASAP fix #IL0708270029 for seimans stoppers
				if (value.length > 0)
				{
					colName = id;
					
					pos = colName.search("\\#");
					if (pos != -1) colName = colName.substring(0, pos);
					
					strFields[indx] = colName;
  					strTypes[indx]=(typeof(field_type)=="undefined")?"string":field_type;
  					strOperators[indx]=(typeof(operator)=="undefined")?"like":operator;
					if(strTypes[indx].indexOf("date")>-1) {
						var dtVal=GoInternal(value,"date");
						if (dtVal.charAt(0)==":") {
							WriteError(dtVal.substr(1));
							return false;
						}
						if 	(strOperators[indx].indexOf(">")>-1)
						{
							dtVal=dtVal + "T00:00:00:000";
						}
						else if (strOperators[indx].indexOf("<")>-1)
						{
							dtVal=dtVal + "T23:59:59:999";
						}					
						
						strValues[indx]= dtVal;
					}				
					else strValues[indx] = value;  								
					indx ++;
				}
			}
		}
	    
		//# added by eli harel collacte all fields that are not search input
		for (i = 0; i < fields.length, field = fields[i]; i++)
		{
			with (field)
			{
				var fieldvalue = "";
				
				switch(type)
				{
					case "checkbox":
						fieldvalue = checked==true?"true":"";
						break;
					default:
						fieldvalue = value;
				}
				//
				//field that are not for search filter class name is empty
				if( className == "input_search" || fieldvalue == "") continue;
				
				if( searchCustomFilter == null )
				{
					searchCustomFilter = new ActiveXObject("MSXML2.DOMDocument");
					searchCustomFilter.loadXML("<customfind/>");
				}
				
				var elm = searchCustomFilter.documentElement;
				elm.setAttribute(id,fieldvalue);
			}
		}
		if (direction!=null)
		{	
			if (typeof(m_primaryXML)=="undefined") return;
			currentPageNum=m_primaryXML.selectSingleNode("/root/@currentPage");
			if (currentPageNum!=null) currentPageNum=parseInt(currentPageNum.text);		
			else currentPageNum=1;
			if (m_TotalPagesCount!=null)
				pagesCount=m_TotalPagesCount;
			else
			{
				pagesCount=m_primaryXML.selectSingleNode("/root/@pagesCount");
				if (pagesCount!=null) 
				{
					m_TotalPagesCount=parseInt(pagesCount.text);
					pagesCount=m_TotalPagesCount;
				}
				else return;
			}
			if (direction=="next")
			{
				if (pagesCount>currentPageNum) currentPageNum++;
				else return;
			}
			if (direction=="prev")
			{
				if (currentPageNum>1) currentPageNum--;
			}
		}
		else if (noRetrieve!=true)
		{
			m_TotalRecordCount=null;
			m_TotalPagesCount=null;
		}
		if(m_currentPageNumber!=null)currentPageNum=m_currentPageNumber;
		m_searchString=BuildXML4Search(m_EntityName, m_QueryName, strFields, strValues,strTypes,strOperators,currentPageNum);  
		try{
		        var str_searchString=f_pre_scrl_retrieve(m_searchString);
    	}catch(e){/* do nada */}
    	try{
    	    if(_GetGlobalVar("superSortHash")!=null)
    	    {
    	        superSortHash = _GetGlobalVar("superSortHash");
    	        _RemoveGlobalVar("superSortHash");
    	    }
        	if (str_searchString!=null) m_searchString=str_searchString;
			    if (IsServerQBESortEnabled())
			        m_searchString=AO_ServerSort(m_searchString, superSortHash, m_primaryXSL);
	    }catch(e){}
		if (typeof(noRetrieve)=="undefined") var noRetrieve=false;
		if (noRetrieve==true) return m_searchString;
        AO_LoadingMsg(document.all._scroller);
		var strContent=false;	
		var SOAPResult=SOAP_RetrieveXML(m_searchString);
		
		if (SOAP_IsError(SOAPResult)){		
			if(AO_CheckSessionTimeOut(SOAPResult)) return;
			m_primaryXML = null;
			document.all._scroller.innerHTML = "";		
			_Information.innerText = WriteError(SOAP_Format_Error_Message(SOAPResult),true);
		}else
		{
			m_primaryXML = SOAP_Get_XMLObj(SOAPResult);
			if (m_TotalRecordCount==null)
				m_TotalRecordCount=m_primaryXML.selectSingleNode("/root").getAttribute("totalRecordCount");		
			if (m_TotalPagesCount==null)
				m_TotalPagesCount=m_primaryXML.selectSingleNode("/root").getAttribute("pagesCount");						
			if (m_TotalRecordCount=="") m_TotalRecordCount=null;		
			if (m_TotalRecordCount==-2) m_TotalPagesCount=1000;
			var _ddlbXML=searchXML.documentElement.selectNodes("//ddlb");
			if (_ddlbXML!=null)
				for (j=0;j<_ddlbXML.length;j++)
					m_primaryXML.lastChild.appendChild(_ddlbXML[j].cloneNode(true));
			try{
				f_post_scrl_retrieve();
			}catch(e){/* do nada */}
			var sign, pos, tmpStr, tmpPos;
			m_primaryXSL = _addIncludes(m_primaryXSL);
			m_XSLURL=m_primaryXSL.url;
			
			var sortField = m_primaryXSL.selectSingleNode("//@order-by");
			var fieldValue = sortField.value;
			
			if (fieldValue.search("-") != -1)
			{
				sign = "-";
			}else
			{
				sign = "+";
			}
			//added by eli harel to support new sorting function
			if(fieldValue.match(/\+|\-/gi))
            {
			    if( fieldValue.indexOf(";") > -1 )
			    {
				    fieldValue = fieldValue.split(";")[0].substr(1)+"@"+fieldValue.split(";")[1].substr(1);
			    }
			    else
			    {
				    fieldValue = fieldValue.substr(1);
			    }
			}
			//end added by eli harel
			var sortValue = m_primaryXSL.selectSingleNode("//cdata()");
			var sortString = ""+sortValue.nodeValue;
		
			pos = sortString.search("var sort = ");
			if (pos != -1)
			{
				tmpStr = sortString.substr(pos);
				tmpPos = tmpStr.search(";");
				tmpStr = sortString.substring(pos, pos + tmpPos);
				sortString = sortString.replace(tmpStr, "var sort = '" + fieldValue + "'");
			}
						
			pos = sortString.search("var sign = ");
			if (pos != -1)
			{
				tmpStr = sortString.substr(pos);
				tmpPos = tmpStr.search(";");
				tmpStr = sortString.substring(pos, pos + tmpPos);
				sortString = sortString.replace(tmpStr, "var sign = '" + sign + "'");
			}
			if (sortString.length > 0) sortValue.nodeValue = sortString;
			
			_bo_rows_show_msg(null, m_TotalRecordCount,currentPageNum);
			//strHTML = m_primaryXML.transformNode(m_primaryXSL);
			AO_SaveCacheHistory(m_BCName,m_primaryXML,fieldValue,sign);	
			strHtmlContent = m_TransformObj.TransformScroller(null);
					
			var elm=document.getElementById("table_rows_count_td");
			if (elm!=null)
			{
				elm.innerText="";
			}				
			if (strHtmlContent.length > 0) {			
				//document.all._scroller.innerHTML = strHTML;
				m_XrefSpecs[currTab]=null;
				//MarkScrlRow(null,true);
				try{
					var maxLimitReached=false;	
					var userDataKey = "search_results"+m_BCName+"_"+_GetPageName(document.location.href).toLowerCase()+_GetGlobalVar('PortalUserLogin');			
					
					var xmlNode=new ActiveXObject("MSXML2.DOMDocument");
  					xmlNode.loadXML(m_searchString);
					var primaryXMLString="";
					
					if (rb_cache.value.trim()!="cache")//ASAP #IL0406200008
					{
						maxLimitReached=true;
						primaryXMLString="<root xmlns:dt=\"urn:schemas-microsoft-com:datatypes\"/>";
					}				
					else
					{
						primaryXMLString=m_primaryXML.selectSingleNode("//root").xml;
					}
					userData.XMLDocument.loadXML(primaryXMLString);			
					//AO_SaveCacheHistory(m_BCName,primaryXMLString);
					userData.XMLDocument.selectSingleNode("/root").setAttribute("show_advanced",String(!m_show));				
					
					if (m_TotalRecordCount!=null)
						userData.XMLDocument.selectSingleNode("/root").setAttribute("Total_Records_Count",m_TotalRecordCount);
					if (m_TotalPagesCount!=null)
						userData.XMLDocument.selectSingleNode("/root").setAttribute("Total_Pages_Count",m_TotalPagesCount);
						
					userData.XMLDocument.documentElement.appendChild(
						xmlNode.selectSingleNode("//Find"));	
					//# added by eli harel adding the custom filter to the user data cache
					if( searchCustomFilter != null )
					{
						userData.XMLDocument.documentElement.appendChild(
						searchCustomFilter.documentElement);
					}
					
					if( interval_digit_chx.checked == true )
					{
						var tmpElm = userData.XMLDocument.createElement("IntervalDetails");
						tmpElm.setAttribute("interval",interval_digit.value);
						userData.XMLDocument.documentElement.appendChild(tmpElm);
					}
					
	// astea-trans=placeholder;placeholder;N;astea-trans=placeholder;placeholder;N;astea-trans=text;TXTVIRTUAL$cached_resaults_vx;N;
					var informationText="<Message body='"+_Information.innerText+" - "+"CACHED RESULTS"+"'/>";
					if (maxLimitReached) informationText="<Message body=''/>";
					if (xmlNode.loadXML(informationText)){
						userData.XMLDocument.documentElement.appendChild(
							xmlNode.selectSingleNode("//Message"));
					}
					if (xmlNode.loadXML("<Session id='"+_GetGlobalVar('PortalUserLogin')+"'/>")){
						userData.XMLDocument.documentElement.appendChild(
							xmlNode.selectSingleNode("//Session"));
					}
					
					if (xmlNode.loadXML("<Sort order='"+fieldValue+"' sort='"+sign+"'/>")){
						userData.XMLDocument.documentElement.appendChild(
							xmlNode.selectSingleNode("//Sort"));
					}				
					
					var cache_type="<Cache method='";
					cache_type+=rb_cache.value.trim();
					//if (rb_cache2.checked) cache_type+="refresh";
					//if (rb_cache3.checked) cache_type+="no_cache";
					cache_type+="'/>";
					if (xmlNode.loadXML(cache_type)){
						userData.XMLDocument.documentElement.appendChild(
							xmlNode.selectSingleNode("//Cache"));
					}
					userData.SaveValue(userDataKey,null);
					xmlNode=null;				
				}catch(e){}
			}
				
			var btnPrev=document.getElementById("btn_prev_scrl");
			var btnNext=document.getElementById("btn_next_scrl");
			if (btnPrev!=null && btnNext!=null)
			{
				if (m_primaryXML.selectSingleNode("/root/@hasMore").text=="no") btnNext.disabled=true;
				else btnNext.disabled=false;
				if (direction!=null)
				{
					currentPageNum=m_primaryXML.selectSingleNode("/root/@currentPage");
					if (currentPageNum!=null) currentPageNum=parseInt(currentPageNum.text);		
					else currentPageNum=1;				
					if (m_TotalPagesCount!=null)
					{					
						if (currentPageNum>1)
							btnPrev.disabled=false;
						else 
							btnPrev.disabled=true;
					}
					else 
						btnPrev.disabled=true;
				}
				else 
					btnPrev.disabled=true;
			}

		}
		//setting scroller size for behavior.
		var innerWindow = document.getElementById("_searchTop");
        innerWindow = innerWindow.parentElement.parentElement.parentElement.parentElement.parentElement.parentElement;
        var menuDiv = document.getElementById("main_application_header");
        
        _SetGlobalVar("ScrollerNewSize",document.body.clientHeight - menuDiv.clientHeight - innerWindow.clientHeight - 55);        
        	
		//AO_EndWait();
		return;
	}
	catch(e)
	{
		//AO_EndWait();
		WriteError(e);
	}	
	finally
	{
		m_PageIndicator.NoBusy();
		if (m_actvElement != null && m_actvElement != "")
		{
		    m_actvElement = document.all(m_actvElement);
		    if(m_actvElement != null) 
		    {
		        if (typeof(m_actvElement.length) != "undefined")
			    {
			        m_actvElement = m_actvElement[0];
			    }
		        //ASAP #IL0802180004 - return the focus to previously active element
		        setTimeout("m_actvElement.blur();m_actvElement.focus(); ", 100);
		    }
		}
		else
		{
		    setTimeout("AO_FocusFirstObject(null,'ScrollerRetrieve')", 100);
		}
		window.setTimeout(AO_DrawScrollerFromCache,1);
	}
}
function MarkScrlRow_State(){
	var objPage=document.getElementById(m_currentAlias);
	if (objPage==null)return;
	var allTRs=objPage.getElementsByTagName("TR");
	var selectedTR=null;
	for (var i=0;i<allTRs.length;i++){
		if (allTRs[i].className.search(/row1|row2/ig)>-1){
			selectedTR=allTRs[i];
			break;
		}
	}
	if (selectedTR!=null) {
		selectedTR.scrollIntoView(true);
		var tbl=selectedTR;
		for(;tbl.tagName.search(/html|div|table/gi)==-1;tbl = tbl.parentElement);
		if (tbl.tagName.search(/html|div/gi)>-1 ) return false;					
		tbl.focus();
		if (tbl.onclick==null) return;
		var strFunc=tbl.onclick.toString();
		if (strFunc.search(/SelectRow/g)>-1 )		SelectRow(tbl,selectedTR);
		else if (strFunc.search(/SelectEditableRow/g)>-1 )SelectEditableRow(tbl,selectedTR);
	}

}

function MarkScrlRow(rw,scrlIntoView){

	var scrl=document.all["_scroller"];
	
	if (scrl!=null) scrl=scrl.all("dataDiv");
    if (scrl==null)
    { 
      scrl=document.all["_scroller"];
      scrl=scrl.all.tags("DIV");
    }
      
	if (scrl!=null && scrl.length>=2) scrl=scrl[1];
	if (scrl!=null) scrl=scrl.all.tags("TR");	
	if (scrl!=null && scrl.length!=0){				
		if (m_XrefSpecs[currTab]==null) m_XrefSpecs[currTab]=new Object();	
		if (rw==null){
			if (m_XrefSpecs[currTab].RowID==null) rw=scrl[0];		
			else rw=document.all[m_XrefSpecs[currTab].RowID];
		}
		
		if(rw==null)
		{
			var rowID = new String(m_XrefSpecs[currTab].RowID).trim();
			for(var i=0;i<scrl.length;i++)
			{
				var trId = new String(scrl[i].id);
				if(trId.trim() == rowID)
				{
					rw = scrl[i];
				}
			}
		}
		if (rw!=null && m_XrefSpecs[currTab].RowIndex!=null && MarkScrlRow.caller != KB_ScrollerUpdate)
		{
		    var rowIndex = parseInt(m_XrefSpecs[currTab].RowIndex)-1;
		    rw = rw.parentElement.parentElement.rows[rowIndex];
		}
		if (rw!=null){
			m_XrefSpecs[currTab].RowID=rw.id;
			m_XrefSpecs[currTab].RowIndex = rw.rowIndex+1;
			__RowsCountStr(rw,false)
			var rowID=rw.id.match(/row_(\d\d*)/i);
			if (rowID) {
				m_currentRow[currTab]=rowID[1]-1;
			}
			else {
				m_currentRow[currTab] = rw.rowIndex;
			}			
			rw.style.backgroundColor = "#FFEEA6";
			var elm=document.getElementById("table_rows_count_td");
			if (elm!=null)
			{
				elm.innerText="";
				elm.innerText=(rw.rowIndex+1)+"/"+rw.parentElement.rows.length;				
			}
			
            if(document.getElementById("scrollerDiv")!=null)
            {
              window.setTimeout("ScrollIntoView("+(rw.rowIndex*17)+");",100);
            }
            else if(scrlIntoView!=null)rw.scrollIntoView(scrlIntoView);

		}
	}
}

function ScrollIntoView(height)
{
    document.getElementById("scrollerDiv").scrollTop = height;
}


function ScrollerUpdate(aNavigateTo,oElement) 
{
	var iEnd;
	var iStart;
	var strType;
	var strField;
	var strWhere;
	var node = null;
	var strVal = "";
	var strArgs = "";
	try{
		if (m_currentRow[currTab] == null) return false;
		var rowNode = m_primaryXML.selectNodes("root/row");
		
		if (rowNode.length > 0)
		{
			for (var i = 0; i < m_Arguments.length; i += 2)
			{
				strWhere = m_Arguments[i + 1];
				
				while (true)
				{
					iStart = strWhere.search("&{");
					if (iStart == -1) break;
					iStart += 2;
					strField = strWhere.substr(iStart);
					iEnd = strField.search("}");
					strField = strField.substr(0, iEnd);
					node = rowNode.item(m_currentRow[currTab]).selectSingleNode(strField);
					strVal = node.text;
					strType = node.dataType;
	//				if (strType.toLowerCase()=="string") strVal="'"+strVal;
					node = null;
					strVal=URLEncode(strVal);
					strWhere = strWhere.replace("&{" + strField + "}", strVal);
				}
				strArgs += "&" + m_Arguments[i] + "=" + strWhere;
			}
		}
		
		rowNode = null;

		var userData = m_ControlFrame.m_userData;
		var userDataKey = "search_results"+m_BCName+"_"+_GetPageName(document.location.href).toLowerCase()+_GetGlobalVar('PortalUserLogin');
		//first try to load the data stored in user data
		try
		{
			userData.GetValue(userDataKey);
		}
		catch(err)
		{/*do nothing*/}
		//only if data is stored then continue
		var rowId=m_XrefSpecs[currTab].RowIndex;
		if(userData.XMLDocument.documentElement != null &&
			userData.XMLDocument.xml != "" )
		{
			userData.XMLDocument.selectSingleNode("/root").setAttribute("row_id",rowId);
			_SetGlobalVar("ScrollerRowID",rowId);
			userData.SaveValue(userDataKey);
			//AO_SaveCacheHistory(m_BCName,userData.XMLDocument);
		}
		if(window.event != null && window.event.srcElement != null)
		{
		    if(window.event.srcElement.tagName.toLowerCase() != "td") return;
		    var sItemClickedID = (oElement!=null?oElement.innerText:window.event.srcElement.innerText);
		    strArgs += String.prototype.Format("&WebVar_itemclickedid={0}",sItemClickedID.trim());
		}
		if(window.event.ctrlKey && !window.event.shiftKey && !window.event.altKey)
		{
		    aNavigateTo = aNavigateTo.removeEx("../",1);
		    return OpenNewWindow(aNavigateTo + "?action=retrieve" + strArgs);
		}
		else
		{
		    return _OpenWindow(aNavigateTo + "?action=retrieve" + strArgs);
		}
	}
	catch(err)
	{
		WriteError(err);
		return false;
	}
}

  var m_iTimer=null;
  var m_timerStart=false;  
  function SelectRowByID(id,form_page){	
	if (form_page==null)form_page=true;
  	if (id==-1) return false;
 	if (!m_timerStart)__SRBI(id,form_page);
  	else m_iTimer=setInterval("__SRBI('"+id+"',"+form_page+")",500);
  }
  
  function __SRBI(id,form_page)	{
	if (!m_timerStart) {
		if (m_iTimer!=null) clearInterval(m_iTimer);
		m_iTimer=null;
	}
	else return;		
	document.body.style.cursor="default";
  	var elm=document.all[id];	
  	if (elm==null) return false;
  	for (var tbl=elm;(tbl.tagName.toLowerCase()!="body") &&(tbl.onclick==null);tbl=tbl.parentElement);
  	if (tbl.tagName.toLowerCase()=="body") return false;
  	if (!elm.tabIndex) elm.tabIndex=0;
  	elm.focus();
  	tbl.onclick();
  	if (form_page) 	try{RowEdit("",form_page);}catch(e){/**/}
  	else try{SelectEditableRow(tbl);}catch(e){/**/}
  	
  }

  function GetRowID(xmlCriteria,rowFormat){	
  	if (rowFormat==null) rowFormat="row_";
  	var xslStr='<xsl:stylesheet xmlns:xsl="uri:xsl"><xsl:template match="/">'+
  		'<xsl:for-each select="'+xmlCriteria+'">'+rowFormat+'<xsl:value-of select="@number"/>'+
  		'</xsl:for-each></xsl:template></xsl:stylesheet>';
  	var xmlTrans=new ActiveXObject("MSXML2.DOMDocument");
  	if (xmlTrans.loadXML(xslStr)){		
  		try{
  			var res=m_primaryXML.transformNode(xmlTrans);
  			xmlTrans=null;
  		}catch(e){WriteError(e.description);return -1;}
  		return res;
  	}
  	xmlTrans=null;
  	return -1;  	
  	
  }
  

/// <summary>
/// Activated when the user clicks on row on read-only data grid. The function sets Framework variables that 
/// hold the row location according to the current tab(m_currentRow[currTab]).
/// </summary>
/// <param name="aTable">[required] the table element that represent the read-only data grid</param>
/// <param name="rw">[optional, default the table active element]the row element to mark</param>
/// <param name="preserveRowNum">[optional, default false] if true do not modify the current row variable(m_currentRow[currTab])</param>
/// <returns>true/false</returns>
function SelectRow(aTable,rw,preserveRowNum) {
	var cell;
	try{
		if (m_XrefSpecs[currTab]==null) m_XrefSpecs[currTab]=new Object();
		preserveRowNum = typeof(preserveRowNum)=="undefined"?false:true;
		m_XrefSpecs[currTab].xrefPage=null;
		ClearXrefPageToXrefSpecs();
		// 6/10/00 8:46 Meir - Initialize value (prevent of deleting existing rows)
		m_XrefSpecs[currTab].newRow=null;
		//~Meir
		m_currentColumn[currTab] = null; 
		var row ,cell ;
		if (rw!=null) row=cell=rw;
		else row=cell=aTable.document.activeElement;

		
		//Meir 04/07/00 12:00PM - Support editable grid
		if (row.tagName.search(/input|textarea|select/gi) != -1) m_currentColumn[currTab] = row.id;
		if (row.tagName.search(/td|input|select|textarea/gi)!=-1)
			for(;row.tagName.search(/tr|html|body|table/gi)==-1;row = row.parentElement);
		if (row.tagName.search(/html|body|table/gi)>-1 ) return true;
		if(row.getAttribute("row_reference")!=null)
		{
		   row = aTable.all(row.getAttribute("row_reference"));
		}
		//if (row.tagName == "TD") row = row.parentElement;
		//if (row.tagName == "TABLE" || 
		//		row.tagName == "INPUT") return true;
		//~Meir 04/07/00 12:00PM
			
		var len = aTable.rows.length;
		for (var i=0; i < len; i++)
		{
			aTable.rows(i).style.backgroundColor = "";
		}
		m_XrefSpecs[currTab].RowID=row.id;
		
		var preRowNumber = m_currentRow[currTab];
		__RowsCountStr(row,false)
		var rowID=row.id.match(/row_(\d\d*)/i);
		if (rowID) {
			m_currentRow[currTab]=rowID[1]-1;
			MarkRow();
		}
		else {
			m_currentRow[currTab] = row.rowIndex;
			row.style.backgroundColor = "#FFEEA6";
			var elm=document.getElementById("table_rows_count_td");
			if (elm!=null)
			{
				elm.innerText="";
				elm.innerText=(row.rowIndex+1)+"/"+row.parentElement.rows.length;				
			}		
		}
		
		currRow[currTab] = row.rowIndex;
		m_XrefSpecs[currTab].RowIndex = row.rowIndex+1;
		SetCellValue(row);
		if (cell.className == "readonly_grid_main_cell"){
			if (!(cell.disabled || cell.readOnly)){
				if (cell._onclick != null){
					return eval(cell._onclick.trim()); 
				}
				else{
					return ScrollerUpdate(m_NavigateTo[2]); //maint
				}
			}
		}
		if( preserveRowNum)
		{
			m_currentRow[currTab] = preRowNumber;
		}
		return true;
	}
	catch(err)
	{
		WriteError(err);
		return false;
	}	
}

function __RowsCountStr(row,print_result){
	var result=-1;
	if (row){	
		currRow[m_currentAlias]=row.rowIndex;
		m_XrefTableLength[m_currentAlias]=row.parentElement.rows.length;		
	}
	if (print_result){
		if(document.getElementById('ao_rec_counter'))
		{
			if( (currRow[m_currentAlias] == null || typeof(currRow[m_currentAlias])=="undefined") &&
				(m_currentRow[currTab] == null || typeof(m_currentRow[currTab])=="undefined"))
			{
				var oElements = new Array(6);
				oElements[0] = document.getElementById('first_row_nav_butt');
				oElements[1] = document.getElementById('prev_row_nav_butt');
				oElements[2] = document.getElementById('next_row_nav_butt');
				oElements[3] = document.getElementById('last_row_nav_butt');
				oElements[4] = document.getElementById('td_btn_list_nav_xref');
				oElements[5] = document.getElementById('ao_rec_counter');
				document.getElementById('ao_rec_counter').innerText = "";
				for(var i in oElements)
				{
					__DisableElment(oElements[i]);
					oElements[i].style.filter="alpha(opacity=50)";
					oElements[i].style.cursor = "auto";
				}
			}
			else
			{
				var iTotalRowCount = m_XrefTableLength[m_currentAlias];
				var iCurrentRow = _GetCurrentTabRow();
				currRow[m_currentAlias]=iCurrentRow-1;
				var oSortStateBo = AO_SortStateBO();
				if( oSortStateBo != null )
				{   
				    iTotalRowCount = 0;
			        var oRowCollection = oSortStateBo.selectNodes('/row_numbers/row_number');
				    for(var index=0;index<oRowCollection.length;index++)
		            {
		                var oRow = oRowCollection[index];
			            if((parseInt(oRow.getAttribute("status"))&2)==0)
			            {
			                iTotalRowCount++;
			            }
			            if(parseInt(oRow.text)==_GetCurrentTabRow())
			            {
			                iCurrentRow = iTotalRowCount;
			            }
		            }
		        }
				result=String(iCurrentRow)+"/" +iTotalRowCount;
				document.getElementById('ao_rec_counter').innerText = result;				
			}
			return result;
		}		
		else if(document.getElementById('table_paging_rows_count_td'))	
		{
			var oTD = document.getElementById('table_paging_rows_count_td');
			var iPageNumber = oTD.getAttribute("PageNumber");
			var iAmount = oTD.getAttribute("Amount");
			var iTotal =  oTD.getAttribute("Total");
			result=String((iPageNumber*iAmount)+(row.rowIndex+1))+"/"+iTotal;
			return result;	
		}		
	}
	return -1;
}

function MarkRow(aTable,rowIndex){
	try{
		var rw=document.all(m_XrefSpecs[currTab].RowID);
		if (rw==null || rw.length!=null) return;
		if(rw.getAttribute("selectable")=="false")return;		
		__RowsCountStr(rw,false);
		if (m_XrefSpecs[currTab].editable!=false){
			if (rw!=null)
			{
				var backgroundColor = "#FFEEA6";
				if (rw.selectedBackgroundColor != null) backgroundColor = rw.selectedBackgroundColor;
				rw.style.backgroundColor = backgroundColor;
				var elm=document.getElementById("table_rows_count_td");
				if (elm!=null)
				{
					elm.innerText="";
					elm.innerText=(rw.rowIndex+1)+"/"+rw.parentElement.rows.length;				
				}		 
				if(typeof(m_aliases) != "undefined")
				{
					var BOALias=m_aliases[get_PrimaryBoIndex(currTab)];
					validateObj.InvokeHook("f_selectReadOnlyRow_"+BOALias,BOALias,m_currentAlias,m_currentRow[currTab],rw.id);
				}
			}		
		}else
		{
			if (rw!=null && m_XrefSpecs[currTab].newRow != true)
			{
				SelectEditableRow(rw.parentElement.parentElement, rw.childNodes(0));
			}
			
		}
		
		
	}
	catch(err)
	{
		WriteError(err)
	}	
}

//check if the lookup was closed without selecting any record.
function AO_IsLookUpCancelled(result)
{
    if(result == null )
    {
        return true;
    }
    else if(typeof(result) == "object" && result instanceof Array)
    {
        return result["is_cancelled"];
    }
    else if(typeof(result) == "object" && typeof(result.xml) != "undefined")
    {
        return false;
    }
    return true;
}

/// <summary>
/// Called when a user clicks a standard Lookup button, or presses <F2> on a field that has a lookup attached to it.
/// If the module contains implementation to Custom_LookUp the function will call the custom lookup that overrides the lookup
/// implementation.
/// The function flow is:
/// 1.LookUp_Prepare - Extracts the lookup definitions from the specified element and builds the data structure containing lookup definitions.
/// 2.LookUp_Exec - Executes the query according to the lookup definitions.
/// 3.LookUp_Show - Shows the lookup dialog with the execute result.
/// 4.LookUp_Populate - Populates the corresponding fields with the result.
/// </summary>
/// <param name="column">[required]the element ID that contains the definition of the lookup(entity,query, fields used to build the criteria)</param>
/// <param name="show_1">[optional, default true]if false and the result contains only one row, do not display the lookup dialog window</param>
/// <param name="show_0">[optional, default true]if false and there is no result return without displaying the lookup dialog window</param>
/// <param name="custom_xref">[optional]pass a custom xref if the current one doesn't work</param>
/// <param name="should_retrieve">[optional]if false then do not retrieve information from server</param>
/// <returns>true/false</returns>
function LookUp(column,show_1,show_0,custom_xref, should_retrieve) {
//	var pos, strTmp, iCount, lCount, result, strURL, strXML;
//	var objDOM, nodeDOM, objHttp, strValue, sFeatures;
//	var strColumns, strContent, lookupPage, strSensColumns;
//	var lookupQuery, strRefModule, textObj, lookUpColumn, strWhere = "",rowID;
//	var strMapColumns = new Array(), strValues = new Array();
//	var parent,node, argList;
//	var sensitivity,sensitivityArr=new Array();
//	var field_type,operator,strTypes=new Array(),strOperators=new Array();			
	try{
	    if (typeof(custom_xref) == "undefined") 
	        custom_xref = currRow[currTab];
		glbPreventOnChange=false;
		var test;
		test=Custom_LookUp(column);
		if (test) return true;
		throw ("no Custom");
	}catch(e){
		try{
            validateObj.InvokeHook("f_pre_lookup",column);
			if( window.event != null && window.event.srcElement != null )
				window.event.srcElement.setAttribute("PreserveObjectEvent","false");
			if (show_1==null) show_1=true;
			if (show_0==null) show_0=true;	
		// Prepare Stage	
			var result_prepare=LookUp_Prepare(column,custom_xref);	
			result_prepare["show_1"]=show_1;	
			result_prepare["show_0"]=show_0;
			if ("object"!=typeof(result_prepare)) return false;	
		// XML Execution Stage
			var result_exec=LookUp_Exec(result_prepare,column, should_retrieve);
			if(result_exec[0]=="text/error") throw (result_exec[1].xml);		
			var resultXML=result_exec[1];
		// Show Lookup Stage
			var result_show=LookUp_Show(result_prepare,resultXML);				
			// Poplulate Stage
			var result_populate=false;		
	    	if ("object"==typeof(result_show) && result_show.documentElement.text != "cancel"){
				result_populate=LookUp_Populate(result_prepare,result_show,custom_xref);		
			}		
			
			resultXML = null;		
			AS_FocusOnField(column, custom_xref);// ASAP #IL0212300003 - focus after lookup

			return result_populate;
		}
		catch(err)
		{
			WriteError(err);
			return false;
		}		
	}
}

/// <summary>
/// For internal Framework. Populates the specified fields with the corresponding values retrieved by the lookup.
/// </summary>
/// <param name="result_prepare">[required] Array of Arrays</param>
/// <param name="result_show">[required]XML result</param>
/// <param name="custom_xref">[optional]pass a custom xref if the current one doesn't work</param>
/// <returns>true/false</returns>
function LookUp_Populate(result_prepare,result_show, custom_xref){
    function ConvertXMLType(node,nodeDOM)
    {
        var nodeDT=node.dataType;
        if (node.dataType=="date" && nodeDOM.dataType.toLowerCase()=="datetime")
        {
			node.text=(""+nodeDOM.text).split("T")[0];		
		}
		else if (node.dataType=="time")				
		{
		    var tmpArr = (nodeDOM.text).split("T");	
		    node.text=tmpArr[tmpArr.length-1];
		}
		else 
	    {
			node.text=nodeDOM.text;	
		}
    }
    var i;
	var textObj;
	var BORowNum;
	var tmpArr,objBOAlias,name;
	var lookupQuery=result_prepare["lookup_query"];
	var sensitivityArr=result_prepare["sensitivity"];
	var strMapColumns=result_prepare["map_cols"];
	var strSensColumns=result_prepare["sense_cols"];
	if (typeof(custom_xref) == "undefined") 
	    custom_xref = currRow[currTab];
	if (result_show.selectSingleNode("/"+lookupQuery)!=null){
		var oldNodes=m_primaryXML.selectNodes("/root/"+lookupQuery);
		for (var i=oldNodes.length-1;i>-1;i--){
			oldNodes[i].parentNode.removeChild(oldNodes[i]);
		}
		m_primaryXML.selectSingleNode("/root").appendChild(result_show.selectSingleNode("/"+lookupQuery));
		try{
			f_LookUp_Populate_multiple(lookupQuery,result_prepare);
		}catch(e){/* do nothing */}
		return true;
	}
//	if(result_show.documentElement.text == "cancel") return false;
	
	var iCount=strSensColumns.length;
	var nodeDOM=null;
	for (i = 0; i < iCount; i++)
	{
        if(m_QuitFlowSequense)
        {
          m_QuitFlowSequense=false;
          return true;
        }
		if (sensitivityArr[i]=="s" || sensitivityArr[i]=="i") continue;
		tmpArr=AO_GetBOAliasFromID(strSensColumns[i]);
		objBOAlias=tmpArr[0];
		name = tmpArr[1];				
		nodeDOM = result_show.selectSingleNode("(row/" + strMapColumns[i]+")|(root/row/" + strMapColumns[i]+")");
		if (nodeDOM != null) {
			textObj = document.all(strSensColumns[i]);
			if (textObj!=null){
				if (textObj.length!=null){
					if (textObj.type==null)
					textObj=textObj(custom_xref);
				}
				if (textObj.type==null) {					

					var parent = currXMLDoc.selectNodes('//' +objBOAlias);				
					if (parent.length){ 
						if (m_XrefRows[objBOAlias]!=null) BORowNum=m_XrefRows[objBOAlias];
						else BORowNum=m_currentRow[currTab];
						if (BORowNum==null) BORowNum=0;
						if (typeof(m_StateID)!="undefined")
						{							
							node=parent(0).selectSingleNode("row[@number $eq$ '"+String(BORowNum+1)+"']/"+name);
							if (node==null) node = parent(0).getElementsByTagName(name).item(BORowNum);		
						}									
						else 
							node = parent(0).getElementsByTagName(name).item(BORowNum);		
						try
						{						
							var errMsg=f_col_validate(objBOAlias,name,nodeDOM.text,(BORowNum!=null)?String(BORowNum+1):1);					
							if (errMsg.trim().length)							
							{
								errMsg=errMsg.trim(); if (errMsg.toLowerCase()=="boxxxx") return false;
								WriteError(errMsg);
								return false;
							}
						}
						catch(e){}						
						ConvertXMLType(node,nodeDOM);						
						SetFieldStatus(node,8,objBOAlias,
							(BORowNum!=null)?BORowNum:0);
					}		
					if ((""+nodeDOM.dataType).toLowerCase()!="datetime")						
						textObj.innerText=nodeDOM.text;
					else {
						
						textObj.innerText=AO_UDF((""+nodeDOM.text).split("T")[0]);
					}								
				}
				else if ((textObj.type.toLowerCase() == "select-one")){
					for (var j=0;j<textObj.options.length;j++)
					{
						if(textObj.options[j].value.toLowerCase().trim()==
										nodeDOM.text.toLowerCase().trim()) {
							textObj.options[j].selected=true;
						}
					}
										
				}	
				else if (textObj.type.toLowerCase()=="checkbox"){
					var arrValues=AO_GetCheckBoxOnOffValues(textObj,name);
					var value_on="Y",value_off="N";
					if (arrValues!=null)
					{
						value_on=arrValues["on"];
						value_off=arrValues["off"];
					}				
					textObj.checked=(value_on==nodeDOM.text);
				}							
				else {
					
					if (nodeDOM.dataType=="date" || nodeDOM.dataType=="dateTime")
					{
						textObj.value=AO_UDF((""+nodeDOM.text).split("T")[0]);
						if( nodeDOM.dataType=="dateTime" && textObj.value != "") textObj.setAttribute("time",AO_FormatDateTime(nodeDOM.text.split("T")[1],"time"));
					}
					else {
						var txt=nodeDOM.nodeTypedValue;
						if (txt==null) txt="";
						if (textObj.type.toLowerCase()=="text") 
						{ 
						//if there is ENTER - cut the string until the first one							
							txt=(""+txt).split(/\n/)[0];
						}
						if (textObj.getAttribute("maxlength")!=null) txt=(""+txt).substr(0,textObj.getAttribute("maxlength"));
						var sValue = txt;
						if( (nodeDOM.dataType=="float" || nodeDOM.dataType=="double" || nodeDOM.dataType=="r4"
							|| nodeDOM.dataType=="r8") && textObj.type.toLowerCase()=="text")
					    {
						    sValue = AS_Num2String(sValue);
						}
						textObj.value=sValue;
					}
							
				}
				if (textObj.onchange) {
				    //m_lockManager.ReleaseLock(textObj.uniqueID);
					var change_res=textObj.onchange();
					if (change_res==false) return false;
				}	
				else{
//Tamir Onchange	
/*			
					if (textObj.flag_change){
						var change_res=ItemChange(textObj,textObj.getAttribute("rowChange")-1);
						old_active_element_value=textObj.value;
						if (change_res==false) return;
					} 						
*/					
//~Tamir Onchange									
				}
						
			}
			else{
			
				tmpArr=AO_GetBOAliasFromID(strSensColumns[i]);
				objBOAlias=tmpArr[0];
				name = tmpArr[1];
				var parent = currXMLDoc.selectNodes('//' +objBOAlias);				
				if (parent.length){ 
					if (m_XrefRows[objBOAlias]!=null) BORowNum=m_XrefRows[objBOAlias];
					else
					{
						if(objBOAlias == "main")
							BORowNum=0;				
						else
						{
							if(typeof(m_XrefRows[objBOAlias])!="undefined") BORowNum = m_XrefRows[objBOAlias];
							else BORowNum=m_currentRow[currTab];	
						}
					}			
					node = parent(0).selectSingleNode("row[@number='"+((BORowNum!=null)?String(BORowNum+1):1)+"']/"+name)		
					try
					{						
						var errMsg=f_col_validate(objBOAlias,name,nodeDOM.text,(BORowNum!=null)?String(BORowNum+1):1);					
						if (errMsg.trim().length)							
						{
							errMsg=errMsg.trim(); if (errMsg.toLowerCase()=="boxxxx") return false;
							WriteError(errMsg);
							return false;
						}
					}
					catch(e){}
					ConvertXMLType(node,nodeDOM);							
					SetFieldStatus(node,8,objBOAlias,
						(BORowNum!=null)?BORowNum:0);
				}else return false;
					
					
			}
		}
	}
	nodeDOM = null;
	try{
		f_lookup_populated(result_show,result_prepare["column"],result_prepare);
	} catch(e) {}		
	return true;
}

/// <summary>
/// internal framework use, display the lookup dialog window with the results.
/// </summary>
/// <param name="result_prepare">[required]Array of Arrays,send this as argument to the dialog window that use this to load default search criteria values</param>
/// <param name="resultXML">[required]XML result</param>
/// <returns>selected row</returns>
function LookUp_Show(result_prepare,resultXML){	
	function SetGlobalVarForStudio(resultXML,strRefModule,lookupQuery,strMapColumns,strValues,result_prepare,strURL,sensitivityArr)
	{
				_SetGlobalVar("lookupScrollerXML",resultXML.xml);
				_SetGlobalVar("lookupEntityName",strRefModule);
				_SetGlobalVar("lookupQueryName",lookupQuery);
				_SetGlobalVar("lookupKeyVal",new Array(strMapColumns,strValues,sensitivityArr,result_prepare));
				_SetGlobalVar("lookupURL",strURL);
	}
	
	var lCount = resultXML.selectNodes("root/row").length;
	var result_show="cancel";
	if (result_prepare["show_1"]==null )result_prepare["show_1"]=true;
	if (result_prepare["show_0"]==null )result_prepare["show_0"]=true;
	if ((lCount!=0) || result_prepare["show_0"]){
		if ((lCount==1) && !result_prepare["show_1"]){		
			result_show = resultXML;		
		}else{		
			var strRefModule=result_prepare["ref_module"];
			var lookupQuery=result_prepare["lookup_query"];
			var strMapColumns=result_prepare["map_cols"];
			var strValues=result_prepare["values"];	
			var strTypes=result_prepare["types"];	
			var strOperators=result_prepare["operators"];	
			var sensitivityArr=result_prepare["sensitivity"];	
			var lookupPage=result_prepare["lookup_page"];	
			
			var strURL = "";
			//check if the lookupPage var contain the file extention
			if(lookupPage.indexOf(".asp?")>-1)
			{
				lookupPage = lookupPage.replace(".asp",".aspx");
				strURL = "../lup_aspx/" + lookupPage;
			}
			else
			{
				strURL = "../lup_aspx/" + lookupPage + ".aspx";
			}
			var refObj = AO_GetPrimaryWindow().top.control_frame;
			var argList = Array(resultXML, strRefModule, lookupQuery, new Array(strMapColumns,strValues,sensitivityArr,result_prepare),refObj);
			var sFeatures ="status: no; help: no; dialogHeight: 500px; dialogWidth: 700px;";
			var strTmp=argList;  
			 
			var isStudioLookupMode=_GetGlobalVar("isStudioLookupMode");
			//alert(lookupMode);
			if (isStudioLookupMode=="true")
			{
				SetGlobalVarForStudio(resultXML,strRefModule,lookupQuery,strMapColumns,strValues,result_prepare,strURL,sensitivityArr)
				_SetGlobalVar("isStudioLookupMode","");
			}
			else
			{
				result_show = window.showModalDialog(encodeURI(strURL), argList, sFeatures);
				argList = null;
				if (result_show != "cancel"){
					resultXML.loadXML(result_show);
					result_show = resultXML;
					result_prepare["is_cancelled"] = false;
				}
				else
				{
				    resultXML.loadXML("<root>"+result_show+"</root>");
                    result_show = resultXML;
					try{
						//f_lookup_Notpopulated(result_prepare,result_prepare["column"]);
						//checking problem with 
						result_prepare["is_cancelled"] = true;
						
						f_lookup_populated(result_prepare,result_prepare["column"]);			
					} catch(e) {}							
				}
			
			}
		}
	}
	return result_show;
}
/// <summary>
/// For internal Framework. Invokes BuildXML4Search with the lookup to prepare values and execute the criteria.
/// </summary>
/// <param name="result_prepare">[required] Array of Arrays that holds the results of the lookup preparation</param>
/// <param name="column">[optional]element ID that contains the lookup definitions</param>
/// <param name="should_retrieve">[optional]if false then do not retrieve information from server</param>
/// <returns>XML results</returns>
function LookUp_Exec(result_prepare,column, should_retrieve){
	var strContent="";	
	var result_array=new Array();
	
	var strRefModule=result_prepare["ref_module"];
	var lookupQuery=result_prepare["lookup_query"];
	var strMapColumns=result_prepare["map_cols"];
	var strValues=result_prepare["values"];	
	var strTypes=result_prepare["types"];	
	var strOperators=result_prepare["operators"];	
	var strSearchXML=BuildXML4Search(strRefModule, lookupQuery+":lookup", strMapColumns, strValues,strTypes,strOperators,1,result_prepare["where_cond"]);
	//add support of superSort!
    if ((validateObj.IsDefined(column)) && (IsServerQBESortEnabled()))
    {
        var mapColumnID = "";
        for(var index=0;index<result_prepare.sense_cols.length;index++)
        {
            if(result_prepare.sense_cols[index]==column)
            {
                mapColumnID = result_prepare.map_cols[index];
                break;
            }
        }
        if(mapColumnID != "" )
        {
            var superSortHash = new Array();
            superSortHash['sort_column_alias'] = mapColumnID;
	        superSortHash['sort_direction']  = "+";
	        superSortHash['force_sort'] = false;
	        
	        var searchXSLPage = null;
	        if (typeof (document.all._scrollerXSL)!= "undefined")
	        {
	            searchXSLPage = document.all._scrollerXSL.XMLDocument;
            }
            strSearchXML=AO_ServerSort(strSearchXML, superSortHash, searchXSLPage);
             
            
	    }
	}
	          	
	var columnObj = document.getElementById(column);
	var strHook=null;
	try{
       strHook=LookUp_BuildSearchXML_hook(result_prepare,column,strSearchXML);
	}catch(e){strHook=strSearchXML;}
	if (strHook!=null) strSearchXML=strHook;
	
	var SOAPResult= null;
    if (!(typeof(should_retrieve) != "undefined" && should_retrieve == false))
        SOAPResult = SOAP_RetrieveXML(strSearchXML);

	if( columnObj != null && columnObj.getAttribute("retreive_before_open")=="false" )
	{
		result_array[0]="";	
		result_array[1]=new ActiveXObject("MSXML2.DOMDocument");
		return result_array;	
	}
	result_array[1]="";	
	
	if (SOAP_IsError(SOAPResult)){
        strContent = SOAP_Format_Error_Message(SOAPResult);   
        result_array[0]="text/error";
        result_array[1]=new ActiveXObject("MSXML2.DOMDocument");
        result_array[1].async = false;
        result_array[1].loadXML(strContent);
    }   
	else
	{
		result_array[1]=SOAP_Get_XMLObj(SOAPResult);
		var xmlResult=result_array[1];
		try
		{		
			xmlResult=f_ModifyXMLLookupBeforeDisplay(strRefModule,lookupQuery,xmlResult);
		}catch(e){xmlResult=result_array[1]}		
		result_array[1]=xmlResult;
	}
	return result_array;
}
/// <summary>
/// For internal Framework. Extracts the definition and builds data structure that contains the lookup data required for
/// execution and population. 
/// </summary>
/// <param name="column">[required]element object that contains the definition of the lookup</param>
/// <returns>Array of Arrays</returns>
function LookUp_Prepare(column, custom_xref){
	var lookUpColumn,strColumns,strSensColumns,pos,strRefModule;
	var tmpArr,objBOAlias,name,i,field_type,textObj,operator;
	var sensitivity,strMapColumns = new Array(),sensitivityArr=new Array(),strValues=new Array();
	var parent,node,strTypes=new Array(),strOperators=new Array();
	if (typeof(custom_xref) == "undefined") 
	    custom_xref = currRow[currTab];
	if (window.event!=null)
	{
		if (window.event.srcElement.className.toLowerCase().trim()=="dislookup"){
			return false;
		}
		if (window.event.srcElement.className.toLowerCase().trim()=="dislookup1"){
			return false;
		}
	}
	CreateXMLDOM();
	tmpArr=AO_GetBOAliasFromID(column);
	objBOAlias=tmpArr[0];
	name = tmpArr[1];
	lookUpColumn = document.all(column);
	
	if (lookUpColumn.length != null)
	{
		lookUpColumn = lookUpColumn(custom_xref);
	}

	strColumns = lookUpColumn.name;
	if (strColumns == null) return false;
	strSensColumns = strColumns.split(";");
	
	if (strSensColumns[0].length == 0) return false;
	
	pos = strSensColumns[0].search("\\$");
	strRefModule = strSensColumns[0].substring(0, pos);
	
	if (strRefModule.length == 0) return false;

	strTmp = lookUpColumn.lookup.split("$");
	lookupPage = strTmp[0];
	lookupQuery = strTmp[1];

	strSensColumns[0] = strSensColumns[0].substr(pos + 1);
	var iCount = strSensColumns.length;
	for (i = 0; i < iCount; i++)
	{
		pos = strSensColumns[i].search("\\=");
		if (pos > 0){
			/// Sensitivity goes here	
			sensitivity=strSensColumns[i].substring(0, pos);
			strMapColumns[i] = strSensColumns[i].substr(pos + 1);
			sensitivity=sensitivity.split(":");
			strSensColumns[i] = sensitivity[0];
			if (sensitivity.length==2){
				sensitivity=sensitivity[1].trim().toLowerCase();
				sensitivityArr[i]=sensitivity;
			} 				
			else sensitivityArr[i]="w";			
		}else{
			sensitivity=strSensColumns[i];			
			sensitivity=sensitivity.split(":");
			strSensColumns[i] = sensitivity[0];
			strMapColumns[i] = sensitivity[0];
			if (sensitivity.length==2){
				sensitivity=sensitivity[1].trim().toLowerCase();
				sensitivityArr[i]=sensitivity;
			} 				
			else sensitivityArr[i]="w";					
		}
		
		if (sensitivityArr[i]=="t") {
			strValues[i]="";
			continue;
		}
		var textObj = document.all(strSensColumns[i]);
		if (textObj!=null){			
			
			field_type="string"; operator="like";								
			if (sensitivityArr[i]=="s") operator="=";
			if ((textObj.length!=null) ){
				if ((textObj.type!=null )&& (textObj.type.toLowerCase() == "select-one")){
					strValues[i] = textObj.value;
					try{
						field_type=textObj.field_type;					
						operator=textObj.operator;
					}catch(e){/*do nothing*/}					
				}			
				else if (textObj(custom_xref).type==null){
					strValues[i]=textObj(custom_xref).innerText;
					try{															
						field_type=textObj(custom_xref).field_type;					
						operator=textObj(custom_xref).operator;				
					}catch(e){/*do nothing*/}
				}			

				else if (textObj(custom_xref).type.toLowerCase()=="checkbox"){
					parent = currXMLDoc.selectNodes('//' +m_aliases[get_PrimaryBoIndex(currTab)]);
					if (parent.length){ //var node = parent(0);
						node = parent(0).getElementsByTagName(strSensColumns[i]).item((m_currentRow[currTab]!=null)?m_currentRow[currTab]:0);		
						strValues[i]=node.text;						
					}else {
						strValues[i]=AO_GetCheckBoxValue(textObj(currRow[currTab]));
						try{
							field_type=textObj(currRow[currTab]).field_type;					
							operator=textObj(currRow[currTab]).operator;						
						}catch(e){/*do nothing*/}
					}
					
				}
				else {
					strValues[i] = textObj(custom_xref).value;
					try{
						field_type=textObj(custom_xref).field_type;					
						operator=textObj(custom_xref).operator;
					}catch(e){/*do nothing*/}
				}
				
			}
			else {				
				if (textObj.type==null){
					strValues[i]=textObj.innerText;
					try{
						field_type=textObj.field_type;					
						operator=textObj.operator;					
					}catch(e){/*do nothing*/}
				}			
				else if (textObj.type.toLowerCase()=="checkbox"){
					
					parent = currXMLDoc.selectNodes('//' +m_aliases[get_PrimaryBoIndex(currTab)]);
					if (parent.length){ //var node = parent(0);
						node = parent(0).getElementsByTagName(strSensColumns[i]).item((m_currentRow[currTab]!=null)?m_currentRow[currTab]:0);		
						strValues[i]=node.text;
						
					}else {
						strValues[i]=AO_GetCheckBoxValue(textObj.value);
						try{
							field_type=textObj.field_type;					
							operator=textObj.operator;											
						}catch(e){/*do nothing*/}
					}					
				}			
				else {					
					strValues[i] = textObj.value;							
					try{
						field_type=textObj.field_type;					
						operator=textObj.operator;					
					}catch(e){/*do nothing*/}
				}					
			}
		}
		else{		
			tmpArr=AO_GetBOAliasFromID(strSensColumns[i]);
			objBOAlias=tmpArr[0];
			name = tmpArr[1];
			parent = currXMLDoc.selectNodes('//' +objBOAlias);
			
			if (parent.length){ //var node = parent(0);
				//node = parent(0).getElementsByTagName(name).item((m_currentRow[currTab]!=null)?m_currentRow[currTab]:0);		
				var index = m_currentRow[currTab];
				if(index==null || objBOAlias == "main") index = 0; 
				else if(m_XrefSpecs[currTab] != null && m_XrefSpecs[currTab].RowID != null)
				{
					index = parseInt(m_XrefSpecs[currTab].RowID.split("_")[1])-1;
				}
				node = parent(0).selectSingleNode("row[@number $eq$ '"+(index+1)+"']/"+name);

				if (node==null) 
					strValues[i]=""; 
				else 
					strValues[i]=node.text;
						
			}else return false;
		}
		strTypes[i]=(field_type==null)?"string":field_type;
  		strOperators[i]=(operator==null)?"like":operator;	
  		if (sensitivityArr[i]=="s" && operator==null) strOperators[i]="=";
	}	
		
	var result_prepare=new Array();	
	
	result_prepare["ref_module"]=strRefModule;
	result_prepare["lookup_query"]=lookupQuery;
	result_prepare["map_cols"]=strMapColumns;
	result_prepare["sense_cols"]=strSensColumns;
	result_prepare["values"]=strValues;	
	result_prepare["types"]=strTypes;	
	result_prepare["operators"]=strOperators;	
	result_prepare["sensitivity"]=sensitivityArr;
	result_prepare["lookup_page"]=lookupPage;
	result_prepare["column"]=column;
	return result_prepare;	
}

function CheckMandatory(subElement,show_message){

	var itmLabel, itmInput, itmInputCol;
	try{	
	if (show_message==null) show_message=true;
		var len = subElement.all.length;
		for (var i=0;i<len;i++){
			itmLabel=subElement.all.item(i);
			if (itmLabel.className.match(/mandatory/i) || itmLabel.getAttribute("mandatory")=="true"){
				
				if (!show_message)
				{	
					if (itmLabel.getAttribute("conditional")!="true") continue;
				}			
				if(itmLabel.getAttribute("mandatory")=="true")
				{
					itmInput = itmLabel.getElementsByTagName("INPUT");
					
					for(var inpIndex=0;inpIndex<itmInput.length;inpIndex++)
					{
						if(itmInput[inpIndex].type == "text" )
						{
							itmInput = itmInput[inpIndex];
							break;
						}
					}
				}
				else
				{		
					itmInput=subElement.all(itmLabel.id.replace(/_t$/i,""));
				}

				if (itmInput==null) continue;
				// V.A. 04/07/2000
				if ((itmInput.length == null) || (itmInput.tagName!=null))
				{
					itmInputCol = Array(itmInput);
				}else
				{
					itmInputCol = itmInput;
				}
				var is_mandatory;
				var tmpBOAlias, strFieldID,child;
				var conditional;
				for (var j = 0; j < itmInputCol.length; j++)
				{
					itmInput = itmInputCol[j];
					
					if (!((""+itmInput.value).trim()).length){				
						is_mandatory=true;
						strFieldID=AO_GetBOAliasFromID(itmInput.id);			
						tmpBOAlias=strFieldID[0];
						strFieldID=strFieldID[1];
						tmpBOAlias=tmpBOAlias.split(":")[0];			
						conditional=itmLabel.getAttribute("conditional");
						if (conditional=="true"){
							try{
								var counter=0;
								child=m_primaryXML.selectSingleNode("/root/"+tmpBOAlias+
									"/row[@number='"+String(m_currentRow[currTab]+1)+"']");
								for (;child!=null;child=child.previousSibling)counter++;
								if (counter==0)counter=1;
								is_mandatory=f_test_mandatory_condition(tmpBOAlias,strFieldID,counter-1);
								if (is_mandatory!=false)is_mandatory=true;
							}catch(e){is_mandatory=true}						
							if (!is_mandatory && !show_message) 
							{
								itmLabel.className="mandatory_no_star";
								ModifyAttributeInXsl(strFieldID,"class","mandatory_no_star",null,m_currentAlias);
							}
							else if (is_mandatory && show_message)
							{
								itmLabel.className="mandatory";
								ModifyAttributeInXsl(strFieldID,"class","mandatory",null,m_currentAlias);
							}
						}
						if (!is_mandatory) continue;	
						if (!show_message) continue;
						var tbContent=(subElement!=document)?subElement:itmInput.parentNode;			
						while(!tbContent.tagName.match(/html/i) &&
							!tbContent.tagName.match(/div/i) && !tbContent.id.match(/tabcnt/i))
							tbContent=tbContent.parentNode;					
						if (tbContent.tagName.match(/html/i)!=-1){
							//tabActivate(tabTemplateTab,
							//	document.all.item(tbContent.id.replace(/cnt/i,"hdr")),
							//	tbContent);
							var tmpStr=tbContent.id.replace(/cnt/i,"hdr");
							if (tmpStr!=null)
								var tmpTab=document.all.item(tmpStr);
							else
								var tmpTab=tbContent;
							// V.A. 04/07/2000
							if (tmpTab != null)
							{
								if (tmpTab.onclick){ 
									tmpTab.onclick();
									m_currentColumn[currTab]=itmInput.id;
								}
							}
							if( itmInput.getAttribute("focus_on")==null)
							{
							    try
							    {
							        itmInput.focus();
							    }
							    catch(err){/*do nothing*/}
							}
							else
							{
							    document.getElementById(itmInput.getAttribute("focus_on")).focus();
							}
							//~ V.A.
						}
						if( itmLabel.innerText == "" )
							itmLabel = document.getElementById(itmInput.id+"_t");
						if( itmLabel != null )
						{
							throw (":VLD001:"+itmLabel.innerText.replace(/:|\*/g,""));
						}
						else
						{
							throw (":VLD001:");
						}

						return true;
					}
					else if (!show_message)
					{
						try{
							is_mandatory=true;
							strFieldID=AO_GetBOAliasFromID(itmInput.id);			
							tmpBOAlias=strFieldID[0];
							strFieldID=strFieldID[1];
							tmpBOAlias=tmpBOAlias.split(":")[0];								
							var counter=0;
							child=m_primaryXML.selectSingleNode("/root/"+tmpBOAlias+
								"/row[@number='"+String(m_currentRow[currTab]+1)+"']");
							for (;child!=null;child=child.previousSibling)counter++;
							if (counter==0)counter=1;
							is_mandatory=f_test_mandatory_condition(tmpBOAlias,strFieldID,counter-1);
							if (is_mandatory!=false)is_mandatory=true;
						}catch(e){is_mandatory=true}						
						if (!is_mandatory) 
						{
							//itmLabel.style.backgroundImage="";
							itmLabel.className="mandatory_no_star";
							ModifyAttributeInXsl(strFieldID,"class","mandatory_no_star",null,m_currentAlias);
						}

					}
				}
				//~ V.A.
			}
		}
		return false;
	}
	catch(e)
	{
		var descr;
		if (typeof(e.description)!="undefined")
			descr=e.description;
		else descr=e;
		if (descr.indexOf("VLD001")==-1 && itmLabel!=null && itmLabel.id!=null) descr=descr+":label-"+itmLabel.id;
		WriteError(descr);return true;
	}
}

function CheckQbeMandatory(subElement)
{
    var filter = "className qbe_mandatory";
    var queueResults = FilterElements(subElement,filter);
    if(queueResults == null) return false;
    var len = queueResults.length;
    if(len == 0) return false;
    var itmLabel = null;
    var isRequired = true;
    
    try
    {
        for(var i=0;i<len;i++)
        {
            itmLabel = queueResults[i];
            var itmInput=subElement.all(itmLabel.id.replace(/_q$/i,""));
            if(itmInput.value!="") isRequired = false;
        }
        
        if(isRequired)
        { 
            itmLabel = queueResults[0];
		    throw (":VLD001:"+itmLabel.innerText.replace(/:|\*/g,""));
        }
    }
    catch(e)
	{
		var descr;
		if (typeof(e.description)!="undefined")
			descr=e.description;
		else descr=e;
		if (descr.indexOf("VLD001")==-1 && itmLabel!=null && itmLabel.id!=null) descr=descr+":label-"+itmLabel.id;
		WriteError(descr);return true;
    }
}




/******************************************************************************************/
function moveTabDown(){
try{
	//_uparrow.style.visibility="visible";
	var ga=document.all("sub" + m_curGroupAlias);
	var lblga=document.all(m_curGroupAlias+"_label").outerHTML;
	document.all(m_curGroupAlias).innerHTML=lblga;
	ga.rows[m_Tabupvisible++].style.display="none";
	ga.rows[m_Tabdownvisible++].style.display="";	
}catch(e){WriteError(e);}	
}

function moveTabUp(){
try{
	//_downarrow.style.visibility="visible";
	var ga=document.all("sub" + m_curGroupAlias);
	var lblga=document.all(m_curGroupAlias+"_label").outerHTML;
	document.all(m_curGroupAlias).innerHTML=lblga;
	m_Tabupvisible--;m_Tabdownvisible--;
	ga.rows[m_Tabupvisible].style.display="";
	ga.rows[m_Tabdownvisible].style.display="none";
}catch(e){WriteError(e);}	
}		   		   
function _SelectTabControlItem(groupAlias,checkDisable)
{
try{
	checkDisable = typeof(checkDisable)=="undefined"?true:checkDisable;
	if ((m_curGroupAlias != groupAlias))
	{
		var tmpStr;
		if (m_curGroupAlias != null){
			if (aliasLoaded!="") return false;	
		}
		var sb=document.all("sub" + groupAlias);
		var i=0;
		var tmpStr;
		var currAliasplace=null;
		if (m_curGroupAlias != null)
		{ 
			document.all("sub" + m_curGroupAlias).style.display = "none";
			document.all(m_curGroupAlias).className = "clsTabControlItem";
		}
		else
		{
			for (i=0;i<m_ElementsIDs.length;i++){
				if (m_ElementsIDs[i]!=groupAlias) 
					document.all(m_ElementsIDs[i]).className = "clsTabControlItem";
			}
		}
		sb.style.display = "";
		m_Tabupvisible=0;
		m_Tabdownvisible=sb.rows.length-1; // Without the closing <TR>
		var sumAllOpenItemsHeight=(m_GroupAliases.length+m_Tabdownvisible+1)*26;
		for (i=0;i<=m_Tabdownvisible;i++){
		    if(sb.rows[i].getAttribute("NotVisible")==true) continue;
			sb.rows[i].style.display="";
		}
		for (i=0;i<m_ElementsIDs.length;i++){
			document.all(m_ElementsIDs[i]).style.display="";
			if (m_ElementsIDs[i]==groupAlias) currAliasplace=i;
			//_tabUpArrow.innerHTML="";
			_tabDownArrow.innerHTML="";
		}
		m_groupVisibleDown=m_ElementsIDs.length;
		m_groupVisibleUp=-1;
		var groupAlias1,pos;
		var tdHeight=document.body.clientHeight-100;
		for (i=m_groupVisibleDown-1;(i>currAliasplace) && (sumAllOpenItemsHeight>tdHeight);i--){
			m_groupVisibleDown--;
	//		document.all(m_ElementsIDs[i]).style.display="none";
			sumAllOpenItemsHeight-=26;
			
		}
		for (i=0;(i<currAliasplace-1) && (sumAllOpenItemsHeight>tdHeight);i++){
			m_groupVisibleUp++;
			//document.all(m_ElementsIDs[i]).style.display="none";
			sumAllOpenItemsHeight-=26;
		}	
		
		document.all(groupAlias).className = "clsTabControlItemSelected";
			
		m_curGroupAlias = groupAlias;
		var disableResult=false,pageAlias1;
		var groupsRows=document.all("sub" + m_curGroupAlias).rows;		
		
		for (i=0;i<groupsRows.length-1 && checkDisable;i++){			
			pageAlias1=groupsRows[i].cells(0).id.replace("sub","");	
			var disObjContainer = groupsRows[i].all("sub"+pageAlias1);				
			pageAlias1=pageAlias1.replace("ex","");	
			disableResult=AO_test_disable_tab(pageAlias1);		
			var disObj = groupsRows[i].all("sub"+pageAlias1);
			if (disableResult)
              disObjContainer.disabled = disObj.disabled = true;
            else
              disObjContainer.disabled = disObj.disabled = false;
		}		
		
	}
	else {
		if (arguments[1]!="open")
		_CloseTabs();
	}
	return true;
}catch(e){WriteError(e);return false;}		
}

//disable the left navigation bar
function AO_DisableTab()
{
    for (var i=0;i<m_PageAliases.length;i++)
	{
	    var res = AO_test_disable_tab(m_PageAliases[i]);
	    res = typeof(res)=="undefined"?false:res;
	    document.getElementById("sub"+m_PageAliases[i]+"ex").disabled = res;
	    document.getElementById("sub"+m_PageAliases[i]).disabled = res;
	}		
}

function AO_test_disable_tab(pageAlias){
	var testResult=false;
	var testResult=(AS_GetPagePermission(pageAlias,"access")=="false");
	if (!testResult)
	{
		try{	
			testResult=f_test_disable_tab(pageAlias);
			return testResult;
		}catch(e){return false}	
	}
	return testResult;
	
}
function _CloseTabs(){
try{
	for (var i=0;i<m_ElementsIDs.length;i++) 
		document.all(m_ElementsIDs[i]).style.display="";
	var subTabs=document.all("sub"+m_curGroupAlias);
	_HideTabRows("sub"+m_curGroupAlias,0,subTabs.rows.length);
	document.all('_tabDownArrow').innerHTML="";
	m_curGroupAlias=null;
}catch(e){WriteError(e);return false;}			
}

function _HideTabRows(objName,rowNum,maxRows){
try{
	if (rowNum<maxRows){
		document.all(objName).rows[rowNum].style.display="none";
		setTimeout("_HideTabRows('"+String(objName)+"',"+Number(rowNum+1)+","+maxRows +")", 60);
	}
	else 
		document.all(objName.replace(/sub/i,"")).className = "clsTCISelectedClosed";
}catch(e){WriteError(e);return false;}					
}
function _OpenTabs(){
try{
	for (var i=0;i<m_groupVisibleUp;i++) 
		document.all(m_ElementsIDs[i]).style.display="none";
	for (i=m_ElementsIDs.length-1;i>m_groupVisibleDown;i--) 
		document.all(m_ElementsIDs[i]).style.display="none";

	document.all(m_curGroupAlias).className = "clsTabControlItemSelected";
	document.all("sub"+m_curGroupAlias).style.display="";
	document.all('_tabDownArrow').innerHTML="";
}catch(e){WriteError(e);return false;}						
}

function _SelectTabControlSubItem(pageAlias)
{
try{
	var testDisable=AO_test_disable_tab(pageAlias);
	if (testDisable){	
		document.getElementById("sub"+pageAlias+"ex").disabled=true;
		//WriteError("Access Denied to " +pageAlias);
		WriteError(AO_GetMesgWithParams("A2SEC011" , Array(String(pageAlias))));
		return false;
	}
	else {
		document.getElementById("sub"+pageAlias).disabled=false;		
	}
	if (m_currentAlias != pageAlias)
	{
		var subTab = document.all("sub" + pageAlias + "ex");
		
		subTab.className = "clsTabControlSubItemSelected";
		(subTab.firstChild.firstChild.firstChild.firstChild).style.font = "bold 11px tahoma";
		_RemoveSelectedSubTab();
	}
	
	return true;
}catch(e){WriteError(e);return false;}						
}

function _RemoveSelectedSubTab()
{
	if (m_currentAlias != null)
	{ 
		var subpage=document.all("sub" + m_currentAlias + "ex");
		subpage.className = "clsTabControlSubItem";
		(subpage.firstChild.firstChild.firstChild.firstChild).style.font = "11px tahoma";
		for (var aliasparent=subpage.parentElement;!aliasparent.id;
		aliasparent=aliasparent.parentElement);	
		m_previousGroup=aliasparent.id.replace("sub","");
		m_previousPage=m_currentAlias;
	}
}
/// <summary>
/// Called when the user clicks on the page tab located on the left side menu. Eventually this function calls _CreatePage with 
/// the corresponding page alias name. The function also restores last page view details when the user clicks Browser Refresh.
/// button.
/// </summary>
/// <param name="alias">[required]the alias page name</param>
/// <param name="automatic_focus">[optional, default true]if set to false the Framework will not set the focus on the first to rate performance. If the page creates complex DOM structure (Data Grid with
/// element in the document this can used while consider performance issue, if the page create complex DOM structure (Data Grid with
/// large rows number) the focus can be time consuming.</param>
/// <returns>true/false</returns>
function _OpenPage(alias,automatic_focus) {
try{
	var Module_CurrentRow = undefined;
	var Module_RowID = undefined;
	var Module_xrefPage = undefined;
	var pageType = -1;
	function RestoreModuleValues()
	{
		Module_CurrentRow = validateObj.IsDefined(Module_CurrentRow)?Module_CurrentRow:_GetGlobalVar("Module_CurrentRow");
		Module_RowID = validateObj.IsDefined(Module_RowID)?Module_CurrentRow:_GetGlobalVar("Module_RowID");
		
		if (("undefined"!=typeof(Module_RowID)) && (Module_RowID!="")) {						
			m_XrefSpecs[currTab]=new Object();
			//result=(currRow[m_currentAlias]+1)+"/" +m_XrefTableLength[m_currentAlias]		
			var arrNums=Module_RowID.split(";");					
			if (arrNums[0]!=null){						 
				currRow[alias]=parseFloat(arrNums[0]);
				m_XrefSpecs[currTab].RowID="row_"+(currRow[alias]+1);
			}
			if (arrNums[1]!=null) 
			{
				m_XrefTableLength[alias]=parseFloat(arrNums[1]);
				var length=m_primaryXML.selectNodes("/root/"+m_pageBOs[j].split(":")[0]+"/row").length;
				if (length>0) m_XrefTableLength[alias]=length;
			}	
			_RemoveGlobalVar("Module_RowID");
			_SetGlobalVar("Module_RowID","");
			Module_xrefPage = validateObj.IsDefined(Module_xrefPage)?Module_xrefPage:_GetGlobalVar("Module_xrefPage");
			if (("undefined"!=typeof(Module_xrefPage)) && (_GetGlobalVar("Module_xrefPage")!="")) {									
				m_XrefSpecs[currTab].xrefPage=_GetGlobalVar("Module_xrefPage");
				AddXrefPageToXrefSpecs(_GetGlobalVar("Module_xrefPage"));
				_RemoveGlobalVar("Module_xrefPage");
				_SetGlobalVar("Module_xrefPage","");						
			}
		}			
	}
	PrintTimer('OpenPage.xml')
	if ((m_currentAlias != alias) && 
	    (window.event == null || !document.getElementById("sub"+alias+"ex").disabled 
	    || window.event.srcElement.id=="report"))
	{
		if( !m_PageIndicator.IsBusy() )
		{
			m_PageIndicator.Busy("","_OpenPage");
		}
		if (_SelectTabControlSubItem(alias)){
			_AssignCurTab(alias);		
			//if (m_currentAlias != null) document.getElementById(m_currentAlias).style.display = "none"; 
			if (m_currentAlias != null){
			 document.getElementById(m_currentAlias).innerHTML="";
			 document.getElementById(m_currentAlias).style.display = "none";
			}
			document.getElementById(alias).style.display = "";
			m_currentAlias = alias;
			window.status=m_currentAlias;
            if(typeof(_GetGlobalVar("Module_CurrentRow"))=="number" )
            {
              Module_CurrentRow=_GetGlobalVar("Module_CurrentRow");
              m_currentRow[currTab] = Module_CurrentRow;
            }
			
			if (("undefined"!=typeof(Module_CurrentRow)) && (String(Module_CurrentRow)!="")) {				
				var count = m_PageAliases.length;
				for (i = 0; i < count; i++)
				{
					if (alias == m_PageAliases[i]) break;
				}
				j = parseInt(m_PageAttributes[i]);
				var	pos = m_pageBOs[j].search(/(\:|\*)/g);
				pageType = m_pageBOs[j].substr(pos+1)
				if ((pos==-1) || (pageType!="2")){
					RestoreModuleValues();				
				}
				_SetGlobalVar("Module_CurrentRow","");
				_SetGlobalVar("Module_RowID","");
				_SetGlobalVar("Module_xrefPage","");			
			}						
			PrintTimer('OpenPageBeforeCreatePage.xml')
			_CreatePage(alias);
			if(pageType == "2")
			{
				RestoreModuleValues();
				_CreatePage(alias);
			}
			if (AO_IsConnectedWindow()) AO_DisablePageDOM(alias,true);
			PrintTimer('OpenPage.xml')
			if(UI_LANGUAGE == 'JP' || UI_LANGUAGE == 'JPA')
			{
				if (css_stylesheet.href.indexOf("1024/AO_StyleSheet_jpa.css")==-1 && (css_stylesheet.href != '../app_css/AO_StyleSheet_jpa.css'))
			    {
					css_stylesheet.href = '../app_css/AO_StyleSheet_jpa.css';
                }
			}
		}else return false;
		
	}
	if (automatic_focus==null) automatic_focus=true;
	if (automatic_focus && m_pageLoaded)
	{
		setTimeout("AO_FocusFirstObject(null,'_OpenPage')",100);
	}
	else if(automatic_focus && !m_pageLoaded)
	{
		m_funcToRunOnFinish.push("AO_FocusFirstObject(null,'_OpenPage')");
	}
	
	return true;
}
catch(e){
	WriteError(e);
	return false;
}		
finally
{
	m_PageIndicator.NoBusy("_OpenPage");
}
}

function AO_OverrideXSLCache(alias){
	return validateObj.InvokeHook("f_override_XSLCache",alias);
}

function AO_PRE_CreatePage(alias){
	try{
		var res = f_pre_CreatePage(alias);
		if( typeof(res) != "undefined") return res;
		return true;		
	}catch(e){return false;}	
}

function AO_After_CreatePage(alias){
	try{
		f_after_CreatePage(alias);
		return true;		
	}catch(e){return false;}	
}

function AO_PRE_CreateXrefPage(alias,xrefAlias){
	try{
		f_pre_CreateXrefPage(alias,xrefAlias);
		return true;
	}catch(e){return false;}
}

function AO_PRE_CreateXrefZoomPage(alias, xslSheet){
	try{
		return f_pre_CreateXrefZoomPage(alias, xslSheet);
	}catch(e){return null;}
}

function GetRowByPrimaryKey(BOALias,Module_PrimaryKey)
{
	try
	{
		if (null!=Module_PrimaryKey && Module_PrimaryKey!="")
		{
			var primaryKeyArr = Module_PrimaryKey.split("@");
			var xpathQuery = new String();
			for(var index=0;index<primaryKeyArr.length;index++)
			{
				var Module_PrimaryKey=primaryKeyArr[index].split(";");
				if (Module_PrimaryKey.length==2)
				{
					var primaryKey=Module_PrimaryKey[0];
					var primaryKeyVal=Module_PrimaryKey[1];	
				}
				var keyExists = m_primaryXML.selectSingleNode("/root/"+BOALias+"/row["+primaryKey+"]");
				if( keyExists != null )
				{
					xpathQuery += primaryKey+" $eq$ '"+primaryKeyVal+"' and ";
				}
			}
			xpathQuery = xpathQuery.removeEx("and ");
			return m_primaryXML.selectSingleNode("/root/"+BOALias+"/row["+xpathQuery+"]");
		}
		else
		{
			return null;
		}
	}
	catch(err)
	{/**/}
}
/// <summary>
/// Creates page layout (by transforming the XSL specify to the corresponding alias and rendering the HTML content)
/// and displays the layout on the corresponding user work area (page alias). The work area is represented by a tabular structure (HTML table)
/// that contains cells for each page alias. This function also retrieves BOs marked as ROD for the current page alias.
/// This function is called mainly from the _OpenPage function, and also can be called from zoom in pages.
/// If the page contains a Data Grid this function automaticlly marks the first row on the Data Grid.
/// </summary>
/// <param name="alias">[required]use this parameter to get the corresponding XSL document used for transformation</param>
/// <param name="direction">[optional] if the page displays Data Grid with paging toolbar set the direction (prev/next)
/// used to display the corresponding rows in the grid</param>
/// <returns>true/false</returns>
function _CreatePage(alias,direction) {
	var i,j;
	var xrefNull=false;
try{
	var loadCache=false;
	// Added by Greg . For flag_change
	old_active_element_id = "";	
	var tmpCurrentAlias=alias;
	//added by eli harel 23-2-2005
	if( _GetGlobalVar("XrefPageCreated") != "undefined" ) _RemoveGlobalVar("XrefPageCreated");
	//end
	if (m_action=="new" && alias=="_TabControl") tmpCurrentAlias=m_PageAliases[0];
	Debug.writeln("Start _CreatePage");
	var objPage = document.getElementById(alias);
	var count = m_PageAliases.length;
	for (i = 0; i < count; i++)
	{
		if (tmpCurrentAlias == m_PageAliases[i]) break;
	}

	j = parseInt(m_PageAttributes[i]);
	m_pageRecreate = true;
	var	pos = m_pageBOs[j].search(/(\:|\*)/g);
	if (pos != -1)
	{
		var blnRet;
		if (RegExp.$1==":")
			blnRet=(m_pageBOs[j].substr(pos+1) == "1");
		else 
			blnRet=true;		
		if (blnRet)
		{			
			m_pageBOs[j] = m_pageBOs[j].substring(0, pos);
			m_aliases[j]=m_pageBOs[j];
			objPage.style.cursor="wait";
// astea-trans=placeholder;placeholder;N;astea-trans=text;TXTASP$loading.._vx;N;
			objPage.innerHTML = "<center><H1 style='cursor:wait'> <font color=#808080>"+"Loading..."+"</font></H1></center>";
			m_timerStart=true;
			var listOfColumns = ""
			
			setTimeout("__rod('"+m_pageBOs[j]+"',null,'" + listOfColumns + "','"+alias+"','"+
				RegExp.$1+"')",1);			
			return true;
		}else if (RegExp.$1==":"){ //":2"
			loadCache=true;
			m_pageBOs[j] = m_pageBOs[j].substring(0, pos);
			m_aliases[j]=m_pageBOs[j];

		}
	}
	if (m_XrefSpecs[currTab]==null) xrefNull=true;
	m_TransformObj.SetXslCache(tmpCurrentAlias,direction);
	if (xrefNull || (m_XrefSpecs[currTab].xrefPage==null)){
		_SetGlobalVar("Module_PrimaryKey","");
	}
	else {
		var checkRow=null;
		var BOALias=m_aliases[get_PrimaryBoIndex(currTab)];
		var Module_PrimaryKey=_GetGlobalVar("Module_PrimaryKey");
		_SetGlobalVar("Module_PrimaryKey","");
		checkRow=GetRowByPrimaryKey(BOALias,Module_PrimaryKey);
		if (checkRow!=null)
		{
			m_currentRow[currTab]=checkRow.getAttribute("number")-1;
		}
		
		if (checkRow==null && _GetCurrentTabRow()!=null)
		{
		    checkRow=m_primaryXML.selectSingleNode("/root/"+BOALias+
					"/row[@number='"+String(_GetCurrentTabRow())+"']");
			//changed by eli harel 02-05-2005
			//this resolve the problem when the current page is true
			//and we want to display the current row of the xref and not the 
			//parent BO
			if( checkRow==null && m_XrefSpecs[currTab].xrefPage != null )
			{
				
				var xslTmpDocument = GetXSLDocument(m_XrefSpecs[currTab].xrefPage);
				var tmpElm = xslTmpDocument.selectSingleNode("//xsl:comment[@xref]");
				if( tmpElm != null )
				{
					xslTmpDocument = _ChangeFilter(xslTmpDocument);
					var xrefParentKey = (tmpElm.text).split("=")[0];
					var xrefName = tmpElm.getAttribute("xref");
					var forXslElm = xslTmpDocument.selectSingleNode("//xsl:for-each[@xref='"+xrefName+"']");
					
					if( forXslElm!=null && !validateObj.IsNothing( forXslElm.getAttribute("select") ) )
					{
						var selectAttr = forXslElm.getAttribute("select");
						selectAttr = selectAttr.substr(0,selectAttr.length-1)+"$and$(@number='"+String(_GetCurrentTabRow())+"')]";
						checkRow=m_primaryXML.selectSingleNode(selectAttr);
					}
				}
			}
		}
		if (checkRow!=null && !(parseInt(checkRow.getAttribute("status"))&2))	{			
			AO_PRE_CreatePage(alias);			
			RowEdit(m_XrefSpecs[currTab].xrefPage,true,	m_XrefSpecs[currTab].newRow);		
			//m_XrefSpecs[currTab].SortOrder="+number(@number)";
			if (!validateObj.IsNothing(_GetGlobalVar("Module_SortOrder")))
			{
			    m_XrefSpecs[currTab].SortOrder=_GetGlobalVar("Module_SortOrder");
			    _RemoveGlobalVar("Module_SortOrder");
				//currRow[m_currentAlias]=m_currentRow[currTab];
				//__RowsCountStr(null,true);
			}
			if (m_XrefSpecs[currTab].SortOrder=="" || m_XrefSpecs[currTab].SortOrder==null) 
			{
				m_XrefSpecs[currTab].SortOrder="+number(@number)";
			}
			//added by eli harel 23-2-2005
			_SetGlobalVar("XrefPageCreated","true");
			//end
			return true;
		}
	}
	objPage.innerHTML="";	
	if (m_primaryXSL.xml!=""){
		//m_primaryXSL=_addIncludes(m_primaryXSL);				
		m_XSLURL=m_primaryXSL.url;
		var strHtmlContent = "";
		var res = AO_PRE_CreatePage(alias);		
		if( typeof(res) == "string" && res == "ChangeFilter")
		{
		    _ChangeFilter(m_primaryXSL);
		   AO_ClearXSLCache("xslcache");
		   AO_RefreshXSLCache(true);
		}
		if (m_action=="new") 
		{
		    _OpenWizPage(document.getElementById("_TabControl"));
		    var sGroupAlias = m_curGroupAlias;
		    m_curGroupAlias = null;		
		    _ChangeStyle(sGroupAlias);
		}
		else 
		{
				// CHANGES
				m_TransformObj.TransformXsl();
				strHtmlContent = m_TransformObj.SetXslOutput(objPage);
		}
		if ((!xrefNull) && (m_XrefSpecs[currTab].RowID!=null) && (currRow[currTab]!=null)) 
		{
			MarkSelectedRow();
		}
		//added by eli harel 23-2-2005
		//add condition that check if the xref of the page already created
		else if( _GetGlobalVar("XrefPageCreated") != "true" ){
			AO_HighlightRowInGrid(m_pageBOs[j],alias);
		}	
		if( _GetGlobalVar("XrefPageCreated") != "undefined" ) _RemoveGlobalVar("XrefPageCreated");
		//end
	}
	objPage = null;
	if (loadCache)
	{
		
		AO_LoadXrefCache(m_pageBOs[j]);
	}
	//added by eli harel 07-03-2005
	AO_After_CreatePage(alias);	
	//end		
	A2ShowHideSearch(null);
	return true;
}catch(e){WriteError(e);return false;}	
}


//--------------------------------------------------------
// this two methods display grid layout in sync fashion
// the grid rows are displayed on the background 
// while the user can look and manipulate the current rows
//--------------------------------------------------------

//global var used by the async mechanism
var m_GridTableContainer = null;
var m_GridTableId = null;
var m_GridRowCollection = null;
var m_AsyncGridInterval = null;
var m_GridNumToDisplay = 5;

//the first method check if the grid layout marked as AsyncMode
//then cache all the grid rows inglobal array, and invoke interval
//that except pointer to function that display the grid rows on
//given time
function AsyncGridTableBuilder(primaryXsl,strHtmlContent)
{
	var doc = null;
	var intervalValue = 100;
	m_GridTableContainer = null;
	m_GridRowCollection = null;
	try
	{
		if( m_AsyncGridInterval != null )
		{
			window.clearInterval(m_AsyncGridInterval);
			m_AsyncGridInterval = null;
		}
		
		//check if the table contain attribute AsyncMode that set to true
		if(primaryXsl.selectSingleNode("//table[@AsyncMode='true']")==null) return strHtmlContent;
		
		doc = new ActiveXObject("MSXML2.DOMDocument");
		doc.async = false 
		
		doc.loadXML(strHtmlContent);
		
		var tableElement = doc.selectSingleNode("//table[@AsyncMode='true']");
		var childLength = tableElement.childNodes.length;
		m_GridTableId = tableElement.getAttribute("id");
		if( childLength <= 1 ||  m_GridTableId==null || childLength <= m_GridNumToDisplay ) return strHtmlContent;
		
		intervalValue = tableElement.getAttribute("Interval")!=null?parseInt(tableElement.getAttribute("Interval")):intervalValue;
		m_GridNumToDisplay = tableElement.getAttribute("Fragment")!=null?parseInt(tableElement.getAttribute("Fragment")):m_GridNumToDisplay;
		
		m_GridRowCollection = new Array();
		
		for(var nodeIndex=m_GridNumToDisplay;nodeIndex<childLength;nodeIndex++)
		{
			var childToRemove = tableElement.childNodes.item(nodeIndex);
			m_GridRowCollection.push(childToRemove);
		}
		
		for(var nodeIndex=0;nodeIndex<m_GridRowCollection.length;nodeIndex++)
		{
			childToRemove = tableElement.removeChild(m_GridRowCollection[nodeIndex]);
		}
		
		strHtmlContent = doc.xml;
		m_AsyncGridInterval = window.setInterval(AsyncGridTableInterval,intervalValue);
	}
	catch(err)
	{
		//
	}
	return strHtmlContent;
}

//this method are called by the window interval, and add to the
//main grid rows on the background until the row buffer is empty
function AsyncGridTableInterval()
{
	try
	{
		var rowNumber = m_GridNumToDisplay;
		if(m_GridTableId==null || m_GridRowCollection==null) return false;
		
		if(m_GridTableContainer == null)
		{
			m_GridTableContainer = document.getElementById(m_GridTableId);
			if( m_GridTableContainer == null ) return;
		}
		
		if( m_GridRowCollection.length==0 )
		{
			window.clearInterval(m_AsyncGridInterval);
		}
		
		if( m_GridRowCollection.length < m_GridNumToDisplay )
		{
			rowNumber = m_GridRowCollection.length;
		}
		// generate fragment container for div assembly
		var docFragment = document.createDocumentFragment();
		var divObj = docFragment.createElement("DIV");
		var rowStr = "";
		//get all row we want to display
		for(var rowCounter=0;rowCounter<rowNumber;rowCounter++)
		{
			var rowElement = m_GridRowCollection.pop();
			rowStr += rowElement.xml;
		}
		divObj.innerHTML = "<table>"+rowStr+"</table>";
		docFragment.appendChild(divObj);
		
		var rowCollection = docFragment.firstChild.firstChild.rows;
		//append all row to the table container
		while(rowCollection.length)
		{
			// blast new tbody into the document tree table
			m_GridTableContainer.firstChild.appendChild(rowCollection[0]);
		}
	}
	catch(err)
	{
		//
	}
}

function AO_SaveXrefCache(BOAlias,searchStr)
{
	var userData = m_ControlFrame.m_userData;
	var primaryKey=m_primaryXML.selectSingleNode("/root/main/@primaryKeys");
	
	if (primaryKey!=null)
	{
		primaryKey=(""+primaryKey.text).split(";")[0];
		if (primaryKey!="")
		{
			primaryKey=_ParseParams("&{main$"+primaryKey+"}");
			if (primaryKey!="") BOAlias=BOAlias+"_"+primaryKey;
				
		}
	}
	
	var userDataKey = BOAlias+"_"+_GetPageName(document.location.href).toLowerCase()+_GetGlobalVar('PortalUserLogin');
		
	userData.SaveValue(userDataKey,searchStr);		
}
function AO_LoadXrefCache(BOAlias)
{
	var retrieveAfterPopulate=false;
	var userData = m_ControlFrame.m_userData;
	var primaryKey=m_primaryXML.selectSingleNode("/root/main/@primaryKeys");
	
	if (primaryKey!=null)
	{
		primaryKey=(""+primaryKey.text).split(";")[0];
		if (primaryKey!="")
		{
			primaryKey=_ParseParams("&{main$"+primaryKey+"}");
			if (primaryKey!="") BOAlias=BOAlias+"_"+primaryKey;
				
		}
	}
	
	var userDataKey = BOAlias+"_"+_GetPageName(document.location.href).toLowerCase()+_GetGlobalVar('PortalUserLogin');
		
	//first try to load the data stored in user data
	try
	{
		userData.GetValue(userDataKey);
	}
	catch(err)
	{/*do nothing*/}
	//only if data is stored then continue
	//if ((srSpan!=null) && (srSpan.length==null)){
	if(userData.XMLDocument.documentElement != null &&
		userData.XMLDocument.xml != "" )
	{
		var CacheXMLDocument=userData.XMLDocument.selectSingleNode("/Find");
		if (CacheXMLDocument==null) return;
		var fnAtt=CacheXMLDocument.attributes;
		var inps;
		var inp_nodeName,row;
		for (var i=0;i<fnAtt.length;i++){
			inps=fnAtt[i];
			inp_nodeName=document.all[inps.nodeName+"_qbe"];
			if (inp_nodeName!=null) {
				retrieveAfterPopulate=true;
				if (inp_nodeName.field_type==null ||
						inp_nodeName.field_type.indexOf("date")===-1)
					inp_nodeName.value=inps.nodeValue;
				else inp_nodeName.value=AO_UDF(inps.nodeValue.split("T")[0]);
			}
		}
		if (retrieveAfterPopulate)
			A2CS_ServerRunRetrieve(true);
	}
}

//this function fix editable grid display after page is created
function FixEditableGridLayout(tblObj)
{
	function SetCheckBox(cellObj)
	{
		if( cellObj.getAttribute("type") == "checkbox" && cellObj.innerHTML == "&nbsp;")
		{
			cellObj.innerHTML = "<input class='checkbox' type='checkbox' disabled>";
			return true;
		}
		return false;
	}
	
	var rowsCollection = tblObj.rows;
	var cellsIndex = null;
	var rowLen = rowsCollection.length
	for(var rowIndex=0;rowIndex<rowLen;rowIndex++)
	{
		var rowObj = rowsCollection[rowIndex];
		if( cellsIndex == null )
		{
			var cellsCollection = rowObj.cells;
			var cellLen = cellsCollection.length;
			for(var cellIndex=0;cellIndex<cellLen;cellIndex++)
			{
				if(cellsCollection[cellIndex].className.match(/.*readonly_grid.*/ig)) continue;
				if(SetCheckBox(cellsCollection[cellIndex]))
				{
					if(cellsIndex == null ) cellsIndex = new Array();
					cellsIndex.push(cellIndex);
				}
			}	
		}
		else
		{
		    var cellLen = cellsIndex.length;
			for(var cellIndex=0;cellIndex<cellLen;cellIndex++)
			{
				SetCheckBox(rowObj.cells[cellsIndex[cellIndex]]);
			}
		}
	}
}

function AO_HighlightRowInGrid(BOName,alias)
{
	var tbls=document.currentAlias().all.tags("table");
	var tbl,rows,row,is_editable;
	for (var i=0;i<tbls.length;i++)
	{
		tbl=tbls[i];
		if (tbl.onclick==null) continue;
		rows=tbl.rows;
		if (rows.length==0) continue;		
		row=rows[0];
		if (row.id.indexOf("row_")>-1)		
		{
			//added by eli harel 04-05-2005
			//check if the grid table contain attribute that indicate
			//that we dont need to highlight the first row
            var iHighlightRowNum = parseInt(tbl.getAttribute("HighlightEditableRowNum"),10);
            if(  !isNaN(iHighlightRowNum) && iHighlightRowNum > 0 )
            {
              if( iHighlightRowNum <= rows.length )
              {
                  row=rows[iHighlightRowNum-1];
              }
            }
            var sOnClick = tbl.onclick.toString().trim();
			if ((sOnClick.indexOf("SelectEditable")>-1) || ( !isNaN(iHighlightRowNum) && iHighlightRowNum > 0 ) ||
				(tbl.onselectstart!=null && tbl.onselectstart.toString().trim().indexOf("SelectEditable")>-1))
			{
				if( !validateObj.IsNothing(m_XrefSpecs[currTab]) && m_XrefSpecs[currTab].xrefPage != null)
				{
					SelectEditableXrefRow(tbl,m_XrefSpecs[currTab].xrefBoName,row);
				}
				else if(sOnClick.indexOf("SelectEditableXrefRow")>-1)
				{
				    row.setActive();
				    tbl.click();
				}
				else
				{
					SelectEditableRow(tbl,row);
				}
				m_skipFocusOnFirst = true;
			}
			else 
			{
				// zoom on row if only one row exist
				if ((tbl.zoom!=null))
				{
					if (m_StartOnZoom[alias]==null)	{
						m_StartOnZoom[alias]=false;				
						var rowsNum=tbl.rows;		
						if (rowsNum.length>0)
						{
							var rw=tbl.rows[0];
							if ((m_XrefSpecs[currTab]!=null) && (m_XrefSpecs[currTab].RowID!=null)){
								for (var i=0;i<tbl.rows.length;i++)
								{
									if (tbl.rows[i].id==m_XrefSpecs[currTab].RowID)
									{
										rw=tbl.rows[i];
										break;
									}
								}
							}
							for (var i=0;i<rw.cells.length;i++)
							{
								try
								{
									rw.cells[i].focus();
									break;
								}catch(e){}
								
							}
							
							if (tbl.onclick!=null) tbl.click();					
							else SelectRow(tbl,rowsNum[0]);
							RowEdit('',true);
						}
					}
				}
				else
				{
					if( validateObj.IsDefined(m_currentRow[currTab]) )
					{
						var tmprow = tbl.all("row_"+(m_currentRow[currTab]+1));
						row = tmprow!=null?tmprow:row;
					}
					SelectRow(tbl,row);	
				}
			}
			return;
		}
	}
	return;

}

function __rod(pagebos,keys,bocolumnlist,alias,sign){	
	var xrefNull	=false;
    Debug.writeln("Start __rod");
	var date1 = new Date();
	var objPage = document.getElementById(alias);
	objPage.innerHTML="";
	RetrieveOnDemand(pagebos,bocolumnlist);
	Debug.writeln("Finish Retrive ROD " + ((new Date()).getTime()- date1.getTime()));
	m_primaryXSL = GetXSLDocument("_" + alias + "XSL");
	//m_primaryXSL=_addIncludes(m_primaryXSL);
	m_XSLURL=m_primaryXSL.url;
	AO_PRE_CreatePage(alias);
	var strHtml = m_primaryXML.transformNode(m_primaryXSL);
	Debug.writeln("Finish Transformation " + ((new Date()).getTime()- date1.getTime()));
	if (m_primaryXSL.xml!="")
		objPage.insertAdjacentHTML("afterBegin",strHtml);	
    Debug.writeln("Finish Build HTML " + ((new Date()).getTime()- date1.getTime()));
	
	objPage.style.cursor="default";
	m_timerStart=false;	
/**************/
	if (m_XrefSpecs[currTab]==null) xrefNull=true;		
	if (xrefNull || (m_XrefSpecs[currTab].xrefPage==null)){

	}
	else {	
		var checkRow=null;
		var BOALias=m_aliases[get_PrimaryBoIndex(currTab)];
		var Module_PrimaryKey=_GetGlobalVar("Module_PrimaryKey");
		_SetGlobalVar("Module_PrimaryKey","");
		checkRow=GetRowByPrimaryKey(BOALias,Module_PrimaryKey);
		if (checkRow!=null)
		{
			m_currentRow[currTab]=checkRow.getAttribute("number")-1;
		}
		
		//GetRowID(xmlCriteria,rowFormat)
		//SelectRowByID(GetRowID("//demand_expense/row[demand_id=" + demand_id +"]"))		
		//_SetGlobalVar("Module_PrimaryKey",primaryKey+";"+primaryKeyValue);
		if (checkRow==null)
			checkRow=m_primaryXML.selectSingleNode("/root/"+BOALias+
				"/row[@number='"+String(m_currentRow[currTab]+1)+"']");
		if (checkRow!=null)	{			
			AO_PRE_CreatePage(alias);			
			RowEdit(m_XrefSpecs[currTab].xrefPage,true,	m_XrefSpecs[currTab].newRow);		
			/*m_XrefSpecs[currTab].SortOrder="+number(@number)";
			if (null!=Module_PrimaryKey && Module_PrimaryKey!="")
			{
				currRow[m_currentAlias]=m_currentRow[currTab];
				__RowsCountStr(null,true);
			}
			return true;*/
			if (typeof(_GetGlobalVar("Module_SortOrder"))!="undefined")
			{
			    m_XrefSpecs[currTab].SortOrder=_GetGlobalVar("Module_SortOrder");
			    _RemoveGlobalVar("Module_SortOrder");
				//currRow[m_currentAlias]=m_currentRow[currTab];
				//__RowsCountStr(null,true);
			}
			if (m_XrefSpecs[currTab].SortOrder=="" || m_XrefSpecs[currTab].SortOrder==null) 
			{
				m_XrefSpecs[currTab].SortOrder="+number(@number)";
			}
				AO_After_CreatePage(alias);	
			return true;
		}
	}
	
	AO_HighlightRowInGrid(pagebos,alias);
	//setTimeout("AO_FocusFirstObject()", 10);

			
	
/**************/
	
	
}
function _CreateTabControl(objParent)
{
	var i, count, oRow, oCell;
	if(m_tabControlHtml != "")
	{
		return;
	}
	var strHTML="<TABLE width='100%' height='100%'><TBODY><TR width='100%' height='100%'>";
	
	count = m_PageAliases.length;
	
	for (i = 0; i < count; i++)
	{
		strHTML+="<TD width='100%' height='100%' style='display:none' id="+m_PageAliases[i]+"></TD>"
	}
	strHTML+="</TR></TBODY></TABLE>";
	
	objParent.insertAdjacentHTML("beforeEnd",strHTML);
	m_tabControlHtml = objParent.innerHTML;
	return true;
}

function AO_MapReport(alias,report_num){
	if (m_ReportParams[report_num]==null) return false;
	alias=document.all[alias];
	if ((alias==null) || (alias.length!=null)) return false;
	alias.onclick = new Function("return Single_Report("+report_num+")");		
}

function _OpenPageKB(){
	var paCount=m_PageAliases.length;
	for (var currPageNum=0;currPageNum<paCount;currPageNum++){
		if (m_currentAlias==m_PageAliases[currPageNum]) break;		
	}
	if (currPageNum==paCount) returnFalse;
	var prevID="",nextID="", idKB="";
	if (m_PageAliases[currPageNum-1]!=null) prevID=m_PageAliases[currPageNum-1];
	if (m_PageAliases[currPageNum+1]!=null) nextID=m_PageAliases[currPageNum+1];
	var ev=window.event;
	var se=ev.srcElement;
	with (ev){		
		if (ctrlKey && (keyCode==40) && (nextID!="")) idKB=nextID;
		if (ctrlKey && (keyCode==38) && (prevID!="")) idKB=prevID;		
	}	
	if (idKB!=""){
		var pm=document.getElementById("sub"+idKB);
		if (pm!=null && (pm.onclick!=null)) {
			ev.cancelBubble=true;
			ev.returnValue=false;				
			AO_HotLink(pm.parentGroup,idKB);
		}
	}
}
function _CreateTabControlItems(objParent)
{
	var cachedTabControlItems = _GetTabControlItemsFromCache("maint");
	
	if( cachedTabControlItems != null )
	{
		objParent.innerHTML = cachedTabControlItems;
		return true;
	}
	
	if (m_TabControl!=""){
		objParent.innerHTML=m_TabControl;
		return true;	
	}
	
	var pos, groupAlias, pageCount, maxPage = 0;
	var oRow, oCell, subRow, subCell, startPage;
	var oTable = document.createElement("TABLE");	

	var oTBody = document.createElement("TBODY");
	var oArrowCell,oArrowTable,oArrowRow,oArrowBody;
	oTable.width = "125px";
	oTable.cellSpacing = "0";
	oTable.cellPadding = "0";
	oTable.border = "0";
	oTable.style.tableLayout = "fixed";
	oTable.id = "subTabContainerTbl";
	//oTable.border="1";
	var count = m_GroupAliases.length;
	
	for (var i = 0; i < count; i++)
	{
		oRow = document.createElement("TR");
		oRow.width = "100%";
		
		pos = m_GroupAliases[i].search("\\:");
		if (pos == -1) return false;
		
		groupAlias = m_GroupAliases[i].substring(0, pos);
		m_ElementsIDs[i]=groupAlias;
		
		pos++;
		pageCount = parseInt(m_GroupAliases[i].substr(pos));
		oCell = document.createElement("TD");
		oCell.id = groupAlias;
		//oCell.innerText = m_GroupTitles[i];
		var onClickFuncStr = "return _SelectTabControlItem(\"" + groupAlias + "\")";
		var strTmpTbl = "<table width='100%' cellpadding='0' cellspacing='0' border='0'>"+
						"<tr><td disableelement='false' NOWRAP style='text-overflow:ellipsis;overflow:hidden;word-break:keep-all;font:bold 12px arial'  onclick='"+onClickFuncStr+"' id="+groupAlias+"_label>"+m_GroupTitles[i]+"</td></tr>"+
						"</table>";
		oCell.innerHTML=strTmpTbl;
		
		oCell.align = "left";
		oCell.style.textOverflow = "ellipsis";
		oCell.style.overflow = "hidden";
		oCell.title = oCell.innerText;
		
		oCell.className = "clsTabControlItem";
		
		oCell.noWrap="true";
		
		//var oArrowTable = document.createElement("TABLE");
		//oArrowTable.border="1";
		//var oArrowBody =  document.createElement("TBODY");
		//var oArrowRow =  document.createElement("TR");
		oRow.appendChild(oCell);
		oTBody.appendChild(oRow);
		oCell = null;
		oRow = null;

		pageCount += maxPage; 
		startPage= maxPage;
		if (pageCount > m_PageAliases.length) return false;
		var subTable = document.createElement("TABLE");
		var subTBody = document.createElement("TBODY");
	
		subTable.width = "100%";
		subTable.cellSpacing = "0";
		subTable.cellPadding = "0";
		subTable.border = "0";
		subTable.style.tableLayout = "fixed";
		
		subTable.id = "sub" + groupAlias;
		subTable.style.display = "none";
		oRow = document.createElement("TR");
		oRow.width = "100%";

		oCell = document.createElement("TD");
		oCell.width = "100%";

		for (var j = startPage; j < pageCount ; j++, maxPage = j)
		{
			var pageName = "sub" + m_PageAliases[j];
			subRow = document.createElement("TR");
			subRow.width = "100%";
            var isVisible = validateObj.InvokeHook("f_visibleSubItem",m_PageAliases[j]);
            
            if(isVisible==false)
            { 
                subRow.setAttribute("NotVisible",true);
                subRow.style.display = "none";
            }
			subCell = document.createElement("TD");
			subCell.noWrap = true;
			subCell.style.textOverflow = "ellipsis";
			subCell.style.overflow = "hidden";
			subCell.id = pageName+"ex";
			//subCell.innerText = m_PageTitles[j];
			subCell.title = subCell.innerText;
			subCell.className = "clsTabControlSubItem";
			//subCell.onclick = new Function("return _OpenPage('" + m_PageAliases[j] + "')"); 
			subCell.parentGroup=groupAlias;
			//added by eli harel the function call is done by declarative
			var cellInnerHTML = "";
			
			onClickFuncStr = "_OpenPage(\"" + m_PageAliases[j] + "\")";
			cellInnerHTML = "<table width='125px' style='table-layout:fixed' cellpadding='0' cellspacing='0' border='0'>"+
							"<tr><td disableelement='false' id='"+pageName+"' NOWRAP style='padding-left:12px;text-overflow:ellipsis;overflow:hidden;word-break:keep-all;font:11px arial' onclick='"+onClickFuncStr+"'>"+m_PageTitles[j]+"</td></tr>"+
							"</table>";
			subCell.innerHTML = cellInnerHTML;
			
			subRow.appendChild(subCell);
			subTBody.appendChild(subRow);

			subCell = null;
			subRow = null;		
		}
		
		subRow = document.createElement("TR");
		subRow.width = "100%";

		subCell = document.createElement("TD");
		subCell.className = "clsTabControlSubItemBottom";

		subRow.appendChild(subCell);
		subTBody.appendChild(subRow);
 
		subCell = null;
		subRow = null;
			
		subTable.appendChild(subTBody);
		oCell.appendChild(subTable);
		oRow.appendChild(oCell);
		oTBody.appendChild(oRow);

		oCell = null;
		oRow = null;
		subTBody = null;
		subTable = null;
	}
	oTable.appendChild(oTBody);
	objParent.appendChild(oTable);
	_AddTabControlItemsToCache(objParent.innerHTML,"maint");
	oRow = null;
	oTBody = null
	oTable = null;
	return true;
}

function _SetModuleTitles(){
	if( window.dialogArguments == null && window.opener == null )
	{
	    var sTitle = _SetModuleTitle(m_ClusterTitle, _ClusterTitle);
		window.top.document.title = sTitle;
		//adding hook function so application can edit the Module Title 
		//for history purposes only.
		var sTitleExt = "";
		try {
		    sTitleExt = f_titleForHistory();
		} catch (e) {/*do nothing */}
		if (sTitleExt != "") 
		{
		   sTitle += "["+sTitleExt+"]";
		} 
		else if(typeof(WebVar_itemclickedid) != "undefined" && typeof(m_action)!="undefined" && m_action == "maint")
		{
		    sTitle += "["+WebVar_itemclickedid+"]";
		}
		else if( m_objParamsBuilder != null && m_objParamsBuilder.macroParams != null 
		    && m_objParamsBuilder.macroParams != "" && typeof(m_action)!="undefined" && m_action == "maint")
		{
		    sTitle += "["+m_objParamsBuilder.macroParams+"]";
		}
		else if(typeof(m_action)!="undefined" && m_action == "new")
		{
		    sTitle += "["+m_action+"]";
		}
		else if(typeof(m_action)=="undefined" && document.location.href.toUpperCase().indexOf("_QBE.ASP")>-1)
		{
		    sTitle += "[QBE]";
		}
	    document.title = sTitle;
	}
	else
		document.title = _SetModuleTitle(m_ClusterTitle, _ClusterTitle);
	// astea-trans=placeholder;placeholder;N;
	if(_GetGlobalVar('PortalName')==null){
		//new user have no portal - show only module title
		_SetModuleTitle(_addTitleStyle(m_ClusterTitle).toUpperCase(), _ClusterTitle);
	}
	else{
		//show module title
		_SetModuleTitle(_addTitleStyle(m_ClusterTitle).toUpperCase(), _ClusterTitle);
		//show login details
		// astea-trans=text;TXTJAVASCRIPT$Welcome,;N;
		// astea-trans=placeholder;placeholder;N;
		// astea-trans=placeholder;placeholder;N;
		// astea-trans=placeholder;placeholder;N;
		// astea-trans=placeholder;placeholder;N;
		// astea-trans=placeholder;placeholder;N;
		// astea-trans=text;TXTASP$db_prof_t_vx;Y;
		// astea-trans=placeholder;placeholder;N;
		// astea-trans=placeholder;placeholder;N;
		// astea-trans=placeholder;placeholder;N;
		// astea-trans=placeholder;placeholder;N;
		// astea-trans=placeholder;placeholder;N;
		// astea-trans=text;TXTASP$version_vx;Y;
		// astea-trans=placeholder;placeholder;N;
		// astea-trans=placeholder;placeholder;N;		
		_SetModuleTitle("Welcome,"+" <b>"+HTMLEncode(_GetGlobalVar('first_name'))+" "+HTMLEncode(_GetGlobalVar('last_name'))+"</b> &nbsp;&nbsp; "+"DB Profile:"+" <b>"+_GetGlobalVar('DBProfile').replace('+',' ')+"</b> &nbsp;&nbsp; "+"Version:"+" <b>"+CURRENT_VERSION+"</b>",_LoginDetailsTitle);

	}
	_SetModuleTitle(_addTitleStyle(m_ModuleTitle), _ModuleTitle);
	_SetModuleTitle(_addTitleStyle(m_ModuleSubTitle), _ModuleSubTitle);
}
function _addTitleStyle(str){
	var pos,iStart=0,iEnd;
	var strTemp="";
	while (true){
		iStart=str.indexOf("&{");
		
		if (iStart==-1) {
			strTemp+=str.substr(0);
			break;
		}
		else strTemp+=str.substring(0,iStart);		
		iEnd=str.indexOf("}");		
		var id = str.substring(iStart+2,iEnd);
		id = id.split(".")[0];
		strTemp+="<font id='"+id+"' style='font:bold 11px arial; color:black'>"+str.substring(iStart,iEnd+1)+"</font>";
		str=str.substr(iEnd+1);		
	}
	return strTemp;
}
function _SetModuleTitle(str,obj) {
	var strArgs = _ParseParams(str,null,true);

	if (obj.innerHTML != strArgs){
		obj.innerHTML = strArgs;
		return obj.innerText;
	}
	
	return obj.innerText;
}
/// <summary>
/// Evaluates pre-defined expression to get values from the client state,
/// example: ("&{demand_labor#3$demand_id.number()}")returns the value of the demand_id in the third line in demand_labor, and format the value to a culture number representation.
/// {BOName#LineNumber$fieldName.functionName}, function names - gettime(),getdate(),ddlb(),checkbox(),number(),maxlen()
/// </summary>
/// <param name="str">[required]the expression to evaluate</param>
/// <param name="withTypes">[Obsolete]pass null as parameter</param>
/// <param name="set_alt">[optional, default false]if true return the value as title description for element</param>
/// <returns>string that contains the result from the state</returns>
function _ParseParams(str,withTypes,set_alt){
	var iEnd, iStart;
	var strArgs, strField, strParams,strLine,strFunc,strVal,strType,ndXML;
	if (withTypes==null) withTypes=false;
	if (set_alt==null) set_alt=false;
	if (str != null)
	{
		strArgs = str;
					
		while (true)
		{
			iStart = strArgs.search("&{");
			if (iStart == -1) break;
			iStart += 2;
			strField = strArgs.substr(iStart);
			iEnd = strField.search("}");
			strField = strField.substr(0, iEnd);
			strParams = strField.split("$");
			strLine=strParams[0].split("#");
			strFunc=strParams[1].split(".");
			if (strLine.length==1){
				ndXML=m_primaryXML.selectSingleNode("//" + strParams[0] + "//" + 
						strFunc[0]);
				if (ndXML!=null){
					strVal = ndXML.text;
//					if (withTypes && ndXML.dataType.toLowerCase()=="string") strVal="'"+strVal;
				}
				
			}
			else if (strLine.length==2){
				var slashes="//" + strLine[0] +"/";
				if (slashes=="///") slashes="//";
				ndXML=m_primaryXML.selectSingleNode(slashes+"row[@number='"+strLine[1]+"']//"+strFunc[0])
				if (ndXML!=null) strVal = ndXML.text; //ASAP IL0704220002
//				if (withTypes && (ndXML.dataType==null || ndXML.dataType.toLowerCase()=="string")) strVal="'"+strVal+"'";
			}
			if(typeof(strVal)!="undefined") strVal = HTMLEncode(strVal);	
			if (strFunc.length==2){
				switch (strFunc[1].toLowerCase()){
					case "gettime()":
						strVal=AO_GetDateTime(strVal,4);							
						break;
					case "getdate()":
						if (strVal!="")	strVal=AO_UDF(strVal.split("T")[0]);							
						break;
					case "ddlb()":
						if (strVal!="")	strVal=AO_DescrFromDDLB(strFunc[0],strVal);
						break;
					case "checkbox()":
						if (strVal!="")	strVal=AO_DescrFromCheckBox(strFunc[0],strVal);					
						break;						
					case "number()":
						if (strVal!="")	strVal=AS_Num2String(strVal);
						break;
					case "maxlen()":
						if (strVal!="")	strVal=AO_MaxLen(strVal);
						break;
				}
			}
					
			if((typeof(strVal)!="undefined" && strVal.length>50 && set_alt==true )
			    && (ndXML.dataType==null || ndXML.dataType.toLowerCase()=="string"))
			{
				strVal = "<font title='"+strVal+"' style='cursor:hand'>"+strVal.substr(0,50)+"...</font>";
			}	
			else if(typeof(strVal)=="undefined")
			{
			    return "";
			}
			strArgs = strArgs.replace("&{" + strField + "}", strVal);
		}
	
		while (true)
		{
			iStart = strArgs.search("@{");
			if (iStart == -1) break;
			iStart += 2;
			strField = strArgs.substr(iStart);
			iEnd = strField.search("}");
			strField = strField.substr(0, iEnd);
			strVal = eval(strField);
			strArgs = strArgs.replace("@{" + strField + "}", strVal);
		}

		return strArgs;
	}
}
/// <summary>
/// The titles are stored in three variables: m_ClusterTitle, m_ModuleTitle, and m_ModuleSubTitle.
///  This function parses these three variables and puts them in the page titles. This function is invoked on ItemChange Event.
/// </summary>
function _RefreshTitle() {
	return _SetModuleTitles();
}
/// <summary>
/// 1.	Moves to the group in the menu that was specified.
/// 2.	Opens the specify page(calling _OpenPage(alias))
/// </summary>
/// <param name="group">[required] group name</param>
/// <param name="alias">[required] page alias name</param>
/// <param name="XrefJump">[optional,default false]if the page is Xref Page pass true</param>
/// <returns>true/false</returns>
function AO_HotLink(group, alias,XrefJump) {
	if (window.name=="ConnectedWindow") return;
	if (XrefJump==null) XrefJump=false;
	//window.event.cancelBubble=true;
	_SelectTabControlItem(group,"open")
	if(	_OpenPage(alias)){
		_AssignCurTab(alias)
		if (XrefJump==true) m_XrefSpecs[currTab]=null;			
		return true;
	}
	return false;
}
function _AssignCurTab(alias){
	for (var i=0;i<m_PageAliases.length;i++)
		if (m_PageAliases[i]==alias){
			currTab=i;
			//m_currentRow[currTab]=null;
			break;
		}		
}
function LoadXMLDDLB(xmlObj){
	if (xmlObj==null) return null;	
	var xmlRoot=xmlObj.selectSingleNode("/root");
	if (xmlRoot==null) return xmlObj;
	var ddlbFound=xmlRoot.selectNodes("ddlb");
	if (ddlbFound.length) return xmlObj;
	var docXSL=document;
//	if (document.frames.length>0)
//		docXSL=document.frames("iXSLLoader");
	

	// V.K. New DDLB maint syntax

	if(typeof(m_DDLBPath) != "undefined")
	{
		var ddlbArr = m_ControlFrame.m_DDLB[m_CurrentPageName]
		var doc = new ActiveXObject("MSXML2.DOMDocument");
		doc.async = false 

		if(typeof(ddlbArr) == "undefined")
		{
		
			m_ControlFrame.m_DDLB[m_CurrentPageName] = new Array()
			ddlbArr = m_ControlFrame.m_DDLB[m_CurrentPageName]

			for(i=0; i < m_DDLBPath.length; i++)
			{
				doc.load(m_DDLBPath[i])
				if(doc.parseError == 0)
				{
					ddlbArr[m_DDLBPath[i]] = doc.selectSingleNode("/ddlb").cloneNode(true)
				}
				else
				{
					alert("Failed loading DDLB from path = " + m_DDLBPath[i]);
					ddlbArr[m_DDLBPath[i]] = null
				}
			}
		}

		for(ddlbPath in ddlbArr)
		{
			if(ddlbPath =="../ddlb_xml/priority_ddlb.xml")
			{
				xmlRoot.appendChild(SOAP_RetrieveDDLBPriority());
			}
			else
			{
				if(ddlbArr[ddlbPath] != null)
					xmlRoot.appendChild(ddlbArr[ddlbPath].cloneNode(true))
			}
		}
		return xmlObj
	}
	// V.K. New maint syntax
	
/* Meir 18.02.04 14:55 By Kofman's request
	if (docXSL.all["ddlb_xml"]==null)
	{
		if (window.top.frames.length>0){
			docXSL=window.top.frames("XSLPagesFrame");		
			if (docXSL!=null) docXSL=docXSL.document;
		}
	}
*/	
	var ddlbNodes=docXSL.all["ddlb_xml"];
	if (ddlbNodes==null) return xmlObj;		
	var ddlbXML;
	if (ddlbNodes.length==null){
		if (ddlbNodes.src=="../ddlb_xml/priority_ddlb.xml")
		{
			xmlRoot.appendChild(SOAP_RetrieveDDLBPriority());
			
		}
		else
		{
			ddlbXML=ddlbNodes.XMLDocument.selectSingleNode("/ddlb");
			if (ddlbXML!=null && ddlbXML.xml!="" && ddlbNodes.XMLDocument.parseError==0) xmlRoot.appendChild(ddlbXML.cloneNode(true));
		}
	}
	else{
		for (var i=0;i<ddlbNodes.length;i++){
			if (ddlbNodes[i].src=="../ddlb_xml/priority_ddlb.xml")
			{				
				xmlRoot.appendChild(SOAP_RetrieveDDLBPriority());
				
				
			}
			else
			{
				if (ddlbNodes[i].XMLDocument.parseError!=0)	continue;
				ddlbXML=ddlbNodes[i].XMLDocument.selectSingleNode("/ddlb");
				if (ddlbXML!=null && ddlbXML.xml!="")xmlRoot.appendChild(ddlbXML.cloneNode(true));
			}			
		}
	}	
	xmlObj=AS_SearchAndLoadDynamicLists(xmlObj);
		
	return xmlObj;
}
function AO_ModuleOnload(){
	try{
	    window.status = "";
	    window.document.body.onclick=new Function("AO_ShowElementID()");	    
		AO_tryResize();
		//window.top.control_frame.UnloadHandler();		
		AO_Onload_Post();
	}catch(e){/*do nothing*/}
}
//iTimers++;
//var k_OpenModuleExecInline=iTimers;

function ShowLockingFilter()
{
    // astea-trans=text;TXTASP$record_locked_vx;N;
    var sMsg = "This Record is Locked By";
	if(document.getElementById("lockedDiv")!=null || m_LockingPerson=="") return;
	document.all("MainDiv").insertAdjacentHTML("afterBegin","<div style='position:absolute; top:100px;left:300px;' ID='lockedDiv'><h1><font color='darkgray'>"+sMsg+" "+m_LockingPerson+"</font></h1></div>");
	lockedDiv.style.filter="progid:DXImageTransform.Microsoft.Matrix(M11=\"1.0\", sizingmethod=\"auto expand\");";	
	var deg2rad=Math.PI * 2 / 360;
	var rad = 25 * deg2rad;

	var costheta = Math.cos(rad);
	var sintheta = Math.sin(rad);

	lockedDiv.filters.item(0).M11 = costheta;
	lockedDiv.filters.item(0).M12 = -sintheta;
	lockedDiv.filters.item(0).M21 = sintheta;
	lockedDiv.filters.item(0).M22 = costheta;
	document.all("_TabControl").style.filter="alpha(opacity=50)";    
}

function ExecInlineCode() 
{	
	if (aliasLoaded=="") return;
	if (m_primaryXML==null) return;	
	var lockingPerson=AS_RecordIsLocked();
	if (lockingPerson!="")
	{
		ShowLockingFilter();
		m_PageIndicator.NoBusy(); 
	}  	
	var loadElm=document.getElementById("loadingh1");
	if (loadElm!=null) {
		loadElm.style.display="none";
		loadElm.style.visibility="hidden";
		
	}
	try{
		var oResult = RunCodeAfterRetrievePrefOpenPage(aliasLoaded);
		if(typeof(oResult) == "object" && oResult != null)
		{
		    aliasLoaded="";
	        groupAliasLoaded = oResult.GroupName.split(":")[0];
	        _SelectTabControlItem(groupAliasLoaded,false);
	        aliasLoaded = oResult.AliasName;
		}
	}catch(e){/* Do Nothing */}	
//		timesArray[k_afterExec]=window.top.control_frame.timers_diff(window.top.control_frame.timer_now(),timesArray[k_afterExec]);						
	var alias=aliasLoaded;
	var mask = 0;
	aliasLoaded="";
	var id;
	
	if (m_action=="maint") 
	{
		_OpenPage(alias);
		AO_DisableTab();		
        mask = (2|4|8);
        ExecuteCommand("SaveAsRecentDocument","");
	}
	else {
		_OpenWizPage(_TabControl);
		_ChangeStyle(groupAliasLoaded);	
		if(window.dialogArguments != null || opener != null)
		{
		    mask = (4|8);
		}
	}
	if (m_action=="") m_action="search";
	//var buttons=document.getElementById("_Module_ToolBar").cells(0).all.tags("TD");
	var buttons=document.getElementById("_Module_ToolBar").cells(0).firstChild.rows(0).cells;
    //var buttons=MenuBarItemsXML.XMLDocument.selectNodes("/MenuBarItems/MenuBarItem[@"+m_action+" $ieq$ 'true']");
	
	for (var i=0;i<buttons.length && !AO_IsConnectedWindow();i++)
	{
		if( buttons[i].getAttribute("debug"))
		{
			//buttons[i].onclick = new Function("CopyNUnitToClipbord()");
			continue;
		}
		if (buttons[i].className==null) continue;
		if (buttons[i].getAttribute(m_action)=="" || buttons[i].getAttribute(m_action)==null) continue;
		if (buttons[i].getAttribute(m_action).toLowerCase()=="true")
        {                 
            id=buttons[i].id; 
            var bIsDisabled = false;      

            if (AS_GetBCPermission("modify")!="true" && ((id=="tdMenuBarItemApply")|| (id=="tdMenuBarItemSave") ))
            {
                bIsDisabled = true;
            }
            else if (AS_GetBCPermission("new")!="true" && ((id=="tdMenuBarItemNew")))
            {
                bIsDisabled = true;
            }
            if (AS_GetBCPermission("delete")!="true" && ((id=="tdMenuBarItemDelete")))
            {
                bIsDisabled = true;
            }
            if ((id=="tdMenuBarItemReport") && (AS_GetReportPermission()!="true"))

            {
              bIsDisabled = true;
            }
            //
            if( bIsDisabled )
            {
              AO_SetMenuButton("disabled",id,"javaScript","javaScript",null,null,null);     
            }
            else
            {
              AO_SetMenuButton(m_action,id);
            }
        }
	}
//ASAP IL0711050006 rollback all changes related to the attachment count US028432 BHunter(03.16.07)      
//    if(m_attachNum > 0)
//    {
//        m_attachNum = UpdateAttachmentCount(m_tableName,m_tableKey,m_attachNum);
//    } 
//ASAP IL0711110005, the astrik appear above the home icon
//    if(m_attachNum>0 && document.all["attach"]!=null)
//    {
//        document.all["attach"].parentElement.title = '('+m_attachNum+')';
//        buttonLeft=document.all["attach"].parentElement.parentElement.parentElement.parentElement.parentElement.offsetLeft+20;
//        document.all["attach"].parentElement.innerHTML+="<font id='red_asterisk' color='red' style='font-size:17px;position:absolute;top:3;left:"+buttonLeft+";cursor:hand'><b>*</b></font>";
//    }
	AS_DisplayNewSaveOptions(mask);
	if(AS_IsDebugMode(true)) NU_ShowNunit();
	tblToolBar.style.display = "block";
	if( DoSingleOperation() == true ) 
	{
		CreateHotLinksButtons();
	}
	else
	{
		UpdateHotLinksButtons();
	}
	document.getElementById("divToolBar").disabled=false;

	_SetModuleTitles();	
	if (m_action=="maint") 
	{
        ExecuteCommand("SaveAsRecentDocument","");
	}
	PrintTimer('_SetModuleTitles.xml')
//	timesArray[k_Mod1]=window.top.control_frame.timers_diff(window.top.control_frame.timer_now(),timesArray[k_Mod1]);							
//	iTimers++;	
//	var k_UserFuncs=iTimers;
//	funcsArray[k_UserFuncs]="User Functions inside ExecInlineCode()";	
//	timesArray[k_UserFuncs]=window.top.control_frame.timer_now();	
	
	PrintTimer('ExecInlineCode-AfterOpenPage.xml')
	var bUpdateMenuStatus = false;
	if (AS_GetBCPermission("modify")=="true" || AS_GetBCPermission("delete")=="true" ||
	AS_GetBCPermission("new")=="true")
	{
		try{
			f_change_menu_func();
		}catch(e){/* Do Nothing */}
		try{

			if(!AO_IsConnectedWindow())f_update_menu_status();
			bUpdateMenuStatus = true;
		}catch(e){/* Do Nothing */}
	}
	try{
		RunCodeAfterRetrieve();
	}catch(e){/* Do Nothing */}	
	
   if(m_attachNum>0 && document.all["attach"]!=null)
	{
		document.all["attach"].parentElement.title = '('+m_attachNum+')';
		buttonLeft=document.all["attach"].parentElement.parentElement.parentElement.parentElement.parentElement.offsetLeft+20;
		document.all["attach"].parentElement.innerHTML+="<font id='red_asterisk' color='red' style='font-size:17px;position:absolute;top:3;left:"+buttonLeft+";cursor:hand'><b>*</b></font>";
	}

	document.getElementById("_ModuleTitle").style.display="";
	document.getElementById("_ModuleSubTitle").style.display="";
	document.getElementById("_Module_ToolBar").style.display="";
	AO_DisplayNavigationButtons();
	if (AO_IsConnectedWindow())
	{
		AO_DisablePageDOM(null,true);
		AO_DisablePageDOM('_TabControlItems',false);
		AO_DisablePageDOM('_tabDownArrow',false);
	}
	FixToolBarLayout();
	if(m_action=="new" && bUpdateMenuStatus) NewBtnOverrideOnClick();
	aliasLoaded=alias;
	aliasLoaded="";
	m_pageFirstLoaded = true;
	CreateXMLDOM();
	m_PageIndicator.NoBusy();
	if(typeof(WebVar_AsyncLoad) != "undefined" && WebVar_AsyncLoad == "true")
	{
        if(m_useSingleInstance)
        {
            for(var key in m_PreserveNodeStatus)
            {
                var oNode = m_primaryXML.selectSingleNode(key);
                oNode.setAttribute("status",m_PreserveNodeStatus[key]);
            }
            m_PreserveNodeStatus = null;
        }
        else
        {
            var tmpPrimaryXML = AS_GetASyncHandler().PreserveStateXML(window.document.location.href);
            m_primaryXML.loadXML(tmpPrimaryXML.xml);
        }
	    AS_GetASyncHandler().RemoveStateByLocation(window.document.location.href);	
	    WebVar_AsyncLoad = undefined;
	}
	//AS_LockRecordUsedByUser();
}

function NewBtnOverrideOnClick()
{
    var oElement = document.getElementById('btnSubmitSelected');
    if(oElement.onclick != null && window.dialogArguments==null && window.opener ==null)
    {
        var sFunction = oElement.onclick.toString();
        var start = sFunction.indexOf("{")+1;
        var end = sFunction.indexOf("}")-1;
        var sScriptExec = "";
        sFunction = sFunction.substring(start,end);
        
        oElement = document.getElementById('tdMenuBarItemSaveAndExit');
        if(oElement != null)
        {
            sScriptExec = String.prototype.Format("{0};{1};{2}","AS_SetSaveOptions(this,1)",sFunction,"")
            oElement.onclick = new Function(sScriptExec);
        }
        oElement = document.getElementById('tdMenuBarItemSaveAndNew');
        if(oElement != null)
        {
            sScriptExec = String.prototype.Format("{0};{1};{2}","AS_SetSaveOptions(this,2)",sFunction,"")
            oElement.onclick = new Function(sScriptExec);
        }
    }
    
    if(window.dialogArguments!=null || window.opener !=null )
    {
        var oContainer = document.getElementById("divToolBar");
        var oTable = oContainer.all("_Module_ToolBar_Tbl");
        var oCells = oTable.rows[0].cells;
        for(var index=0;index<oCells.length;index++)
        {
            var oCell = oCells[index];
            if(oCell.id == "btnSubmitSelected") oCell.style.display = "block";
            else oCell.style.display = "none";
        }
        
        oContainer.style.display = "block";
    }
}
function FixToolBarLayout()
{
    try
    {
        var oTdNames = {'tdMenuBarItemPortal':'tdMenuBarItemSpace_1','tdMenuBarItemClose':'tdMenuBarItemSpace_2','tdMenuBarItemNew;tdMenuBarItemSave;tdMenuBarItemApply;tdMenuBarItemSaveAndExit;tdMenuBarItemSaveAndNew;btnSubmitSelected':'tdMenuBarItemSpace_3','tdMenuBarItemNew;tdMenuBarItemDelete':'tdMenuBarItemSpace_4','tdMenuBarItemRefresh':'tdMenuBarItemSpace_5'};
        
        for(var tdName in oTdNames)
        {
            var sSeparator = oTdNames[tdName];
            var tdGroup = tdName.split(";");
            var enable=false;
            
            for(var index=0;index<tdGroup.length;index++)
            {
                var oElement = document.getElementById(tdGroup[index]);
                if( oElement == null || oElement.style.display == "none")continue;
                enable = true;
                break;
            }
            if(!enable && document.getElementById(sSeparator)!=null)
            {
                document.getElementById(sSeparator).style.display = "none";
            }
            else
            {
                document.getElementById(sSeparator).style.display = "";
            }
        }
     }
     catch(err)
     {/*do nothing*/}
}

function AO_ShowElementID(oElement,sBoName)
{
    try
    {
        var sMsg = "";
        sBoName = sBoName||null;
        if(oElement==null)
        {
            var iX = event.clientX;
            var iY = event.clientY;
            oElement = document.elementFromPoint(iX,iY);
        }
        if(oElement.parentNode.id.indexOf("mbsti_") >-1)
        {
            oElement = oElement.parentNode.parentNode.parentNode.parentNode.parentNode;
        }
        if(oElement != null && oElement.id != "")
        {
            if(sBoName==null)
            {
                var tmpArr=AO_GetBOAliasFromID(oElement.id);
		        sBoName=tmpArr[0];
		    }
		    
		    var sFormat = "Element ID = {0}";
		    var oParamters = new Array(oElement.id);
		    if(typeof(m_action) != "undefined")
		    {   
		        oParamters.push(sBoName);
		        sFormat+= ", Business Object = {1}";
		    }
		    sMsg= String.prototype.Format(sFormat,oParamters);
        }
        else
        {
            sMsg= String.prototype.Format("No Element ID");
        }
        window.status = sMsg;
   }
   catch(err)
   {/*do nothing*/}
}

function AO_CheckAliasPermission(group, alias)
{
    var testDisable=AO_test_disable_tab(alias);
    if (!testDisable) return null;
    var rtnObj = null;
    var currentAlias = "";
    var currentGroup = "";
    var pageIndex=0;
	if (testDisable){	
	    WriteError(AO_GetMesgWithParams("A2SEC011" , Array(String(alias))));
		for(pageIndex=0;pageIndex<m_PageAliases.length;pageIndex++)
		{
		    currentAlias = m_PageAliases[pageIndex];
		    if(currentAlias==alias) continue;
		    testDisable=AO_test_disable_tab(currentAlias);
		    if(!testDisable) break;
		}
		var pages = 0;
		for(var index=0;index<m_GroupAliases.length;index++)
		{
		    currentGroup = m_GroupAliases[index];
		    pages += parseInt(m_GroupAliases[index].split(":")[1]);
		    if(pageIndex<pages) break;
		}
		rtnObj = new Object();
		rtnObj.AliasName = currentAlias;
	    rtnObj.GroupName = currentGroup;
	}
	
	return rtnObj;
}

function AO_OpenModule(group, alias,method) {
	LoadingFrames(method);
	var oResult = AO_CheckAliasPermission(group, alias);
	if(oResult != null)
	{
	    alias = oResult.AliasName;
	    group = oResult.GroupName;
	}
	m_OpenModuleFuncStr = "AO_OpenModule('"+group+"','"+alias+"','"+method+"');";
	
	if(validateObj.IsNothing(window.frameElement) == false  &&
		( FrameStatus("Get") == "_BackgroundLoading"))
	{
		return;
	}
	if (AS_GetBCPermission("Access")=="false")
	{
		if( m_LockingPerson == "" )
		{
			if (typeof(m_ModuleAccessAllowed)!="undefined" && m_ModuleAccessAllowed==false)  return;
			else m_ModuleAccessAllowed=false;

			AO_CustomMessageWithParams("SYS016","","",Array(m_ClusterTitle));
			
			AB_ExitModule();
			return;
		}
		else
		{
			ShowLockingFilter(m_LockingPerson);
		}
	}
	//work around for leak
	window.onload=new Function("AO_ModuleOnload()");
	window.onbeforeunload= new Function("AO_LooseData()");
	window.onunload=new Function("AO_CloseState()");
//	iTimers++;	
//	var k_Mod1=iTimers, k_Mod2;
//	funcsArray[k_Mod1]="Layout creation";
//	timesArray[k_Mod1]=window.top.control_frame.timer_now();	
    if(method=="new")_RemoveGlobalVar("Module_GroupAlias");
	if ("undefined"!=typeof(_GetGlobalVar("Module_GroupAlias")) && (_GetGlobalVar("Module_GroupAlias")!="")){
		var grp=_GetGlobalVar("Module_GroupAlias"),arrGroup;
		for (var i=0;i<m_GroupAliases.length;i++){
			arrGroup=m_GroupAliases[i].split(":");
			if (arrGroup.length!=2) return false;
			if (arrGroup[0]==grp){
				group=m_GroupAliases[i];
				break;
			}
		}
		if (i==m_GroupAliases.length){
			_SetGlobalVar("Module_PageAlias", m_PageAliases[0]);		
		}
		else group=m_GroupAliases[i];
		 _RemoveGlobalVar("Module_GroupAlias");
		 _SetGlobalVar("Module_GroupAlias","");
	}
	if ("undefined"!=typeof(_GetGlobalVar("Module_PageAlias")) && (_GetGlobalVar("Module_PageAlias")!="")) {
		
		alias=_GetGlobalVar("Module_PageAlias");
		 _RemoveGlobalVar("Module_PageAlias");
		 _SetGlobalVar("Module_PageAlias","");
	}
	var	pos, groupAlias;	

//	if (m_LogoImg != null)
//		_imgLogo.innerHTML = "<img src='" + m_LogoImg + "' WIDTH='116px' HEIGHT='90px'>";

	AO_HideButtons(method);
	
	document.getElementById("divToolBar").disabled=true;
	if (method!="new"){
		m_action="maint";
		pos = group.search("\\:");
		if (pos == -1) return false;
		groupAlias = group.substring(0, pos);
		
		if( DoSingleOperation() )
		{
			_CreateTabControlItems(_TabControlItems);
			_CreateTabControl(_TabControl);
		}
//		timesArray[k_Mod1]=window.top.control_frame.timers_diff(window.top.control_frame.timer_now(),timesArray[k_Mod1]);			
		//iTimers++;
		//k_Mod2=iTimers;
		//funcsArray[k_Mod2]="Open Page";
		//timesArray[k_Mod2]=window.top.control_frame.timer_now();	
		
		_SelectTabControlItem(groupAlias,false);
		for (var i=0;i<m_PageAliases.length;i++)
		{
			var elm=document.getElementById("sub"+m_PageAliases[i]+"ex");
			if (elm==null) alert("Page Alias:"+m_PageAliases[i] +" is not used by group:"+groupAlias+". Please check the group definitions");
			else elm.disabled=true;
		}
	
	}
	else{
		m_action="new";
		m_currentAlias="_TabControl";
		groupAlias=group;
		_CreateWizardItems(_TabControlItems);
	}
	aliasLoaded=alias;
	groupAliasLoaded=group;
	ExecInlineCode() ;
	//alert(k_Mod2);
	//timesArray[k_Mod2]=window.top.control_frame.timers_diff(window.top.control_frame.timer_now(),timesArray[k_Mod2]);					
	return true;
}

function _AddTabControlItemsToCache(contentStr,action)
{
	var _CacheTabControlItems = null;
	var resultContent = null;
	try{
		if( AO_GetPrimaryWindow().top.control_frame.m_CacheTabControlItems == null )
		{
			AO_GetPrimaryWindow().top.control_frame.m_CacheTabControlItems = new Array();
		}
		_CacheTabControlItems = AO_GetPrimaryWindow().top.control_frame.m_CacheTabControlItems;
		
		_CacheTabControlItems[document.location+action] = contentStr;
	}
	catch(ex){
		return false;
	}
	return true;
}

function _GetTabControlItemsFromCache(action)
{
	var _CacheTabControlItems = null;
	var cachedItem = null;
	try{
		_CacheTabControlItems = AO_GetPrimaryWindow().top.control_frame.m_CacheTabControlItems;
		if( _CacheTabControlItems == null ) return _CacheTabControlItems;
		var resultContent = null;
		
		if( _CacheTabControlItems == null )
		{
			return resultContent;
		}
		cachedItem  = _CacheTabControlItems[document.location+action]
	}
	catch(err)
	{
		return null;
	}
	//return null;
	return cachedItem;
}

/// <summary>
/// Used only in "New" pages. Highlights the relevant elements in the group.
/// </summary>
/// <param name="groupAlias">[required]the group name to highlight</param>
/// <param name="is_focused">[optional]if true the function invoked by input element that is part of the group
/// and the input gain the focus and set as active element, otherwise by the group title</param>
/// <returns>true/false</returns>
function _ChangeStyle(groupAlias,is_focused){
var isTitle = false
if (is_focused == null)
	isTitle = true;
try{
	if (aliasLoaded!="") return false;
	var fields;
	var field,i;
	var blnFirstField=false;
	if (m_curGroupAlias==null)blnFirstField=true;
	
	if (m_curGroupAlias == groupAlias) return;
	if (is_focused==null) is_focused=false;
	document.all(groupAlias).className = "clsWizardSelected";
	
	if (m_curGroupAlias != null)
	{ 
		document.all(m_curGroupAlias).className = "clsWizardItem";
	}
	m_curGroupAlias = groupAlias;
	var tbIndex=1;
	var w = _TabControl.all;
	fields=w.length;
	var fldClsName;
	for (i=0;i<fields;i++){
		field=w[i];
		if (field.group==null) continue;
		if (field.type=="hidden") continue;
		fldClsName=""+field.className.toLowerCase();
		if (field.group==groupAlias){			
			var oLabelCollection = field.parentNode.parentNode.getElementsByTagName("LABEL");
			if(oLabelCollection.length > 0 )
			{
				oLabelCollection[0].style.color = "#000000";
			}	
			if (fldClsName.match(/.*group_separator|td_lookup_holder|td_holder.*/ig)){
					field.style.color = "#000000";
			}
			else if (fldClsName.match(/.*(disinput).*/ig)||(fldClsName.match(/.*(input_form).*/ig) && blnFirstField)){									
					if( fldClsName.match(/.*(disinputdate).*/ig) )
					{
						field.className=fldClsName.replace(/disinputdate/ig,"input_date");
					}
					else if( fldClsName.match(/.*(disinputtime).*/ig) )
					{
						field.className=fldClsName.replace(/disinputtime/ig,"input_time");
					}
					else
					{
						field.className=fldClsName.replace(/disinput/ig,"input_form");
					}
					
					field.readOnly=false;
					field.disabled=false;
					field.tabIndex=tbIndex++;
					if (!is_focused) 
					{
						try {
							field.focus();
							is_focused=true;
						}
						catch(e){
							is_focused=false;
						}
						continue;
					}
					if (is_focused && !isTitle)
					{
						isTitle = true;
						field.focus();
					}
			}
			else if (fldClsName.match(/.*group_title|group_title_new.*/ig)){
					field.style.color = "#BC2200";
			}
			else if (fldClsName.match(/.*disdescr.*/ig)){			
					field.className=fldClsName.replace(/disdescr/ig,"endescr");
			}
			else if (fldClsName.match(/.*dislookup.*/ig)){				
					field.className=fldClsName.replace(/dislookup/ig,"btnLookup");
			}
			else if (fldClsName.match(/.*dislookup1.*/ig)){				
					field.className=fldClsName.replace(/dislookup/ig,"btnLookup1");
			}
			else if (fldClsName.match(/.*discalendar.*/ig)){				
					field.className=fldClsName.replace(/discalendar/ig,"btnCalendar");
			}			
			else if (fldClsName.match(/.*distime.*/ig)){				
					field.className=fldClsName.replace(/distime/ig,"btnTime");
			}						
			else if (fldClsName.match(/.*checkbox.*/ig)){				
					field.disabled=false;
					field.tabIndex=tbIndex++;
					if (!is_focused)
					{
						try {
							field.focus();
							is_focused=true;
						}
						catch(e){
							is_focused=false;
						}
					}
			}
		}
		else{						
			field.tabIndex=-1;
			var oLabelCollection = field.parentNode.parentNode.getElementsByTagName("LABEL");
			if(oLabelCollection.length > 0 )
			{
				oLabelCollection[0].style.color = "#747576";
			}
			if (fldClsName.match(/.*input_form|input_numeric.*/ig)){						
					field.className=fldClsName.replace(/input_form|input_numeric/ig,"disinput");			
					field.readOnly=true;
//					field.disabled=true;
			}
			if (fldClsName.match(/.*input_date.*/ig)){						
					field.className=fldClsName.replace(/input_date/ig,"disinputdate");			
					field.readOnly=true;
//					field.disabled=true;
			}
			if (fldClsName.match(/.*input_time.*/ig)){						
					field.className=fldClsName.replace(/input_time/ig,"disinputtime");	
					field.readOnly=true;
//					field.disabled=true;
			}
			else if (fldClsName.match(/.*checkbox.*/ig)){		
    			    field.disabled=true;
//    			    var oTable = field.parentElement.parentElement.parentElement.parentElement;
//					if(oTable.tagName.toLowerCase()=="table")
//					{
//					    oTable.onclick=new Function ("_ChangeStyle('"+field.group+"',false);document.getElementById('"+field.id+"').focus();document.getElementById('"+field.id+"').checked=true;document.getElementById('"+field.id+"').click();");
//					}
			}
			else if (fldClsName.match(/.*group_title|group_title_new.*/ig)){								
					field.style.color="#747576";
			}
			else if (fldClsName.match(/.*endescr.*/ig)){
					field.className=fldClsName.replace(/endescr/ig,"disdescr");																	
			}
			else if (fldClsName.match(/.*btnlookup.*/ig)){	
					field.className=fldClsName.replace(/btnlookup/ig,"dislookup");																	
			}
			else if (fldClsName.match(/.*btnlookup1.*/ig)){	
					field.className=fldClsName.replace(/btnlookup/ig,"dislookup1");																	
			}
			else if (fldClsName.match(/.*btncalendar.*/ig)){	
					field.className=fldClsName.replace(/btncalendar/ig,"discalendar");																	
			}			
			else if (fldClsName.match(/.*btntime.*/ig)){	
					field.className=fldClsName.replace(/btntime/ig,"distime");																	
			}						
			else if (fldClsName.match(/.*group_separator|td_lookup_holder|td_holder.*/ig)){
					field.style.color="#747576";
			}
			if (!field.onclick && field.group!="") {
//				alert("_ChangeStyle('"+field.group+"')");
                if (field.tagName.toLowerCase()!="select" && field.type!="checkbox")
					field.onclick=new Function ("_ChangeStyle('"+field.group+"',false);document.getElementById('"+field.id+"').focus()");		
				else {				
					field.onactivate=new Function ("_ChangeStyle('"+field.group+"',true)");		
				}
			}
		}
	}
	try{
		f_wizard_step(groupAlias);
		
	}catch(e){
		//do nothing 
	}	
	AS_TreatUIPermissions();
}catch(e){WriteError(e)}
}


function _OpenWizPage(objParent){
	var oRow, oCell;
	if( m_tabControlHtml == "" )
	{
		m_tabControlHtml = objParent.innerHTML;
	}
	var oTable = document.createElement("TABLE");
	var oTBody = document.createElement("TBODY");
	oTable.width = "100%";
	oTable.height = "100%";

	oRow = document.createElement("TR");
	oRow.width = "100%";
	oRow.height = "100%";
	
	oTBody.appendChild(oRow);

	m_primaryXSL = GetXSLDocument("_" + m_PageAliases[0] + "XSL");
	
	oCell = document.createElement("TD");
	oCell.width = "100%";
	oCell.height = "100%";
	oCell.id = "_WizPageControl";
	m_primaryXSL=_addIncludes(m_primaryXSL);		
	m_XSLURL=m_primaryXSL.url;
	oRow.appendChild(oCell);
	oTable.appendChild(oTBody);
	objParent.appendChild(oTable);
	oCell.innerHTML="";
	oCell.insertAdjacentHTML("afterBegin",m_primaryXML.transformNode(m_primaryXSL));		
	oCell = null;
	oRow = null;
	oTBody = null
	oTable = null;
}


function _CreateWizardItems(objParent){
	if( !DoSingleOperation() ) return;
	/*var cachedTabControlItems = _GetTabControlItemsFromCache("new");
	
	if( cachedTabControlItems != null )
	{
		objParent.innerHTML = cachedTabControlItems;
		return true;
	}*/
	var pos, groupAlias, pageCount, maxPage = 0;
	var oRow, oCell, subRow, subCell, startPage;
	var oTable = document.createElement("TABLE");
	var oTBody = document.createElement("TBODY");
	
	var oArrowCell,oArrowTable,oArrowRow,oArrowBody;
	oTable.width = "125px";
	oTable.cellSpacing = "0";
	oTable.cellPadding = "0";
	oTable.border = "0";
	var count = m_GroupAliases.length;
	try{	
		//m_GroupAliases[count]="btnSubmit";
		//m_GroupTitles[count]="Submit";
		count++;
		for (var i = 0; i < count; i++)
		{
			oRow = document.createElement("TR");
			oRow.width = "100%";
			groupAlias = m_GroupAliases[i];
			m_ElementsIDs[i] = groupAlias;
			oCell = document.createElement("TD");
			oCell.id = groupAlias;
			if (i<count-1) {
				oCell.className = "clsWizardItem";
				oCell.innerText = (i + 1).toString() + "    " + m_GroupTitles[i];
			}
			else {
				//oCell.height = "30px";
				//oCell.style.paddingRight = "15px";
				//oCell.innerHTML='<INPUT id="btnSubmitSelected" class="btnSubmitSelected" type="button" onclick="return new_Single_Done(\'new\')">';
				//var txtSubmit = "Submit";
				//oCell.innerHTML=  '<button id="btnSubmitSelected" class="clickTranspButt" style="display:none"></button>';
	/*		
				if (i==count-2) oCell.className = "clsWizardItem";
				else oCell.className = "clsWizardItem";
	*/			
			}
			oCell.style.verticalAlign  = "text-top";
			oCell.style.paddingTop = "7px";
			if (i<count-1)
				oCell.onclick = new Function("return _ChangeStyle('" + groupAlias + "')"); 
			else {
	/*		
				if (i==count-2){
					oCell.onclick=new Function("return new_Single_Done('new')");
				}
				else {
					oCell.onclick=new Function("return Single_Close()");
				}
	*/			
			}	
			oCell.noWrap="true";

			oRow.appendChild(oCell);
			oTBody.appendChild(oRow);
				
			oCell = null;
			oRow = null;
		}
	
/***********************/

		/*if (m_QuickSaveInNewModules)
		{
			oRow = document.createElement("TR");
			oRow.width = "100%";
			groupAlias = m_GroupAliases[count];
			m_ElementsIDs[count] = groupAlias;
			oCell = document.createElement("TD");
			oCell.id = groupAlias;
			//oCell.height = "30px";
			oCell.style.paddingRight = "15px";
			//oCell.innerHTML='<INPUT id="btnSubmitSelected" class="btnSubmitSelected" type="button" onclick="return new_Single_Done(\'new\')">';
			// astea-trans=text;TXTASP$quick_save_vx;N;
			var txtSave = "Quick Save";
			var txtSaveTooltip="Save &amp; go back";
			oCell.innerHTML=  '<button title="'+txtSaveTooltip+'" id="btnSaveSelected" class="clickTranspButt" onclick="AO_NewModuleQuickSave()"><table cellpadding="0" cellspacing="0" border="0"><tr><td class="butt_left_yellow"></td><td class="imgText_yellow">'+txtSave+'</td><td class="butt_right_yellow"></td></tr></table></button>';
			
			if (i==count-2) oCell.className = "clsWizardItem";
			else oCell.className = "clsWizardItem";
				
			
			oCell.style.verticalAlign  = "text-top";
			oCell.style.paddingTop = "7px";
			oCell.noWrap="true";

			oRow.appendChild(oCell);
			oTBody.appendChild(oRow);
				
			oCell = null;
			oRow = null;
		}*/
	/****************************/	
		oTable.appendChild(oTBody);
		objParent.appendChild(oTable);
		
		oRow = null;
		oTBody = null
		oTable = null;
	
		//_AddTabControlItemsToCache(objParent.innerHTML,"new");
		return true;
	}
	catch(e)
	{
		WriteError(e.description);
	}		

}

function AO_NewModuleQuickSave()
{
	if (new_Single_Done(false,true)==true)
	{
		AO_NavigateFromSave(true);
	}
		
}
function ao_attachFile(){
	window.showModalDialog('../attachments/AttachFrame.asp?action=att_retrieve&where_cond=' + m_tableKey + '^' + m_tableName  ,'Attachments', 'scroll:no;status:no;resizable:no;dialogWidth:1000px;dialogHeight:530px');
	
	try
	{
	    //ASAP IL0711050006 rollback all changes related to the attachment count US028432 BHunter(03.16.07)
	    /*US028432 BHunter(03.16.07): this will update hte correct count.*/
		//var AttachCnt = Number(UpdateAttachmentCount(m_tableName,m_tableKey,Number(_GetGlobalVar("attachRowCounter"))));
       //_SetGlobalVar("attachRowCounter",AttachCnt);
	    
		var numOfAttach = parseInt(_GetGlobalVar("attachRowCounter"));
	    var validobj;
	    
		if(!isNaN(numOfAttach) && numOfAttach != 0)
		{
			document.all["attach"].parentElement.title = numOfAttach;
			buttonLeft=document.all["attach"].parentElement.parentElement.parentElement.parentElement.parentElement.offsetLeft+20;
			
		   validobj = document.all("red_asterisk");
		   if (!isNaN(validobj)){
			document.all["attach"].parentElement.innerHTML+="<font id='red_asterisk' color='red' style='font-size:17px;position:absolute;top:3;left:"+buttonLeft+";cursor:hand'><b>*</b></font>";
			}
			else{
			  document.all["red_asterisk"].style.display ='inline';
			}

			document.all["attach"].parentElement.innerHTML+="<font id='red_asterisk' color='red' style='font-size:17px;position:absolute;top:3;left:"+buttonLeft+";cursor:hand'><b>*</b></font>";
		}
		else
		{
		    var oElement = document.all["attach"];
			oElement.parentElement.all["red_asterisk"].style.display = 'none';
			oElement.parentElement.title = "";
			_SetGlobalVar("attachRowCounter",0);
		}
		ao_AfterAttachFile();
	}
	catch(e){}
}

//the last argument is refrence to object cell that we change is
//label and image in order to leave the td ids
function __SetMenuButtonSmallTable(imgHTML,btnText,method,objCell){
	var labelFontSize = 9;
	var isMenuItem = objCell.getAttribute("menuitem");
	var ignoreSubStr = objCell.getAttribute("DisplayFullLabel")=="true"||isMenuItem == "true";
	if(_GetGlobalVar('lang_id')=='JPA') labelFontSize = 11;
	if (method==null) method="null";
	var tableObj = objCell.getElementsByTagName("TABLE").length>0?objCell.getElementsByTagName("TABLE")[0]:null;
	if( tableObj == null )
	{
		var labelFontSize = 9;
		if(_GetGlobalVar('lang_id')=='JPA') labelFontSize = 11;
		if (method==null) method="null";
		var oStr="<TABLE height=\"35px\" width=\"35px\" BORDER=0 CELLSPACING=0 CELLPADDING=0 style=\"border-collapse:collapse;\"";
			if (method=="invisible") oStr+="display:none";	
		oStr+="\"><TR><TD align=center id=mbsti_"+btnText+">"+imgHTML+"</TD></TR><TR><TD nowrap ALIGN=center id=mbstl_"+btnText+">"+
			"<LABEL style=\"FONT-FAMILY:'arial';font-size:"+labelFontSize+"px\">"+(ignoreSubStr?btnText+" ":btnText.substr(0,7))+"</LABEL>"+(ignoreSubStr?"&nbsp;&nbsp;":"")+"</TD></TR></TABLE>";
		objCell.insertAdjacentHTML("afterBegin",oStr);
		return;
	}
	
	tableObj.style.display = method=="invisible"?"none":tableObj.style.display;
	tableObj.rows[0].cells[0].innerHTML = "";
	
	tableObj.rows[0].cells[0].insertAdjacentHTML("afterBegin",imgHTML);
	
	var oCell = (isMenuItem != "true")?tableObj.rows[1].cells[0]:tableObj.rows[0].cells[1];
	oCell.innerHTML = "<LABEL style=\"FONT-FAMILY:'Tahoma';font-size:"+labelFontSize+"px\">"+(ignoreSubStr?btnText+" ":btnText.substr(0,7))+"</LABEL>"+(ignoreSubStr?"&nbsp;&nbsp;":"");
}
/// <summary>
/// Used to change the properties on the top toolbar buttons (Save, New, Delete etc), mainly to change their behavior (disable/enable). 
/// </summary>
/// <param name="method">[require]the method that the button will reflect(disabled,hotlink,invisible,new,search,maint.enable)</param>
/// <param name="a_id">[required] the toolbar button ID</param>
/// <param name="a_className">[optional] set the button class</param>
/// <param name="a_language">[optional,default javascript]the script langauge used to run the onclick function</param>
/// <param name="a_onclick">[optional,default the original function]subscribe this function to the button onclick event</param>
/// <param name="a_img">[optional, default the original image] set the button image</param>
/// <param name="a_title">[optional,default the original title] set the button title</param>
/// <returns></returns>
function AO_SetMenuButton(method,a_id,a_className,a_language,a_onclick,a_img,a_title){
	if (a_id==null || a_id=="") return false;
	else if (a_id=="tdMenuBarItemNew" && AS_GetBCPermission("new")=="false") return false;
	else if (AS_GetBCPermission("modify")!="true" && ((a_id=="tdMenuBarItemApply")|| (a_id=="tdMenuBarItemSave") ))
		return false;
	else if (AS_GetBCPermission("delete")!="true" && ((a_id=="tdMenuBarItemDelete")))
		return false;
	//var oCell=document.getElementById(a_id);
	var a_alt = a_title;
	var oCell=_Module_ToolBar.all(a_id);
	if(oCell==null) oCell = document.getElementById(a_id);
	var bOverride = "";
	var btnExist=false;
	if (oCell==null) {
		oCell=document.createElement("TD");
		oCell.id=a_id;		
	}
	else {			
	    bOverride = oCell.getAttribute("Override");
		var tmpImg=oCell.all.tags("img");	
		var tmpLabel=oCell.all.tags("label");
		if (tmpImg.length ) {
			tmpImg=tmpImg[0];
			a_alt=tmpImg.alt;
			if (tmpLabel.length) a_title=tmpLabel[0].innerText;
			else a_title=a_alt;
			a_img=tmpImg.id;		
		}		
	}
	if (a_onclick!=null && bOverride!="true") {
		oCell.a_function=a_onclick;		
	}
	if (a_className!=null && a_className.toLowerCase()!="javascript")oCell.className=a_className;
	var strInnerHTML;
	var a_method;
	if (a_title!=null){
		a_title=String(a_title.charAt(0)).toUpperCase()+a_title.substr(1);
		strInnerHTML="<img id='"+a_img+"' WIDTH='25px' alt='"+a_alt+"' HEIGHT='25px' src='../images/icn_"+a_img;
		if (method=="disabled")
			strInnerHTML+=".gif' style='filter:gray alpha(opacity=100);cursor:default;'/>";
		else if (method=="hotlink")
			strInnerHTML+=".gif' style='cursor:hand;'/>";
		else if (method=="invisible")
			a_method="invisible";
		else if (method=="maint" || method=="enabled" || method=="action" || method=="search" || method=="new" || method=="report"){
			strInnerHTML+=".gif' onmouseout=\"src='../images/icn_"+a_img+".gif'\" onmouseover=\"src='../images/icn_"+
				a_img+"_h.gif'\" style='cursor:hand;'/>";
		}
		
		if (method=="report" && a_id == "tdMenuBarItemClose")
		{
		    //Navigation settings
	        m_NavigateTo[0] = "../scrl_asp/Reports_Scroller_QBE.asp";
		}
		
		__SetMenuButtonSmallTable(strInnerHTML,a_title,a_method,oCell);
	}
	if (!(method=="disabled")){
		if (oCell.a_function!=null && a_onclick==null) a_onclick=oCell.a_function;
		if (a_onclick!=null){			
			oCell.language=a_language;
			if (bOverride!="true" || (bOverride=="true" && a_onclick==oCell.a_function))
			{
			oCell.onclick=new Function(a_onclick);
			}
			else if(a_onclick!=oCell.a_function)
			{
			    var functionParts = oCell.a_function.split(";");
			    var sFunction = a_onclick;
			    var oSB = new StringBuilder();
			    for(var index=0;index<functionParts.length;index++)
			    {
			        sFunction = functionParts[index];
			        if(functionParts[index].toLowerCase().indexOf("new_single_done")>-1
			            || functionParts[index].toLowerCase().indexOf("single_new")>-1)
			        {
			            sFunction = a_onclick;
			        }
			        if(sFunction=="") continue;
			        oSB.Append(String.prototype.Format("{0};",sFunction));
			    }
			   
			    sFunction = oSB.ToString();
			    sFunction = sFunction.removeEx(";");
			    
			    oCell.onclick=new Function(sFunction);
			}
		}
	}
	else {
		oCell.language=null;
		oCell.onclick=null;
	}
	return oCell;
}

function AO_ShowButtons(method)
{
//	var oXML=MenuBarItemsXML.XMLDocument;
	var oChild;
	var id, xmlMethod,elm;
	if ("undefined"==typeof(m_attachNum)) var m_attachNum=0;
	if (method==null || method=="" || method=="undefined") method="maint";
	
	//clsToolBarItem
	var buttons=document.getElementById("_Module_ToolBar").cells(0).all.tags("TD")
	//var buttons=oXML.selectNodes("/MenuBarItems/MenuBarItem[@"+method+" $ieq$ 'true']");	
	for (var i=0;i<buttons.length;i++)
	{		
		
		oChild=buttons[i];
		if (oChild.className==null) continue;
		if (oChild.getAttribute(method)=="" || oChild.getAttribute(method)==null) continue;
		if (oChild.getAttribute(method).toLowerCase()=="true")
		{
			id=oChild.id;		
			if (id=="tdMenuBarItemNew" && AS_GetBCPermission("new")=="false") continue;
			AO_SetMenuButton(method,id);			
		}
	}
}
function AO_HideButtons(method)
{
//	var oXML=MenuBarItemsXML.XMLDocument;
	var oChild;
	var id, xmlMethod,elm;
	if ("undefined"==typeof(m_attachNum)) var m_attachNum=0;
	
	//var buttons=document.getElementById("_Module_ToolBar").cells(0).all.tags("TD")
	var buttons=document.getElementById("_Module_ToolBar").cells(0).firstChild.rows(0).cells;
	//var buttons=oXML.selectNodes("/MenuBarItems/MenuBarItem[@"+method+" $ne$ 'true']");	
	for (var i=0;i<buttons.length;i++)
	{		
		oChild=buttons[i];		
		xmlMethod=oChild.getAttribute(method);
		if (xmlMethod==null || xmlMethod=="" || xmlMethod.toLowerCase()=="true") continue;

		oChild.style.visibility="hidden";
		oChild.style.display="none";
	}
}
//work around for leak
function AO_ClearModuleButtons()
{
	var buttons=document.getElementById("_Module_ToolBar").cells(0).firstChild.rows(0).cells;
	var buttonsToRemove = new Array();
	for (var i=0;i<buttons.length;i++)
	{		
		var oChild=buttons[i];		
		
		if(oChild.style.display == "none")
		{
			buttonsToRemove.push(oChild);
		}
	}
	var len = buttonsToRemove.length;
	for(var i=0;i<len;i++)
	{
		var oChild=buttonsToRemove.pop()
		oChild.style.display = "block";
		oChild.removeNode(true);
	}
}

function CreateHotLinksButtons()
{
 	var oTR = null;
	var oTBody = null;
	var oTable = null;
	var oTD = null;
	var oCell=null;
	var count = m_HotLinkAlias.length;
	if(m_HotLinkAlias.length == 0 ) return;
	oTD = document.createElement("TD");
	oTD.align = "right";
	oTD.width = "50%"; 
	oTable = document.createElement("TABLE");
	oTBody = document.createElement("TBODY");
	oTR = document.createElement("TR");
	oTable.id = "hotLinkButtons";
	oTable.appendChild(oTBody);
	oTD.appendChild(oTable);
	var tmpAction="";
	for (var i = 0; i < count; i++)
	{
		oCell = null;
		if ("undefined"==typeof(m_HotLinkType[i]))m_HotLinkType[i]="hotlink";
		tmpAction="";
		if (m_HotLinkType[i]=="action")tmpAction=m_HotLinkAct[i];
		else tmpAction="return AO_HotLink(" + m_HotLinkAct[i] + ");"

		oCell=AO_SetMenuButton("action", m_HotLinkAlias[i],"clsToolBarItem","javaScript",
	   			tmpAction,m_HotLinkImg[i].replace(/\.\.\/images\/|\.gif|icn\_/ig,""),m_HotLinkAlt[i]);
		oTR.appendChild(oCell); 
	} 
	oCell = document.createElement("TD");
	oCell.width = "10px";
	oCell.style.font = "10px arial";
	oTR.appendChild(oCell);
	oCell = null;
 
	oTBody.appendChild(oTR);
	_Module_ToolBar.appendChild(oTD);
	if (AS_GetBCPermission("modify")!="true" || AO_IsConnectedWindow())
	{
		for (var i=0;i<count;i++)
			if (m_HotLinkType[i]=="action") AO_SetMenuButton("disabled", m_HotLinkAlias[i]);
	}
}

function UpdateHotLinksButtons()
{
	var oTable = document.getElementById("hotLinkButtons");
	if(oTable==null)return;
	oTable.parentNode.removeNode(oTable);
	CreateHotLinksButtons();
	return;
}

function __MakeTabControlChoice(objParent){ 
	var tmpXSLSheet = searchXSL.XMLDocument;
	var labelWidth = tmpXSLSheet.selectSingleNode("//tr[@class='tr_form'][0]/td/@width").nodeValue;
	labelWidth=labelWidth.replace("px","") + "px";
	
	objParent.innerHTML = "<table cellpadding='0' cellspacing='0'><tr><td width='" + labelWidth + 
		"' align='right'>" + "<label class='lblSearch'><img height='0px'></img></label></td>"+
		"<td><select style='height:150px' name='rb_cache'>"+
// astea-trans=placeholder;placeholder;N;astea-trans=text;TXTASP$ddlb_search1_vx;N;
		"<option value='cache' selected>"+ "After Search - save results for next access" + "</option>"+
// astea-trans=placeholder;placeholder;N;astea-trans=text;TXTASP$ddlb_search2_vx;N;
		"<option value='refresh'>" + "After Search - save search string and retrieve new results" + "</option>"+
// astea-trans=placeholder;placeholder;N;astea-trans=text;TXTASP$ddlb_search3_vx;N;
		"<option value='no_cache'>"+ "Begin a blank search on next access" + "</option>"+		
		"</select></td>"+
		"<td style='padding-left:10px'>"+
			"<table cellpadding='0' cellspacing='0'>"+
				"<tr>"+
					"<td style='padding:5px'><input id='interval_digit_chx' type='checkbox' class='checkbox' onclick='checkInterval(this)'></input></td>"+
// astea-trans=placeholder;placeholder;N;astea-trans=text;TXTASP$refresh_data_vx;N;
					"<td>" + "Refresh Data" + "</td>"+
					"<td id='interval_section' style='padding-left:5px; display:none'>"+
						"<table cellpadding='0' cellspacing='0'>"+
							"<tr>"+
// astea-trans=placeholder;placeholder;N;astea-trans=text;TXTASP$every_2_vx;N;
								"<td>" + "Every:" + "</td>"+
								"<td style='padding:0px'>"+
									"<select onchange='checkIntervalValue(this)' id='interval_digit'>"+
										"<option value='15'>"+"15 "+"seconds"+"</option>"+
										"<option value='30'>"+"30 "+"seconds"+"</option>"+
										"<option value='60'>"+"1 "+"minute"+"</option>"+
										"<option value='300'>"+"5 "+"minutes"+"</option>"+
										"<option value='600'>"+"10 "+"minutes"+"</option>"+
									"</select>"+
								"</td>"+
							"</tr>"+
						"</table>"+
					"</td>"+
				"</tr>"+
			"</table>"+
		"</td>"+
		"</tr></table>";
}			

function checkInterval(obj,callInt)
{
	if( _searchInterval != -1 )
	{
		window.setTimeout("",1000);
		window.clearInterval(_searchInterval);
	}
	
	if(obj.checked)
	{
		document.getElementById("interval_section").style.display = 'block';
		_searchInterval = window.setInterval(RefreshQBEResults, parseInt(interval_digit.value)*1000);
	}
	else
	{
		interval_section.style.display = 'none';
		
		_searchInterval = -1;
	}
}

//refresh the qbe result when interval period exceed
function RefreshQBEResults()
{
    var value = typeof(m_XrefSpecs[currTab])!="undefined"?m_XrefSpecs[currTab].UniqueValue:null;
    if(m_primaryXML!=null)
    {
         var oNode = m_primaryXML.selectSingleNode("/root/@currentPage");
         if(oNode!=null) m_currentPageNumber = oNode.value;
    }
    document.getElementById("btnSearch").onclick();
    m_currentPageNumber = null;
    if(typeof(value)!="undefined" && value != null)
    {
        var dataDiv = document.getElementById("dataDiv");
        var oTable = dataDiv.childNodes[0];

        var rowIndex = GetRowIdByCellValue(oTable,value);
        if(rowIndex>-1)
        {
            SelectRow(oTable, oTable.rows[rowIndex]);
            
            setTimeout("AO_ScrollIntoView("+rowIndex+")", 100);
        }
    }
}

function AO_ScrollIntoView(rowIndex)
{
    var dataDiv = document.getElementById("dataDiv");
    var oTable = dataDiv.childNodes[0];
    MarkScrlRow(oTable.rows[rowIndex],false);
}

//set cell value
function SetCellValue(rowObj)
{
    if(typeof(m_currRowCellID) != "undefined")
    {
        m_XrefSpecs[currTab].UniqueValue = rowObj.cells[m_currRowCellID].innerText;
    }
}

//get the specified row id by saved value
function GetRowIdByCellValue(oTable,value)
{
    if(typeof(m_currRowCellID) != "undefined")
    {
        var len = oTable.rows.length;
        for(var index=0;index<len;index++)
        {
            var oRow = oTable.rows[index];
            if(oRow.cells[m_currRowCellID].innerText == value)return index;
        }
    }
    return -1;
}

function checkIntervalValue(obj)
{
	if(document.getElementById("interval_digit_chx").checked)
	{
		if( _searchInterval != -1 )
		{
			window.clearInterval(_searchInterval);
			_searchInterval = window.setInterval(document.getElementById("btnSearch").onclick, obj.value*1000);
		}
	}
}		
	
/*
function __MakeTabControlChoice(objParent){
	objParent.innerHTML='<TABLE style="HEIGHT: 81px; WIDTH: 252px">'+
		'<TR><TD style="height:10px"></TD></TR>'+
		'<TR><TD style="width:90px;color:white;padding-left:2px" nowrap><b>'+'Cache Results'+'</b></TD>'+
		'<TD align=left><INPUT type="radio" id=rb_cache1 name="rb_cache" style="width:20px;cursor:hand" CHECKED>'+
		'</TD></TR>'+
		'<TR><TD style="width:90px;color:yellow;padding-left:2px" nowrap><b>'+'Refresh Results'+'</b></TD>'+
		'<TD align=left><INPUT type="radio" id=rb_cache2 name="rb_cache" style="width:20px;cursor:hand">'+
		'</TD></TR>'+
		'<TR><TD style="width:90px;color:chartreuse;padding-left:2px" nowrap><b>'+'No Cache/Refresh'+'</b></TD>'+
		'<TD align=left><INPUT type="radio" id=rb_cache3 name="rb_cache" style="width:20px;cursor:hand">'+
		'</TD></TR>'+		
		'</TABLE>';
}
*/

function AO_CreateQBEButtons()
{
	var oTable, oTBody, oTR, oTD, oCell;	

	_tdTabControlItems.background = "../images/Search_img.gif";
	oTD = document.createElement("TD");
	oTD.align = "left";
	oTD.width = "50%";
	
	oTable = document.createElement("TABLE");
	oTBody = document.createElement("TBODY");
	oTR = document.createElement("TR");
	oTable.appendChild(oTBody);
	oTD.appendChild(oTable);
	oCell=AO_SetMenuButton("maint","tdMenuBarItemNew","clsToolBarItem","javaScript","return Single_New()",
// astea-trans=placeholder;placeholder;N;astea-trans=text;TXTTOOLTIPS$new_vx;N;
		"new","New");
	oTR.appendChild(oCell);
	oCell = null;
	oCell=AO_SetMenuButton("maint","tdMenuBarItemPortal","clsToolBarItem","javaScript","return Single_Portal()",
// astea-trans=placeholder;placeholder;N;astea-trans=text;TXTTOOLTIPS$Portal;N;
		"portal","Portal");				
	oTR.appendChild(oCell);
	oCell = null;
	
	
	oTBody.appendChild(oTR);
	_Module_ToolBar.appendChild(oTD);

	oTR = null;
	oTBody = null;
	oTable = null;
	oTD = null;
}

function AO_GetSessionID(){
   return _GetGlobalVar("SessionID")
}

function isinView(oObject)
{
    var oParent = oObject.offsetParent; 
    var iOffsetTop = oObject.offsetTop;
    var iClientHeight = oParent.clientHeight;
    if (iOffsetTop > iClientHeight) {
        return false;
    }
    else{
 	    return true;
    }
}

function KB_XrefFormUpdate()
{
	var ev=window.event;
	var se=ev.srcElement;
	with (ev)
	{		
		if (m_XrefSpecs[currTab]==null) return;
		if (m_XrefSpecs[currTab].RowID==null) return;
		if (typeof(m_StateID)!="undefined")	
		{	
			if (ctrlKey && shiftKey && (keyCode==76))//Ctrl+Shift+L
			{ //CTRL-SHIFT-L
				cancelBubble=true;
				returnValue=false;

				var btnZoom=document.getElementById("btn_list_nav_xref");
				if (btnZoom!=null) btnZoom.click();			
			}					
		}
	}
}

function AO_GetNextSelectedRow(curRow, isForward)
{
    var nextRow = curRow;
    
    if (isForward == null) isForward == true;
    
    do
    {
        if (isForward) nextRow = nextRow.nextSibling;
        else nextRow = nextRow.previousSibling;
    }
    while (nextRow != null && nextRow.id != null && nextRow.id.search(/row_(\d\d*)/i) < 0)
    
    return nextRow
}

function KB_ScrollerUpdate(){
	var ev=window.event;
	var se=ev.srcElement;
	with (ev){		
		if (m_XrefSpecs[currTab]==null) return;
		if (m_XrefSpecs[currTab].RowID==null) return;
		var rw=document.all[m_XrefSpecs[currTab].RowID];			
		if (rw==null) return;	
		if (typeof(m_StateID)!="undefined")	{	
			if (ctrlKey && shiftKey && (keyCode==90)){ //CTRL-SHIFT-Z
				cancelBubble=true;
				returnValue=false;
/*				var dv=rw;
				for(;dv.tagName.search(/html|div/gi)==-1;dv = dv.parentElement);
				if (dv.tagName.search(/html/gi)>-1 ) return false;					
				dv=dv.nextSibling;
				var inps=dv.getElementsByTagName("INPUT");				
				var btnZoom=null;
				for (var i=0;i<inps.length;i++){
					if (inps[i].className.toLowerCase()=="btnzoom"){
						btnZoom=inps[i];
						break;
					}
				}
				if (btnZoom!=null && (btnZoom.onclick!=null)) btnZoom.click();
*/
				var btnZoom=document.getElementById("line_btn_zoom_butt");
				if (btnZoom!=null) btnZoom.click();			
			}		
			else if (ctrlKey && shiftKey && (keyCode==90)){ //CTRL-SHIFT-L
				cancelBubble=true;
				returnValue=false;
/*				var dv=rw;
				for(;dv.tagName.search(/html|div/gi)==-1;dv = dv.parentElement);
				if (dv.tagName.search(/html/gi)>-1 ) return false;					
				dv=dv.nextSibling;
				var inps=dv.getElementsByTagName("INPUT");				
				var btnZoom=null;
				for (var i=0;i<inps.length;i++){
					if (inps[i].className.toLowerCase()=="btnzoom"){
						btnZoom=inps[i];
						break;
					}
				}
				if (btnZoom!=null && (btnZoom.onclick!=null)) btnZoom.click();
*/
				var btnZoom=document.getElementById("line_btn_zoom_butt");
				if (btnZoom!=null) btnZoom.click();			
			}					
		}
		//if (ctrlKey && (keyCode==76)){ //CTRL-L	
		if (ctrlKey && shiftKey && (keyCode==13)){ //Enter
			var seParent=se;
			cancelBubble=true;
			returnValue=false;
			var cl=null;
			for (var j=0; j < rw.cells.length; j++) {			
				if (rw.cells[j].className=="readonly_grid_main_cell"){
					cl=rw.cells[j];
					break;
				}
			}
			if (cl!=null){
				if (cl._onclick!=null && (!cl.disabled)) eval(cl._onclick.trim()); 
				else ScrollerUpdate(m_NavigateTo[2],cl);		
			}
		}
		//40 -down //38-up	//33-pgup //34-pgdown		
		else if ((keyCode=="40" || keyCode=="38" || keyCode=="33" ||keyCode=="34") && !(ctrlKey || altKey || shiftKey) ){
			if (m_ShortcutBar) return;
			rw.focus();
			var dv=rw.parentElement.parentElement.parentElement;
			var scrlTop=dv.scrollTop;
			var offstHeight=dv.offsetHeight;			
			var sbl=null;
			if (keyCode=="40"){if (rw!=null) sbl=AO_GetNextSelectedRow(rw, true);}
			else if (keyCode=="38"){if (rw!=null)sbl=AO_GetNextSelectedRow(rw, false);}
			else if (keyCode=="34"){
				if (rw!=null){
					sbl=rw.nextSibling;
					while(sbl!=null && (sbl.offsetTop+sbl.offsetHeight)<rw.offsetTop+offstHeight) {
						sbl=sbl.nextSibling;
					}
					if (sbl!=null) {			
						if (sbl!=rw.nextSibling) sbl=sbl.previousSibling;						
					}
					else sbl=rw.parentElement.lastChild;
				}
			}
			else if (keyCode=="33"){				
				if (rw!=null){
					sbl=rw.previousSibling;
					while(sbl!=null && sbl.offsetTop-rw.offsetHeight>rw.offsetTop-offstHeight) {
						sbl=sbl.previousSibling;
					}
					if (sbl!=null) {
						if (sbl!=rw.previousSibling)sbl=sbl.nextSibling;
					}
					else sbl=rw.parentElement.firstChild;
				}				
			}
			if (sbl!=null) {
				var sblTop=sbl.offsetTop;	
				cancelBubble=true;
				returnValue=false;					
				rw.style.backgroundColor = "";			
				if (typeof(m_StateID)=="undefined")	MarkScrlRow(sbl);								
				else {
					var tbl=sbl;
					for(;tbl.tagName.search(/html|div|table/gi)==-1;tbl = tbl.parentElement);
					if (tbl.tagName.search(/html|div/gi)>-1 ) return false;					
					if (tbl.onclick==null) return;
					var strFunc=tbl.onclick.toString();
					if (strFunc.search(/SelectRow/g)>-1 ) SelectRow(tbl,sbl);
					else if (strFunc.search(/SelectEditableRow/g)>-1 )SelectEditableRow(tbl,sbl);
				}
				if ((keyCode=="40") || (keyCode=="34")) {							
					if (sblTop+sbl.offsetHeight>scrlTop+offstHeight)
						sbl.scrollIntoView(false);
				}
				else if ((keyCode=="38") || (keyCode=="33")){
					if (sblTop-rw.offsetHeight<scrlTop)					
						sbl.scrollIntoView(true);
				}
				
			}
			
		}
	}	
}

function AO_ScrollerOnload(){
	try{
		var entryPoint = EntryPoint("Get");
		if(entryPoint==null || entryPoint=="scroller")
		{
			window.top.document.all.myframeset.setAttribute("rows","100%,0,0,0,0",false);
		}
		window.status = "";
	    window.document.body.onclick=new Function("AO_ShowElementID()");		
		//_RemoveGlobalVar("FrameSetRow");
		EntryPoint("Remove");
		AO_tryResize();
		 //window.top.control_frame.UnloadHandler();				
		AO_Onload_Post();
		
	}catch(e){/*do nothing*/}
}

function AO_ScrollerBeforeUnload(){
	try{
		//memory leak work around
		AO_ClearModuleButtons();
		if( _TabSelectSearch != null )
		{
			_TabSelectSearch.style.display = "block";
			_TabSelectSearch.removeNode(true);
		}
		AS_SaveData();
		CollectGarbage();
	}catch(e){/*do nothing*/}
}

function AO_ScrollerOnUnload()
{
	try
	{
		//
	}
	catch(err)
	{/*do nothing*/}
}
function dummy()
{}
function AO_InitScroller()
{
	var currentPageNum=1, pagesCount;
	if(UI_LANGUAGE == 'JP' || UI_LANGUAGE == 'JPA')
	{
		if (css_stylesheet.href.indexOf("1024/AO_StyleSheet_jpa.css")==-1 && (css_stylesheet.href != '../app_css/AO_StyleSheet_jpa.css'))
		{
			css_stylesheet.href = '../app_css/AO_StyleSheet_jpa.css';
        }
	}
	if (AS_GetBCPermission("Access")=="false")
	{
		AO_CustomMessageWithParams("SYS016","","",Array(m_ClusterTitle));
		
		AB_ExitModule();
		return;
	}
	window.onload=new Function("AO_ScrollerOnload()");
	window.onbeforeunload= new Function("AO_ScrollerBeforeUnload()");
	window.onunload= new Function("AO_ScrollerOnUnload()");
	LoadingFrames("scroller");
	var i;
	
	if (document.URL.match("Reports_qbe_asp")) /*this is a report*/
	{
	    AO_HideButtons("report");
	    AO_ShowButtons("report");
	}
	else /*this is a regualer QBE*/
	{
	    AO_HideButtons("search");
	    AO_ShowButtons("search");
	}
	CreateHotLinksButtons();	
	var searchXML=GetXSLDocument("searchXML"+m_BCName);
	_SetGlobalVar("cacheBCName",m_BCName);
	if (_scrollerXSL.XMLDocument.xml.length == 0)
	{
		_scrollerXSL.async = false;
		_scrollerXSL.loadXML(_scrollerXSL.innerHTML);
	}		
	
	tblToolBar.style.display = "block";
	m_primaryXSL = _scrollerXSL.XMLDocument;
	m_currentAlias = "_searchTable";	
	_SetModuleTitles();
	if(AS_IsDebugMode(true))NU_ShowNunit();
	var tmpXSLSheet=searchXSL.XMLDocument;
	tmpXSLSheet=_addIncludes(tmpXSLSheet);
	m_primaryXSL=_addIncludes(m_primaryXSL);
	m_XSLURL=m_primaryXSL.url;
	searchXML.loadXML(LoadXMLDDLB(searchXML).xml);	
	_TabControl.innerHTML="";
	_TabControl.insertAdjacentHTML("afterBegin",searchXML.transformNode(tmpXSLSheet));	
	document.body.onkeydown=KB_ScrollerUpdate;
	__MakeTabControlChoice(_TabSelectSearch);
	try
	{
		f_update_menu_status();
	}catch(e){/* Do Nothing */}	
	FixToolBarLayout();
	m_PageIndicator.Busy();
	rb_cache.value="refresh";
	try{
		var userData = m_ControlFrame.m_userData;
		var userDataKey = "search_results"+m_BCName+"_"+_GetPageName(document.location.href).toLowerCase()+_GetGlobalVar('PortalUserLogin');
		//first try to load the data stored in user data
		try
		{
			userData.GetValue(userDataKey);
		}
		catch(err)
		{/*do nothing*/}
		//only if data is stored then continue
		//if ((srSpan!=null) && (srSpan.length==null)){
		if(userData.XMLDocument.documentElement != null &&
			userData.XMLDocument.xml != "" )
		{
			var cache_type=userData.XMLDocument.selectSingleNode("/root/Cache");			
			if (cache_type!=null)cache_type=cache_type.getAttribute("method");
			else cache_type="cache";
			cache_type=""+cache_type.trim();
			var showAdvanced="false";
			var row_index="1";
			if (userData.XMLDocument.selectSingleNode("/root")!=null)
			{
				showAdvanced=userData.XMLDocument.selectSingleNode("/root").getAttribute("show_advanced");
				m_TotalPagesCount=userData.XMLDocument.selectSingleNode("/root").getAttribute("Total_Pages_Count");
				if (m_TotalPagesCount=="") m_TotalPagesCount=null;
				m_TotalRecordCount=userData.XMLDocument.selectSingleNode("/root").getAttribute("Total_Records_Count");
				if (m_TotalRecordCount=="") m_TotalRecordCount=null;
				//m_FirstValueInScrl=srSpan.XMLDocument.selectSingleNode("/root").getAttribute("first_value");
				if( validateObj.IsNothing(_GetGlobalVar("ScrollerRowID")) )
				{
					row_index=userData.XMLDocument.selectSingleNode("/root").getAttribute("row_id");
				}
				else
				{
					row_index=_GetGlobalVar("ScrollerRowID");
					userData.XMLDocument.selectSingleNode("/root").setAttribute("row_id",row_index);
					_RemoveGlobalVar("ScrollerRowID");
				}
			}
			
			//added by eli and benny 20-03-2005 dd-mm-yyyy
			//get the interval data from ud
			var IntervalDetailsElm = userData.XMLDocument.selectSingleNode("/root/IntervalDetails");
			if( IntervalDetailsElm!=null)
			{
				interval_digit_chx.checked = true;
				checkInterval(interval_digit_chx);
				interval_digit.value = IntervalDetailsElm.getAttribute("interval");
			}
			//
			if (AO_isStudioEditMode()) showAdvanced="true";
			var imgShowHide=document.getElementById("btnShowHide");
			if (imgShowHide!=null)
			{			
				try
				{
					if (imgShowHide.firstChild.firstChild.firstChild.firstChild.nextSibling!=null)
					{
						if (showAdvanced=="true") 
						{
							A2ShowHideSearch(imgShowHide);
						}
					}
				}catch(e){}
			}
			
			if (cache_type=="cache" || cache_type=="refresh"){
				var lastSession=userData.XMLDocument.selectSingleNode("/root/Session");
				if (lastSession!=null) lastSession=lastSession.getAttribute("id");
				lastSession=""+lastSession;
				if (true/* for benny sade, sade*//*(lastSession!="") && (lastSession==AO_GetSessionID())*/) {					
				//if((lastSession!="") && (lastSession== _GetGlobalVar('PortalUserLogin'))){
					var findNode=userData.XMLDocument.selectSingleNode("/root/Find");
					var customfindNode=userData.XMLDocument.selectSingleNode("/root/customfind");
					if (findNode!=null){
						var fnAtt=new Array();
						//# added by eli harel in order to preserve the custom fields
						//i merage the filter attributes and the custom filter attributes
						for(var i=0;i<findNode.attributes.length;i++)
						{
							fnAtt.push(findNode.attributes[i]);
						}
						
						for(var i=0;customfindNode!=null && i<customfindNode.attributes.length;i++)
						{
							fnAtt.push(customfindNode.attributes[i]);
						}
						var inps;
						var inp_nodeName,row;
						for (var i=0;i<fnAtt.length;i++){
							inps=fnAtt[i];
							inp_nodeName=document.all[inps.nodeName];
							if (inp_nodeName!=null) {
								if (m_show) 
								{
									row=inp_nodeName;									
									if (row.tagName.search(/input|select|textarea/gi)!=-1)
										for(;(row.parentElement.id!="_searchTable") && (row.tagName.search(/html/gi)==-1) ;row = row.parentElement)
									{																				
										if (row.style.display=="none")	
										{						
											imgShowHide=document.getElementById("btnShowHide");												
											if (imgShowHide!=null)	 				
											try
											{
												if (imgShowHide.firstChild.firstChild.firstChild.firstChild.nextSibling!=null)
													A2ShowHideSearch(imgShowHide);
											}catch(e){}
											break;
										}
									}
								}
								//#changed by eli harel adding condition that check if the
								//input type is check box 
								if ((inp_nodeName.field_type==null ||
									inp_nodeName.field_type.indexOf("date")==-1)&&
									inp_nodeName.type != "checkbox"	)
									inp_nodeName.value=inps.nodeValue;
								else if( inp_nodeName.type == "checkbox") inp_nodeName.checked = true;
								else inp_nodeName.value=AO_UDF(inps.nodeValue.split("T")[0]);
							}
						}
					}
					
					if (cache_type=="cache"){												
						if (userData.XMLDocument.xml.length)
						{
							findNode=userData.XMLDocument.selectSingleNode("//root/Message");
							if (findNode!=null) {
								_Information.innerText=findNode.getAttribute("body");
								_Information.style.color="#BC2100";	
								m_primaryXML=userData.XMLDocument;
								AO_LoadingMsg(document.all["_scroller"]);
								var btnPrev=document.getElementById("btn_prev_scrl");
								var btnNext=document.getElementById("btn_next_scrl");
								if (btnPrev!=null && btnNext!=null)
								{					
														
									if (m_primaryXML.selectSingleNode("/root/@hasMore")!=null && m_primaryXML.selectSingleNode("/root/@hasMore").text=="no") btnNext.disabled=true;
									else btnNext.disabled=false;
									currentPageNum=m_primaryXML.selectSingleNode("/root/@currentPage");
									if (currentPageNum!=null) currentPageNum=parseInt(currentPageNum.text);		
									else currentPageNum=1;
									pagesCount=m_primaryXML.selectSingleNode("/root/@pagesCount");
									if (pagesCount!=null) pagesCount=parseInt(pagesCount.text);
									else pagesCount=1;													
									if (currentPageNum>1)
										btnPrev.disabled=false;
									else 
										btnPrev.disabled=true;
										
								}
							}
						}
					}
					else { //refresh
						rb_cache.value="refresh";
						var sortOrder="";
						var sortSign="+";
						if (userData.XMLDocument.xml.length){
							findNode=userData.XMLDocument.selectSingleNode("//root/Sort");
							if (findNode!=null)
							{	
								sortOrder=findNode.getAttribute("order");
								sortSign=findNode.getAttribute("sort");								
							}
						}
						try{
							f_BeforeScrollerRetrieve()
						}catch(e){}
						ScrollerRetrieve();
						try{
							f_AfterScrollerRetrieve()
						}catch(e){}
						if (sortOrder!="" && (!IsServerQBESortEnabled()))AO_Sort(sortOrder,null,sortSign);
					}
				}
			}
			else rb_cache.value="no_cache";
		}			
			
	}
	catch(e)
	{
		//WriteError('error')
		//if error accured while reading data from user data
		//clear the user data and dont display any results.
		document.all["_scroller"].innerHTML="";
		rb_cache.value="no_cache";
		
		userData.DeleteKey(userDataKey);
	}
	finally
	{
	    m_PageIndicator.NoBusy();
	}
    row_index = row_index||null;
    if (row_index!=null)
    {
	    
	    if (m_XrefSpecs[currTab]==null)
	    {
		    m_XrefSpecs[currTab]=new Object();	
	    }
		
	    m_XrefSpecs[currTab].RowIndex=row_index;
    }
    if(typeof(_GetGlobalVar("QbeSearchParameter"))!="undefined" && _GetGlobalVar("QbeSearchParameter")!=null)
    {
        if(typeof(_GetGlobalVar("QbeSearchParameter"))=="string")
        {
            var filter = "className input_search|tagName input";
            var oInput = FilterElements(_searchTable,filter,true);   
            if(oInput!=null)
            {
                oInput.value = _GetGlobalVar("QbeSearchParameter");
                ScrollerRetrieve();
            }
       }
       else if(_GetGlobalVar("QbeSearchParameter") instanceof Array)
       {
            var additionalParameters = _GetGlobalVar("QbeSearchParameter");
            for(field in additionalParameters)
            {
                var input = document.getElementById(field);
                if(input != null)
                {
                    input.value = additionalParameters[field];
                }
            }
            ScrollerRetrieve();
       }
    }
	setTimeout("AO_FocusFirstObject(null,'AO_InitScroller')", 100);	
	
	
	//if we load the scroller on background mode 
	//we invoke the retrieve
	/*if( FrameStatus("Get") == "_BackgroundLoading" )
	{
		ScrollerRetrieve();
	}*/
	return true;
}
function AO_LoadingMsg(container)
{
    try
    {
        if(typeof(container)=="string") container = document.getElementById(container);
        if(container==null)return;
        var sMsg = String.prototype.Format("<CENTER><H1 id='loadingh1'><font color=#808080>{0}</font></H1></CENTER>",txtLoading);
        container.innerHTML = sMsg;
    }
    catch(err)
    {/*do nothing*/}
}

function AO_DrawScrollerFromCache()
{
    if(m_primaryXML==null) return;
	var findNode=m_primaryXML.selectSingleNode("//root/Sort");
	//if sort details exists on user data 
	//call the sort function that also transform the xsl
	
	if (findNode!=null)
	{
	    var IsServerQBESortEnabled = _GetGlobalVar("IsServerQBESortEnabled");
	    _SetGlobalVar("IsServerQBESortEnabled",null);
		AO_Sort(findNode.getAttribute("order"),null,findNode.getAttribute("sort"));
		_SetGlobalVar("IsServerQBESortEnabled",IsServerQBESortEnabled);
	}
	else
	{
		//document.all["_scroller"].innerHTML=m_primaryXML.transformNode(m_primaryXSL);
		m_TransformObj.SetXslOutput(document.all["_scroller"]);
	}
	try
	{
	    MarkScrlRow(null,true);
	}
	catch(err)
	{/*do nothing*/}
}

function LookUPs(){
	LookUp(m_currentColumn[currTab]);
	
	var lookUpColumn = document.all(currRow[currTab]);
	
	if (lookUpColumn.length != null)
	{
		lookUpColumn = lookUpColumn(currRow[currTab]);
	}
	lookUpColumn.focus();
	return;
}
var AO_NewWindow=null;
function AO_Wait(msg){
    return;
	document.body.style.cursor="wait";
	for (var i=0;i<10000;i++);
// astea-trans=placeholder;placeholder;N;astea-trans=placeholder;placeholder;N;astea-trans=text;TXTJAVASCRIPT$Please_Wait;N;
	if (typeof(msg)=="undefined")msg="<h1>"+"Please Wait"+"</h1>";
	var nwtext="<html><body background='../images/Backgr_right.gif'>"+msg+"</body></html>";
	if (!AO_NewWindow) {
		AO_NewWindow = window.open('','AO_NewWindow','width=200,height=50,resizable=0,center=1,toolbar=0,location=0,directories=0,status=0,menubar=0',false);	
		AO_NewWindow.document.write(nwtext);
// astea-trans=text;TXTASP$please_wait_vx;N;
		AO_NewWindow.document.title="Please Wait...";
	}
}
function AO_EndWait(){
    return;
	document.body.style.cursor="default";
	if (AO_NewWindow) AO_NewWindow.close();
	AO_NewWindow=null;
}
/********************** Begin External Macro ****************************/
/// <summary>
/// Obsolete, use A2CS_RunServerMacro instead.
/// </summary>
/// <param name="aliasName">alias name, used to get the BO name</param>
/// <param name="macroName">macro name to invoke</param>
/// <param name="paramFields">Array of macro params</param>
/// <param name="syncFields">Array of fields that will be sync with the server result</param>
/// <returns>true/false</returns>
function ExternalAction(aliasName,macroName,paramFields,syncFields){
	var externalScope=document;
	var types="";
	var waitInt=false;
	if (!AO_NewWindow){
// astea-trans=placeholder;placeholder;N;astea-trans=text;TXTJAVASCRIPT$please_wait_vx;N;
		AO_Wait("<h1>"+"Please Wait..."+"</h1>");
		waitInt=true;
	}
	var boAlias, pos,rowNum=0;
	boAlias = aliasName
	pos = aliasName.search("@");
	if (pos > -1) {
		boAlias = aliasName.substr(0,pos);
		rowNum=aliasName.substr(pos+1).split("=")[1];
	}
	var fieldsTypes=paramFields//GetFieldsTypes(paramFields);
	if (fieldsTypes==null) return false;
	var aliasKey="";
	for (var i=0;i<m_aliases.length;i++) if (m_aliases[get_PrimaryBoIndex(i)]==boAlias) {		
		break;
	}	
	var result=_ExecMacro(macroName,aliasName,aliasKey,paramFields,syncFields,externalScope,types,'');	
	
	if (syncFields instanceof Array && typeof(result) == "object"){
		m_DoChanges=false;
		if (syncFields.length>0 && syncFields[0]!=null) AO_Sync(boAlias,syncFields,externalScope,rowNum,result);
			//ClearDocumentStatus();
		m_DoChanges=true;
	}	
	else if(typeof(result) == "string")//if the _ExecMacro return error message display the error
	{
		WriteError(result);
	}
	if (waitInt) AO_EndWait();
	return true;
}
function ClearDocumentStatus(){
		if (currXMLDoc==null) return true;
		var childs = currXMLDoc.selectNodes("*[@status != '0']");
		for (var i=0;i<childs.length;i++) 
			childs[i].setAttribute("status","0");
}
function GetFieldsTypes(updatedFields){
	
	if (!CreateXMLDOM()) return false;
	if (updatedFields instanceof Array){
		var fieldsTypes=new Array();
		for (var i=0;i<updatedFields.length;i++){
			//fieldsTypes[i]=updatedFields[i]+ ":"
			var ndXML=currXMLDoc.selectNodes("//" + updatedFields[i]);
			if (ndXML.length>0) fieldsTypes[i]= ndXML(0).getAttribute("dt:dt");
			else {
				fieldsTypes[i]= "string";
			}
		}
		return fieldsTypes;
	}
	return true;
}

/// <summary>
/// For internal Client Framework. Invoked by ExternalAction public function.
/// </summary>
/// <param name="macroName">[required]macro name</param>
/// <param name="macroObject">[required]bo name</param>
/// <param name="aliasKey">[required]page alias</param>
/// <param name="paramFields">[required]macro parameters</param>
/// <param name="syncFields">[required]Array of fields to sync with the server result</param>
/// <param name="parentDiv">[required]Obsolete</param>
/// <param name="types">[required]Obsolete</param>
/// <param name="columnList">[required]Obsolete</param>
/// <returns>SOAPResult object</returns>s
function _ExecMacro(macroName,macroObject,aliasKey,paramFields,syncFields, parentDiv,types,columnList){
	/*ByVal macroName As String, ByVal macroObject As String, macroParams() As Variant, 
	ByRef errText As Variant*/
	var pos;
	var field;
	var colName;
	var strHTML;
	var indx = 0;
	var strFields = new Array();
	var strValues = new Array();
	if (paramFields instanceof Array){
		if (paramFields.length == 0) paramFields=null;
	}
	
	var boObject=macroObject.split("@")[0];
    var strSendXML=BuildXML4Exec(boObject, syncFields);    
	var SOAPResult=SOAP_ExecMacro(macroName,m_BCName,macroObject,paramFields,false,false,strSendXML);
	if (SOAP_IsError(SOAPResult)){
		return SOAP_Format_Error_Message(SOAPResult);
	}
	m_ServerAct = validateObj.InvokeHook("f_IsServerInteraction",macroName,null,m_currentAlias);
	m_ServerAct=m_ServerAct==null?true:m_ServerAct;
	return  SOAP_Get_XMLObj(SOAPResult);

	
}

/// <summary>
/// For internal Framework. Builds the request XML send to the server, used by AddNewRow function before 
/// interacting with server calls this function to build the request XML for the current BO with all fields.
/// </summary>
/// <param name="macroObject">[required]bo name</param>
/// <param name="syncFields">[required]array of fields(column) to fetch from the server</param>
/// <param name="strXML_root">[optional, default empty string]string for the request XML root element definition</param>
/// <param name="add_root">[optional,defult true]if send strXML_root this parameter should be true, indicate that the root element
/// should be strXML_root parameter</param>
/// <param name="getAllColumns">[optional, default true]true to get all column ignore the ASP column cache</param>
/// <returns>the request XML string</returns>
function BuildXML4Exec(macroObject,syncFields,strXML_root,add_root,getAllColumns){
	if (macroObject==null || macroObject.trim()=="")return "";
	if (add_root==null) add_root=true;
	if (strXML_root==null)strXML_root="";
	if(getAllColumns == null) getAllColumns = true;

	var strXML="<BO alias='"+macroObject+"'>";

	for (var i = 0; i < syncFields.length; i++){
		if ((typeof(syncFields[i])=="object") ||(typeof(syncFields[i])=="undefined")) continue;
		
		strXML+="<column name='"+syncFields[i].replace(":n","")+"'></column>"
	}

	strXML += "</BO>";
	var tmpXML,tmpArray;
	for (var i = 0; i < syncFields.length; i++){		
		if (!(syncFields[i] instanceof Array)) continue;
		if (syncFields[i].length<1) continue;   
		tmpXML="<BO alias='"+syncFields[i][0]+"'>";
		for (var j=1;j<syncFields[i].length;j++) tmpXML+="<column name='"+syncFields[i][j].replace(":n","")+"'></column>"
		tmpXML += "</BO>";		
		strXML+=tmpXML;

	}

	strXML_root+=strXML;
	var pageName
	if(getAllColumns)
		pageName = ""
	else
		pageName = _GetCurrentPageName()

	if (add_root)
		strXML_root="<root xmlns:dt='urn:schemas-microsoft-com:datatypes'><GetCurrentState pageName='" + pageName + "' stateID='" + m_StateID + "'>" +
			strXML_root+"</GetCurrentState></root>";	
	return strXML_root;
								
}

function AO_Sync(aliasName,not_implemented,externalScope,rowNum,boStateXML,BOArray){	
	function _f_do_change(rowName){
		if (BOArray instanceof Array){
			for (var i=0;i<BOArray.length;i++)
				if (BOArray[i]==(rowName+":n")) return false;			
		}
		return true;
	}
	var Values=boStateXML.selectSingleNode("error");
	if (Values!=null){
		WriteError(Values.text);
		_show.innerText = "";
	}
	else{		
		Values=boStateXML;
		var updatableField;
		var rowFilter="";
		if (rowNum!=null && rowNum!=0) rowFilter="[@number='"+rowNum+"']";
		else rowNum=0;
		Values = Values.selectSingleNode("//"+aliasName+"/row"+rowFilter);
		if (Values==null) return;
		for(var ndChild=Values.firstChild;
			ndChild;ndChild=ndChild.nextSibling){
				if (ndChild.nodeType==8) continue;//comment
				updatableField=externalScope.all(ndChild.nodeName);
				
				if (updatableField==null) updatableField=document.all(ndChild.nodeName);
				if (updatableField==null) updatableField=document.all(aliasName+"@"+ndChild.nodeName);
				if (updatableField==null ||  !_f_do_change(ndChild.nodeName))
				{
					ndXML=currXMLDoc.selectSingleNode("//"+aliasName+"//row"+rowFilter+"//"+ndChild.nodeName);
					if (ndXML!=null ){
						ndXML.text=ndChild.text;
						SetFieldStatus(ndXML,0,aliasName,Math.max(parseInt(rowNum),1)-1);
		
					}
				}else{
					if (updatableField.length!=null && updatableField.tagName==null){
							updatableField=updatableField(currRow[currTab]);
					}
					
									
					if (updatableField.value!=ndChild.text){
						if (updatableField.tagName.search(/input|select/gi)!=-1){
							if (ndChild.dataType){
								switch (ndChild.dataType)
								{
									case "date":
										var udfDate=AO_UDF(ndChild.text);
										if (updatableField.value!=udfDate)
											updatableField.value=udfDate;
										else continue;
										break;
									case "number": case "float": case "double": case "r4": case "r8": case "int":	
									case "integer":	
										var strNum=AS_Num2String(ndChild.nodeTypedValue);
										if (strNum!=updatableField.value)									
											updatableField.value=strNum;	
										else continue;
										break;	
									default:
										if (updatableField.type=="checkbox"){
											if (ndChild.text==currXMLDoc.selectSingleNode("//root/ddlb/"+ndChild.nodeName).getAttribute("on"))
												updatableField.checked=true;
											else updatableField.checked=false;
										}
										else {
											var txt=ndChild.nodeTypedValue;
											if (updatableField.getAttribute("maxlength")!=null) 
												txt=(""+txt).substr(0,updatableField.getAttribute("maxlength"));
											updatableField.value=txt;
										}
								
								}
							}
							else{
								updatableField.value=ndChild.text;
							}
							
							
							if (updatableField.onchange) {
								m_DoChanges=false;
								updatableField.onchange();	
								m_DoChanges=true;
							}
							else{
//Tamir onchange							
/*
								if (updatableField.flag_change ){
									m_DoChanges=false;
									ItemChange(updatableField,updatableField.getAttribute("rowChange")-1);
									old_active_element_value=updatableField.value;
									m_DoChanges=true;
								} 
*/								
//~Tamir onchange									
							}							
						
						}
						else{
							updatableField.innerText=(ndChild.dataType)?ndChild.nodeTypedValue:ndChild.text;
							if (updatableField.tagName.search(/textarea/gi)!=-1){
								if (updatableField.onchange && _f_do_change(ndChild.nodeName)){
									m_DoChanges=false;
									 updatableField.onchange();	
									 m_DoChanges=true;
								}
								else{
//Tamir onchange								
/*
									if (updatableField.flag_change ){
										m_DoChanges=false;
										ItemChange(updatableField,updatableField.getAttribute("rowChange")-1);
										old_active_element_value=updatableField.value;
										m_DoChanges=true;
										
									} 						
*/									
//~Tamir onchange									
								}								
							}
							else{
								ndXML=currXMLDoc.selectSingleNode("//"+aliasName+"//row"+rowFilter+"//"+ndChild.nodeName);
								if (ndXML!=null && ndXML.text!=ndChild.text) {
									if (ndXML.dataType!=null && ndChild.dataType!=null) 
										ndXML.nodeTypedValue=ndChild.nodeTypedValue;							
									else ndXML.text=ndChild.text;
									SetFieldStatus(ndXML,0,aliasName,Math.max(parseInt(rowNum),1)-1);
								}	
							}
						}						

					}

				}
		}			
		
	}


}
/********************** End External Macro ****************************/

/********************** Begin New Design Functions *********************/
/// <summary>
/// Used to filter the client state, by getting the rows of the corresponding BO that their state was changed,
/// meaning different than zero.
/// </summary>
/// <param name="boAlias">[required]BO name to filter, empty string will filter the entire state</param>
/// <param name="returnObject">[optional, default false]if true return XML document object</param>
/// <returns>variant, can be true/false or object that can be XML string or XML </returns>
function _FilterUpdatedXML(boAlias,returnObject){
	
	if (!CreateXMLDOM()) return false;
	var selXML=new ActiveXObject("MSXML2.DOMDocument"),fldNodes;
	if (returnObject==null) returnObject=false;
	try{	
		selXML.loadXML(currXMLDoc.xml);	
		var tmpXML="<root xmlns:dt='urn:schemas-microsoft-com:datatypes'>";
 		if (selXML==null) return false;
 		if (boAlias!="") boAlias="("+boAlias+")";
		var ndChilds=selXML.selectNodes("/root/"+boAlias+"/row[@status!=0]");			
		var countSel=ndChilds.length;
		var boName,dependChild,joinKeyName,joinKeyValue,parentKeyName,parentKeyValue;
		//if (ndChilds.length==0) return "";
		for (var j=0;j<countSel;j++){		
			ndChild=ndChilds.item(j);
			//ASAP #IL0402080006
			if (Number(ndChild.getAttribute("status")) & 2){
				boName=ndChild.parentNode.nodeName;				
				var dependantChilds=selXML.selectNodes("/root/*[@parentAlias='"+boName+"']/row[@status!=0]");				
				for (var i=0;i<dependantChilds.length;i++)
				{
					dependChild=dependantChilds[i];
					joinKeyName=dependChild.parentNode.getAttribute("joinKeys");
					parentKeyName=dependChild.parentNode.getAttribute("parentKeys");
					joinKeyValue=dependChild.selectSingleNode(joinKeyName);
					if (joinKeyValue==null) continue;
					joinKeyValue=joinKeyValue.text;
					parentKeyValue=ndChild.selectSingleNode(parentKeyName);
					if (parentKeyValue==null) continue;
					parentKeyValue=parentKeyValue.text;
					if (parentKeyValue==joinKeyValue)
					{
						dependChild.setAttribute("status",dependChild.getAttribute("status") | 2);
						fldNodes=dependChild.selectNodes("*");
						for (var k=0;k<fldNodes.length;k++){		
							fldNodes[k].parentNode.removeChild(fldNodes[k]);
						}									
					}
					
				}
		
				fldNodes=ndChild.selectNodes("*");
				for (var i=0;i<fldNodes.length;i++){		
					fldNodes[i].parentNode.removeChild(fldNodes[i]);
				}			
			}

		}
		var ndChilds=selXML.selectNodes("/root/"+boAlias+"/row[@status!=0]");			
		for (var j=0;j<ndChilds.length;j++){
			ndChild=ndChilds.item(j);					
			tmpXML+="<"+ndChild.parentNode.nodeName+">"+
				ndChild.xml+"</"+ndChild.parentNode.nodeName+">";		
		}
		tmpXML+="</root>"; 
		selXML.loadXML(tmpXML);
		tmpXML=selXML.selectNodes("//*[@status=0]");
		for (var i=0;i<tmpXML.length;i++){		
			tmpXML[i].parentNode.removeChild(tmpXML[i]);
		}
		tmpXML=selXML.selectNodes("/root//*[@xmlns:dt]");
		for (var i=0;i<tmpXML.length;i++){		
			tmpXML[i].removeAttribute("xmlns:dt");
		}		
		
	}catch(e){return false;}
	if (returnObject) return selXML;
	return selXML.xml;
	
}

/// <summary>
/// Used to synchronized the client state with the server state.
/// </summary>
/// <param name="boAlias">[required]the BO to sync</param>
/// <param name="event_name">[required]the name of the event to initiate this operation (setitem,macroname etc)</param>
/// <param name="saveState">[optional,default false]true call save after finish this command, false otherwise</param>
/// <param name="closeState">[optional,default false]true close state after finish executing the command, false otherwise</param>
/// <returns>true/false</returns>
function AO_Sync2Server(boAlias,event_name,saveState,closeState){
	if (m_sessionClosed) return false;
	for (var i=0;i<m_aliases.length;i++)
		if (m_aliases[i]==boAlias) break;		
	if (i==m_aliases.length) return false;
	else var aliasNum=i;	
	
	saveState = typeof(saveState)=="undefined"?false:saveState;
	closeState = typeof(closeState)=="undefined"?false:closeState;
	
	var SOAPResult=SOAP_Sync2Server(boAlias,_FilterUpdatedXML(boAlias),saveState,closeState);
	
    var strHTML = SOAPResult.value;
	if (!SOAP_IsError(SOAPResult)){		
		m_ServerAct = validateObj.InvokeHook("f_IsServerInteraction",null,boAlias,m_currentAlias);
		m_ServerAct=m_ServerAct==null?true:m_ServerAct;
		try{
			f_externalSync(boAlias,event_name);
		}catch(e){/*do nothing*/}
		var syncFields=BuildXML4Exec(boAlias,Array(null));	
		SOAPResult=SOAP_GetState(syncFields);			
		if (SOAP_IsError(SOAPResult)) {
			WriteError(SOAP_Format_Error_Message(SOAPResult));
			return false;
		}
		SOAPResult=SOAP_Get_XMLObj(SOAPResult);
		var Values=SOAPResult.selectSingleNode("root/"+boAlias);
		if (Values==null)return true;
		var oldChild=m_primaryXML.selectSingleNode("root/"+boAlias);
		if (oldChild!=null) m_primaryXML.documentElement.replaceChild(Values,oldChild);
		else m_primaryXML.documentElement.appendChild(Values);			
		return true;
	}
	else 
	{		
		WriteError(SOAP_Format_Error_Message(SOAPResult));		
	}

}

function ApplyPageParameters(parameters)
{
    _SetGlobalVar("Module_GroupAlias",parameters["Module_GroupAlias"]);
    _SetGlobalVar("Module_PageAlias",parameters["Module_PageAlias"]);
    _SetGlobalVar("Module_CurrentRow",parameters["Module_CurrentRow"]);
    _SetGlobalVar("Module_RowID",parameters["Module_RowID"]);
    _SetGlobalVar("Module_SortOrder",parameters["Module_SortOrder"]);
    _SetGlobalVar("Module_PrimaryKey",parameters["Module_PrimaryKey"]);
    _SetGlobalVar("Module_xrefPage",parameters["Module_xrefPage"]);
}

function SetCurrentPage(parameters)
{	
    if (typeof(parameters) != "undefined")
    {
        parameters["Module_GroupAlias"] = m_curGroupAlias;
        parameters["Module_PageAlias"] = m_currentAlias;
    }
    else
    {
        _SetGlobalVar("Module_GroupAlias",m_curGroupAlias);               
        _SetGlobalVar("Module_PageAlias",m_currentAlias);           
    }
    var oRowCollection = m_primaryXML.selectNodes("/root/"+m_aliases[get_PrimaryBoIndex(currTab)]+"/row");
    var iNumber = 0;
    if( oRowCollection.length )
    {
        iNumber = parseInt(oRowCollection[oRowCollection.length-1].getAttribute("number"));
        if (typeof(parameters) != "undefined")
            parameters["Module_CurrentRow"] = ((iNumber>oRowCollection.length||iNumber==0)?0:m_currentRow[currTab]);
        else _SetGlobalVar("Module_CurrentRow",((iNumber>oRowCollection.length||iNumber==0)?0:m_currentRow[currTab]));        
    }
	if (m_XrefSpecs[currTab]!=null){
		if (m_XrefSpecs[currTab].RowID!=null)
		{
		    if (typeof(parameters) != "undefined")
               parameters["Module_RowID"] = currRow[m_currentAlias]+";"+ m_XrefTableLength[m_currentAlias];
            else _SetGlobalVar("Module_RowID", currRow[m_currentAlias]+";"+
				m_XrefTableLength[m_currentAlias]);			
				
		    if (typeof(parameters) != "undefined")
               parameters["Module_SortOrder"] = m_XrefSpecs[currTab].SortOrder;
            else _SetGlobalVar("Module_SortOrder",m_XrefSpecs[currTab].SortOrder);		
			var primaryKey=	m_primaryXML.selectSingleNode("/root/"+m_aliases[get_PrimaryBoIndex(currTab)]);
			if (primaryKey!=null)
			{
				primaryKey=primaryKey.getAttribute("primaryKeys");
				if (primaryKey!=null && primaryKey!="")
				{
					var primaryKeyArr = primaryKey.split(";");
					var Module_PrimaryKey = new String();
					for(var i=0;i<primaryKeyArr.length;i++)
					{
						primaryKey=primaryKeyArr[i];						
						var primaryKeyValue=AO_getItemObj(primaryKey,m_aliases[get_PrimaryBoIndex(currTab)],
							String(m_currentRow[currTab]+1));
						if (primaryKeyValue!=null)
						{
							primaryKeyValue=primaryKeyValue.text;
							Module_PrimaryKey += primaryKey+";"+primaryKeyValue+"@";
						}
					}
					if (typeof(parameters) != "undefined")
                            parameters["Module_PrimaryKey"] = Module_PrimaryKey.removeEx("@");
                    else
					    _SetGlobalVar("Module_PrimaryKey",Module_PrimaryKey.removeEx("@"));
				}
			}			
		}
		if (m_XrefSpecs[currTab].xrefPage!=null)
		    if (typeof(parameters) != "undefined")
                parameters["Module_xrefPage"] = m_XrefSpecs[currTab].xrefPage;
            else
    			_SetGlobalVar("Module_xrefPage", m_XrefSpecs[currTab].xrefPage);	
	}				
}

function Module_Apply(){
	if (new_Single_Done(false)==true) {
	    AO_CloseState();
		SetCurrentPage();
		//currXMLDoc = null;
		m_RealoadPage = false;
		FrameStatus("Set","Loaded","main_frame");
		ExecReteriveWithLayout("apply");
		m_RealoadPage = true;
		return true;
	}
	else return false;
}

var k_Total;
if (typeof(timesArray)=="undefined") var timesArray=new Array();
if (typeof(funcsArray)=="undefined") var funcsArray=new Array();
if (typeof(iTimers)=="undefined") var iTimers=-1;
timesArray=new Array();
funcsArray=new Array();

function AO_SaveModule()
{
try{	
	var i, pos;
	if (aliasLoaded!="") return false;	
	if (m_sessionClosed) return false;
	if (!m_action.match(/.*(new).*/ig) && AS_GetBCPermission("modify")!="true") return true;
	if (!CreateXMLDOM()) return false;

	glb_SaveOrApply = "save";
	if (new_checkAllMandatoryTabs()) return false;	
	try{
		var msg=f_module_validate();
		if (msg.trim().length) {
			msg=msg.trim(); if (msg.toLowerCase()=="boxxxx") return false;
			WriteError(msg);return false;
		}
	}catch(e){/* do nothing */}
	var strFilter=_FilterUpdatedXML("");
	var SOAPResult=SOAP_Sync2Server(GetMainModule(),strFilter,true,false);	
		
	try{
		var blnSOAPError=SOAP_IsError(SOAPResult);
		if (blnSOAPError)
		{
			if(!checkServerError(SOAPResult)){
				WriteError(SOAP_Format_Error_Message(SOAPResult));
				return false;
			}
		}
		else return true;
	}catch(e){WriteError(e);return false}

	return true;
}catch(e){WriteError(e);return false;}	
}


/// <summary>
/// Saves the current module (new, maint), by synchronizing all states to the server and save the state, the state remains open until the
/// user navigates from the module, can save the module in Synch or ASync mode, if the function is invoked by one of the save 
/// buttons the save occur on A Sync fashion. If you call this function manually without specifiying the save options, the save occurs on Sync 
/// fashion.
/// </summary>
/// <param name="goBack">[required]if true after save navigate back, otherwise remain in the current page</param>
/// <param name="saveOption">[optional] options:
/// 1- save the module in ASync mode and immediately navigate back
/// 2- save the module in ASync mode, if the current module is "new" create new record, otherwise stay on the current module</param>
/// <param name="macroName">[optional, default empty string] macro name</param>
/// <returns>true/false</returns>
function new_Single_Done(goBack, saveOption, macroName){
try{
    if(typeof(m_StateID) == "undefined") return;
	m_PageIndicator.Busy();
	var strFilter=null;
	if (!CreateXMLDOM()) return false;
	if (new_checkAllMandatoryTabs()) return false;
	m_SaveStatusBW |= 2;
	try{
			var msg=f_module_validate();
			if (msg.trim().length) {
				msg=msg.trim(); if (msg.toLowerCase()=="boxxxx") return false;
				WriteError(msg);return false;
			}
	}catch(e){/* do nothing */}
	if( m_SaveStatusBW & 4 ) return false;
	strFilter=_FilterUpdatedXML("");
	if(m_saveOptions!=null)
	{
	    saveOption=m_saveOptions;
	}
	CloseContextMenu("_NewSave");
    if(!m_disableAsyncBehaivor && saveOption != null 
        && window.dialogArguments==null && window.opener ==null)
    {
        goBack = saveOption;
        if((saveOption==1 || saveOption==2) && AS_GetASyncHandler().Available(sLocation))
        {
            WriteTraceLine(String.prototype.Format("Start Async save operation , option = {0} , Location = {1}",saveOption,document.location.href));
            var sLocation = window.document.location.href;
            var sParameters = _GetGlobalVar(_GetPageName(document.location.href));
            var sMainRecordName = "";
            var tableKey = "";
            macroName=macroName||"";
            try
            {
                sMainRecordName = m_ModuleTitle.split(":")[0];
                tableKey = m_tableKey;
                if(m_action == "new")
                {
                   var str = m_ModuleTitle.split(":")[1].trim();
                   var istart = str.indexOf("&{");
                   var iend = str.indexOf("}");
                   str = str.substring(istart,iend+1);
                   tableKey = _ParseParams(str);                  
                }
            }
            catch(err)
            {/*do nothing*/}
            var parameters = new Array();
            SetCurrentPage(parameters);
            var oAdditonalParams = new Array(m_BCName,m_ClusterTitle,sMainRecordName,tableKey, parameters);
            var res = AS_GetASyncHandler().BeginInvoke(m_StateID,m_primaryXML,sLocation,oAdditonalParams,sParameters,"BCBase", "InteractWithServer",m_StateID, _GetGlobalVar("SessionID"), macroName,m_BCName,GetMainModule(),Array(""),strFilter,"","",true,false);
            if( res != "" )throw (res);
            m_sessionClosed = true;
            
            AO_NavigateOptions(saveOption);
            m_saveOptions = null;
            return true;
        }
    }
    WriteTraceLine(String.prototype.Format("Start synchronize save operation, Location = {1}",document.location.href));
	var i, pos;
	if (aliasLoaded!="" && CheckCurrentFrame()==true) return false;	
	if (m_sessionClosed) return false;
	if (!m_action.match(/.*(new).*/ig) && AS_GetBCPermission("modify")!="true") return true;
	
	if (goBack==null){
		goBack = true;
		glb_SaveOrApply = "save";
	}
	else{
		glb_SaveOrApply = "apply";	
	}
	var SOAPResult=SOAP_Sync2Server(GetMainModule(),strFilter,true,false);	
	var responseValue=_CheckResponse(SOAPResult,goBack);

	if (!responseValue) return false;

	return true;
}
catch(e){WriteError(e);return false;}
finally
{
    m_SaveStatusBW = 0;
	m_PageIndicator.NoBusy();
}
}

//this function build on page load the m_mandatoryMetaData array
//and save the array on the client cache
function LoadMandatoryFieldsToCache()
{
	var nChildCount;
	
	try
	{
		if(!validateObj.IsDefined(m_PageAliases)) return;
		//check if the cache is allready init
		if( AO_GetPrimaryWindow().top.control_frame.m_mandatoryFieldsCache == null )
		{
			AO_GetPrimaryWindow().top.control_frame.m_mandatoryFieldsCache = new Array();
		}
		var __mandatoryFieldsCache = AO_GetPrimaryWindow().top.control_frame.m_mandatoryFieldsCache;
		//check if we allready cache the module manadatory fields
		if( __mandatoryFieldsCache[document.location] != null )
		{
			return;
		}
		var mandatoryCachedArr = new Array();
		var doc = new ActiveXObject("MSXML2.DOMDocument");
		doc.async = false
		//go through all module xsl
		for(var i=0;i<m_PageAliases.length;i++)
		{
			var pathAliasArray = new Array("_"+m_PageAliases[i]+"XSL","_"+m_PageAliases[i]+"XSL_Additional")
			for(var j=0;j<pathAliasArray.length;j++)
			{
				var pathAlias = pathAliasArray[j];
				var arrayResult = GetXslMandatoryFields(m_XSLPath[pathAlias],doc);
				if( arrayResult != "" )
				{
					mandatoryCachedArr[pathAlias] = arrayResult;
				}
			}
		}
		//insert the mandatory field array into cache
		__mandatoryFieldsCache[document.location] = mandatoryCachedArr;
	}
	catch(err)
	{
		return false;
	}	
	return true;
}

function UpdateMandatoryCache(alias,fieldId,newVal)
{
	try
	{
		var __mandatoryFieldsCache = AO_GetPrimaryWindow().top.control_frame.m_mandatoryFieldsCache;
		var mandatoryFieldsCache = __mandatoryFieldsCache[document.location];
		var aliasCache = mandatoryFieldsCache[alias];
		var newCahceFileds = new String();
		if( aliasCache != null )
		{
			
			var fildesArr = aliasCache.split("@");
				
			for(var i=0;i<fildesArr.length;i++)
			{
				var filedStrArr = fildesArr[i];
				var fieldStr = filedStrArr.split("^")[0]+"^"+filedStrArr.split("^")[1]+"^"+filedStrArr.split("^")[2]
				if(filedStrArr.split("^")[0]==fieldId && filedStrArr.split("^")[1]=="M" && 
					newVal=="mandatory_no_star")
				{
					fieldStr +="^I";
				}
				newCahceFileds += fieldStr+"@";
			}
		
			mandatoryFieldsCache[alias] = newCahceFileds.removeEx("@");
		}
	}
	catch(err)
	{/**/}
}

//param 1 -string- xsl file path
//param 2 -object- reference to xml document object
//return mandatory fields 
function GetXslMandatoryFields(filePath,objXSL)
{
	var mandatoryFields = new String();
	
	try
	{
		//load the document
		objXSL.load(filePath);
		if (objXSL.xml.length==0) return mandatoryFields;
		//get all mandatory or conditinal childs
		var ndXSLChilds=objXSL.documentElement.selectNodes(".//td[(@class = 'mandatory') $or$ (@conditional $ieq$ 'true') $or$ (xsl:choose//xsl:attribute $ieq$ 'mandatory') $or$ (xsl:if//xsl:attribute $ieq$ 'mandatory') $or$ (xsl:if//xsl:attribute[@name='conditional'])]");
		if (ndXSLChilds==null) return mandatoryFields;
		//go through the child nodes and chain all the mandatory fileds
		//details to string
		for (var i=0;i<ndXSLChilds.length;i++){
			var ndXSLChild = ndXSLChilds[i];
			
			var XSLChildName = ndXSLChild.getAttribute("id").replace(/_t$/i,"");
			var conditinalNode = ndXSLChild.selectSingleNode("(xsl:if//xsl:attribute[@name='conditional']) | (xsl:choose//xsl:attribute[@name='conditional'])");
			//check the filed type
			if( conditinalNode == null )
			{
				XSLChildName += ndXSLChild.getAttribute("conditional")!=null?"^C":"^M";
			}
			else
			{
				XSLChildName += conditinalNode.text=="true"?"^C":"^M";
			}
			//get the field label
			var labelNode=ndXSLChild.selectSingleNode("label | */label");
			if (labelNode==null) labelNode=ndXSLChild;
			XSLChildName += "^"+labelNode.lastChild.text.replace(/:|\*/g,"");
			
			mandatoryFields += XSLChildName+"@";
		}
		
		mandatoryFields = mandatoryFields.removeEx("@");
	}
	catch(err)
	{
		throw ("err");
	}
	
	return mandatoryFields;
}

function new_checkAllMandatoryTabs(){
  var i, nChildCount;
  var strChildId;
  var oChild;
  nChildCount = m_PageAliases.length;
  
try{
  //--- loop thru the child objects to manage CONTENT-TABS
	//check mandatory only for the page and not
	//for the xsl file.
	var oNode =  new Object();
	//check if the current page contains mandatory fields
	//if not skip validation on current page
	if(typeof(m_XrefSpecs[currTab]) == "undefined" || 
	    typeof(m_XrefSpecs[currTab].xrefPage) == "undefined" ||
	    m_XrefSpecs[currTab].xrefPage == null)
	{
	    oNode =  m_primaryXSL.selectSingleNode(".//td[(@mandatory = 'true') $or$ (@class = 'mandatory') $or$ (@conditional $ieq$ 'true') $or$ (xsl:choose//xsl:attribute $ieq$ 'mandatory') $or$ (xsl:if//xsl:attribute $ieq$ 'mandatory') $or$ (xsl:if//xsl:attribute[@name='conditional'])]");
	}
	if( oNode!=null && CheckMandatory(document.currentAlias())) return true;
	if(m_action == "new" ) return false;
	//added by eli harel if the mandatory fields define in cache
	//then check the mandatory fileds using the cache
	var __mandatoryFieldsCache = AO_GetPrimaryWindow().top.control_frame.m_mandatoryFieldsCache;
	
	//check if we allready cache the module manadatory fields
	if( __mandatoryFieldsCache[document.location] != null )
	{
		return new_checkAllMandatoryFromCache();
	}
	
	for( i = 0; i < nChildCount; i++ ) {
		//--- retrive child object and id
		//--- process only if object is content tab
			
		if (m_PageAliases[i]==m_currentAlias) 
		{
			//if( CheckMandatory(document.getElementById(m_currentAlias))) return true;
			continue;
		}
		
		if (CheckMandatoryXSL(m_PageAliases[i],m_aliases[get_PrimaryBoIndex(i)])) return true;
	}
	 
	}catch(e){WriteError(e);return true}
	return false;
}

//this function check module mandatory fields on save or apply
//against the cache and not the xsl files
function new_checkAllMandatoryFromCache()
{
	var i, nChildCount;
	var strChildId;
	var oChild;
	//get the number of page alias
	nChildCount = m_PageAliases.length;
	try
	{
		//--- loop thru the child objects to manage CONTENT-TABS
		for( i = 0; i < nChildCount; i++ ) 
		{
			if(m_PageAliases[i] == m_currentAlias) continue;
			//for each page alias check is mandatory fields
			//if manadatory is needed return true
			if (CheckMandatoryCache(m_PageAliases[i],m_aliases[get_PrimaryBoIndex(i)])) return true;
		}
	//on general error raise error and return true
	//meaning dont save/applay
	}catch(e){WriteError(e);return true}
	//if all manadatory fields exits return false
	return false;
}

//this function get the mandatory fileds for the specified alias
function GetMandatoryFields(alias,number)
{	
	var __mandatoryFieldsCache = AO_GetPrimaryWindow().top.control_frame.m_mandatoryFieldsCache[document.location];
	return __mandatoryFieldsCache[alias];
}

//this function check if the manadatory fileds for the specified bo
//are init on the state according to their status
function CheckMandatoryCache(alias,boAlias,rowNum){
	var ndXSLChilds,ndXSLChild,
		ndXMLChilds,ndXMLChild;
	var strFieldID;
	var xrefNull,tmpTab,boAlias, tmpBOAlias;
	
	//hook the code
	try{
		tmpTab = AO_GetCurrentTab(alias)
		var objXSLArr = AO_GetPageXslNames(tmpTab,alias);
		var objXSLArr = null;

		if( objXSLArr == null ) return false;
		
		for(var xslIndex=0;xslIndex<objXSLArr.length;xslIndex++)
		{
			try
            {
                var checkAlias = m_currentAlias;
                if(m_XrefSpecs[tmpTab].xrefPage!=null)
                {
                        checkAlias = m_XrefSpecs[tmpTab].xrefPage;
                }
                if(objXSLArr[xslIndex] == checkAlias && m_currentAlias == checkAlias) continue;
            }
            catch(err)
            {/*do nothing*/}

			//get the manadatory fields array using the page alias or the 
			//page xref alias
			var __alias = new String(objXSLArr[xslIndex]);
			var mandatoryFields = GetMandatoryFields(__alias);
			//if no manadatory fileds for the specified page alias continue
			if (mandatoryFields==null) return false;
			
			mandatoryFields = mandatoryFields.split("@");
			var fieldm=null,is_mandatory,msgTxt="";
			//iter through the mandatory fileds
			for (var i=0;i<mandatoryFields.length;i++){
				//Get the id of the label
				fieldm=mandatoryFields[i];
				tmpBOAlias=boAlias;
				//get the field type
				is_mandatory=fieldm.split("^")[1]=="M"?true:false;
				if(!validateObj.IsNothing(fieldm.split("^")[3])&& fieldm.split("^")[3]=="I") continue;
				
				//get the message text
				msgTxt = !validateObj.IsNothing(fieldm.split("^")[2])?unescape(fieldm.split("^")[2]):fieldm.split("^")[0];
				//get the filed real name
				fieldm=fieldm.split("^")[0];
				
				//check if the field is refrenced to another bo
				strFieldID=AO_GetBOAliasFromID(fieldm,boAlias);
				
				tmpBOAlias=strFieldID[0];
				strFieldID=strFieldID[1];
				if (tmpBOAlias==null) tmpBOAlias=boAlias;
				tmpBOAlias=tmpBOAlias.split(":")[0];
				//check if the manadatory filed exist on the state
				ndXMLChilds=currXMLDoc.selectNodes("//root/"+tmpBOAlias+"/row/"+strFieldID);		
				for (var j=0;j<ndXMLChilds.length;j++){
					ndXMLChild=ndXMLChilds.item(j);
					if (ndXMLChild.parentNode.getAttribute("status") & 2) continue;
					if (ndXMLChild.text.trim().length<=0){
						//if filed type is conditinal
						if (!is_mandatory){
							try{
								is_mandatory=f_test_mandatory_condition(tmpBOAlias,strFieldID,j);
								if (is_mandatory!=false)is_mandatory=true;
							}catch(e){is_mandatory=true}
							if(!is_mandatory)
							{
								ModifyAttributeInXsl(strFieldID,"class","mandatory_no_star",null,__alias);
							}
							else
							{
								ModifyAttributeInXsl(strFieldID,"class","mandatory",null,__alias);
							}
						}
						if( is_mandatory )
						{//if field type is mandatory
							if (!m_action.match(/.*(new).*/ig)) _OpenPage(alias,false);
							else _ChangeStyle(document.getElementById(strFieldID).group);				
							try{
								document.getElementById(strFieldID).focus();
								document.getElementById(strFieldID).focus();//only twice works...
							}catch(e){/* do nothing*/}

							throw (":VLD001:"+msgTxt.replace(/:|\*/g,""));
						}
					}
				}//for ndXMLChilds.length
			}//for mandatoryFields.length
		}//for objXSLArr.length
		//if no mandatory field is required return false
		return false;
	}//if the code is failed because general error return true
	catch(e)
	{
		WriteError(e);
		return true;
	}	
}

//this function is update attributes in xsl cache
function ModifyAttributeInXsl(elementId,attrName,attrNewVal,objXSL,alias)
{
	try
	{
		if(validateObj.IsNothing(objXSL) && validateObj.IsNothing(alias))
		{
			objXSL = m_primaryXSL;
		}
		else if(validateObj.IsNothing(objXSL) && !validateObj.IsNothing(alias))
		{
			objXSL=new ActiveXObject("MSXML2.DOMDocument");
			objXSL.async=false;
			var res = objXSL.load(m_XSLPath[alias]);
			if(!res) return;
		}
		
		var elName = elementId.split("_t").length>1?elementId:elementId+"_t";
		var tmpNode = objXSL.selectSingleNode("//node()[@id='"+elName+"']");

		if( tmpNode != null)
		{
			tmpNode.setAttribute(attrName,attrNewVal);
		}
		
		AO_RefreshXSLCache();
		UpdateMandatoryCache(alias,elementId,attrNewVal);
	}
	catch(err)
	{/*do nothing*/}
}

function CheckMandatoryXSL(alias,boAlias,rowNum){
	var ndXSLChilds,ndXSLChild,
		ndXMLChilds,ndXMLChild;
	var strFieldID;
	var xrefNull,tmpTab,boAlias, tmpBOAlias;
try{
	
	//if (m_currentAlias == alias) return CheckMandatory(document);
	for (var i=0;i<m_PageAliases.length;i++)
		if (m_PageAliases[i]==alias){
			tmpTab=i;
			//m_currentRow[currTab]=null;
			break;
		}		
	if (m_XrefSpecs[tmpTab]==null) xrefNull=true;
	//if (m_action=="new") alias="_TabControl";
	if (xrefNull || (m_XrefSpecs[tmpTab].xrefPage==null))
		var objXSL=GetXSLDocument("_" + alias + "XSL");
	else 
		var objXSL=GetXSLDocument(m_XrefSpecs[tmpTab].xrefPage);
	if (objXSL.xml.length==0) return false;
	var ndXSLChilds=objXSL.documentElement.selectNodes(".//td[(@class = 'mandatory') $or$ (@conditional $ieq$ 'true')]");
	if (ndXSLChilds==null) return false;
	var XSLChildName,is_mandatory;
	for (var i=0;i<ndXSLChilds.length;i++){
		//Get the id of the label
		is_mandatory=true;
		ndXSLChild=ndXSLChilds.item(i);
		if ((""+ndXSLChild.getAttribute("class")).indexOf("mandatory")==-1) continue;
		tmpBOAlias=boAlias;
		XSLChildName=ndXSLChild.getAttribute("id").replace(/_t$/i,"");
		strFieldID=AO_GetBOAliasFromID(XSLChildName,boAlias);
		
		tmpBOAlias=strFieldID[0];
		strFieldID=strFieldID[1];
		if (tmpBOAlias==null) tmpBOAlias=boAlias;
		tmpBOAlias=tmpBOAlias.split(":")[0];
		ndXMLChilds=currXMLDoc.selectNodes("//root/"+tmpBOAlias+"/row/"+strFieldID);		
		for (var j=0;j<ndXMLChilds.length;j++){
			ndXMLChild=ndXMLChilds.item(j);
			if (ndXMLChild.parentNode.getAttribute("status") & 2) continue;
			if (ndXMLChild.text.trim().length<=0){
				if (ndXSLChilds[i].getAttribute("conditional")=="true"){
					try{
						is_mandatory=f_test_mandatory_condition(tmpBOAlias,strFieldID,j);
						if (is_mandatory!=false)is_mandatory=true;
					}catch(e){is_mandatory=true}
					if(!is_mandatory)
					{
						ModifyAttributeInXsl(strFieldID,"class","mandatory_no_star",objXSL);
					}
					else
					{
						ModifyAttributeInXsl(strFieldID,"class","mandatory",objXSL);
					}
				}
				if (is_mandatory){
					//alert(ndXSLChild.text.replace(/:|\*/g,"") +" is mandatory");				
					if (!m_action.match(/.*(new).*/ig)) _OpenPage(alias,false);
					else _ChangeStyle(document.getElementById(XSLChildName).group);				
					try{
						document.getElementById(XSLChildName).focus();
						document.getElementById(XSLChildName).focus();//only twice works...
					}catch(e){/* do nothing*/}
					var labelNode=ndXSLChild.selectSingleNode("label");
					if (labelNode==null) labelNode=ndXSLChild;
					throw (":VLD001:"+labelNode.lastChild.text.replace(/:|\*/g,""));
				}
			}
		}
	}
	
	return false;
}catch(e){WriteError(e);return true;}	
}

function AO_GetBOAliasFromID(id,boAlias){
	var retArr=new Array();
	
	try
	{
		var pos=id.search("\\@");
		if (m_currentAlias=="_searchTable") retArr[0]="_searchTable";
		
		else {
			if (boAlias!=null) retArr[0]=boAlias;
			else retArr[0]=m_aliases[get_PrimaryBoIndex(currTab)];
		}
		retArr[1]=id.substr(pos+1);
		if (pos<0) return retArr;

		var newAlias=id.substring(0,pos);
		if (newAlias.charAt(0)=="\/"){
			retArr[0]+="/row["+m_currentRow[currTab]+"]"+newAlias;				
			retArr[1]="row/"+retArr[1];
		}
		else retArr[0]=newAlias;
	}
	catch(err)
	{/*do nothing*/}
	return retArr;
}


/****************************** End New Design Functions *******************************/
/****************************** Begin Functions From TabControlEvents *******************************/
// ------------------------------------------------------------
// This file contains the client side handlers for the tab control
// ------------------------------------------------------------

//
//--- function to activate the relvant tab, this function 
//--- is called as an event from the various tabs on the onclick 
//--- events of those tabs. It does all the CSS gimmickry
//--- and achieves the desired effect of tab activation
//
function GetMainModule(){return m_aliases[0];}

/// <summary>
/// Notifies the user if the state was changed. If the user confirms the changes the state is closed and the function
/// navigates back.
/// </summary>
/// <param name="goBack">[required]if true navigates back, otherwise stays on the current page(this option is invalid because the state 
/// is closed</param>
/// <returns>true/false</returns>
function Single_Close(goBack){
//	fadeout();
	if (AO_ConfirmExit()) return true;	
	AO_CloseState();
	_goBack(goBack);
}
function _goBack(goBack){
	if (goBack==null) goBack=true;
	if (goBack) 
	{
	    if ("undefined"!=typeof(WebVar_goback)){
		    _OpenWindow(AO_GetGoBackModuleLocation());
		}		
		else _OpenWindow(m_NavigateTo[0]); //QBE
    }
    return false;
}
function PrepareUrlForNew()
{
    var strURL = m_NavigateTo[1]==""?document.location.href:m_NavigateTo[1];
    var sQueryString = typeof(m_action)!="undefined"&&m_action=="new"&&(typeof(WebVar_UseDefault)=="undefined" || WebVar_UseDefault=="false")?_GetGlobalVar(_GetPageName(document.location.href)):"action=new";
    
    if(typeof(sQueryString)=="undefined" || sQueryString.indexOf("undefined")>-1) sQueryString = "action=new";
    strURL = String.prototype.Format("{0}?{1}",strURL,sQueryString);
    
	return strURL;
}
function Single_New()
{
	if (AS_GetBCPermission("new")=="false") return false;
	if (typeof(m_StateID)!="undefined")
	{
	    if (AO_ConfirmExit()) return true;
	}
	var strURL=PrepareUrlForNew();
	return _OpenWindow(strURL);
}

function Single_NewEx(strURL){
	if (AS_GetBCPermission("new")=="false") return false;
	if (typeof(m_StateID)!="undefined")
	{
	    if (AO_ConfirmExit()) return true;
	}
	var strURL=PrepareUrlForNew();
	return _OpenWindow(strURL);
}

function _ChangeFilter(xslSheet,preserveXrefRow){
	
	var ndTmpl=new ActiveXObject("MSXML2.DOMDocument");
	var ndStyleSheet=xslSheet.selectSingleNode("/xsl:stylesheet");
	var nd=ndStyleSheet.selectSingleNode("xsl:template[@id='tmpl_root']");
	if (nd==null) return xslSheet;
	var BOName=m_aliases[get_PrimaryBoIndex(currTab)];
		preserveXrefRow = (typeof(preserveXrefRow)=="undefined")?false:preserveXrefRow;
	if(nd==null){
		ndTmpl.loadXML('<root><xsl:template match="/" id="tmpl_root" xmlns:xsl="uri:xsl">'+
			'<xsl:apply-templates select="/root/"+BOName+"/row"/></xsl:template></root>');	
		ndStyleSheet.appendChild(ndTmpl.firstChild);
	}
	ndTmpl=ndStyleSheet.selectSingleNode("xsl:template[@id='tmpl_row']");	
	if (ndTmpl!=null && _GetCurrentTabRow()!=null ){
		ndTmpl.setAttribute("match","/root/"+BOName+"/row[@number="+
			String(_GetCurrentTabRow())+"]");
	}	
	else if (ndTmpl!=null && _GetCurrentTabRow()==null){
		ndTmpl.setAttribute("match","/");
		return xslSheet;
	}
	else return xslSheet;
	nd=ndTmpl.selectNodes("xsl:comment[@id='"+BOName+"_link_key']");
	var scriptBoNode = ndStyleSheet.selectSingleNode("//xsl:script[@id $eq$ 'boAliasScript']");
	if( scriptBoNode != null )
	{
		var boalias='ccontrl_xref';
		var scriptTxt = scriptBoNode.text;
		scriptBoNode.text = scriptTxt.split("=")[0]+"='"+BOName+"'";
	}
	var sub_nd,xref_str,link_str,parse_str,parsed_str,for_nd, filter_str;
	for (var i=0;i<nd.length;i++){
		sub_nd=nd[i];
		xref_str=sub_nd.getAttribute("xref");
		if (xref_str==null || xref_str=="")continue;		
		
//		<xsl:for-each select="/root/employee_skills_xref/row[person_id='madlin_test01']" order-by="rb_dayofweek" xref="employee_skills_xref">		
		
		link_str=sub_nd.text;
		if (link_str==null || link_str=="")continue;
		link_str=link_str.split(";");
		parsed_str="";
		for (var j=0;j<link_str.length;j++){
			parse_str=link_str[j].split("=");
			if (parse_str.length!=2) continue;
			if (parsed_str !="") parsed_str+=" $and$ ";
			parsed_str+="(" +parse_str[0]+"='"+_ParseParams("&{"+BOName+"#"+String(m_currentRow[currTab]+1)+"$"+parse_str[1]+"}")+"')";			
		}		
		
		for_nd=ndTmpl.selectNodes("//xsl:for-each[@xref='"+xref_str+"']");
		for (var k=0;k<for_nd.length;k++){
			//Added implementation for Additional filter for demand labor links Xref /Slava 01 March 2005
			filter_str = for_nd[k].getAttribute("filter");
			
			if(filter_str != null && filter_str.length > 0)
				for_nd[k].setAttribute("select","/root/"+xref_str+"/row["+parsed_str+ " $and$ " + filter_str +"]");
			else
				for_nd[k].setAttribute("select","/root/"+xref_str+"/row["+parsed_str+"]");
		}
		if(!preserveXrefRow) m_XrefRows[xref_str]=null;
	}
	m_primaryXrefXSL=xslSheet;
	return xslSheet;
}

//modify the m_currentRow acccording to the specify BO name
function AO_UpdateCurrentRow(boName)
{
    var rowObj = m_primaryXML.selectSingleNode("//"+boName+"/row[@status $eq$ '0']");
    if(rowObj!=null) 
    {    
        m_currentRow[currTab] = parseInt(rowObj.getAttribute("number"))-1;
    }
    else
    {
        return false;
    }
    m_XrefSpecs[currTab]=new Object();
    return true;
}

function _GetCurrentTabRow(useRowIndex)
{
	var rowNumber = null;
	useRowIndex = typeof(useRowIndex)=="undefined"?false:useRowIndex;
	if(typeof(m_currentRow[currTab]) != "undefined" &&
		m_currentRow[currTab] != null )
	{
		rowNumber = useRowIndex==false?m_currentRow[currTab]+1:currRow[currTab]+1;
	}
	return rowNumber;
}

/// <summary>
/// Zooms from grid to form according the selected row, and from form to grid.
/// </summary>
/// <param name="xslPage">Obsolete</param>
/// <param name="isPage">[required]if true zoom in to the selected row,otherwise zoom out to the data grid page</param>
/// <param name="validation">[optional, default true] if true and isPage true call check mandatory on the current page</param>
/// <returns>true/false</returns>
function RowEdit(xslPage,isPage,validation){
	function AddDDLBOption(selectObj,val,dis_val,def_value)
	{
		var oOption = document.createElement("OPTION");
		oOption.value = val;
		oOption.text = dis_val;
		oOption.setAttribute("UseInnerValue","true");
		selectObj.options.add(oOption);
	}
	var check;
	var i;
	var ndDDLB;
	var xrefAlias=m_aliases[get_PrimaryBoIndex(currTab)]
	if (isPage && _GetCurrentTabRow()!=null){
		var checkRow=m_primaryXML.selectSingleNode("/root/"+xrefAlias+
			"/row[@number='"+String(m_currentRow[currTab]+1)+"']");
		if(checkRow.getAttribute("status") & 2 ) return false;
		if (checkRow==null) return false;				
	}
//	var tbContent=findParentTab();
	if (validation==null) validation=true;
	try{
		var bln_RowEdit_cust=f_RowEdit_Cust(m_currentAlias,isPage);
		if (bln_RowEdit_cust==false) return false;
	}catch(e){/*do nothing*/}
	if ((!isPage) && validation){
	
		if( CheckMandatory(document.getElementById(m_currentAlias))) return false;
		
	}
	if (!CreateXMLDOM()) return false;
	var xslSheet=null;
	var tmpCurrentAlias=m_currentAlias;
	if (m_action=="new" && m_currentAlias=="_TabControl") tmpCurrentAlias=m_PageAliases[0];	
	
	if (!isPage){
		xslSheet= _CheckDisable(m_primaryXSL,true);
		m_XSLURL=xslSheet.url;
		m_XrefSpecs[currTab].xrefPage=null;
		ClearXrefPageToXrefSpecs();
	}
	else{
		if (m_XrefSpecs[currTab].xrefPage==null)
		{
			m_XrefSpecs[currTab].xrefPage="_"+m_currentAlias+"XSL_Additional";
			AddXrefPageToXrefSpecs("_"+m_currentAlias+"XSL_Additional");
		}
		else 
		{
			//Meir 02.04.03 - Treat AO_PRE_CreateXrefPage() in apply
			var test=m_XrefSpecs[currTab].xrefPage;
			test=test.split("Additional_");
			if (test.length==2) AO_PRE_CreateXrefPage(m_currentAlias,test[1]);
			//~Meir									
		}
		xslSheet=GetXSLDocument(m_XrefSpecs[currTab].xrefPage);
		
		// Uzi & Alex
		var newZoomedXSLPage = AO_PRE_CreateXrefZoomPage(m_currentAlias, xslSheet);
		if (newZoomedXSLPage != null)
		{
			xslSheet = newZoomedXSLPage;
			AO_GetPrimaryWindow().top.control_frame.m_XSL[_GetCurrentPageName()][m_XrefSpecs[currTab].xrefPage] = null;
		}
		
		m_XSLURL=xslSheet.url;
		// Uzi 27.05.04 - Validate that the zoom page exist
		if (m_XSLURL == "")
		{
			throw "The zoom page does not exist. Please check that " +  m_XrefSpecs[currTab].xrefPage + " exist.";
		}
		// Uzi 27.05.04 - End of Validation
		xslSheet=_ChangeFilter(xslSheet);		
		var sortField = m_primaryXSL.selectSingleNode("//xsl:for-each[@order-by]");
		if (sortField!=null){
			m_XrefSpecs[currTab].SortOrder=sortField.getAttribute("order-by");
			m_XrefSpecs[currTab].Criteria=sortField.getAttribute("select");
		}
		
	}	
	
	if (isPage) {
		var parent = currXMLDoc.selectNodes('//' + m_aliases[get_PrimaryBoIndex(currTab)]);		
	}
	else{
		var parent = currXMLDoc;
	}	
	check=isPage?parent.length :true;

	if (check) {//var node = parent(0);
		var node=null;
		document.getElementById(m_currentAlias).innerHTML="";
		
		var tmpXSLSheet=xslSheet.documentElement;
		if (tmpXSLSheet==null)
			tmpXSLSheet=xslSheet;			
		tmpXSLSheet=_addIncludes(tmpXSLSheet);
		var strHTML="";
		var templateNode = tmpXSLSheet.selectSingleNode("xsl:template[@id='tmpl_row']");
		if (isPage && templateNode==null && _GetCurrentTabRow()!=null){
			node=document.all.item("_"+m_PageAliases[currTab]);
			var rowObj=parent(0).selectSingleNode("row[@number='"+String(m_currentRow[currTab]+1)+"']");
			if (rowObj!=null){
				node.loadXML(rowObj.xml);
				node=node.documentElement;
				ndDDLB=currXMLDoc.documentElement.selectNodes("ddlb");
				for (i=0;i<ndDDLB.length;i++){
					node.appendChild(ndDDLB[i].cloneNode(true));
				}
			}
			
		}
		else if(templateNode==null){
			node=parent;	
		}
		
		if (templateNode!=null)
			strHTML=m_primaryXML.transformNode(tmpXSLSheet);
		else 
			strHTML=node.transformNode(tmpXSLSheet);
		document.getElementById(m_currentAlias).insertAdjacentHTML("afterBegin",strHTML);
		if (isPage){		
			var BOALias=m_aliases[get_PrimaryBoIndex(currTab)];
			validateObj.InvokeHook("f_zoomReadOnlyRow_"+BOALias,BOALias,m_currentAlias,m_currentRow[currTab]);

			//if the xml document for zoom page contain ddlb elements
			//we iter through all elements that contain entrys and activate
			//f_addNewDDLBOptions hook function
			if((typeof(f_addNewDDLBOptions)!="undefined") && (typeof(ndDDLB.length)!="undefined"))
			{
				try
				{
					var entryCollection = node.selectNodes("//ddlb/*[*]");
					var entryLen = entryCollection.length;
					
					for(var entryIndex=0;entryIndex<entryLen;entryIndex++)
					{
						var entryElm = entryCollection[entryIndex];
						var ddlbName = entryElm.nodeName;
						var params = validateObj.InvokeHook("f_addNewDDLBOptions",ddlbName);
						if(params==null) continue;
						if(params!=null && (params.length > 0) && (params[0] instanceof Array) )
						{
							var selectObj = document.getElementById(ddlbName);
							for(var i=0;i<params.length;i++)
							{
								AddDDLBOption(selectObj,params[i][1],params[i][0]);
							}
						}
						else if(params!=null && params.length > 0 )
						{	
							var selectObj = document.getElementById(ddlbName);
							AddDDLBOption(selectObj,params[1],params[0]);
						}
					}
				}
				catch(err)
				{/*do nothing*/}
			}
			__RowsCountStr(null,true);		
			var tbl=document.getElementById(m_currentAlias);
			for(;tbl.tagName.search(/html|table/gi)==-1;tbl = tbl.parentElement);
			if (tbl.tagName.search(/table/gi)>-1 ){
				tbl.focus();
//				tbl.onkeydown=new Function ("return KB_PageUpdate()"); 
			}
		}				
		window.status=m_currentAlias;

	}
	//document.recalc;
	if (!(isPage || validation) && (RowEdit.caller==UndoRowChanges )) {
		if (m_XrefSpecs[currTab].newRow==true) DeleteRow();	
		if (m_XrefSpecs[currTab]!=null) m_XrefSpecs[currTab].newRow=null;
	}	
	if (window.event!=null) window.event.cancelBubble=true;
	if (m_XrefSpecs[currTab]!=null) m_XrefSpecs[currTab].editable=!isPage;

	if (check && !isPage) {
		m_primaryXrefXSL=null;
		if ((m_XrefSpecs[currTab]!=null) && (m_XrefSpecs[currTab].RowID!=null) && (currRow[currTab]!=null)) 
			MarkSelectedRow();
		else
		{
			var tbl1=document.getElementById("tbl_"+m_aliases[get_PrimaryBoIndex(currTab)]);
			if (tbl1!=null && tbl1.rows.length>0)
			{
				var cell;
				//Bug fixing for sveta
				for (var i=0;i<tbl1.rows[0].cells.length;i++)
				{
					cell=tbl1.rows[0].cells[i]
					if (!(cell.disabled || cell.readOnly) && (cell.className!=null) && 
						((""+cell.className).toLowerCase()!="readonly_grid_main_cell"))
					{
						cell.focus();
						break;
					}
					
				}
				if ((i!=tbl1.rows[0].cells.length)&& (tbl1.onclick!=null)) tbl1.click();					
			}		
		}
	}
	setTimeout("AO_FocusFirstObject(null,'RowEdit')", 100);	
	
	//#added by Eli Harel hook function that will generate after finishing createing the Xref Page
	if(typeof(AO_After_CreateXrefPage) != "undefined")
	{
		AO_After_CreateXrefPage(xrefAlias,isPage);
	}
	
	return true;
}

function MarkSelectedRow(){
	if (m_XrefSpecs[currTab].editable!=false && typeof(m_XrefSpecs[currTab].editable) != 'undefined')
	{
		var rw=document.all(m_XrefSpecs[currTab].RowID);
		if ((rw != null) && (rw.childNodes !=null) && (rw.childNodes.length > 0))
		{
			FixEditableGridLayout(rw.parentElement.parentElement);
			//remove rw.childNodes(0)
			SelectEditableRow(rw.parentElement.parentElement, rw);
		}
		else
		{
			AO_HighlightRowInGrid(null,null);
		}
	}
	else
	{
		MarkRow();
	}
	//m_XrefSpecs[currTab].newRow=null;
	m_XrefSpecs[currTab].xrefPage=null;
	ClearXrefPageToXrefSpecs();
}

function AddNewRow_fr_form(xslPage,otherPage,needRefresh,macroName,macroParams){
	if( CheckMandatory(document.getElementById(m_currentAlias))) return false;
	return AddNewRow(xslPage,otherPage,needRefresh,macroName,macroParams);
}

function AddNewRowEx(otherPage,macroName,macroParams,needRefresh){
	return AddNewRow("",otherPage,needRefresh,macroName,macroParams);
}
function AddNewXrefRow(boName,macroFields,macroValues,otherPage){
try{
	
	var tmpRowNumber=m_currentRow[currTab];
	var xrefBO=m_aliases[get_PrimaryBoIndex(currTab)];
	var RequestXML=BuildXML4Exec(boName,Array(null));	
	var macroName="newwithparams";
	if (macroValues.length!=null)
		for (var i=0;i<macroValues.length;i++){
			if (macroValues[i].indexOf("row$")==0){
				macroValues[i]=macroValues[i].replace("row$",xrefBO+"#"+String(m_currentRow[currTab]+1)+"$");
				macroValues[i]="&{"+macroValues[i]+"}";
			}
			macroValues[i]=_ParseParams(macroValues[i]);
		}
	var SOAPResult=SOAP_ExecMacro(macroName,m_BCName,boName,Array(macroFields,macroValues),false,false,RequestXML);	
	if (SOAP_IsError(SOAPResult)){    	
		throw(SOAP_Format_Error_Message(SOAPResult));
    }	
	var tmpChild;
	var parent = m_primaryXML.selectSingleNode('/root/'+boName);
	if (parent==null) {
		//bug fixing 11-09-2005
		tmpChild=SOAP_Get_XMLObj(SOAPResult).documentElement.childNodes(0);
		m_primaryXML.childNodes(0).appendChild(tmpChild);
		tmpChild=tmpChild.lastChild;
		parent = m_primaryXML.selectSingleNode('/root/' +boName);					
	}
	else{
		tmpChild=SOAP_Get_XMLObj(SOAPResult).selectSingleNode("/root/" +boName + "/row[end()]");
		if (tmpChild==null) throw("No new child added... ");					
//			tmpChild.setAttribute("number",parent(0).childNodes.length+1);
		parent.appendChild(tmpChild);
	}    
	var childNumber=tmpChild.getAttribute("number")-1;
	
	
	SetStatusNew(boName, childNumber); // TEMPORARY SOLUTION !!!
	m_currentRow[currTab]=tmpRowNumber;
	m_XrefRows[boName]=childNumber;
	if (!otherPage) {
		if (m_XrefSpecs[currTab].xrefPage==null)
		{
			m_XrefSpecs[currTab].xrefPage="_"+m_currentAlias+"XSL";
			AddXrefPageToXrefSpecs("_"+m_currentAlias+"XSL");
		}
		DuplicateForEach("_"+m_currentAlias+"XSL");
//		m_XrefSpecs[currTab].xrefPage=boName;
		
		_CreatePage(m_currentAlias);
		var rowID="row_"+tmpChild.getAttribute("number");
		var rows=document.all.tags("tr"),row;		
		for (var i=0;i<rows.length;i++)
		{
			row=rows[i];
			if (row.id==null) continue;
			if (row.id.indexOf(rowID)>-1)			
			{
				SelectEditableXrefRow(row.parentElement,boName,row);
				break;
			}
		}
	}	
	
	
	return true;
}catch(e){WriteError(e);return false;}
//AddNewXrefRow('employee_skills_xref',Array('person_id'),Array('row$person_id'),false)
}
/// <summary>
/// Called when a user clicks the Add button in an xref scroller (editable or not editable).
/// </summary>
/// <param name="xslPage">[Obsolete]XSL page alias used to build the layout after add new row.</param>
/// <param name="otherPage">[required]false the layout is build as an main page, true the layout is build as an zoom in page</param>
/// <param name="needRefresh">[optional,default true]if true refreshes the layout afer adding the row, otherwise does not refresh the layout
/// Use this option if you call this function from a loop and you need to refresh only after finishing executing all the insert commands.</param>
/// <param name="macroName">[optional,default "new"]</param>
/// <param name="macroParams">[optional,default empty Array]</param>
/// <returns>true/false</returns>
function AddNewRow(xslPage,otherPage,needRefresh,macroName,macroParams){
try{
	if (!CreateXMLDOM()) return false;
	if (AS_GetPagePermission(null,"new")=="false") return false;
	
//	var xslSheet=document.all.item(xslPage).XMLDocument;
	if (needRefresh==null) needRefresh=true;
	if (m_XrefSpecs[currTab]==null)m_XrefSpecs[currTab]=new Object();
	if (otherPage)
	{
		m_XrefSpecs[currTab].xrefPage="_"+m_currentAlias+"XSL_Additional";
		AddXrefPageToXrefSpecs("_"+m_currentAlias+"XSL_Additional");
	}
	else
	{
		m_XrefSpecs[currTab].xrefPage=null;
		ClearXrefPageToXrefSpecs();
	}
	
	m_currentColumn[currTab] = null;
	
	var parent = currXMLDoc.selectNodes('/root/' + m_aliases[get_PrimaryBoIndex(currTab)]);
    if (otherPage==null) otherPage=true;
/************ Start Server Side Retrieve of new Row ****************/	
	var RequestXML=BuildXML4Exec(m_aliases[get_PrimaryBoIndex(currTab)],Array(null));	
	if (macroName==null)macroName="new";
	if (macroParams==null) macroParams=Array(null);
//	var SOAPResult=SOAP_ExecMacro(macroName,m_BCName,m_aliases[get_PrimaryBoIndex(currTab)],macroParams,false,false,
//																										RequestXML);
	var SOAPResult=SOAP_InteractWithServer(macroName,m_aliases[get_PrimaryBoIndex(currTab)],macroParams,Array(null),
		BuildXML4Exec(m_aliases[get_PrimaryBoIndex(currTab)],Array(null))
		,"//"+ m_aliases[get_PrimaryBoIndex(currTab)] +"/row[last()]",
		false, false);

	if (SOAP_IsError(SOAPResult)){    	
		throw(SOAP_Format_Error_Message(SOAPResult));
    }
    else{
		var tmpChild;
		if (parent(0)==null) {
			tmpChild=SOAP_Get_XMLObj(SOAPResult).selectSingleNode("/root/"+m_aliases[get_PrimaryBoIndex(currTab)]);
			currXMLDoc.selectSingleNode("/root").appendChild(tmpChild);
			tmpChild=tmpChild.lastChild;
			parent = currXMLDoc.selectNodes('/root/' + m_aliases[get_PrimaryBoIndex(currTab)]);					
		}
		else{
			tmpChild=SOAP_Get_XMLObj(SOAPResult).selectNodes("/root/" + m_aliases[get_PrimaryBoIndex(currTab)] + "/row[end()]")(0);
			if (tmpChild==null) throw("No new child added... ");					
//			tmpChild.setAttribute("number",parent(0).childNodes.length+1);
			parent(0).appendChild(tmpChild);
		}
/************ End Server Side Retrieve of new Row ***************/		
		m_currentRow[currTab]=tmpChild.getAttribute("number")-1
		//m_currentRow[currTab]=parent(0).childNodes.length-1;
		SetStatusNew(m_aliases[get_PrimaryBoIndex(currTab)], m_currentRow[currTab]); // TEMPORARY SOLUTION !!!
		m_XrefSpecs[currTab].newRow=true;
		m_XrefSpecs[currTab].editable=!otherPage;
		if (!needRefresh) return;
		var tmpCurrentAlias=m_currentAlias;
		if (m_action=="new" && m_currentAlias=="_TabControl") tmpCurrentAlias=m_PageAliases[0];
		if (!otherPage) {
			DuplicateForEach("_"+tmpCurrentAlias+"XSL");
		}
		
		var tmpXSLSheet=GetXSLDocument("_"+tmpCurrentAlias+"XSL");
		//tmpXSLSheet=_addIncludes(tmpXSLSheet);
		var strHTML=currXMLDoc.transformNode(tmpXSLSheet);		
		document.getElementById(m_currentAlias).innerHTML=""
		document.getElementById(m_currentAlias).insertAdjacentHTML("afterBegin",strHTML);
		
		var allTRs=document.body.getElementsByTagName("TR");
		for (var i=0;i<allTRs.length;i++){
			if (allTRs[i].id.match(/row_(\d\d*)/i)){
				if (RegExp.$1 == m_currentRow[currTab]+1){
					m_XrefSpecs[currTab].RowID=allTRs[i].id;
					__RowsCountStr(allTRs[i],false)				
					break;
				}
			}
		}
		
		//mark flag for auto focus insert
		if (otherPage) RowEdit(xslPage,otherPage,false);
		if (!otherPage) {
			RemoveForEach("_"+tmpCurrentAlias+"XSL");
			if (m_XrefSpecs[currTab].RowID!=null) {
				var tmpdv=document.all(m_XrefSpecs[currTab].RowID);
				var tmptbl=null;
				//tmpdv.cells[0].click();
				while(tmpdv.tagName.toLowerCase()!="div") {
					tmpdv=tmpdv.parentElement;
					if (tmpdv.tagName.toLowerCase()=="table") tmptbl=tmpdv;
				}
				with (tmpdv){
					while(scrollHeight>(scrollTop+clientHeight)) {
						doScroll("scrollbarPageDown");			
					}					
				}
				
				//tmptbl
				SelectEditableRow(tmptbl,tmptbl.all(m_XrefSpecs[currTab].RowID));
				setTimeout("AO_FocusFirstObject('"+m_XrefSpecs[currTab].RowID+"','AddNewRow')",100);	
/*				
				var inp=tmptbl.all(m_XrefSpecs[currTab].RowID).getElementsByTagName("input");
				if (inp.length==0)
					inp=tmptbl.all(m_XrefSpecs[currTab].RowID).getElementsByTagName("select");
				if (inp.length==0)
					inp=tmptbl.all(m_XrefSpecs[currTab].RowID).getElementsByTagName("checkbox");																	
				if (inp.length>0){
					for (var iFocus=0;iFocus<inp.length;iFocus++) {
						with (inp[iFocus]){
							if (type=="hidden") continue;
							if (style.display=="none") continue;
							if (style.visibility=="hidden") continue; 	 
							if (disabled || readOnly) continue;
							focus();
						}
						break;
					}
				}
*/		
			}
		}
    }
}catch(e){WriteError(e);}
finally{parent=null;}
}
/// <summary>
/// Deletes row from data grid(Xref), the data grid can be editable or read only.
/// This function is called by clicking the delete button on Xref page. The function marks the status of the 
/// selected row to deleted (status 2) and refreshes the page by calling _CreatePage. Notice this function does not interact with
/// the server so the row still exists on the client state but is marked as the status delete.
/// </summary>
/// <param name="xslPage">Obsolete</param>
/// <param name="boName">the BO name. Used while invoking the hook functions(f_AfterDeleteRow_Cust,f_AfterDeleteRowAndTransform_Cust)</param>
function DeleteRow(xslPage,boName){	
	if (AS_GetPagePermission(null,"delete")=="false") return false;	
	if (m_currentRow[currTab]==null) return false;
	if (!CreateXMLDOM()) return false;	
	try{
		var bln_DeleteRow_cust=f_DeleteRow_Cust(m_currentAlias);
		if (bln_DeleteRow_cust==false) return false;
	}catch(e){/*do nothing*/}		
	if (boName==null) boName=m_aliases[get_PrimaryBoIndex(currTab)];
	SetStatusDeleted (boName, m_currentRow[currTab]);
	var tmpCurrentAlias=m_currentAlias;
	if (m_action=="new" && m_currentAlias=="_TabControl") tmpCurrentAlias=m_PageAliases[0];
	
	xslPage="_" +tmpCurrentAlias+"XSL";		
	var xslSheet=GetXSLDocument(xslPage);
	
	try{
		f_AfterDeleteRow_Cust(boName,m_currentRow[currTab]);
	}catch(e){/*do nothing*/}
		
	_CreatePage(m_currentAlias);
	
	//added by eli harel 15-03-2005 hook function that invoke after
	//transform the new layout
	if(typeof(f_AfterDeleteRowAndTransform_Cust) != "undefined")
	{
		f_AfterDeleteRowAndTransform_Cust(boName,m_currentRow[currTab]);
	}
}

/// <summary>
/// Deletes last row from the current context (BO).
/// </summary>
/// <param name="xslPage">[optional]XSL page name</param>
/// <param name="boName">[optional]BO name</param>
/// <returns>true/false</returns>
function UndoRowChanges(xslPage,boName){
	var newNode;
	var parent;
	var blnNew;
	if (currXMLDoc) {
		newNode=document.all.item("_"+m_PageAliases[currTab]).documentElement;
		//UpdateRow "demandactivities", selectedActivity, result
		if (newNode!=null) {
			parent = currXMLDoc.selectNodes('//' + m_aliases[get_PrimaryBoIndex(currTab)]);
			var oldNode=parent(0).childNodes(m_currentRow[currTab]);
			if (oldNode!=null)
			{
				ndDDLB=newNode.selectNodes("//ddlb");			
				for (var i=0;i<ndDDLB.length;i++)
					ndDDLB[i].parentNode.removeChild(ndDDLB[i]);					
				
				parent(0).replaceChild(newNode, oldNode);
			}
			else if(typeof(boName)!="undefined")//eli changes 23/01/2006
			{
				var oldNode = currXMLDoc.selectSingleNode('//' + boName);
				
				if( oldNode != null )
				{
					oldNode.parentNode.removeChild(oldNode);
				}
			}
		}
	}	
	blnNew=m_XrefSpecs[currTab].newRow;
	var SaveDone=RowEdit(xslPage,false,false);
	if (currXMLDoc && !SaveDone){
		m_XrefSpecs[currTab].newRow=blnNew;
		parent = currXMLDoc.selectNodes('//' + m_aliases[get_PrimaryBoIndex(currTab)]);
		document.all.item(m_aliases[get_PrimaryBoIndex(currTab)]).loadXML(parent(0).childNodes(m_currentRow[currTab]).xml);
		
	}
	
	return SaveDone;
	
}
function findParentTab(){
		var tbTemp=window.event.srcElement.parentNode;			
		while(!tbTemp.tagName.match(/html/i) && !tbTemp.id.match(/tabcnt/i))
			tbTemp=tbTemp.parentNode;
		if (tbTemp.tagName.match(/html/i)) return false;
		return tbTemp;

}
/*****************************************************************/
function DeleteEditableRow(tblObj){
  var r, p, nr;
  if (m_currentRow[currTab] == null)
    return false;

  r = tblObj.children[m_currentRow[currTab]];

  if (r.tagName == "TD") {
    r = r.parentElement;
  }

  p = r.parentElement;

  p.removeChild(r);

  lastSelection = null;
 
  return r; 
}

function addCell(tblObj) {
  var r, p, c, nc, text;
  if (m_currentRow[currTab] == null)
    return false;

  r = tblObj.children[m_currentRow[currTab]];

  if (r.tagName == "TD") {
    r = r.parentElement;
    c =tblObj.children[m_currentRow[currTab]];
  } else {
    c = null;
  }
  //p= document.createElement("TR");
  nc = document.createElement("TD");
  text = document.createTextNode("New Cell");

//  nc.insertBefore(text);
  nc.insertBefore(text);
  r.insertBefore(nc, c);
  r.insertBefore(nc, c);
  r.insertBefore(nc, c);
  tblObj.insertBefore(r);

//  SelectRow(nc);
	tblObj.parentElement.onclick();

  return nc;
}

/****************************** End Functions From TabControlEvents *******************************/
function DeleteXrefRow(xrefBO){	
	if (m_XrefRows[xrefBO]==null ) return;	
	SetStatusDeleted (xrefBO, m_XrefRows[xrefBO]);
	var xrefPage=m_XrefSpecs[currTab].xrefPage;
	
	if (m_XrefSpecs[currTab].xrefPage==null)
	{
		m_XrefSpecs[currTab].xrefPage="_"+m_currentAlias+"XSL";
		AddXrefPageToXrefSpecs("_"+m_currentAlias+"XSL");
	}
	_CreatePage(m_currentAlias);
	m_XrefSpecs[currTab].xrefPage=xrefPage;
	AddXrefPageToXrefSpecs(xrefPage);
//	var tmpRowNumber=m_currentRow[currTab];
//	m_currentRow[currTab]=m_XrefRows[xrefBO];

//	DeleteRow("",xrefBO);	
//	m_currentRow[currTab]=tmpRowNumber;
//	m_XrefRows[xrefBO]=null;
	
}

function SelectEditableXrefRow(aTable,xrefBO,rowElement)
{	
	var tmpRowNumber=m_currentRow[currTab];
	var tmpRowNumber1 = currRow[m_currentAlias];
	tmppageAlias=m_currentAlias;
	m_currentAlias=""
	SelectEditableRow(aTable,rowElement);
	m_currentAlias=tmppageAlias;
	m_XrefRows[xrefBO]=m_currentRow[currTab];
	m_currentRow[currTab]=tmpRowNumber;
	currRow[m_currentAlias] = tmpRowNumber1;
}

function SelectEditableRow_new(tbl,groupAlias){	
	 SelectEditableRow(tbl);
	 if (m_curGroupAlias!=groupAlias){
		m_curGroupAlias=null;
		_ChangeStyle(groupAlias);
	}
}
function DeleteRow_new(groupAlias){
	DeleteRow();
	 if (m_curGroupAlias==groupAlias){
		m_curGroupAlias=null;		
	}
	_ChangeStyle(groupAlias);	
}
function AddNewRow_new(groupAlias,otherPage){
	AddNewRow("",otherPage);
	 if (m_curGroupAlias==groupAlias){
		m_curGroupAlias=null;		
	}
	_ChangeStyle(groupAlias);
}

//this function iter through all table row and 
//check if each row cell is for readonly if true changing the layout
//PARAM 1 -object- the table grid object
function SwapToReadOnlyCell(aTable)
{
	return;
	function SetReadOnlyCell(elm)
	{
		var cellToRemove = new Array();
		var tblCollection = elm.getElementsByTagName("TABLE");
		if( tblCollection.length == 0 ) return;
		var rowObj = tblCollection[0].rows[0];
		var inputCollection = rowObj.getElementsByTagName("INPUT");
		if( inputCollection.length == 0 ) return;
		
		var val = inputCollection[0].value;
		while(rowObj.cells.length)
		{
			rowObj.deleteCell();
		}
		
		var newTd = rowObj.insertCell();
		newTd.innerHTML = val;
		newTd.className = "readonly_grid_cell";
	}
	if( aTable == null ) return;
	var len = aTable.rows.length;
	for (var i=0; i < len; i++)
	{
		var currentRow = aTable.rows(i);
		currentRow.style.backgroundColor = "";
		var rowID=currentRow.id.match(/row_(\d\d*)/i);
		if(rowID==null) break;
		var ndTemp=m_primaryXML.selectSingleNode("//"+m_aliases[get_PrimaryBoIndex(currTab)]+"/row[@number="+rowID[1]+"]");
	
		if( ( ndTemp==null ) || (ndTemp.getAttribute("status") & 8) ||  (ndTemp.getAttribute("status") & 4)) continue;
		var celllen = aTable.rows(i).cells.length;
		for(var j=0;j<celllen;j++)
		{
				SetReadOnlyCell(aTable.rows(i).cells(j));	
		}
	}	
}

/// <summary>
/// Edits selected row in editable grid, used on Xref pages.
/// </summary>
/// <param name="aTable">[required]the table element that represents the data grid control</param>
/// <param name="rowElement">[optional, defualt the table active element] the row element to select and edit</param>
/// <returns>true/false</returns>
function SelectEditableRow(aTable,rowElement) {
	function __ProperXMLVal_ForGrid(str){
		str=str.replace(/\&/g,"\&");
		str=str.replace(/\&amp;lt;/g,"\<");
		str=str.replace(/\</g,"\<");
		str=str.replace(/\>/g,"\>");
		str=str.replace(/\&amp;gt;/g,"\>");
		str=str.replace(/\"/g,"\"");
		str=str.replace(/\'/g,"\'");
		str = escape(str);
		return str;
	}
	function BuildDDLBOption(val,dis_val,def_value,useInnerValue)
	{
		var strAdd = "";
		useInnerValue = (typeof(useInnerValue)=="undefined")?"":" UseInnerValue=\""+useInnerValue+"\"";
		if (def_value == val)
		strAdd = "SELECTED";
		return "<option value=\"" + val + "\" " + strAdd + useInnerValue + ">" + dis_val + "</option>";
	}
	m_handleTabKeyCode = true;
	var funcName=AS_GetFunctionName(SelectEditableRow.caller);
	var row,cell,body,cur_row,i,strValue,inputElement;
	var data_value,display_value,strTmp,nodes,strAdd,defValue;
	if (m_XrefSpecs[currTab]==null) m_XrefSpecs[currTab]=new Object();
//	m_XrefSpecs[currTab].xrefPage=null;
	m_currentColumn[currTab] = null;	
	try
	{
		var readOnly=AO_IsConnectedWindow()||DisablePageTest(m_currentAlias);
		if (readOnly==true)
		{
		    m_XrefSpecs[currTab].editable = null;
		    return SelectRow(aTable,rowElement);
		}
	}
	catch (e){}
	// Where did they click?
	if (rowElement!=null)
	{
		row = rowElement;
	}else
	{
		row = aTable.document.activeElement;
	}
	if (row.className.search(/sort/gi) != -1 || row.getAttribute("selectable")=="false" || row.style.backgroundColor != "") return;
	
	cell = row;
	if (cell.className == "readonly_grid_main_cell"){
		if (cell._onclick != null && (!cell.disabled)){
			if (document.activeElement!=null && document.activeElement==cell)
				return eval(cell._onclick.trim()); 
		}
	
	}	 

	//Meir 04/07/00 12:00PM - Support editable grid
	if (row.tagName.search(/input|textarea|select/gi) != -1) m_currentColumn[currTab] = row.id;
	if (row.tagName.search(/td|input|select|textarea/gi)!=-1)
		for(var rowIdValue = row.getAttribute("id");row.tagName.search(/html|body/gi)==-1 && rowIdValue!= null && rowIdValue.indexOf("row_") == -1;row = row.parentElement,rowIdValue = row.getAttribute("id"));
	
	//for(;row.tagName.search(/tr|html|body|table/gi)==-1;row = row.parentElement);
	if (row.tagName.search(/html|body|table/gi)>-1 )
	{
	   if(aTable.rows.length==0)return true;
	   else row = aTable.rows[0];
    }
    // find the parent of the clicked Row (the TBODY)
    body=row.parentElement;
    
    // Get its "selectedRow" attribute
    // (returns "" for the very first select, since selectedRow doesn't exist yet)
    cur_row = parseInt(body.getAttribute("selectedRow"));
    
    	//////////////////////////////////////////////////
	//this code handle grid navigation using key codes
    if(cur_row!=row.rowIndex)
	{		
		try
		{	
			if( funcName=="KB_ScrollerUpdate" )
			{
				var inputElement=document.activeElement;
				var BOAlias = AO_GetBOAliasFromID(inputElement.id)[0];
				var name = AO_GetBOAliasFromID(inputElement.id)[1];
				var data=m_primaryXML.selectSingleNode("/root/"+BOAlias+"/row[@number="+String(m_currentRow[currTab]+1)+"]/"+name);		
				
				if(inputElement != null && typeof(inputElement.onchange) != "undefined"
					&& typeof(inputElement.value) != "undefined" && inputElement.value != "" && data.text != inputElement.value)
				{
					
					var res = inputElement.onchange();
					if(!res)
					{ 
						aTable.rows(cur_row).style.backgroundColor = "#FFEEA6";
						return res; 
					}
				}
				
			}
		}
		catch(err)
		{/*do nothing*/}
	}
	/////////////////////////////////////////////////
	// If it is valid...
	//	var rowLen = aTable.rows.length;
	//	for (var i=0; i < rowLen; i++)
	//	{
	//		aTable.rows(i).style.backgroundColor = "";
	//	}	
    if(!isNaN(cur_row))
    {
	    aTable.rows(cur_row).style.backgroundColor = "";
	}
    __RowsCountStr(row,false);
	
	m_XrefSpecs[currTab].RowID=row.id;
	m_XrefSpecs[currTab].editable=false;
	var rowID=row.id.match(/row_(\d\d*)/i);

	if (rowID)
	{
		m_currentRow[currTab]=rowID[1]-1;
	}else
	{
		m_currentRow[currTab] = row.rowIndex;
	}		
		
	var oTD = document.getElementById('table_paging_rows_count_td');
	if(oTD!=null)
	{
		oTD.innerText = __RowsCountStr(row,true);
	}
	try
	{
		f_EditableRowSelected(m_currentAlias,m_currentRow[currTab],row);		
	}catch(e){}
	if(cur_row>=0)
	{
		// ... and not the currently selected row...
		if(cur_row!=row.rowIndex)
		{
			var celllen = aTable.rows(cur_row).cells.length;
			// Step through all the cells in the old selected row
			for(i=0;i<celllen;i++)
			{
				var cellObj = aTable.rows(cur_row).cells(i);
				// Find all the input elements in each cell
				if (cellObj.className.match(/.*readonly_grid.*/ig)) continue;
				inputElement=cellObj.getElementsByTagName("input");
				if( inputElement.length == 0 )
				{
					inputElement=cellObj.childNodes(0);
				}
				else
				{
					inputElement = inputElement[0];
				}
				// overwrite any input element with the current value of that input
				// and put back the cell padding
				if (cellObj.type == "checkbox")
				{
					if (inputElement.getAttribute("checked"))
					{
						strTmp = "<img src=\"" + cellObj.on + "\" border=\"0\"/>";
					}else
					{
						strTmp = "";
					}
				}else
				{
					strTmp = inputElement.getAttribute("value");
					if(inputElement.className.indexOf("negative_numeric")>-1 && inputElement.value.charAt(0)=="-")
					{
						aTable.rows(cur_row).cells(i).style.color = "red";
					}
					else if(inputElement.className.indexOf("negative_numeric")>-1 && inputElement.value.charAt(0)!="-")
					{
						aTable.rows(cur_row).cells(i).style.color = "black";
					}

					if (cellObj.type == "ddlb")
					{
						cellObj.value = strTmp;
						var ddlbName=AO_GetBOAliasFromID(inputElement.getAttribute("id"))[1];
						if (cellObj.ddlb_name!=null) 
							ddlbName=cellObj.ddlb_name; 
						var optObj = inputElement.options[inputElement.selectedIndex];
						if( optObj.UseInnerValue != "true")
							strTmp = AO_DescrFromDDLB(ddlbName, strTmp,true);
						else
							strTmp = optObj.text;
					}
				}
				if (strTmp==null || strTmp.length == 0) strTmp = "&nbsp;"
					
				cellObj.id = inputElement.getAttribute("id");
				cellObj.innerHTML = strTmp;
				cellObj.style.paddingTop="4px";
				cellObj.style.paddingBottom="4px";
			}
		}
	}
	
	if(cur_row!=row.rowIndex)
	{
		
		// Rewrite the cells as INPUT elements
		var childRow;
		var is_date_lookup=false;var tbIndex=1;
		for(i=0;i<row.childNodes.length;i++)
		{
			childRow=row.childNodes(i);
			if (childRow.className.match(/.*readonly_grid.*/ig)) continue;		
			if(!AS_CheckPageUIPermissions(m_currentAlias,childRow.id))
			{	
				__DisableElment(childRow,childRow.tagName.toLowerCase());
				continue;
			}
			strTmp = "id=\"" + childRow.id + "\" " +"tabIndex=\"" + tbIndex + "\" ";;		
			tbIndex++;
			var compfield=""; 
			if (childRow.compfield != null)
				strTmp += "compfield=\"" +childRow.compfield + "\" ";
			if (childRow.onchange != null)
				strTmp += "onchange=\"" + childRow.onchange + "\" "
			else
			{
				if (childRow.type != "checkbox" )
				{
					strTmp += "onchange=\"return ItemChange(this,"+m_currentRow[currTab]+")\" ";
					strTmp += "onbeforedeactivate=\"return AO_ItemBeforedeactivate(this,"+m_currentRow[currTab]+")\" ";
					strTmp += (childRow.getAttribute("ValidateType") != null)? "ValidateType='"+childRow.getAttribute("ValidateType")+"'":"";
				}
				else
				{
					if (childRow.onclick==null)
						childRow.onclick=new Function("return AO_ScrollerCheckboxChange(this,"+m_currentRow[currTab]+",'"+childRow.id+"')");						
					else
					{
						strTmp += "onchange=\"return ItemChange(this,"+m_currentRow[currTab]+")\" ";
						strTmp += "onbeforedeactivate=\"return AO_ItemBeforedeactivate(this,"+m_currentRow[currTab]+")\" ";
					}
				}
			}
//			else strTmp += "flag_change='1' rowChange="+String(m_currentRow[currTab]+1) +" "; 
			if (childRow.type == "checkbox")
			{
				var val=childRow.innerHTML.trim();
				//if (val=="") val="&nbsp;";
				//strTmp += (val != "&nbsp;"? "checked":"");
				strTmp += childRow.firstChild!=null && childRow.firstChild.tagName == "IMG"?"checked":"";
				inputElement="<input type=\"checkbox\" class=\"checkbox\" " + strTmp + ">";
			}else
			{
				if (childRow.type == "ddlb")				
				{
					strTmp += "style=\"margin-top:1px;width: " + childRow.clientWidth + "\" ";
					inputElement="<select class=\"input\" " + strTmp + ">";
					defValue = (childRow.value.trim()!= "&nbsp;"? childRow.value.trim():"");
					var ddlbName=childRow.getAttribute("ddlbName");
					if(ddlbName==null)
					{
					    ddlbName=AO_GetBOAliasFromID(childRow.id)[1];
					    childRow.setAttribute("ddlbName",ddlbName);
					}
					if (childRow.ddlb_name!=null) ddlbName=childRow.ddlb_name;
					nodes = m_primaryXML.selectNodes("//ddlb/" + ddlbName + "/entry");
					for (var j = 0; j < nodes.length; j++)
					{
						// hook for dynamic check the ddlb selection options : Uzi & Alex 2/1/2005
						// if this hook is true then the option will be disabled
						try
						{
							var removedDDLBOption = false;
							removedDDLBOption = f_removeDDLBOption(nodes[j].getAttribute("data_value"), AO_GetBOAliasFromID(childRow.id)[0], m_currentRow[currTab]+1, ddlbName);		
							if( removedDDLBOption ) continue;
						}catch(e){}
						
						inputElement+=BuildDDLBOption(nodes[j].getAttribute("data_value"),nodes[j].getAttribute("display_value"),defValue);
					}
					//invoke hook function that add options to DDLB
					try
					{
						var params = validateObj.InvokeHook("f_addNewDDLBOptions",ddlbName);
						if(params!=null && (params.length > 0) && (params[0] instanceof Array) )
						{
							for(var i=0;i<params.length;i++)
							{
								inputElement+=BuildDDLBOption(params[i][1],params[i][0],defValue,true);
							}
						}
						else if(params!=null && params.length > 0 )
						{
							inputElement+=BuildDDLBOption(params[1],params[0],defValue,true);
						}
					}
					catch(err)
					{/*do nothing*/}

					nodes = null;
					inputElement+="</select>"
				}else
				{

					is_date_lookup=false;
					if (childRow.lookup != null)
					{
						if (childRow.lookup.search("calendar_lookup") != -1) is_date_lookup=true;
						strTmp += "style=\"width: " + (childRow.clientWidth-24);
						if (is_date_lookup || (childRow.lookup.search("time_lookup") != -1)) 
							strTmp+="; BEHAVIOR: url('../includes/mask.sct');"
						strTmp +="\" lookup=\"" + childRow.lookup + "\"";
						if (childRow.name != null)
							strTmp += " name=\"" + childRow.name + "\"";
						if (is_date_lookup)				
							strTmp+=" preset=\"" + "shortdate" +"\"";
						else if (childRow.lookup.search("time_lookup") != -1){
							strTmp+=" preset=\"" + "time" +"\"";
						}
					}
					if (childRow.operator!=null)
						strTmp+=" operator=\"" + childRow.operator +"\"";
					if (childRow.field_type!=null)
						strTmp+=" field_type=\"" + childRow.field_type +"\"";
					if (childRow.maxlength!=null)
						strTmp+=" maxlength=\"" + childRow.maxlength +"\"";
					strValue = childRow.innerHTML.trim();
					if (strValue == "&nbsp;") strValue = "";
					strValue=__ProperXMLVal_ForGrid(""+strValue);
					if (childRow.className.match(/.*numeric_td.*/ig)){ //if there's a number type - align input to right
						inputElement = "<input type=\"text\" class=\"numeric_td\" " + strTmp + " value=\"" + strValue + "\">";
					}
					else if (childRow.className.match(/.*key_field.*/ig)){ //if its a key field
						inputElement = "<input type=\"text\" class=\"key_field\" " + strTmp + " value=\"" + strValue + "\">";
					}
					else if (childRow.className.match(/.*positive_numeric.*/ig)){ //if its a positive numeric field
						
						inputElement = "<input type=\"text\" class=\"positive_numeric\" " + strTmp + " value=\"" + strValue + "\" positive=\""+childRow.getAttribute("positive")+"\">";
					}
					else if (childRow.className.match(/.*negative_numeric.*/ig)){ //if its a positive numeric field
						
						inputElement = "<input type=\"text\" class=\"negative_numeric\" " + strTmp + " value=\"" + strValue + "\" positive=\""+childRow.getAttribute("positive")+"\">";
					}
					else if (childRow.className.match(/.*readonly_lookup.*/ig)){
					    inputElement = "<input type=\"text\" class=\"readonly_lookup\" " + strTmp + " value=\"" + strValue + "\" positive=\""+childRow.getAttribute("positive")+"\" disabled readonly>";
					}
					else{
						inputElement = "<input type=\"text\" class=\"input\" " + strTmp + " value=\"" + strValue + "\">";
					}
					if (childRow.lookup != null)
					{						

						if (is_date_lookup)
						{
							inputElement += "<input id='"+childRow.id+"_lup' type=\"button\" class=\"btnCalendar1Edit\" style=\"margin-bottom: 0px;\" ";						
							inputElement += "onclick=\"return DateLookUp('" + childRow.id + "')\">";
						}
						else if (childRow.lookup.search("attach_lookup") != -1)
						{		
							inputElement += "<input id='"+childRow.id+"_lup' type=\"button\" class=\"btnLookup1Edit\" style=\"margin-bottom: 0px;\" ";					
							inputElement += "onclick=\"return FileLookup('" + childRow.id + "');\">";
						}
						else if (childRow.lookup.search("time_lookup") != -1)
						{		
							inputElement += "<input type=\"button\" id='"+childRow.id+"_lup' class=\"btnTime1Edit\" style=\"margin-bottom: 0px;\" ";					
							inputElement += "onclick=\"return TimeLookUp('" + childRow.id + "');\">";
						}
						else if (childRow.lookup.search("priority_lookup") != -1)
                        { 
                            inputElement += "<input type=\"button\" id='"+childRow.id+"_lup' class=\"btnLookup1Edit\" style=\"margin-bottom: 0px;\" "; 
                            inputElement += "onclick=\"return Priority_Lookup('" + childRow.id + "');\">";
                        } 
						else
						{
							inputElement += "<input tabindex='-1' id='"+childRow.id+"_lup' type=\"button\" class=\"btnLookup1Edit\" style=\"margin-bottom: 0px;\" ";						
							inputElement += "onclick=\"return LookUp('" + childRow.id + "')\">";
						}
					}
				}
			}
			
			if(childRow.getAttribute("CustomGridCell")=="true")
			{
				try
				{	var sBOAlias = m_aliases[get_PrimaryBoIndex(currTab)];
					var sPageName = m_currentAlias;
					if(funcName.indexOf("SelectEditableXrefRow") > -1)
					{
						sPageName = m_XrefSpecs[currTab].xrefPage;
						sBOAlias = "";
					}
					
					inputElement = f_update_customGridCell(inputElement,sBOAlias,m_currentRow[currTab],sPageName);
				}
				catch(err)
				{/**/}
			}
			childRow.id = "";
		    childRow.innerHTML = inputElement;
			if(childRow.getElementsByTagName("INPUT").length)
			{
			    childRow.getElementsByTagName("INPUT")[0].value = unescape(childRow.getElementsByTagName("INPUT")[0].value);
			}
			childRow.style.paddingTop = "0px";
			childRow.style.paddingBottom = "0px";
		}
		//focus on the first input element
	    try
	    {
	        var inputElement = row.getElementsByTagName("input");
	        if(inputElement.length>0)
	        {
	            inputElement = inputElement[0];
	            inputElement.focus();
		        inputElement.focus();
	        }
	    }
	    catch(err)
	    {/*do nothing*/}
	}
	
    // Store the new selectedRow back in the TBODY element.
    body.setAttribute("selectedRow",row.rowIndex);	
	currRow[currTab]=row.rowIndex;	
	m_XrefSpecs[currTab].editable=true;
	
	MarkRow();
//	if (window.event == null)
//	{
//		setTimeout("AO_FocusFirstObject('"+row.id+"','SelectEditableRow')",100);
//	}
//	else
//	{
//		var eventTypeDescr = window.event.type;
//		
//		if (!eventTypeDescr.match(/click|selectstart/ig))
//		{
//			setTimeout("AO_FocusFirstObject('"+row.id+"','SelectEditableRow')",100);
//		}
//	}

  
    if (window.event == null || !window.event.type.match(/click|selectstart/ig))
	{
        var objects=row.all;
	    var len = objects.length;
	    for (var i=0;i<len;i++)
	    {
		    object=objects[i];
		    var tName = object.tagName.trim();
		    var cName = object.className.trim();
    		
    		
		    if ( !(cName.match(/dis/ig)) &&
			     (tName.match(/input|textarea|select/ig)) &&
			     !(cName.match(/sort|checkbox|flat_input/ig)) &&
			     (cName.match(/input_form|input_search|input_date|input_numeric1|input_numeric|/ig))
			    )
		    {
		        try
		        {
		            object.focus();
		            break;
		        }
		        catch(err){}
		    }
	    }
	}
	FixEditableGridLayout(aTable);
	return true;
}

function AO_ScrollerCheckboxChange(obj,rowIndex,id)
{

	if (obj.all(id)==null) return;
	ItemChange(obj.all(id),rowIndex);
}
/// <summary>
/// The function is invoked when the user clicks the sort button. The function sets the XSL document with the specified sort details
/// and then transforms the XSL document and displays the sorted layout.
/// </summary>
/// <param name="order">[required] the column to sort</param>
/// <param name="for_each_id">[optional]if set get the xsl:foreach using the specify id, use this parameter when XSL page contain
/// more then one Data Grid</param>
/// <param name="a_sign">[optional]descending/ascending, pass + or -</param>
/// <returns></returns>
function AO_Sort(order,for_each_id,a_sign)
{
    var funcName=AS_GetFunctionName(AO_Sort.caller);
    
	//private function that update the user data with sort details
	//only on scroller mode
	//added by eli harel 03-04-2005
	function SaveSortDetailsToUD(fieldValue,sign)
	{
		try
		{
			var ud=document.getElementById("search_results_QBE");
			var userData = m_ControlFrame.m_userData;	
			var userDataKey = "search_results"+m_BCName+"_"+_GetPageName(document.location.href).toLowerCase()+_GetGlobalVar('PortalUserLogin');
			
			if (ud!=null)
			{
				userData.GetValue(userDataKey);
								
				if ( userData.XMLDocument == null || userData.XMLDocument.documentElement == null ) return false;
				var doc = userData.XMLDocument;
				var sortElm =  doc.selectSingleNode("//root/Sort");
				//var sNewSortExpression = (fieldValue+";"+sign);
				//var sOldSortExpression = (sortElm.getAttribute("order")+";"+sortElm.getAttribute("sort"));
				//if( sNewSortExpression == sOldSortExpression)return false;
				if( sortElm == null )
				{
					sortElm = doc.createElement("Sort");
					doc.documentElement.appendChild(sortElm);
				}		
			
				sortElm.setAttribute("order",fieldValue);
				sortElm.setAttribute("sort",sign);
				AO_SaveCacheHistory(m_BCName,userData.XMLDocument);
				userData.SaveValue(userDataKey);
				return true;
			}
		}
		catch(err)
		{
			/*nothing*/
		}
	}
	
	try
	{
		var sign, pos, tmpStr, tmpPos;	
		var criteria="";
		if (for_each_id!=null)
			criteria="xsl:for-each[@id='"+for_each_id+"']/";
		else for_each_id="";
		var XSLPage=m_primaryXSL;
		if (m_primaryXrefXSL!=null) XSLPage=m_primaryXrefXSL;
		var sortField = XSLPage.selectSingleNode("//"+criteria+"@order-by");	
		if(sortField==null) throw ("Set order-by with default value");
		var fieldValue = sortField.value;
		
		if (a_sign==null)
		{
			if (fieldValue.search(/\+/) != -1)
			{
				sign = "-";
			}else
			{
				sign = "+";
			}
			
			if (fieldValue.substr(1) != order && fieldValue.indexOf(";") == -1)
			{
				sign = "+";
			}
			else if(fieldValue.indexOf(";") > -1)
			{
				var compareToField = fieldValue.split(";")[0].substr(1)+"@"+fieldValue.split(";")[1].substr(1)
				if( compareToField != order ) sign = "+";
			}
		}
		else sign=a_sign;
		
		if( order.indexOf("@") == -1 )
		{
			sortField.value = sign + order;	
		}
		else
		{
			var orderexpr = "";
			var ordercolumns = order.split("@");
			for(var i=0;i<ordercolumns.length;i++)
			{
				orderexpr += sign + ordercolumns[i];
				if( i<(ordercolumns.length-1)) orderexpr += ";";
			}
			sortField.value = orderexpr;
		}
		
		var sortValue = XSLPage.selectSingleNode("//xsl:script/cdata()");
		var sortString = sortValue.nodeValue;
		var srt="sort";
		if (for_each_id!="") srt=for_each_id+"_"+srt;
		pos = sortString.search("var "+srt+" = ");
		
		if (pos != -1)
		{
			tmpStr = sortString.substr(pos);
			tmpPos = tmpStr.search(";");
			tmpStr = sortString.substring(pos, pos + tmpPos);
			sortString = sortString.replace(tmpStr, "var "+srt+" = '" + order + "'");
		}
		var sgn="sign"	;
		if (for_each_id!="") sgn=for_each_id+"_"+sgn;	
		pos = sortString.search("var "+sgn+" = ");
		if (pos != -1)
		{
			tmpStr = sortString.substr(pos);
			tmpPos = tmpStr.search(";");
			tmpStr = sortString.substring(pos, pos + tmpPos);
			sortString = sortString.replace(tmpStr, "var "+sgn+" = '" + sign + "'");
		}

		if (sortString.length > 0) sortValue.nodeValue = sortString;
		
		if(AO_CheckSortLimit(order, sign, criteria, XSLPage,document.all("_Information"),m_TotalRecordCount,parseInt(_GetGlobalVar("UpperRecordLimit")))) return;
		
		if (document.all._scroller != null)
		{
			SaveSortDetailsToUD(order,sign);		    
			m_XSLURL=m_primaryXSL.url;
			var sHtmlContent = m_primaryXML.transformNode(XSLPage);
			_scroller.innerHTML = "<FORM>"+sHtmlContent+"</FORM>";
			if((funcName.indexOf("anonymous")>-1) && (m_XrefSpecs[0] != null))
			{
			    m_XrefSpecs[currTab].RowIndex=null;
			    m_XrefSpecs[currTab].RowID=null;
			    MarkScrlRow(null,true);
			}
			m_currentRow[currTab]=0;
		}else
		{
			window.focus();
			var cacheName="_"+ m_currentAlias+"XSL";
			if (m_XrefSpecs!=null && currTab!=null && m_XrefSpecs[currTab]!=null && m_XrefSpecs[currTab].xrefPage!=null)
				cacheName=m_XrefSpecs[currTab].xrefPage	;
			//must refresh XSLT cached object
			AO_RefreshXSLCache();
			_CreatePage(m_currentAlias);
		}	
	}
	catch(err)
	{
		WriteError(err);
	}
}


function BuildXML4RegView(alias, key, row, columnList)
{
	var strXML = "<RegView ";

	strXML += "alias='" + alias + "' ";
	strXML += "key='" + key + "' ";
	if (row.length > 0) strXML += "row='" + row + "' ";
	strXML += "columnList='" + columnList + "' ";
	strXML += "/>"
	
	return strXML;
}


function RetrieveOnDemand(BOName,bocolumnlist)
{
	var primaryXML;
	var additionalChild = null;
	var requestXML=BuildXML4Exec(BOName,new Array(), null, null, false);
 	var SOAPResult=SOAP_GetState(requestXML);
 	if (SOAP_IsError(SOAPResult)) {
 		WriteError(SOAP_Format_Error_Message(SOAPResult))
 		return false;
 	}
 	SOAPResult=SOAP_Get_XMLObj(SOAPResult);
 	primaryXML = m_primaryXML.selectSingleNode("root");
 	additionalChild = SOAPResult.selectSingleNode("//" + BOName);
 	if (additionalChild != null) {
		var oldChilds=primaryXML.selectNodes(BOName);
		for (var i=0;i<oldChilds.length;i++) primaryXML.removeChild(oldChilds[i]);		
 		primaryXML.appendChild(additionalChild);
 	}

	primaryXML = null;
	additionalChild = null;
	
	return true;   
}

function ExecMacroEx(BOName, MacroName, Params, requestStateXPathFilter,macroRequestUpdateObj)
{
	var primaryXML;
	var additionalChild = null;
	var strSendXML = "";
	var SOAPResult=null;
	
	if (macroRequestUpdateObj!=null) 
	{				
	    var request_BO_Array = macroRequestUpdateObj.request_BO_Array;
	    var update_BO_Array = macroRequestUpdateObj.update_BO_Array;
	    var result = A2CS_RunServerMacro(MacroName, BOName, Params, update_BO_Array, request_BO_Array, requestStateXPathFilter, false, false, null, true);	
	    if(typeof(result)=="string") return result;
	}
	else
	{
	    strSendXML=BuildXML4Exec(BOName,Array(null));
	    SOAPResult=SOAP_ExecMacro(MacroName,m_BCName,BOName,Params,false,false,strSendXML, requestStateXPathFilter);
	    if (SOAP_IsError(SOAPResult)){
		    return SOAP_Format_Error_Message(SOAPResult);
	    }
	    primaryXML = m_primaryXML.selectSingleNode("root");
 	    additionalChild = SOAP_Get_XMLObj(SOAPResult).selectSingleNode("//" + BOName);
 	    if (additionalChild != null) {
		    var oldChilds=primaryXML.selectNodes(BOName);
		    for (var i=0;i<oldChilds.length;i++) primaryXML.removeChild(oldChilds[i]);		 	
 		    primaryXML.appendChild(additionalChild);
 	    }
     	
	    primaryXML = null;
	    additionalChild = null;
	}
	return true;   
}

function RetrieveOnDemandEx(PageAlias, BOName, MacroName, Params)
{
	var primaryXML;
	var childNode = null;
	
	primaryXML = m_primaryXML.selectSingleNode("root");
 	var oldChilds=primaryXML.selectNodes(BOName);
	for (var i=0;i<oldChilds.length;i++) primaryXML.removeChild(oldChilds[i]);		 	 	
 	childNode = null;

	var res = ExecMacroEx(BOName, MacroName, Params);
	if(res != true )
	{
	    return res;
	}
	_CreatePage(PageAlias);
	
	return true;   
}

function AO_GetCheckBoxValue(textObj){
	var name=O_GetBOAliasFromID(textObj.id)[1];
	var arrValues=AO_GetCheckBoxOnOffValues(textObj,name);
	var value_on="Y",value_off="N";
	if (arrValues!=null)
	{
		value_on=arrValues["on"];
		value_off=arrValues["off"];
	}					
	return (textObj.checked)?value_on:value_off;
/*
	if (CreateXMLDOM()) {
		return (textObj.checked)?
			currXMLDoc.selectSingleNode("//root/ddlb/"+textObj.id).getAttribute("on"):
			currXMLDoc.selectSingleNode("//root/ddlb/"+textObj.id).getAttribute("off");
	}
	else return (textObj.checked)?"Y":"N";
*/
}

function AO_DescrFromCheckBox(chkboxName,RowEntry,noFont){
	_primaryXML.XMLDocument=LoadXMLDDLB(_primaryXML.XMLDocument);
	var result="(null)";
	try{
		var chkboxNode =_primaryXML.XMLDocument.selectSingleNode("//ddlb/" + chkboxName);
		var result;
		if (RowEntry==chkboxNode.getAttribute('on')){
			try{
				result=chkboxNode.getAttribute('display_on');
			}
			catch(e){
				result=chkboxNode.getAttribute('on');
			}
		}
		else if (RowEntry==chkboxNode.getAttribute('off')){
			try{
				result=chkboxNode.getAttribute('display_off');
			}
			catch(e){
				result=chkboxNode.getAttribute('off');
			}
		}
		
	}
	catch(e){
		result=e.description;
	}
	finally{
		if (noFont==null || noFont==false) return("<b>"+result+"</b>");
		return result;		
	}
}
function AO_MaxLen(vVal)
{
	var availStr = 30;
	var strTmp = "";
	var tmpvVal = vVal.split(" ");
	for(var i=0; i< tmpvVal.length; i++ )
	{
		availStr -= tmpvVal[i].length;
		if(availStr <= 0) break;
		strTmp += tmpvVal[i] + " "; 	
	}
	strTmp += "...";
	return strTmp;
}

function AO_GetFieldValueFromDynamicList(dataFieldId,dataFieldValue,requestedFieldId)
{	
	if (m_primaryXML==null)
	 {
		WriteError("AO_GetFieldValueFromDynamicList: m_primaryXML is null");
		return null;
	}
	var dynamicListNode=m_primaryXML.selectSingleNode("//ddlb/"+dataFieldId+"/entry[@data_value $ieq$ '" +
		 dataFieldValue +"']/"+requestedFieldId);
	if (dynamicListNode==null) 
	{
		WriteError("AO_GetFieldValueFromDynamicList: Request field value of "+dataFieldId +" not found");
		return null;
	}
	return dynamicListNode.text;	
}
function AO_DescrFromDDLB(ddlbName,RowEntry,noFont){
	_primaryXML.XMLDocument=LoadXMLDDLB(_primaryXML.XMLDocument);
	var result="",nd=_primaryXML.XMLDocument.selectSingleNode("//ddlb/" + ddlbName + 
		"/entry[@data_value $ieq$ '" + RowEntry +"']");
	if (nd!=null) result=nd.getAttribute('display_value');
	if (noFont==null || noFont==false) ("<b>"+result+"</b>");
	return result;
}

function AO_isStudioEditMode()
{
	var isStudioEditMode=_GetGlobalVar("isStudioEditMode");
	
	if (("undefined"!=typeof(isStudioEditMode)) && (String(isStudioEditMode)!="")) 
		return true;
	else 
		return false;
}
function AO_LooseData()
{
    if(typeof(m_StateID)!="undefined" && m_saveOptions==2  
      && !AO_ConfirmExit()) 
    {
        return;
    }
	var ans;
	
	if (AO_isStudioEditMode()) return;
	if (AS_GetBCPermission("modify")!="true") return;	
	if (m_sessionClosed) return;
	if (m_primaryXML==null) ans=7;	
	//ASAP #IL0402230022
	var activeElement=document.activeElement;
	if (activeElement!=null)
	{	
		try
		{
			var actionButton=document.getElementById("btnSubmitSelected");
			if (actionButton==null) var actionButton=document.getElementById("tdMenuBarItemSave");			
			if (actionButton!=null && actionButton.onclick!=null)
			{
				activeElement.blur();actionButton.focus();
			}
			
		}catch(e){/**/}
		
	}	
	AS_SaveData();
	if (currXMLDoc==null) return;
	var childs = m_primaryXML.selectNodes("//row[@status != '0']");
	if (childs.length==0 && !m_ServerAct) ans=7;
	if(window.dialogArguments!=null || window.opener !=null ) m_EnforceLooseMsg = false;
	//added by eli harel 30-03-2005
	//this global var indicate if the page should display IE message 
	//before leaving the page default value is true
	if (!ans &&  m_EnforceLooseMsg && _GetGlobalVar("IsChildWindow") == "undefined" ) event.returnValue=AO_GetMesg("AO09040");
	else if(m_progressHandler != null && !m_progressHandler.closed) event.returnValue=AO_GetMesg( "AO09051" );
	AO_ClearModuleButtons();
	return;	
}

///call this function from Astea Browser to check if the current document conatins 
///modified content
function AO_IsModified()
{

    if (m_primaryXML==null || typeof(m_action) == "undefined") return false
	if (AS_GetBCPermission("modify")!="true") return false
	var childs = m_primaryXML.selectNodes("//row[@status != '0']");
	if (childs.length==0 && !m_ServerAct) return false;
	
	return true;
}

function AO_ConfirmSave(retrieve)
{
	var ans=0;
	retrieve = retrieve==null?true:retrieve;
	if (currXMLDoc==null) return false;
	if (m_primaryXML==null) ans=7;
	if (AS_GetBCPermission("modify")!="true") ans=7;
	var childs = m_primaryXML.selectNodes("//row[@status != '0']");
	if (childs.length==0 && !m_ServerAct) ans=7;
	if (m_sessionClosed) ans=7; // State was close. Saving is not an option.
	childs=null;	
	if (!ans) ans=AO_QuitConfirm();
	//question:do you want to save the changes -->
	//	yes=6
	//no=7
	//cancel=2
	switch (ans){
		case 6: 
		    var funcName=AS_GetFunctionName(AO_ConfirmSave.caller);
			// save and quit			
			var do_single=true;
			try{
				do_single=f_savePage("save");
			}
			catch(e){
				do_single=true;
			}
			if (do_single)
			{
			    if(funcName.indexOf("Single_Report")>-1 && retrieve)
			    {
			        _SetGlobalVar("Save_Synchronic","true");
			        if (!Module_Apply()) return true;
			    }
			    else
			    {
			       if (!AO_SaveModule()) return true;
			    }
			}
			return false;
			break;
		case 7:
			// don't save and quit
			return false;
			break;
		case 2:
			//don't quit
			return true;
			break;
	}
	return false;

}

/// <summary>
/// If the user navigates out of state module, this function is called and checks if the state was modified.
/// If true displays confirm message to the user asking him if he wants to save his changes, if the user clicks yes
/// the function saves the state.
/// </summary>
/// <returns>true/false</returns>
function AO_ConfirmExit()
{
	var ans=0;
	if (currXMLDoc==null) return false;
	if (m_primaryXML==null) ans=7;
	if (AS_GetBCPermission("modify")!="true") ans=7;	
	var childs = m_primaryXML.selectNodes("//row[@status != '0']");
	if (childs.length==0 && !m_ServerAct) ans=7;
	if (m_sessionClosed) ans=7; // State was close. Saving is not an option.
	childs=null;	
	if (!ans) ans=AO_QuitConfirm();
	//question:do you want to save the changes -->
	//	yes=6
	//no=7
	//cancel=2
	switch (ans){
		case 6: 
			// save and quit
			
			var do_single=true;
			try{
				do_single=f_savePage("save");
			}
			catch(e){
				do_single=true;
			}
			if (do_single) if (!new_Single_Done(false,2)) return true;
			return false;
			break;
		case 7:
			// don't save and quit
			AO_CloseState();
			return false;
			break;
		case 2:
			//don't quit
			return true;
			break;
	}
	return false;

}

/// <summary>
/// Closes the state when a user leaves a state page. The function is subscribed to the window.onunload event.
/// before closing the state check m_sessionClosed, if true the state is already closed, otherwise closes the state
/// and sets m_sessionClosed to true.
/// The function also checks if the state is shared (shared state enables the developer to manage the state in a different document,
/// without closing the state), if true does not close the state.
/// </summary>
/// <return>true/false</return>
function AO_CloseState(){
    try
    {
	    validateObj.InvokeHook("f_window_unload");
	    if( window.dialogArguments == null && window.opener == null )
		    window.top.document.title = "Astea Alliance Enterprise";
	    if (m_sessionClosed || (typeof(SharedState)!= "undefined" && SharedState()))
	    {
	        if(SharedState())
	        {
	            m_sessionClosed = true;
	            AO_GetPrimaryWindow().top.main_frame.AO_SyncWindowsState(m_primaryXML.xml);
	        }
	        return;
	    }
		validateObj.InvokeHook("f_Before_Close_State");
	    SOAP_CloseState();
	    validateObj.InvokeHook("onClosePage");
    }catch(e){return false}    
	CollectGarbage();
    m_sessionClosed=true;
    return true;
}

function AO_CloseSession(){
	AO_CloseState();
}

//this function create find xml for default active report
function CreateDefaultReportXML()
{
	var reportFindXml = "";
	
	if(!validateObj.IsDefined(m_ReportParams)) return reportFindXml;
	try
	{
		var node = m_ReportParams[0][2].split("/")[2];
		var boAlias = m_ReportParams[0][2].split("/")[0];
		var val = AO_getItem(node,boAlias,1);
		if(validateObj.IsNothing(val)) return reportFindXml;
		reportFindXml = "<Find entity_name='' query_name=''  getRecordCount='true'  pageNumber='1' "+m_ReportParams[0][1]+"='"+val+"' ><operators values='like;'/><types values='string;'/><is_replace_alias values='Y;'/></Find>"
	}
	catch(err)
	{/*do nothing*/}
	return reportFindXml;
}

/// <summary>
/// Displays the communication module of the modal dialog window, sending as argument Array (aComm) that contains details like body, subject, CC, BCC, etc.
/// This argument can be modified by the developer by implementing "InsertDefaultEmailParameters" hook function.
/// </summary>
/// <returns>the window dialog return value</returns>
function Single_Commun(){
		
		var callerName=Single_Commun.caller;
		var funcName="";
		if (callerName!=null) {
			callerName=callerName.toString();
			funcName=callerName.match("^function(.*)\\(");
			if (RegExp.$1.length>0)funcName=new String(RegExp.$1);
			funcName = funcName.trim();
		}
		
		// this is a hook function use it to add default values to Communication module just before loading it.
		if( funcName != "Single_Commun_Interaction")
		{
			validateObj.InvokeHook("InsertDefaultEmailParameters");
		}
		var Sent=null;
		var emailLink="";
		var queryString = "";
		try
		{
		    emailLink='../form_asp/communication_settings.htm';	
			if(typeof(CollacteEmailAddress)!="undefined" && funcName != "Single_Commun_Interaction")
			{
				var winData = BuildCommSetting();	
				var winProperties = "";
				
				if(winData["bo_list"].length > 0)
					winProperties = "scroll:no;status:no;resizable:no;dialogWidth:597px;dialogHeight:470px";
				else
					winProperties = "scroll:no;status:no;resizable:no;dialogWidth:397px;dialogHeight:270px";
				Sent=window.showModalDialog(emailLink,winData,winProperties,false);
				aComm["comm_setting"] = true;
				
				if(Sent["attach_report"]==true)
				{
					aComm["find_xml"] = CreateDefaultReportXML();
					if(aComm["find_xml"]!=""){
						aComm["report_name"] = m_ReportParams[0][0];
						aComm["report_type"] = Sent["report_type"];
					}
				}
				
				if(Sent["mail_body"]=="false" || Sent["mail_body"]==false)
				{
					aComm["mail_body"]=null;
				}
				if(Sent["mail_to"] != "" )
				{
					//aComm["mail_cc"]=(aComm["mail_cc"]!=null?aComm["mail_cc"]+";"+Sent["mail_cc"]:Sent["mail_cc"]);
					aComm["mail_to"]=Sent["mail_to"];
				}
			}
			else
			{
			    var reportOption = (validateObj.IsDefined(m_ReportParams) && SOAP_IsReportActive(m_ReportParams[0][0]))?"Y":"N";
			    var winData = new Array();
	            winData["str_xml"] = "<root OnlyReport='true'><main><row number='1'><attach_report>"+reportOption+"</attach_report></row></main></root>";
	            winData["bo_list"] = null;
				winProperties = "scroll:no;status:no;resizable:no;dialogWidth:397px;dialogHeight:100px";
				Sent=window.showModalDialog(emailLink,winData,winProperties,false);
				aComm["comm_setting"] = true;
				
				if(Sent["attach_report"]==true)
				{
					aComm["find_xml"] = CreateDefaultReportXML();
					if(aComm["find_xml"]!=""){
						aComm["report_name"] = m_ReportParams[0][0];
						aComm["report_type"] = Sent["report_type"];
					}
				}
			}
		}
		catch(err)
		{/*do nothing*/}
		
		
		if(typeof(CollacteEmailAddress)=="undefined" || !validateObj.IsNothing(Sent) || funcName == "Single_Commun_Interaction")
		{
			aComm["m_tableKey"] = m_tableKey;
			aComm["m_tableName"] = m_tableName;
			emailLink='../form_asp/Communication_Maint.asp?action=retrieve&where_cond=newmail'+queryString;				
			Sent=window.showModalDialog(emailLink,aComm,"scroll:no;status:no;resizable:no;dialogWidth:997px;dialogHeight:640px");
		}
		
		var numOfAttach = parseInt(_GetGlobalVar("attachRowCounter"));
		
		if(!isNaN(numOfAttach) && numOfAttach != 0)
		{
			document.all["attach"].parentElement.title = numOfAttach;
			buttonLeft=document.all["attach"].parentElement.parentElement.parentElement.parentElement.parentElement.offsetLeft+20;
			document.all["attach"].parentElement.innerHTML+="<font id='red_asterisk' color='red' style='font-size:17px;position:absolute;top:3;left:"+buttonLeft+";cursor:hand'><b>*</b></font>";
		}
		
		validateObj.InvokeHook("PostCommunicationSubmit",Sent);
		aComm=new Array();
		
		return Sent;

	//location.href="mailto:dannyk@astea.co.il?subject=Mail%20From%20Carmen&body=In%20the%20future,%20this%20option%20will%20send%20a%20detailed%20report%20as%20attachment";
}

//this is callback that call after active report exported to pdf
function ExportReportCallBack(SOAPResult)
{
	if(SOAPResult != null && SOAP_IsError(SOAPResult))
	{
		if(!validateObj.InvokeHook("f_on_ExportError",fileName))
		{
			WriteError(SOAP_Format_Error_Message(SOAPResult));
		}
		return;
	}
	
	var fileName = SOAPResult.value;
	
	if(	fileName == null )
	{
		if(!validateObj.InvokeHook("f_on_ExportError",fileName))
		{
			WriteError(SOAP_Format_Error_Message(SOAPResult));
		}
		return;
	}
	else
	{
		validateObj.InvokeHook("f_after_ExportReportPostBack",fileName);
	}
}

function AO_IsTableEditable(){
	try{
		return m_XrefSpecs[currTab].editable
	}catch(e){return false;}
}

/// <summary>
/// Used when the Data Grid rows are changed on the state or their status is changed (become disabled)
/// to refresh the data grid only, instead of the entire page.
/// </summary>
/// <param name="fld">[optional, default null] column name to set the focus after refresh</param>
/// <param name="isAdditioanlXref">[optional, default null] if refresh table on Xref page send parameter as true</param>
/// <returns></returns>
function AO_RefreshTable(fld, isAdditioanlXref){

	try{
	if (!AO_IsTableEditable()) return false;
		if (m_XrefSpecs[currTab].RowID==null) return false;
		
		var xslSheet;
		if (isAdditioanlXref!=null && isAdditioanlXref == true && m_XrefSpecs[currTab].xrefPage != null)
		{
			xslSheet=GetXSLDocument(m_XrefSpecs[currTab].xrefPage);
			xslSheet = _ChangeFilter(xslSheet,true);
		}
		else
			xslSheet=GetXSLDocument("_"+m_currentAlias+"XSL");
		
		if (xslSheet==null) return false;
		var xslClone=xslSheet.cloneNode(true);
		var removeMe=xslClone.selectNodes("//script");
	
		for (var i=0;i<removeMe.length;i++){
			removeMe[i].parentNode.removeChild(removeMe[i]);
		}
		removeMe=xslClone.selectNodes("//div[@class='button_separator']");	
		for (var i=0;i<removeMe.length;i++){
			removeMe[i].parentNode.removeChild(removeMe[i]);
		}
		var HTMLRes=document.createElement("TD");
		HTMLRes.style.display="none";
		HTMLRes.id="HTMLRes";
	    var newRow,oldRow,_strHTML_,oCell;
		if ((xslSheet!=null))
		{			
			if (HTMLRes==null) return;
			_strHTML_=""+m_primaryXML.transformNode(xslClone);
			HTMLRes.innerHTML=_strHTML_; _strHTML_="";
			newRow=HTMLRes.all(m_XrefSpecs[currTab].RowID);
			if (!validateObj.IsNothing(newRow)) 
			{
				oldRow=_TabControl.all(m_XrefSpecs[currTab].RowID);
				oldRow.parentElement.parentElement.replaceChild(newRow.parentElement,oldRow.parentElement);
			
				oldRow=_TabControl.all(m_XrefSpecs[currTab].RowID);
				
				var tbl=oldRow.parentElement.parentElement;
				var tI=1,inp;
				var rowlen = tbl.rows.length;
				for(var rowCounter=0;rowCounter<rowlen;rowCounter++)
				{
					var rowobj = tbl.rows[rowCounter];
					var celllen = rowobj.cells.length;
					for (var cellCounter=0;cellCounter<celllen;cellCounter++)
					{
						var cellObj = rowobj.cells[cellCounter];
						var inp=cellObj.all.tags("input");
						for (var j=0;j<inp.length;j++)
						{
							inp[j].tabIndex=tI++;	
						}
						if (cellObj.innerHTML.length==0)cellObj.innerHTML="&nbsp;";
					}
				}						
				if(m_XrefSpecs[currTab].xrefPage == null)
				{			
					SelectEditableRow(tbl,oldRow);				
				}
				else
				{
					SelectEditableXrefRow(tbl,m_XrefSpecs[currTab].xrefBoName,oldRow);
				}			
				if (fld!=null)
				{
					var focus_field=oldRow.all[fld];
					if (focus_field!=null) try{
						if (focus_field.tabIndex==null)focus_field.tabIndex=0;
						focus_field.focus();focus_field.focus();
					}catch(e){/*do nothing*/}
					
				}
			}	
			else
            {
                  oldRow=_TabControl.all("row_1");
                  if (!validateObj.IsNothing(oldRow)) 
                  {
                      var tbl=oldRow.parentElement.parentElement;
                      var oTblCollection = HTMLRes.getElementsByTagName("TABLE");
                      var oTbl = null;
                      for(var index=0;index<oTblCollection.length;index++)
                      {
                          if( oTblCollection[index].getAttribute("onclick")!=null && 
                              (oTblCollection[index].getAttribute("onclick")).toString().indexOf("SelectEditableRow")>-1 ) 
                              oTbl = oTblCollection[index].parentNode;
                      }
                      if( oTbl != null )
                      {
                          var oParent = tbl.parentElement;
                            oParent.innerHTML = "";
                          oParent.insertAdjacentElement("afterBegin",oTbl);
                      }
                  }
             }
          }
		HTMLRes=null;
		
		return true;
		
	}catch(e){
	WriteError(e);
	return false;
	}
}


function DuplicateForEach(xslSheetName){
	var tmpCurrentAlias=m_currentAlias;
	if (m_action=="new" && m_currentAlias=="_TabControl") tmpCurrentAlias=m_PageAliases[0];
	var xslSheet=GetXSLDocument("_"+tmpCurrentAlias+"XSL");
	var xslNodes=xslSheet.selectNodes("//xsl:for-each[@copy='true']");
	if (xslNodes.length!=0){
		var newNode;
		var oldNode;
		for (var i=0;i<xslNodes.length;i++){
			oldNode=xslNodes[i];
			newNode=oldNode.parentNode.appendChild(oldNode.cloneNode(true));
			newNode.setAttribute("copy", "delete");
			newNode.removeAttribute("order-by");
			oldNode.setAttribute("select",oldNode.getAttribute("select")+"[@status != 4]");
			newNode.setAttribute("select",newNode.getAttribute("select")+"[@status = 4]");
			
		}
	}
	return true;
}

function RemoveForEach(xslSheetName){
	var tmpCurrentAlias=m_currentAlias;
	if (m_action=="new" && m_currentAlias=="_TabControl") tmpCurrentAlias=m_PageAliases[0];
	var xslSheet=GetXSLDocument("_"+tmpCurrentAlias+"XSL");
	var xslNodes=xslSheet.selectNodes("//xsl:for-each[@copy='delete']");
	if (xslNodes.length!=0){
		for (var i=0;i<xslNodes.length;i++){
			xslNodes[i].parentNode.removeChild(xslNodes[i]);
		}
	}
	var xslNodes=xslSheet.selectNodes("//xsl:for-each[@copy='true']");
	if (xslNodes.length!=0){
		for (var i=0;i<xslNodes.length;i++){
			xslNodes[i].setAttribute("select",
				xslNodes[i].getAttribute("select").replace("[@status != 4]",""));
		}
	}	
	return true;
}

function AO_AddClientRow(boAlias,otherPage){
	//var boAlias=m_aliases[get_PrimaryBoIndex(currTab)];

/*	if (m_XrefSpecs[currTab]==null) m_XrefSpecs[currTab] = new Object();
	if (otherPage)
		m_XrefSpecs[currTab].xrefPage = "_" + m_currentAlias + "XSL_Additional";
	else
		m_XrefSpecs[currTab].xrefPage=null;
	if (otherPage==null) otherPage = true;
	m_currentColumn[currTab] = null;
	
	var xmlStr = "";
*/
	if (!CreateXMLDOM()) return false;	
	
	var params = prepareClientParams();
	var strFields = params[0];
	var strTypes = params[1];
	var strValues = params[2];
	var strMapping = params[3];
	
	if (strFields.length!=strValues.length) return false;

	xmlStr = "<"+boAlias+	" xmlns:dt='urn:schemas-microsoft-com:datatypes'>"+
			 "<row status='4' clientStatus='new' number='";
	
	var child = currXMLDoc.selectSingleNode("/root/"+boAlias);
	if (child == null)
	{
		xmlStr += "1'>";	
		m_currentRow[currTab] = 0;
	}else
	{
		xmlStr += child.selectNodes("row").length + 1 + "'>";
		m_currentRow[currTab] = child.selectNodes("row").length;
	}
	
	for (var i=0; i < strFields.length; i++)
	{
		pos = strSensColumns[0].search("\\$");
		strRefModule = strSensColumns[0].substring(0, pos);

		xmlStr += "<" + strFields[i] + " status='0' dt:dt='string'>" + 
				  strValues[i] + "</" + strFields[i] + ">";
	}
	xmlStr += "/row>" + "</" + boAlias + ">";
	
	var xmlTemp = new ActiveXObject("MSXML2.DOMDocument");
	xmlTemp.loadXML(xmlStr);
	currXMLDoc.selectSingleNode("/root").appendChild(xmlTemp);
	xmlTemp = null;

	return true;	
}

function prepareClientParams(){
	var arrNames=new Array();
	var arrTypes=new Array();
	var arrValues=new Array();
	var arrMapping=new Array();
	var arrResult=new Array();
/**********************************************************************************/	
	arrNames[0]="pcode_order_xref$pcode_id";
	arrNames[1]="pcode_order_xref$descr";
	
	arrTypes[0]="string";
	arrTypes[1]="string";
	
	arrValues[0]="";
	arrValues[1]="";
/**********************************************************************************/	
	arrResult[0]=arrNames;
	arrResult[1]=arrTypes;
	arrResult[2]=arrValues;
	arrResult[3]=arrMapping;

	return arrResult;
}

//this function add xref xsl to array of all xsl files 
//for the current xref
function AddXrefPageToXrefSpecs(xslXref)
{
	if(typeof(m_XrefSpecs[currTab].xrefPageArr) == "undefined" ||
		m_XrefSpecs[currTab].xrefPageArr == null)
	{
		m_XrefSpecs[currTab].xrefPageArr = new Array();
	}
	
	for(var i=0;i<m_XrefSpecs[currTab].xrefPageArr.length;i++)
	{
		var itemArr = m_XrefSpecs[currTab].xrefPageArr[i];
		if(itemArr == xslXref)
		{
			return false;
		}
	}
	
	m_XrefSpecs[currTab].xrefPageArr.push(xslXref);
}

//clear the xref array of the current xref page
function ClearXrefPageToXrefSpecs()
{
	m_XrefSpecs[currTab].xrefPageArr = null;
}

function AO_ShowXref(xslPage,transFormNode){
	var xslXref="_"+m_currentAlias+"XSL_Additional";
	if (xslPage!=null && xslPage.trim().length>0) xslXref+="_"+xslPage;
	//m_XrefSpecs[currTab].xrefTab=xslPage;
	m_XrefSpecs[currTab].xrefPage=xslXref;
	AddXrefPageToXrefSpecs(xslXref);
	var xslSheet=GetXSLDocument(xslXref);
	var node=document.all.item("_"+m_PageAliases[currTab])
//	if (node!=null) node=node.documentElement;
//	if (node==null)	node=m_primaryXML.selectSingleNode("//" + m_aliases[get_PrimaryBoIndex(currTab)] + 
//						"/row[@number="+String(m_currentRow[currTab]+1)+"]");
		
	var ndTemp=m_primaryXML.selectSingleNode("//" + m_aliases[get_PrimaryBoIndex(currTab)] + 
						"/row[@number="+String(m_currentRow[currTab]+1)+"]");
	if (ndTemp!=null && node.loadXML(ndTemp.xml)){
			var ndDDLB=currXMLDoc.documentElement.selectNodes("ddlb");
			for (i=0;i<ndDDLB.length;i++){
				node.documentElement.appendChild(ndDDLB[i].cloneNode(true));
			}
	}
	if (node==null) return false;						
	m_primaryXrefXSL=xslSheet.documentElement;
	m_primaryXrefXSL=_addIncludes(m_primaryXrefXSL);
	var primaryXrefXSLTmp = m_primaryXrefXSL;
	
	if (transFormNode!=null && transFormNode==false) return m_primaryXrefXSL;
    
    AO_PRE_CreateXrefPage(m_currentAlias,xslPage);
	if(!(primaryXrefXSLTmp==m_primaryXrefXSL)) m_primaryXrefXSL=primaryXrefXSLTmp;
	
	m_primaryXrefXSL=_ChangeFilter(m_primaryXrefXSL);
	var strHTML="";
	
	
	
	if (m_primaryXrefXSL.selectSingleNode("xsl:template[@id='tmpl_row']")!=null)
		strHTML=m_primaryXML.transformNode(m_primaryXrefXSL);
	else 
		strHTML=node.documentElement.transformNode(m_primaryXrefXSL);
	
	document.getElementById(m_currentAlias).innerHTML="";
	document.getElementById(m_currentAlias).insertAdjacentHTML("afterBegin",strHTML);	
	__RowsCountStr(null,true);
	setTimeout("AO_FocusFirstObject(null,'AO_ShowXref')", 100);
	
}
function AO_CheckXrefPermissions(xrefPageName)
{
	if (typeof(xrefPageName)=="undefined") xrefPageName=null;
	if (typeof(m_action)!="undefined")
	{
		if (AS_GetPagePermission(xrefPageName,"modify")=="false")
		{
			AO_DisablePageDOM(m_currentAlias,true);
		}
	}
	if (AS_GetPagePermission(xrefPageName,"new")=="false")
	{
		var elm;
		var addButtons = new Array("line_btn_add_butt","btn_add_nav_xref","add_butt","btnAdd","addBtn");
		
		for(var i=0;i<addButtons.length;i++)
		{
			elm=document.getElementById(addButtons[i]);
			if(elm != null)__DisableElment(elm,"button");
		}
	}
	if (AS_GetPagePermission(xrefPageName,"delete")=="false")
	{
		var elm;
		var delButtons = new Array("line_btn_del_butt","btn_del_nav_xref","btnDel","del_butt","buttDelete","delBtn");
		
		for(var i=0;i<delButtons.length;i++)
		{
			elm=document.getElementById(delButtons[i]);
			if(elm != null)__DisableElment(elm,"button");
		}
	}	
}

function LastRow_fr_form(direction){	
	NextRow_fr_form(direction,true);	
}

function AO_SortStateBO()
{
    var Criteria="/root/"+m_aliases[get_PrimaryBoIndex(currTab)]+"/row";
    var result = validateObj.InvokeHook("f_sortStateCriteria",m_aliases[get_PrimaryBoIndex(currTab)]);
    Criteria = result||Criteria;
    var xslStr='<xsl:stylesheet xmlns:xsl="uri:xsl"><xsl:template match="/">'+
  			'<row_numbers><xsl:for-each select="'+Criteria+'" order-by="'+m_XrefSpecs[currTab].SortOrder+'"><row_number><xsl:attribute name="status"><xsl:value-of select="@status"/></xsl:attribute><xsl:value-of select="@number"/></row_number>'+
  			'</xsl:for-each></row_numbers></xsl:template></xsl:stylesheet>';
	var xmlTrans=new ActiveXObject("MSXML2.DOMDocument");
	if (xmlTrans.loadXML(xslStr))
	{		
		try
		{
			var result = new ActiveXObject("MSXML2.DOMDocument");
			result.async = false;
			result.validateOnParse = true; 
			m_primaryXML.transformNodeToObject(xmlTrans,result);
			if (!result.parseError.errorCode) return result;
		}
		catch(err)
		{}
	}
	return null;
}

function NextRow_fr_form(direction,last){
	if (direction==null) direction=true;	
	if (last==null) last=false;	
	if (m_currentRow[currTab]==null) return false;
	if (!direction && currRow[m_currentAlias]==0) return false;
	if (direction && currRow[m_currentAlias]==m_XrefTableLength[m_currentAlias]) return false;
	if( CheckMandatory(document.getElementById(m_currentAlias)) ) return false;
	var objXML;
	if (m_XrefSpecs[currTab].SortOrder==null){		
		var i=0;
		objXML=m_primaryXML.selectSingleNode("/root/"+m_aliases[get_PrimaryBoIndex(currTab)]+"/row[@number='"+String(m_currentRow[currTab]+1)+"']");			
		do{ 			
			if (direction){				
				if (!last  ) objXML=objXML.nextSibling;
				else {
				   for (objXML;objXML.nextSibling!=null;objXML=objXML.nextSibling);
				   while ((objXML!=null) && (objXML.getAttribute("status") & 2)) objXML=objXML.previousSibling;
				}
			}
			else{
				if (!last)objXML=objXML.previousSibling;
				else {
					for (objXML;objXML.previousSibling!=null;objXML=objXML.previousSibling);
					while ((objXML!=null) && (objXML.getAttribute("status") & 2)) objXML=objXML.nextSibling;
				}
			}					  
			if (objXML==null) return false;
			if(!(objXML.getAttribute("status") & 2)){			
				if (direction){
					if (last) currRow[m_currentAlias]=m_XrefTableLength[m_currentAlias]-1;
					else currRow[m_currentAlias]++;
				}
				else {
					if (last) currRow[m_currentAlias]=0;
					else currRow[m_currentAlias]--;
				}
				m_currentRow[currTab]=objXML.getAttribute("number")-1;
				m_XrefSpecs[currTab].RowID="row_"+objXML.getAttribute("number");				
				RowEdit("",true);
				break;
			}			
		}while (true)		
	}
	else {
  		var result = AO_SortStateBO();
  		if (result!=null){		
  			try{
			    m_XrefSpecs[currTab].SortedStateBO = result;
				objXML=result.selectSingleNode("/row_numbers/row_number[.="+String(m_currentRow[currTab]+1)+"]");
				do{ 				
					if (direction){				
						if (!last) objXML=objXML.nextSibling;
						else {
							for (objXML;objXML.nextSibling!=null && (m_XrefTableLength[m_currentAlias]>currRow[m_currentAlias]);objXML=objXML.nextSibling);
							while ((objXML!=null) && (objXML.getAttribute("status") & 2)) objXML=objXML.previousSibling;
						}
					}
					else{
						if (!last)objXML=objXML.previousSibling;
						else {
							for (objXML;objXML.previousSibling!=null && currRow[m_currentAlias];objXML=objXML.previousSibling){
								currRow[m_currentAlias]--;
							}
							while ((objXML!=null) && (objXML.getAttribute("status") & 2)) {
								objXML=objXML.nextSibling;						
								currRow[m_currentAlias]++;
							}
							currRow[m_currentAlias]--;
						}					  							
					}
					if (objXML==null) return false;
					if(!(objXML.getAttribute("status") & 2)){			
						if (direction){
							if (last) currRow[m_currentAlias]=m_XrefTableLength[m_currentAlias]-1;
							else currRow[m_currentAlias]++;
						}
						else {
							if (last) currRow[m_currentAlias]=0;
							else currRow[m_currentAlias]--;
						}						
						m_currentRow[currTab]=objXML.text-1;
						m_XrefSpecs[currTab].RowID="row_"+objXML.text;							
						RowEdit("",true);							
						break;
					}			
				}while (true)  					  					
  			}catch(e){WriteError(e.description);return -1;}
  		}
  		xmlTrans=null;
  		return -1;  	
  	

	}	
	
	
	
}

function PrevRow_fr_form(){
	NextRow_fr_form(false)
}

function DeleteRow_fr_form(){
	DeleteRow();
}

/// <summary>
/// Used in New pages only. The function is called when a user clicks on the wizard menu on the left-side menu, 
/// or presses <TAB> on the last field in the group.  
/// </summary>
/// <param name="goToGroup">[optional]group name to jump</param>
function AO_NextGroup(goToGroup){
	try{
	    var showNextGroup = AS_GetFunctionName(AO_NextGroup.caller).removeEx(" ",2)=="FocusOnNextInput:";
		var ev=window.event;
		var ic=true;
		if ((ev.keyCode=="9" && !(ev.ctrlKey || ev.altKey || ev.shiftKey)) || (typeof(goToGroup)!="undefined") || (showNextGroup) ) {
			var cnt=m_GroupAliases.length,i;
			if(cnt != 1)
			{
			    if( typeof(goToGroup)=="undefined" )
				{
				    for (i=0;i<cnt;i++){
					    if (m_GroupAliases[i]==m_curGroupAlias) break;
				    }
				    if (i==cnt) return;
				    if (ev.srcElement.onchange) ic=ev.srcElement.onchange();
				}
				
				if (ic!=false){
					ev.returnValue=false;
					if( typeof(goToGroup)=="undefined" )
					{
						_ChangeStyle(m_GroupAliases[(i+1)%cnt]);
					}
					else
					{
						_ChangeStyle(goToGroup);
					}
				}
			}
			else
			{
				setTimeout("AO_FocusFirstObject(null,'AO_NextGroup')",100);
			}
		}
	}catch(e){
		WriteError(e);
	}
}


function _CalculateField(compFields){
	if (compFields==null || compFields=="") return "";
	var result=null,field,fieldsArr=compFields.split(";"),obj;
	for (field in fieldsArr){
		obj=document.all(fieldsArr[field]);
		if (obj==null) continue;
		if (obj.length!=null) obj=obj(currRow[currTab]);
		if (obj.expr!=null){
			try{
				result=eval(obj.expr);
				obj.innerText=result;
			}catch (e){
				//do nothing
			}
		}
	}	
	return result;
}


function sum(expr){
	var sum=0,nd,i,num;				
	nodes=_getNodebyParams(m_primaryXML,expr);
	if (nodes==null) return 0;
	for (i=0;i<nodes.length;i++){
		nd=nodes[i];
		if (parseInt(nd.parentNode.getAttribute("status")) & 2) continue;
		num=parseFloat(nd.text);
		if (!isNaN(num)) sum+=num;
	}
	return sum;
}


function _getNodebyParams(node,expr){
	var strParams,strLine,parseVal;
	if (node==null || expr=="") return null;
		
	parseVal=null;

	if (expr != null)
	{				
		strParams = expr.split("$");
		if (strParams[0]=="row") 
			strParams[0]=m_aliases[get_PrimaryBoIndex(currTab)]+"#"+
				Number(m_currentRow[currTab])+1;
		strLine=strParams[0].split("#");
		if (strLine.length==1)
			parseVal = node.selectNodes("//" + strParams[0] + "//" + 
					strParams[1]);				
		else if (strLine.length==2)
			parseVal = node.selectNodes("//" + strLine[0] +
				"//row[@number="+Number(strLine[1])+"]//"+strParams[1]);

	}
	return parseVal;
}	


function mul(expr){
	var muls=new Array();
	var args=expr.split(";");
	var res=1;
	for (var i=0;i<args.length;i++){
		muls[i]=_getNodebyParams(m_primaryXML,args[i]);//_parseParams(nodeCalc,args[i]);
		if (muls[i]==null) return -1;
		muls[i]=muls[i][0].text;
		res*=muls[i];
	}
	return AS_Num2String(res);
}



function f_put_descr(tipColumn,descr_fld){
	try{

		if (!CreateXMLDOM()) return false;
		var tmpArr=AO_GetBOAliasFromID(descr_fld);
		var objBOAlias=tmpArr[0];
		var nameArr = tmpArr[1];
		nameArr=nameArr.split("#");
		var name=nameArr[0];		
		var col=(m_currentRow[currTab]!=null)?String(m_currentRow[currTab]+1):1;
		if (nameArr.length==2) col=nameArr[1];
		if (name.indexOf("row/")>-1){
			name=name.replace("row/","row[@number='"+col+"']/");
		}
		else {
			name="row[@number='"+col+"']/"+name;
		}
		var val="";
		var node = currXMLDoc.selectSingleNode('//' + objBOAlias+"/"+name);
		if (node!=null) val+=node.text;
		return val;		
	}catch(e){
		return "";
	}
}
function AO_RetrieveXML(entity,query,aFields,aValues,aTypes,aOperators)
{     
    try
    {
        if(aTypes == null )
        {
            aTypes = new Array(aFields.length);
            for(var index=0;index<aTypes.length;index++)
            {
                aTypes[index] = 'argument';
            }
        }
        if(aOperators == null)
        {
            aOperators = new Array(aFields.length);
            for(var index=0;index<aOperators.length;index++)
            {
                aOperators[index] = '=';
            }
        }
        var xml4Search = BuildXML4Search(entity, query, aFields, aValues, aTypes, aOperators); 
        var SOAPResult = SOAP_RetrieveXML(xml4Search);
        if (SOAP_IsError(SOAPResult))
        {
		     WriteError(SOAP_Format_Error_Message(SOAPResult))
		     return false;					 
	    }           
	    var strXML = SOAP_Get_XMLObj(SOAPResult);
        return strXML;
    }
    catch(err)
    {/*do nothing*/}
}

/// <summary>
/// The function gets an entity name and value, and checks if the primary key of the entity contains 
/// this value. 
/// </summary>
/// <param name="entityName">A name of an entity</param>
/// <param name="keyValue">Value of the primary key of the main table of the entity</param>
/// <returns>True  - if the value exists
/// False - If there is error or the value does not exist</returns>
function f_can_find(entityName,keyValue){		
		if (!_checkFuncFields(Array(entityName,keyValue))) return "";
		return SOAP_CanFind(entityName,keyValue);
}
/// <summary>
/// The function gets an entity name and value, and checks if the key that passed to the function 
/// contains the value. 
/// </summary>
/// <param name="entityName">A name of an entity</param>
/// <param name="keyName">Any key in the entity</param>
/// <param name="keyValue">Value of the key mentioned in keyName</param>
/// <returns>True  - if the value exist
/// False - If there is error or the value does not exist</returns>
function f_can_findEx(entityName,keyName,keyValue){
		if (!_checkFuncFields(Array(entityName,keyName,keyValue))) return "";		
		return SOAP_CanFindEx(entityName,keyName,keyValue);
}

/// <summary>
/// The function gets an entity name, primary key value and element name, and returns the value of the 
/// element where its primary key value equals keyValue.
/// </summary>
/// <param name="entityName">A name of an entity</param>
/// <param name="keyValue">Value of the key mentioned in keyName</param>
/// <param name="elementName">Any key in the entity</param>
/// <returns>If there is error or the value does not exist
///  - If the key has a description</returns>
function f_get_descr(EntityName,keyValue,elementName){
		if (!_checkFuncFields(Array(EntityName,elementName,keyValue))) return "";
		return SOAP_GetDescr(EntityName,keyValue,elementName);
}
/// <summary>
/// The function gets an entity name, field name in the entity, value of the field, and returns the 
/// value of elementName where value (keyName)=keyValue, or defaultValue if the value us empty.
/// </summary>
/// <param name="EntityName">A name of an entity</param>
/// <param name="keyName">A field for which the value is given </param>
/// <param name="keyValue">The value of the field in "keyName"</param>
/// <param name="elementName">Any key in the entity</param>
/// <param name="defaultValue"></param>
/// <returns>If there is error or the value does not exist
/// - If the key has a description</returns>
function f_get_descrEx(EntityName,keyName,keyValue,elementName,defaultValue){
		if (!_checkFuncFields(Array(EntityName,keyName,elementName,keyValue))) return defaultValue;
		return SOAP_GetDescrEx(EntityName,keyName,keyValue,elementName,defaultValue);
}


function _checkFuncFields(fields){
	var field;
	for (field in fields){
		if (field==null || field.trim()=="") return false;
	}
	return true;
}

function PrepareReportToMailEx(repName, entityName, queryName, Fields, Values, Types, Operators , mail_to , mail_cc , mail_bcc , subject_id , subject , subject_params , body_id , body , body_params)
{
	var findXML = BuildXML4Search(entityName, queryName, Fields, Values, Types, Operators);
	PrepareReportToMail(repName, findXML, mail_to , mail_cc , mail_bcc , subject_id , subject , subject_params , body_id , body , body_params);
}

function PrepareReportToMail(repName, findXML, mail_to , mail_cc , mail_bcc , subject_id , subject , subject_params , body_id , body , body_params)
{	
	repName += "_" ;
	repName += (UI_LANGUAGE=="AST") ? "ENG" : UI_LANGUAGE;
					
	if (subject_id !=null && subject_id!="")
	{		
		if (subject_params!=null && subject_params!="")
			subject = AO_GetMesgWithParams( subject_id , subject_params);
		else
			subject = AO_GetMesg( subject_id , "");
	}
	
	if (body_id !=null && body_id!="")
	{
		if (body_params!=null && body_params!="")
			body = AO_GetMesgWithParams( subject_id , body_params);
		else
			body = AO_GetMesg( body_id , "")
	}
	
	if (findXML!=null && findXML!="")		
	{
		var SOAPResult = _RunSoapCommandDotNet("ReportManager", "Export", _GetGlobalVar("SessionID") , findXML,repName,"", "PDF", "EXPORT" );	
		var fileName = SOAPResult.value;
		
		if (fileName!=null)
		{
			aComm["attached"] = true;
			aComm["attached_files"] = "Export\\"+fileName;
		}
	}			
	aComm["mail_to"] = mail_to;
	aComm["mail_cc"] = mail_cc;
	aComm["mail_bcc"] = mail_bcc;
	aComm["mail_subject"] = subject;
	aComm["mail_body"] = body;				
}

function AO_NavigateOptions(option)
{
    if(typeof(option) != "number" ) return false;
    if(option==1)
    {
        _goBack(true);
        return true;
    }
    else if(option==2 && (typeof(m_action)!= undefined && m_action=="new"))
    {
        Single_New();
        return true;
    }
    return false;
}

function AO_GetGoBackModuleLocation()
{
    var sLocation = "";
    // if the referer page is a portal...
	if (WebVar_goback == "portal")
	{
		// when clicking on save button - go back to the referer portal
		 sLocation = _get_portal_addr();
	}
	else
	{
		var arrParams=WebVar_goback.split(";");
		if (arrParams.length==2){
			if (m_links[arrParams[0]]!=null){		
				var strAction="retrieve";
				try{
					//ASAP #IL0411020024
					strAction=f_setMaintActionParameter(m_links[arrParams[0]]);
					if (typeof(strAction)!="string") strAction="retrieve";								
				}catch(e){strAction="retrieve"}				
				sLocation = m_links[arrParams[0]]+"?action="+strAction+"&where_cond="+arrParams[1];
			}
				
		}
		else if (arrParams.length==1)
		{
			if (m_links[arrParams[0]]!=null){							
				sLocation =m_links[arrParams[0]];
			}
		}
	}
	
	return sLocation;
}

function AO_NavigateFromSave(goBack){
	if (m_ServerAct==true)if (AO_ConfirmExit()) return true;	
	if(AO_NavigateOptions(goBack)) return true;
	if (goBack==true) {
		if ("undefined"!=typeof(WebVar_goback)){
		    _OpenWindow(AO_GetGoBackModuleLocation());
		}		
		else _OpenWindow(m_NavigateTo[0]); //QBE
	}
	else if (goBack=="new") {
		if ("undefined"!=typeof(WebVar_goback)){		
			var arrParams=WebVar_goback.split(";");
			if (arrParams.length==2){
				if (m_links[arrParams[0]]!=null){
						var strAction="retrieve";
						try{
							//ASAP #IL0411020024
							strAction=f_setMaintActionParameter(m_links[arrParams[0]]);
							if (typeof(strAction)!="string") strAction="retrieve";								
						}catch(e){strAction="retrieve"}										
					_OpenWindow(m_links[arrParams[0]]+"?action="+strAction+"&where_cond="+arrParams[1],true);
				}
					
			}
		}					
		else 
		{
		    //ASAP #IL0606140016
		    if( window.dialogArguments == null && opener == null )
		    {
			    var strAction="retrieve";
			    try{
				    //ASAP #IL0411020024
				    strAction=f_setMaintActionParameter(m_NavigateTo[2]);
				    if (typeof(strAction)!="string") strAction="retrieve";								
			    }catch(e){strAction="retrieve"}										
			    _OpenWindow(m_NavigateTo[2] + "?action="+strAction+"&" + m_Arguments[0]+"="+
				    _ParseParams(m_Arguments[1]),true);
	        }
	        else
	        {
	            _OpenWindow("",false);
	        }
		}
	}

}

function _CheckResponse(SOAPResult,goBack){
try{
	goBack = typeof(goBack)=="undefined"?true:goBack;
    var blnSOAPError=SOAP_IsError(SOAPResult);
	if (!blnSOAPError)
	{
		m_ServerAct=false;
		AO_NavigateFromSave(goBack);
		return true;
	}
	else if (blnSOAPError)
	{
		if(!checkServerError(SOAPResult)){
			if(AO_CheckSessionTimeOut(SOAPResult)) return;
			WriteError(SOAP_Format_Error_Message(SOAPResult));
			return false;
		}
	}
	return false;
}catch(e){WriteError(e);return false}
}

function checkServerError(SOAPResult){

    if(m_invalidStateId == m_StateID)
    {
        m_invalidStateId = null;
        return true;
    }
    m_invalidStateId = m_StateID;

	var serverError = SOAPResult.errorDetail.string;
	var dontPromptIndex = serverError.indexOf("@DontPrompt@");
	var paramsStr;
	var errorParams = new Array();
	//check if the server error caused by optimistic lock
	if(AS_HandleOptimisticLock(serverError)) return true;
	if(dontPromptIndex > -1){
		paramsStr = serverError.substr(dontPromptIndex+12);
		errorParams = paramsStr.split("|");
		try{
			var res = promptServerError(errorParams);
			return validateObj.IsNothing(res)?true:res;
		}
		catch(e){
			return false;
		}
	}
	else
	{
		try {
			//i prompt the error here and not in the caller in order 
			//to display the error when the error causing recursive calls
			WriteError(SOAP_Format_Error_Message(SOAPResult));
			//this hook dont prompt the user with error message
			serverErrorEvent(serverError);			
		}
		catch(e){}
		finally
		{
			return true;
		}
	}

	return false;
}

/// <summary>
/// Runs a Delete server macro. The macro does not delete a line in a BO, but the main BO; Service Order, customer, etc.
/// </summary>
/// <param name="goBack">[optional, default true]if true navigate back</param>
/// <param name="show_message">[optional, default true] if false do not confirm the user before deletion</param>
/// <returns>true/false</returns>
function Single_Delete(goBack,show_message){
try{
	if (m_sessionClosed) return;
	if (AS_GetBCPermission("delete")=="false") return false;
	if (show_message==null) show_message=true;
	if (m_deleteAll!="false") m_deleteAll="true";
	if (show_message)
	{
		var res=AO_DeleteConfirm();
		if (res==7) return false; //No
	}
	var stopDelete=false;
	try
	{
		stopDelete=CheckBeforeDeleteHook();
	}
	catch (e)
	{
		if (stopDelete==true) return false;
	}
	var objFilter=_FilterUpdatedXML("",true);	
	var xmlNodes=objFilter.selectNodes("//row");
	var ndChild, fldNodes;
	for (var count=0;count<xmlNodes.length;count++)
	{
		ndChild=xmlNodes[count];
		
		fldNodes=ndChild.selectNodes("*");
		for (i=0;i<fldNodes.length;i++){		
			fldNodes[i].parentNode.removeChild(fldNodes[i]);
		}					
		if (Number(ndChild.getAttribute("status")) & 4) //new
		{
			ndChild.setAttribute("status",Number(ndChild.getAttribute("status") ) | 2);
		}
	}
	var SOAPResult=SOAP_InteractWithServer("delete",GetMainModule(),Array(null),objFilter.xml,Array(null),"",
		true, true);	
//	var SOAPResult=SOAP_ExecMacro("delete",m_BCName,GetMainModule(),Array(null),true,true,"");
//	objHttp.send("<root all='"+m_deleteAll+"'/>");
	if (goBack==null) goBack=true;
	if (!_CheckResponse(SOAPResult,goBack)) return false;
	SOAPResult = null;	
	return false;
}catch(e){WriteError(e);return false;}
}


function ReportRetrieve(){
	var pos;
	var field;
	var elementsArr;
	var fields=new Array();
	var colName;
	var objHttp;
	var strHTML;
	var indx = 0;
	var strContent;
	var strFields = new Array();
	var strValues = new Array();
  	var strTypes=new Array();
  	var strOperators=new Array();
	m_currentRow[currTab] = null;
	currRow[currTab] = null;
		
	elamentsArr = _searchTop.all.tags("input");
	for (var i=0;i<elamentsArr.length;i++)fields[i]=elamentsArr[i];
	elamentsArr = _searchTop.all.tags("select");
	for (var j=0;j<elamentsArr.length;j++,i++)fields[i]=elamentsArr[j];
	elamentsArr=null;
	if (fields.length == 0) return;

	for (i = 0; i < fields.length, field = fields[i]; i++)
	{
		with (field){
			if (type == "button") continue;
			
			if (value.length > 0)
			{
				colName = id;
					
				pos = colName.search("\\#");
				if (pos != -1) colName = colName.substring(0, pos);
					
				strFields[indx] = colName;
				strValues[indx] = value;
				strTypes[indx]=(typeof(field_type)=="undefined")?"string":field_type;
				if(strTypes[indx]=="date") strValues[indx]=AO_FormatDateTime(value,"date");
				else strValues[indx] = value;
				strOperators[indx]=(typeof(operator)=="undefined")?"=":operator;				
				indx ++;
			}
		}
	}	
	var params=BuildXML4Search(m_EntityName, m_QueryName, strFields, strValues,strTypes,strOperators);
	//params="" + "<FIND entity_name='aaa' query_name='bbb' order_line.order_type_id='service_order'>";
	//params=params + "<operators values='='/>" + "<types values='string'/>"
	//params=params + "</FIND>";
	window.open("../reports_asp/generic_rep.asp?repname="+m_NavigateTo[3]+"&params="+params);
	self.name="main";
}
/// <summary>
/// Used to navigate to another module, by sending the module name translated to URL (the link between module name and its URL ius made on
/// ShortCutMenu/General.js file) and the parameter that is added to the URL.
/// The function validates that the data in the current module is saved before navigating.
/// </summary>
/// <param name="alias">[required]valid module name that exists on the General.js definition</param>
/// <param name="params">[required]call to _ParseParams with this parameter, the result is set to the query string Where_Cond variable name</param>
/// <param name="sourceAlias">[optional, defula null]set WebVar_goback with this value, used to navigate back to the source module</param>
/// <param name="sourceKey">[optional, defula null]must be set when using sourceAlias, this is the source retrieve key</param>
/// <param name="confirmExitFlg">[optionl,default true]if false skip the confirm exist call</param>
/// <returns>if failed return null</returns>	
function AO_Link(alias,params,sourceAlias,sourceKey,confirmExitFlg){
	if (window.name.indexOf("ConnectedWindow") >= 0) return; //disable links within the page
	confirmExitFlg = validateObj.IsDefined(confirmExitFlg)?confirmExitFlg:true;
	if (alias==null || params==null) 
	{
		WriteError(":A2GEN045");
		return null;
	}
	var link=m_links[alias];		
	
	if (link==null || !CreateXMLDOM())	
	{
		WriteError(":A2GEN045");
		return null;
	}
	params=""+_ParseParams(params,true);
	if (params.trim().length==0) 
	{

		WriteError(":A2GEN045");
		return null;
	}
	if(window.event != null && (!window.event.ctrlKey && !window.event.shiftKey && !window.event.altKey) && confirmExitFlg )
 

	{
		var res=AO_ConfirmExit();
		if (res) return null;			
	}
	if (window.event)
	{
		window.event.cancelBubble=true;
		window.event.returnValue=false;				
	}
	var sItemClickedID = "";
	if(window.event != null && window.event.srcElement != null)
	{
	    sItemClickedID = window.event.srcElement.innerText;
	    sItemClickedID = String.prototype.Format("&WebVar_itemclickedid={0}",sItemClickedID.trim());
	}
	var strLocation = "";
	if (sourceAlias!=null && sourceKey!=null)
	{
		sourceKey=""+_ParseParams(sourceKey,true);
		var strAction="retrieve";
		try{
			strAction=f_setLinkActionParameter(alias);
			if (typeof(strAction)!="string") strAction="retrieve";								
		}catch(e){strAction="retrieve"}		
		strLocation = link + "?action="+strAction+"&where_cond="+params+"&WebVar_goback="+sourceAlias+";"+sourceKey+sItemClickedID;				
	}
	else
	{
		var strAction="retrieve";
		try{
			strAction=f_setLinkActionParameter(alias);
			if (typeof(strAction)!="string") strAction="retrieve";								
		}catch(e){strAction="retrieve"}		
		strLocation = link + "?action="+strAction+"&where_cond="+params+sItemClickedID;
	}
	if(window.event != null && window.event.ctrlKey && !window.event.shiftKey && !window.event.altKey)
	{
	    strLocation = strLocation.removeEx("../",1);
	    OpenNewWindow(strLocation);
	}
	else
	{
        _OpenWindow(strLocation);
    }
}
	
/// <summary>
/// Runs query from specified entity and embeds the result to the client state. If you set one of the query filters (columns, values, etc)
/// you must set them all respectively.
/// </summary>
/// <param name="entity_name">[required] the entity name</param>
/// <param name="query_name">[required] the query name</param>
/// <param name="to_replace">[optional,default false]if true and the query already exists, replace with new retrieved data</param>
/// <param name="columns_names">[optional,default empty Array] Array of columns</param>
/// <param name="values">[optional,default empty Array] Array of values</param>
/// <param name="types">[optional,default empty Array] Array of types</param>
/// <param name="operators">[optional,default empty Array] Array of operators</param>
/// <param name="pageNum">[optional,default -1] if the query exceeds the retrieve limit mention the page number</param>
/// <returns>XML string, if the query exists on the state and does not need to be replaced, return the result from the state,
/// otherwise return XML string with the query name that has been executed</returns>
function AO_InsertScroller(entity_name,query_name,to_replace,columns_names,values,types,operators,pageNum){	
	if ((arguments.length!=2) && (arguments.length!=3) && (arguments.length!=7) && (arguments.length!=8)) return "";
	try{
		if (pageNum==null) pageNum=-1;
		var tmpXML;	
		if (to_replace==null) to_replace=false;
		tmpXML=m_primaryXML.selectSingleNode("/root/"+query_name);
		if (to_replace && tmpXML!=null) tmpXML.parentNode.removeChild(tmpXML);
		if (!to_replace){		
			if (tmpXML!=null) return tmpXML.xml;
		}
		if ((arguments.length!=7) && (arguments.length!=8)) {
			columns_names=values=types=operators=new Array();
		}
		var strXML=BuildXML4Search(entity_name,query_name,columns_names,values,types,operators,pageNum);
		AO_Wait();
		//while(SOAP_ServiceAvail("DBManager")!=true);
			
		var SOAPResult=SOAP_RetrieveXML(strXML);
		if (!SOAP_IsError(SOAPResult)){
			strXML = SOAP_Get_XMLObj(SOAPResult);
			tmpXML = strXML.xml.replace ("<root","<"+query_name);
			tmpXML = tmpXML.replace("<\/root>","<\/"+query_name+">");	
			if (strXML.loadXML(tmpXML)){
				for (strXML=strXML.firstChild;strXML.nextSibling!=null;strXML=strXML.nextSibling);					
				m_primaryXML.selectSingleNode("//root").appendChild(strXML);
				AO_EndWait();
				return tmpXML.trim();
			}
		}
		AO_EndWait();
		return "";
	}catch(e){return "";AO_EndWait();}
}




function chgDate(obj_id){
	var obj=document.all[obj_id];
	if (obj!=null)	{
		var year=txtMinutes.value.trim();
		var month= txtHours.value.trim();
		var msg="";
		if ((isNaN(year)) || (year=="")){
			msg=AO_UDF("1999-01-01");	
		}
		if ((isNaN(month)) || (month=="")){
			msg=AO_UDF("1999-01-01");	
		}
		if(!msg){
		    var iDate = Date.prototype.GetLastDayInMonth(parseInt("20"+year),parseInt(month,10));
            msg = AO_UDF("20"+year+'-'+month+'-'+iDate);    
		}
		obj.value=msg;
		if (obj.onchange) obj.onchange();	
	}
		
}

function AO_ReleaseLock(tableName, tableKey){
	try{
		var SOAPResult=SOAP_ReleaseLock(tableName,tableKey)
		if (SOAP_IsError(SOAPResult)){
			 WriteError(SOAP_Format_Error_Message(SOAPResult))
			 return false;					 
		}
		return true;
	}
	catch(e){WriteError(e);return false;}
}

function AO_ClaimLock(tableName, tableKey, timeOut, checkOnly){
	try{
		if(!timeOut) 
			timeOut=0
		
		if(!checkOnly)
			checkOnly=0
		
		var claimResult = false
		
		var SOAPResult=SOAP_ClaimLock(tableName,tableKey,timeOut,checkOnly,HoldingUserID)
		
		if (!SOAP_IsError(SOAPResult))
		{
			var resXML= new ActiveXObject("MSXML2.DOMDocument");	
		
			resXML.loadXML(SOAPResult.raw.xml + "");

			claimResult = (resXML.selectSingleNode("//Result").text.toLowerCase() == "true")
	
			resXML = null
		}
		
		return claimResult;
	}
	catch(e){return false;}
}

function AO_CanLock(tableName, tableKey, timeOut){
	return AO_ClaimLock(tableName, tableKey, timeOut,true);
}

function ConvertJSDate2XMLDate(date)
{
	var timeRepresentation;
	
	with(date)
	{
		timeRepresentation = getFullYear() + "-"
			
		if(getMonth() + 1 < 10) timeRepresentation += "0"
		timeRepresentation+= (getMonth() + 1) + "-"
			
		if(getDate() < 10) timeRepresentation += "0"
		timeRepresentation += getDate() + "T"
			
		if(getHours() < 10) timeRepresentation += "0"
		timeRepresentation += getHours() + ":"
			
		if(getMinutes() < 10) timeRepresentation += "0"
		timeRepresentation += getMinutes() + ":"
		
		if(getSeconds() < 10) timeRepresentation += "0"
		timeRepresentation += getSeconds() + ".000"
	}
	
	return timeRepresentation
}


function AO_Login(username, password, portal, UI_Language,LogoutOpenedSessions){
	
	_SetGlobalVar("PasswordExpired",'N')
	_SetGlobalVar("ProfileID",portal)
	_SetGlobalVar("PortalUserLogin",username)
	var localIP = AO_GetPrimaryWindow().top.control_frame.localIP
		
	var strSessionVars="<SessionVars xmlns:dt='urn:schemas-microsoft-com:datatypes'><Variable Name='UI_Language'>" + UI_Language +"</Variable>"+
		"<Variable Name='UserTimezoneWithoutDaylight'>"+getGMTOffsetStringWhthoutDaylight() +"</Variable>"+
		"<Variable Name='UserTimezone'>"+getGMTOffsetString() +"</Variable>"+
		"<Variable Name='CurrentCulture'>"+clientInformation.userLanguage +"</Variable>"+
		"<Variable Name='ClientDateTime' dt:dt='dateTime'>" + ConvertJSDate2XMLDate(new Date()) + "</Variable>";

	if(LogoutOpenedSessions)
		strSessionVars += "<Variable Name='LogoutOpenedSessions'>Y</Variable>";

	strSessionVars +="</SessionVars>";

	var clientVars=SOAP_Login(username,password,portal,strSessionVars);	
	if (SOAP_IsError(clientVars)) {
	    var errMessage = SOAP_Format_Error_Message(clientVars);
		errMessage = WriteError(errMessage,true);
		
		if(errMessage.indexOf("LOGGED_IN_MORE_THAN_ONCE")>-1)
		{
			if(LogoutOpenedSessions)
			{
// astea-trans=text;TXTASP$cannotclean_vx;N;
				WriteError("Can not clean previous sessions from database.")
				return false;
			}
			
// astea-trans=text;TXTASP$youmayloggedon_vx;N;
			if(confirm("You may only be logged-on to one pc at a time. You are currently logged-on to another pc.\nDo you want to log out of the other pc?"))
			{
				return AO_Login(username,password,portal,UI_Language,"Y");
			}
			else
				return false;
		}


		if(errMessage.indexOf("LOGIN_FAILED")==-1)
			WriteError(errMessage)
		
		return false;
	}
	_SetGlobalVar("clientVars",clientVars.value);
	CheckCreditCardPermissions();
	clientVars=SOAP_Get_XMLObj(clientVars);
	
	// Need to handle Errors !
	var vn,sessionIDExist=false,vnName;
	var varNodes=clientVars.selectNodes("ClientVars/Variable");
	for (var i=0;i<varNodes.length;i++){
		vn=varNodes[i];
		vnName=vn.getAttribute("Name")
		if (vnName=="SessionID"){
			if (vn.text==null || vn.text=="") return false;			
			sessionIDExist=true;
		}
		_SetGlobalVar(vnName,(""+vn.text));
	}

	if (!sessionIDExist) {
		return false;
	}
	
	var oneYearGap = new Date()
	oneYearGap.setFullYear(oneYearGap.getFullYear() + 1)

	if(username.length > 0)
		SetCookie('ComputerID_' + _GetGlobalVar("ProfileID") +  "__" + username, _GetGlobalVar("SessionID"), oneYearGap ,"/");


	var daysToLicenseExpiration = _GetGlobalVar("DaysToLicenseExpiration")

	if(typeof(daysToLicenseExpiration) != 'undefined')
	{		
		AO_CustomMessageWithParams("A2SEC012","","",Array(daysToLicenseExpiration));		
	}
	var passwordDate = _GetGlobalVar("ap_password_dt");
	var passCompareDate = "1970-01-01 12:00:00 AM";
	var anonymous = (_GetGlobalVar("SessionID").indexOf("_ANONYMOUS")>-1)
	if((_GetGlobalVar("PasswordExpired") == "Y" || 
		( typeof(passwordDate) != 'undefined' && passCompareDate == passwordDate))&&
		!anonymous)
	{
	    _SetGlobalVar("PasswordExpired","Y");
		var param = new Object();
		_SetGlobalVar("ExpiredShow","false");
		if (parseInt(_GetGlobalVar("DaysToPasswordExpiration")) > 0 &&
			passCompareDate != passwordDate)
		{	
			var res=AO_CustomMessageWithParams("A2SEC013","","",Array( _GetGlobalVar("DaysToPasswordExpiration")));
			_SetGlobalVar("ExpiredShow","true");
			if (res!=6) return true; // 6 == vbYes
		}
		_SetGlobalVar("UseAutoResizing",false);
		window.showModalDialog("../form_xsl/PasswordExpired.htm",null,"status: no; help: no;dialogWidth:280px;dialogHeight:230px,top=230,left=500");
	
		if(_GetGlobalVar("PasswordExpired") != "N")
		{
		    AO_Logout(true);
			return false;
		}
	}	
	
	return true;
}


function AO_SelfRegistrationLogin(customerName,code,portal, UI_Language){
	return AO_WebAPI("Security","<SelfRegistrationLogin customer='" + customerName + "' code='" + code + "' Portal='" + portal + "' GMT='" + getGMTOffsetString() + "' UI_Language='" +  UI_Language + "' />")
}

function AO_AnonymousLogin(profile, UI_Language){
	return AO_Login("","",profile,UI_Language);
}


function AO_Logout(showConfirmMsg){
	try{	
	    //if this is an opened tab, and we are logging out from it.
	    if ( _GetGlobalVar("IsChildWindow") == "Y")
	    {
	        //display warning message
// astea-trans=text;TXTASP$logout_session_vx;N;
// astea-trans=text;TXTASP$gxml_editor_war_vx;N;
	        var res = AO_msg("You are about to log out.  All open sessions will close, and the information will not be saved. Do you want to continue?",4,"Warning");
	        //if user click no quit logout
            if(res == 7)
            {
               return;
            }  
            else
            {//otherwise close all opened windows and continue with logout
                    AS_CloseAllOpenedWindow();
            }
	    }
	    else 
	    {
	        //if there are opened windows
	        if(AS_IsOpenedWindow())
	        {
	            //display warning message
// astea-trans=text;TXTASP$logout_instance_vx;N;
// astea-trans=text;TXTASP$gxml_editor_war_vx;N;
	            var res = AO_msg("You are about to log out.  All open instances of Astea Alliance will close. Do you want to continue?",4,"Warning");
	            //if user click no quit logout
                if(res == 7)
                {
                    return;
                }
                else
                {//otherwise close all opened windows and continue with logout
                    AS_CloseAllOpenedWindow();
                }
	        }
	    }
		try{
			f_Before_Logout(); // new function
		}catch(e){}
	
		////////Changed by Alex to allow decide if confirm message should popup//////////////// 
		if (showConfirmMsg==null) showConfirmMsg=true;
		if(showConfirmMsg)
			var res=AO_ConfirmExit();
		else
			var res = true;
		////////////////////////////////////////////////////////////////////////////////////////
		
		if (res) return true;	
		try{
			f_Before_Close_State(); // new function
		}catch(e){}					
		AO_CloseState();
		try
		{
			onClosePage();
		}catch(e){/* do nothing */}    
		
	    if (_GetGlobalVar("IsUserCreditCardPermissions") != "undefined")
	        _RemoveGlobalVar("IsUserCreditCardPermissions"); //removing creditcard permissions when logged out
		m_sessionClosed=true; //if logged out then session closed=true
		//close all state managed by the ASyncHandler
		AS_GetASyncHandler().CloseAllState();
		SOAP_LogOut();
		SetCookie("LoginLoaded","N")
		try{
			f_After_Logout(); // new function
		}catch(e){}				
	}
	catch(e){/*do nothing*/}	
	m_sessionClosed=true; //if logged out then session closed=true
	_SetGlobalVar("SessionID",null);
	_SetGlobalVar("ExternalAppEntrance",null);
	_OpenWindow('../start/logoff.asp');
}

function AO_LogoutSession(sessionID){
	try
	{
		var SOAPResult=SOAP_LogOutSession(sessionID);
		if (SOAP_IsError(SOAPResult)) return false;
	}
	catch(err)
	{
		return false;
	}
	return true;
}

function AO_CalculateFormula(formulaName){
	try{
		var SOAPResult=SOAP_CalculateFormula(formulaName);
		if (SOAP_IsError(SOAPResult)) throw(SOAP_Format_Error_Message(SOAPResult));
		return SOAPResult.value;
	}catch(e){WriteError(e);return ""}
}


function AO_WebAPI(action,xmlToSend,isAsynch){
	try{
		if (action!="Security") return false;
		isAsynch = isAsynch ? true : false;
		
		var returnValue = false
		var objHttp = new ActiveXObject("microsoft.xmlhttp")
	
		objHttp.Open("POST", "../includes/AO_Process.asp?action="+action, isAsynch)
	
		objHttp.Send(xmlToSend)
		
		if(!isAsynch && objHttp.getResponseHeader("Content-Type")=="text/xml"){
				returnValue = objHttp.ResponseXML.documentElement.cloneNode(true)		
		}

		return returnValue
	}
	catch(e){
		return false;
	}
	finally{
		objHttp = null
	}
}

function AO_HandleKey(ev){
	var str = "";
	if (typeof(m_action) != undefined && m_action=="new"){
		return AO_HandleKey_New(ev);	
	}	
	ev.returnValue=true;
	return true;
}

function AO_HandleKey_New(ev){
	with (ev){
		if (keyCode=="83" && ctrlKey) {
			try{
				var submit_button=document.getElementById("btnSubmitSelected");
				submit_button.focus();
				submit_button.click();
				ev.returnValue=false;
				return false;				
			}catch(e){
				ev.returnValue=true;
				return true;
			}
		}
	}
	ev.returnValue=true;
	return true;
}
/// <summary>
/// Used only in New pages. Activated when the user clicks the eraser in the group title.  
/// Clears the value in the fields and invokes the onchange() event of the changed fields.  
/// </summary>
/// <param name="group_name">[required]group name to be erased</param>
/// <param name="exclude_fields">[optional]Array of fields that can be excluded from the erase operation</param>
/// <param name="extra_fields">[optional]Array of other fields on the page to be erased</param>
/// <returns>true/false</returns>
function AO_ClearGroup(group_name,exclude_fields,extra_fields){

	function IsItemChange(anaFunc)
	{
		if(anaFunc.search(/ItemChange\s*\(\s*.+\s*,\s*.+\s*\)/gi)==-1)return false;
		else return true;
	}

	if (((""+group_name)=="") && (m_action=="new"))return false;	
	try 
	{
		f_ClearGroup_Pre(group_name);
	}catch(e){/**/}	
	var w = m_primaryXSL.selectNodes("//*[@group = '"+group_name+"']");
	var i=0;
	var fields=w.length;
	var fieldsArray=new Array();	
	var fld,test;
	if (exclude_fields!=null){
		for (i=0;i<exclude_fields.length;i++)fieldsArray[exclude_fields[i]]=false;
	}	
	for (i=0;i<fields;i++){
		field=document.getElementById(w[i].getAttribute("id"));
		if (field==null || field.tagName.search(/td|input|select|textarea/gi)==-1) continue;
		if (fieldsArray[field.id]!=false)fieldsArray[field.id]=true;		
		else continue;
		if (field.checked) field.checked=false;
		field.value="";
		if (field.onchange && IsItemChange(field.onchange.toString())){
			test=field.onchange();
			if (!test) return false;
		}
	}		 
	fieldsArray=new Array();
	if (extra_fields!=null){
		for (i=0;i<extra_fields.length;i++)fieldsArray[extra_fields[i]]=true;		
	}
	for (fld in fieldsArray){
		if (fieldsArray[fld]==true) {
			field=document.getElementById(fld);
			if (field==null) continue;
			if (field.checked) field.checked=false;
			field.value="";
			if (field.onchange){
				test=field.onchange();
				if (!test) return false;
			}
		}
	}
	try 
	{
		f_ClearGroup_Post(group_name);
	}catch(e){/**/}
	_ChangeStyle(group_name);
}


function A2CS_ServerRunRetrieve(a_retrieveParentKey,params,A2CS_ServerRunRetrieve_hook,a_PageBO,XSLName,
	requestStateXPathFilter)
{
/* setVal() */ 	
	function _setVal(obj){
		if (xslValueObj!=null){
			var valString = xslValueObj.nodeValue;
			var pos = valString.search("QBEValuesArray\\['"+obj.id+"'\\]");										  
			if (pos != -1)
			{
				var tmpStr = valString.substr(pos);
				var tmpPos = tmpStr.indexOf("\";");
				if (tmpPos==0) tmpPos = tmpStr.indexOf("';");
				tmpStr = valString.substring(pos, pos + tmpPos+1);
				var newVal=""+obj.value.trim();
				newVal=newVal.replace(/\"/g,"\\\"");
				valString=valString.replace(tmpStr,"QBEValuesArray\['"+obj.id+"'\]=\""+newVal+"\"");
			}
			if (valString.length > 0) xslValueObj.nodeValue = valString;			
		}
		return true;
	}
/* ~setVal() */	
/* DataRetrieved() */
	function _DataRetrieved(){
		if (xslValueObj!=null){
			var valString = xslValueObj.nodeValue;
			var pos = valString.search("var dataFound=");
			if (pos != -1)
			{
				var tmpStr = valString.substr(pos);
				var tmpPos = tmpStr.search(";");
				tmpStr = valString.substring(pos, pos + tmpPos);
				valString = valString.replace(tmpStr, "var dataFound=true");
			}
			if (valString.length > 0) xslValueObj.nodeValue = valString;			
		}

	}
/* ~DataRetrieved() */
	if (AS_GetBCPermission("Access")=="false") return;		
	if (a_retrieveParentKey==null)a_retrieveParentKey=true;
	
	var field;
	var indx = 0;
	var strFields = new Array();
	var strValues = new Array();
  	var strTypes=new Array();
  	var strOperators=new Array();

	var fields=new Array();
	
	var elamentsArr = _searchTop.all.tags("input");
	for (var i=0;i<elamentsArr.length;i++)fields[i]=elamentsArr[i];
	elamentsArr = _searchTop.all.tags("select");
	for (var j=0;j<elamentsArr.length;j++,i++)fields[i]=elamentsArr[j];
	elamentsArr=null;
	if (fields.length == 0) return;
	var pageBO;
	if (a_PageBO!=null) pageBO=a_PageBO;
	else pageBO=m_aliases[get_PrimaryBoIndex(currTab)];
	var xslPage;
	var is
	if (XSLName!=null) 
	{
		xslPage=AO_ShowXref(XSLName,false);
		if (xslPage==null) xslPage=m_primaryXSL
	}
	else xslPage=m_primaryXSL;
	var xslValueObj=xslPage.selectSingleNode("//xsl:script[@id='"+pageBO+"_XSLScript']/cdata()");
	for (i = 0; i < fields.length, field = fields[i]; i++)
	{	
		_setVal(field);
		with (field){
			if ((type == "button") || (typeof(virtual) != 'undefined')) continue;
			
			if (value.length > 0)
			{				
				colName = id;
				
				pos = colName.search("\\#");
				if (pos != -1) colName = colName.substring(0, pos);
				
				strFields[indx] = colName.replace(/_qbe$/ig,"");
  				strTypes[indx]=(typeof(field_type)=="undefined")?"string":field_type;
				//if(strTypes[indx]=="date") strValues[indx]=GoInternal(value,"date");
				if(strTypes[indx].indexOf("date")>-1){
					strValues[indx]=GoInternal(value,"date");
					if (strFields[indx].indexOf("__1")>-1)strValues[indx]+="T00:00:00:000";
					else if (strFields[indx].indexOf("__2")>-1)strValues[indx]+="T23:59:59:999";
				}
				else strValues[indx] = value;
  				strOperators[indx]=(typeof(operator)=="undefined")?"like":operator;				
				indx ++;
			}
		}
	}
	var macroName="RetrieveWithParams"
	var searchStr=BuildXML4Search(pageBO,macroName , strFields, strValues,
		strTypes,strOperators); 
	var paramsArray=new Array();
	//ExecMacroUI has parameter "normalized" string. 
	//We don't need anymore to pack XML into CDATA block.
	paramsArray[0]=searchStr;
	if (params!=null) paramsArray[1]=params;
	else paramsArray[1]=Array("");
	paramsArray[2]=a_retrieveParentKey;
	var macroRequestUpdateObj = validateObj.InvokeHook("f_before_server_run_retrieve_hook",pageBO,macroName,m_currentAlias);
	var res = ExecMacroEx(pageBO, macroName, paramsArray,requestStateXPathFilter,macroRequestUpdateObj);
	if(res != true)
	{
		WriteError(res);
		return false;
	}
	AO_SaveXrefCache(pageBO,searchStr);
	if (A2CS_ServerRunRetrieve_hook!=null){
		try{
			f_server_run_retrieve_hook(A2CS_ServerRunRetrieve_hook);
		}catch(e){/*nothing */}
	}
	_DataRetrieved();	
	var strXref="";
	//ASAP #IL0410200005	
	if (XSLName!=null)
	{
		if (XSLName=="") strXref="_Additional_";
		else strXref="_"+XSLName+"_";		
	}
		
	AO_RefreshXSLCache();
	if (XSLName!=null)
	{
		try{
			AO_ShowXref(XSLName,true)
		}catch(e){_CreatePage(m_currentAlias)}
	}
	else	
		_CreatePage(m_currentAlias);
	return true;
}

function _bo_rows_show_msg(boAlias, totalRecordCount,pageNum){
	if (totalRecordCount!=null && totalRecordCount==-2) totalRecordCount=null;
	var labelObj=document.all("_Information");	
	var pageBO="";	
	if (typeof(m_aliases)!="undefined"){
		if (boAlias!=null) pageBO="/"+boAlias;
		 else pageBO="/"+m_aliases[get_PrimaryBoIndex(currTab)];
		 labelObj=document.all("ao_foundrecord_label");
	}
	if (labelObj==null || labelObj.length!=null) return false;
	var xmlBO=m_primaryXML.selectSingleNode("/root"+pageBO);
	if (xmlBO==null) return false;
	var hasMore=xmlBO.getAttribute("hasMore");
	if (hasMore==null) hasMore="no";
	var strNo=0;	
	//if (totalRecordCount != null) strNo = totalRecordCount;
	var xmlBOLines=xmlBO.selectNodes("row[@status $ne$ 2]");
	for (var i=0;i<xmlBOLines.length;i++){
		if (!(xmlBOLines[i].getAttribute("status") & 2)) strNo++;
	}
	var labelMessage="";
	labelObj.style.color="";	
	// astea-trans=text;TXTASP$no_rec_retr_t_vx;N;
	if (strNo==0) labelMessage="No records retrieved";	
	else
	{
// astea-trans=text;TXTASP$rec_s_t_vx;N;
// astea-trans=text;TXTASP$record_t_vx;N;
		labelMessage=((strNo>1)?" records":" record");
		if (totalRecordCount!=null)
		{
		//449 records found. Showing Records 401 to 449 ?
			var retrieveLimit=_GetGlobalVar("RecordLimit");
			var maxRetrieveLimit=_GetGlobalVar("UpperRecordLimit");
			var more="";
// astea-trans=text;TXTASP$mre_than_spce_vx;N;
			if (Number(totalRecordCount)>=Number(maxRetrieveLimit)) more="More than ";
			var firstNum=(pageNum-1)*retrieveLimit+1
			strNo=firstNum+strNo-1;
// astea-trans=placeholder;placeholder;N;astea-trans=text;TXTASP$to_space_vx;N;
			strNo=firstNum+" "+"to " +strNo;		
			//labelMessage=strNo+ labelMessage +" of " +totalRecordCount+" ";	
			if(UI_LANGUAGE == 'JP' || UI_LANGUAGE == 'JPA')
			{
			    // astea-trans=text;TXTASP$displ_records_vx;N;
			    labelMessage=totalRecordCount + labelMessage + more + "found. Displaying Records"+strNo;
			}
			else
			{		
                // astea-trans=placeholder;placeholder;N;astea-trans=placeholder;placeholder;N;astea-trans=text;TXTASP$displ_records_vx;N;
			    labelMessage=more+totalRecordCount +" "+labelMessage+ " "+"found. Displaying Records"+" "+strNo;
				if (Number(totalRecordCount)>=Number(maxRetrieveLimit))labelMessage+= ". "+m_queryNotSortedLbl;
			}
		}
		else
		{
			labelMessage=strNo +labelMessage;
		// astea-trans=text;TXTASP$found._vx;N;
			labelMessage+=" found.";
			labelMessage=" "+labelMessage+" ";		
			var retrieveLimitChx = document.getElementById("retrieve_no_limit_qbe");            
            if( retrieveLimitChx != null && retrieveLimitChx.value == "Y")
            {
                totalRecordCount = strNo;
            }
		}
		if (totalRecordCount==null)
		{
			if (hasMore.toLowerCase()=="yes") 
			{
					pageNum=xmlBO.selectSingleNode("/root/@currentPage");
					if (pageNum!=null) pageNum=parseInt(pageNum.text);		
					else pageNum=1;
					var retrieveLimit=_GetGlobalVar("RecordLimit");
					var firstNum=(pageNum-1)*retrieveLimit+1
					strNo=firstNum+strNo-1;
					// astea-trans=placeholder;placeholder;N;astea-trans=text;TXTASP$to_space_vx;N;
					strNo=firstNum+" "+"to " +strNo;	
					if(UI_LANGUAGE == 'JP' || UI_LANGUAGE == 'JPA')
			        {			
			            // astea-trans=text;TXTASP$display_2_vx;N;
			            var display = "display";	
			            // astea-trans=text;TXTASP$mre_than_spce_vx;N;
			            var more="More than ";
			            // astea-trans=text;TXTASP$rec_s_t_vx;N;
                        // astea-trans=text;TXTASP$record_t_vx;N;
		                labelMessage=((strNo>1)?" records":" record");
		               // astea-trans=text;TXTASP$displ_records_vx;N;
			            labelMessage=strNo + labelMessage + more + "found. Displaying Records"+strNo;	
			        }
			        else
			        {
		                // astea-trans=text;TXTASP$mre_than_t_vx;N;
		                // astea-trans=text;TXTASP$display_records_vx;N;astea-trans=placeholder;placeholder;N;
					    labelMessage="More than"+labelMessage +" Displaying Records"+" "+strNo;
					}
			}
		}

	}
	labelObj.innerText=labelMessage;
	return true;
}

/// <summary>
/// Executes a macro, saves the BC, gets or sets BOs or field values, or a combination of these tasks.
///	Runs SOAP_InteractWithServer() function (that runs InteractWithServer() of the MacroController)	
/// �	Do not call more than one macro at the same time. In this case, you should declare a new macro in the server that performs the desired set of macros (such as "setitems' macro that calls "setitem").
/// �	Do not sync update specific fields of a BO, only entire BOs. A retrieve of specific fields from a BO is possible.
/// �	The status of the fields retrieved from the server is 0, not modified. If you still need to know which fields were changed, use the "serverStatus" property, with the other set of statuses.
/// </summary>
/// <param name="macroName">[required]name of a macro to run</param>
/// <param name="BOPhrase">[optional,default "main" bo]In which BO, and even in which line of a BO to run the macro</param>
/// <param name="macroParams">[optional,default empty Array]Parameters of the macro, in an Array ,if there is no parameter send null</param>
/// <param name="update_BO_Array">[optional,default all BOs]BO listed in an Array, pass empty string to send all BOs</param>
/// <param name="request_BO_Array">[optional,default all BOs]an array that contain BO names and fields. The fields are optional.
///	The syntax of the Array:Array('bo_name1'-the whole BO[,Array('bo_name2',
///	Array('field_name1'[,'field_name2']....-fields from the bo_name2))....]), pass Null to get all BO's</param>
/// <param name="requestStateXPathFilter">[optional, default empty string]Filterization on the request (the request is retrieved as an XML, so a filterization on the 
/// XML can be done in the server-side, so less data is in the network.</param>
/// <param name="saveState">[required]true to save after the macro and update, false just to perform the other actions reuested</param>
/// <param name="closeState">[required]true to close the state after executing the command on the server, false leave the state open</param>
/// <param name="returnError">[optional,default false]if server error returned and this parameter is true return the error
/// to the caller, otherwise handle the error and return false</param>
/// <returns>true on success, false on fail. If returnError is true the function returns the server error to the caller</returns>
function A2CS_RunServerMacro(macroName,BOPhrase,macroParams,update_BO_Array,request_BO_Array,requestStateXPathFilter,
	saveState, closeState, BCName, returnError){	
	function _FindBO_in_rba(bo,rba){

		if (rba instanceof Array){
			for (var i=0;i<rba.length;i++){
				if (!(rba[i] instanceof Array)) continue;
				if (bo==rba[i][0]) return rba[i][1]
			}
			return null;
		}
		else return rba;
	}
	if(typeof(WebVar_AsyncLoad) != "undefined" && WebVar_AsyncLoad == "true") return;
	BCName = validateObj.IsNothing(BCName)?m_BCName:BCName;
	returnError = validateObj.IsNothing(returnError)?false:returnError;
	var boAlias, pos,rowNum=1;
// Sync BO's	

	var strUpdate="",update_BO_str="";
	var strRequest="",i,j,arrReuqestFields,rba=request_BO_Array;
	if (update_BO_Array==""){
		//all the bo's
		strUpdate=_FilterUpdatedXML("");
	}
	else if (update_BO_Array!=null){	
		//some of the bo's
		update_BO_str=update_BO_Array.join("|");//update_BO_str="bo_1|bo_2|bo_3...."
		
		strUpdate=_FilterUpdatedXML(update_BO_str);
	}
	var ddlbNodes;
	if (request_BO_Array==""){
		rba=m_aliases;
		ddlbNodes=m_primaryXML.selectNodes("/root/ddlb");
	}
	var requestBOName,requestFields;		
	if (rba instanceof Array) {				
		for (var i=0;i<rba.length;i++){
			requestBOName=rba[i];			
			requestFields=Array(null);
			if (rba[i] instanceof Array){
				requestBOName=rba[i][0];
				requestFields=rba[i][1];
			}						
			if (requestBOName.split(":").length>1) continue;
			strRequest=BuildXML4Exec(requestBOName,requestFields,strRequest,false)
		}
		strRequest="<root xmlns:dt='urn:schemas-microsoft-com:datatypes'><GetCurrentState pageName='' stateID='" + m_StateID + "'>" +
			strRequest+"</GetCurrentState></root>";	
	}
//~Sync BO's	
	if (BOPhrase==null)BOPhrase="";
	BOName = BOPhrase;
	pos = BOName.search("@");
	if (pos > -1) {
		BOName = BOPhrase.substr(0,pos);
		rowNum = BOPhrase.substr(pos+1).split("=")[1];
	}	
	var waitInt=false;	
	if (!AO_NewWindow){
// astea-trans=placeholder;placeholder;N;astea-trans=text;TXTJAVASCRIPT$please_wait_vx;N;
		AO_Wait("<h1>"+"Please Wait..."+"</h1>");
		waitInt=true;
	}	
	if (requestStateXPathFilter==null) requestStateXPathFilter="";
	if (macroParams==null)macroParams=Array(null);
	if (macroName==null)macroName="";
	var SOAPResult=SOAP_InteractWithServer(macroName,BOPhrase,macroParams,strUpdate,strRequest,requestStateXPathFilter,
		saveState, closeState,BCName);
	AO_EndWait();			
	if (SOAP_IsError(SOAPResult)){
	    AS_CloseOpenedWindow("Loading");
	    AS_ExitSaveSequansce();
		if( !returnError && !checkServerError(SOAPResult))
		{
			WriteError(SOAP_Format_Error_Message(SOAPResult));
		}
		else if(returnError)
		{
		    return SOAP_Format_Error_Message(SOAPResult);
		}
		return false;
	}			
	
	SOAPResult=SOAP_Get_XMLObj(SOAPResult);
	if (request_BO_Array==null)return true; // no sync
	if (request_BO_Array=="") {
		var load_res=m_primaryXML.loadXML(SOAPResult.xml);//all bo		
		if (load_res){
			m_primaryXML=LoadXMLDDLB(m_primaryXML);						
		}
		return load_res;
	}		
	CreateXMLDOM();
	if (request_BO_Array instanceof Array) {
		var SyncBO,oldChild;
		var rows,row,tmpRowNum,tmpBOName,tmpStateXML,cols,col,field;
		for (var i=0;i<request_BO_Array.length;i++){
			if (!(request_BO_Array[i] instanceof Array)){ //whole BO
				/*var boName = request_BO_Array[i].split(":")[0];
				SyncBO=SOAPResult.selectSingleNode("root/"+boName);
				if (SyncBO==null)continue;*/
				//////////////////////////////////////////
				var boName = request_BO_Array[i].split(":")[0];
				SyncBO=SOAPResult.selectNodes("root/"+boName);
                if (SyncBO==null || SyncBO.length==0)
                {           
                   continue;
                }
                else if(SyncBO.length==1)
                {
                   SyncBO = SyncBO[0];
                }
                else if(SyncBO.length>1)
                {
                    var oFirstBo = SyncBO[0];
                    for(var rowIndex=1;rowIndex<SyncBO.length;rowIndex++)
                    {
                        oFirstBo.appendChild(SyncBO[rowIndex].firstChild);
                    }
                    SyncBO = oFirstBo;
                }
                ////////////////////////////////////
				oldChild=m_primaryXML.selectSingleNode("root/"+boName);
				if (oldChild!=null) m_primaryXML.documentElement.replaceChild(SyncBO,oldChild);
				else m_primaryXML.documentElement.appendChild(SyncBO);											
			}
			else {				
				rows=SOAPResult.selectNodes("//row");
				for (var k=0;k<rows.length;k++){
					row=rows[k];
					tmpBOName=row.parentNode.nodeName;
					tmpRowNum=row.getAttribute("number");
					if (tmpBOName==BOName && tmpRowNum==rowNum)
					{
						var container = document.getElementById(m_currentAlias);
						if(container==null) container = document;
						AO_Sync(BOName,null,container,rowNum,row,_FindBO_in_rba(tmpBOName,request_BO_Array));
						continue;
					}
					cols=row.selectNodes("*");
					for (var j=0;j<cols.length;j++){
						col=cols[j];
						field=m_primaryXML.selectSingleNode("/root/"+tmpBOName+"/row[@number='"+tmpRowNum+"']/"+col.nodeName);
						if (field==null){
							WriteError("/root/"+tmpBOName+"/row[@number='"+tmpRowNum+"']/"+col.nodeName+" is missing from the XML and can not be updated. Sync stopped");
							return false;
						}
						field.text=col.text;
						field.setAttribute("status","0")
						if (field.parentNode.selectNodes("*[@status!=0]").length==0)
							field.parentNode.setAttribute("status","0");						
					}
				}
				//AO_Sync(aliasName,null,externalScope,rowNum,boStateXML)
			}
		}
	}		
	AO_EndWait();
	
	if (closeState)
	{
		m_ServerAct=false;
		m_sessionClosed=true;
	}
	else
	{
	    m_ServerAct = validateObj.InvokeHook("f_IsServerInteraction",macroName,BOPhrase,m_currentAlias);
		m_ServerAct=m_ServerAct==null?true:m_ServerAct;
	}
	return true;	
}

function AO_SetFieldStatusNotModified(BOAlias,name,rowNum){
	var fld=m_primaryXML.selectSingleNode("/root/"+BOAlias+"/row[@number='"+rowNum+"']/"+name);
	if (fld==null) return false;
	fld.setAttribute("status","0");
	var papa=fld.parentNode;
	if (papa.selectNodes("*[@status!=0]").length==0 && !(parseInt(papa.getAttribute("status")) & 2)){
		papa.setAttribute("status","0");				
		return true;
	}
	return false;	
}
function A2CS_RunServerSetItem(BOPhrase,col,val,same_BO_request_Array){
/*	Purpose:		Run macro setitem in the server-side and get the value of specific fields from the same BO
	Return value:	true on success. false on fail
	Parameteres:	
		BOPharse:				A name of the BO, that can be extended to include specific line number or any other 
								syntax
		col:					column name
		val:					value of the column
		same_BO_request_Array:	null, or an array that contain fields names. Note: in this function, only fields from 
								the same BO can be put in the array	
*/
	var request_BO_Array=null;
	if (same_BO_request_Array instanceof Array){
		var BOName=BOPhrase.split("@")[0];
		request_BO_Array=new Array(Array(BOName,same_BO_request_Array));
	}
	return A2CS_RunServerSetItemEx(BOPhrase,Array(col,val),request_BO_Array);
}
function A2CS_RunServerSetItemEx(BOPhrase,macroParams,request_BO_Array){	
/*	Purpose:		Run macro setitem in the server-side and get the value of fields or BO's from the whole BC
	Return value:	true on success. false on fail
	Parameteres:	
		BOPharse:			A name of the BO, that can be extended to include specific line number or any other 
			syntax.
		macroParams:		Array that contains 2 fields - column name and value
		request_BO_Array:	null, or an array that contain BO names and fields. The fields are optional.
			The syntax of the Array:Array('bo_name1'-the whole BO[,Array('bo_name2',
				Array('field_name1'[,'field_name2']....fields from the bo_name2))....])
			
*/
	var pos = BOPhrase.search("@");
	var BOName=BOPhrase,rowNum=1;
	if (pos > -1) {
		BOName = BOPhrase.substr(0,pos);
		rowNum = BOPhrase.substr(pos+1).split("=")[1];
	}	
	var field_node=m_primaryXML.selectSingleNode("/root/"+BOName+"/row[@number='"+rowNum+"']/"+macroParams[0]);
	if (field_node!=null) field_node.setAttribute("status","0");
	return 	A2CS_RunServerMacro("setitem",BOPhrase,macroParams,null,request_BO_Array,null,false,false);	
	
}

function A2CS_GetServerState(request_BO_Array,refresh_page){
/*	Purpose:		Get updated state of fields, BO or everything from the server-side
	Return value:	true on success. false on fail
	Parameteres:			
		request_BO_Array:	null, or an array that contain BO names and fields. The fields are optional.
				The syntax of the Array:Array('bo_name1'-the whole BO[,Array('bo_name2',
				Array('field_name1'[,'field_name2']....fields from the bo_name2))....])
		refresh_page:		true to refresh the page after the action. false to leave the page as it is
			
*/
	var result=A2CS_RunServerMacro(null,null,null,null,request_BO_Array,null,false,false);	
	if (result && refresh_page) _CreatePage(m_currentAlias);
	return result;
}

function A2CS_UpdateServerState(update_BO_Array){
/*	Purpose:		Send updated fields, BO or everything to the server-side
	Return value:	true on success. false on fail
	Parameteres:			
		update_BO_Array:	null, or an array that contain BO names and fields. The fields are optional.
				The syntax of the Array:Array('bo_name1'-the whole BO[,Array('bo_name2',
				Array('field_name1'[,'field_name2']....-fields from the bo_name2))....])
*/
	return 	A2CS_RunServerMacro(null,null,null,update_BO_Array,null,null,false,false);	
}

function A2CS_RunServerSave(){
/*	Purpose:		Save the BC and get updated BC state. Do not close state
	Return value:	true on success. false on fail
	Parameteres: no params
	
*/

	return 	A2CS_RunServerMacro(null,null,null,"","",null,true,false);	
}

///<summary>
/// Runs Retrieve As Append with params macro if the row is not already on the client's xml
///</summary>
///<param term='boAlias'>name of the BO to run this macro with</param>
///<param term='aStateColumns'>array, holds the columns name on the state</param>
///<param term='aStateValues'>rray, holds the columns value on the state</param>
///<param term='aDALColumns'>array, holds the dal's column name (which is often different then the state's name such as where_cond or a_column_name)</param>
///<param term='aDALValues'>array, often same as aStateValues but can be different</param>
///<return></retrun>
function A2CS_Retrieve_As_Append_With_Params(boAlias,aStateColumns,aStateValues,aDALColumns,aDALValues)
{
// checks if the row exists in the xml
	var ndRows=null;
	var xmlCriteria='';
	// build criteria
		
	for (var i=0;i<aStateColumns.length; i++){
	    aStateValues[i] = aStateValues[i].replace("'","&quot;"); //ASAP # IL0603160030
		xmlCriteria += "(" + aStateColumns[i] + " $eq$ '" + aStateValues[i] + "') and ";
	}
	if (xmlCriteria=="") return false;
	//crop the " and "
	xmlCriteria =xmlCriteria.substr(0,xmlCriteria.length-5);
	ndRows = m_primaryXML.selectNodes('root/' + boAlias + '/row[' + xmlCriteria + ']');
	if (ndRows.length > 0) return true;
// send and sync the bo	
	return A2CS_RunServerMacro('RETRIEVEASAPPENDWITHPARAMS',boAlias,Array(aStateColumns,aStateValues,aDALColumns,aDALValues),Array(boAlias),Array(boAlias),'',false,false);
}




//return the group alias according to page alias
function GetGroupByPage(PageAlias)
{
	if (PageAlias!=null && PageAlias!='')
		{
			var pageIndex = -1;
			//find the index of the page
			for (var i=0;i< m_PageAliases.length;i++)
				{
					if (m_PageAliases[i] == PageAlias)
						{
						pageIndex = i;
						break;
						}
				}
			//if it did not find anything return the first group
			if (pageIndex == -1)
				 return m_GroupAliases[0];
			
			var pageNumToReturn=0;
			for (var g=0;g<m_GroupAliases.length;g++)
				{
					pageNumToReturn += parseInt(m_GroupAliases[g].split(':')[1]);
					if (pageNumToReturn > pageIndex)
						//return the correct group
						return m_GroupAliases[g];
				}
		}
	//the default group is the first 
	return m_GroupAliases[0];	
}

//this function is to get js array form vbs and send it back to js function
function AO_String2Array(str)
{
	return Array(str);
}

    function AO_GetCurrentStatePage(boName)
    {
	    return m_primaryXML.selectNodes(m_CurrentBoXpath[boName]);
    }

    function AO_GetBoRowsFromState(xpath,boName)
    {
	    var sXpath = xpath;
	    if(typeof(m_CurrentBoXpath)!="undefined" && typeof(m_CurrentBoXpath[boName])!="undefined")sXpath=m_CurrentBoXpath[boName];
	    return m_primaryXML.selectNodes(sXpath);
    }
    
    //function that check row status
    function AO_IsStatusNew(boAlias,rowNumber,checkServer)
    {
       var status = AO_GetStatus(boAlias,rowNumber) & 4;
       if( checkServer == true )
       {
            status = status|AO_GetServerStatus(boAlias,rowNumber)
       }
       return status
    }
    
    function AO_IsStatusDeleted(boAlias,rowNumber)
    {
       return ((AO_GetStatus(boAlias,rowNumber) & 2) != 0)
    }
    
    function AO_IsStatusUpdated(boAlias,rowNumber)
    {
       return ((AO_GetStatus(boAlias,rowNumber) & 8) != 0)
    }
    
    function AO_GetStatus(boAlias,rowNumber)
    {
        if(rowNumber == null) rowNumber = "1";
        if(boAlias == null) boAlias = "main";
        var nodeObj = m_primaryXML.selectSingleNode("/root/" + boAlias + "/row[@number="+String(rowNumber)+"]");
        if(nodeObj != null) 
        {
            return parseInt(nodeObj.getAttribute("status"));
        }
        return -1;
    }
    
    function AO_GetServerStatus(boAlias,rowNumber)
    {
        if(rowNumber == null) rowNumber = "1";
        if(boAlias == null) boAlias = "main";
        var nodeObj = m_primaryXML.selectSingleNode("/root/" + boAlias + "/row[@number="+String(rowNumber)+"]");
        if(nodeObj != null) 
        {
            return parseInt(nodeObj.getAttribute("serverStatus"));
        }
        return -1;
    }
////////////////////////////
//Tamir Item Value functions
    
    
	function AO_getItemObj(node,boAlias,row){
		if(node == null) return null;
		if(row == null) row = "1";
		if(boAlias == null) boAlias = "main";
		var nodeObj = m_primaryXML.selectSingleNode("/root/" + boAlias + "/row[@number="+String(row)+"]/" + node);
		
		return nodeObj;
	}

	function AO_getItem(node,boAlias,row){
		var nodeObj = AO_getItemObj(node,boAlias,row);
		
		if(nodeObj != null) return nodeObj.text;
	}
	
	function AO_setItem(node,text,boAlias,row){
		var nodeObj = AO_getItemObj(node,boAlias,row);
		if(nodeObj == null) return false;
		if(row == null) row = "1";
		if(boAlias == null) boAlias = "main";		
		if(nodeObj.dataType != null && typeof(text) == "number")
		{
		    nodeObj.nodeTypedValue = text;
		}
		else
		{	
		    nodeObj.text = text;
		}
		SetFieldStatus(nodeObj,"8",boAlias,row-1);
		return true;
	}

	function AO_getObj(inputId){
		var inputObj = document.all(inputId);
		//Evgeny. 13-march-2005 begin fix
		//Check if null before access to this object.
		if(inputObj == null) return null;
		
		if(inputObj.length != null)	
		{
			if (inputObj.type==null )
				inputObj = document.all(inputId)(currRow[currTab]);
		}
		//Evgeny. 13-march-2005 end fix
		
		return inputObj;
	}
	
	function AO_getValue(inputId){
		var inputObj = AO_getObj(inputId);
		if(inputObj == null) return null;
		
		var inputType = inputObj.type;
		if(inputType == "checkbox") return inputObj.checked;
		return inputObj.value;
	}
	
	function AO_setValue(inputId,value){
		var inputObj = AO_getObj(inputId);
		if(inputObj == null) return false;
		var inputType = inputObj.type;
		if(inputType == "checkbox"){
			if(value == "Y" || value == true){
				inputObj.checked = true;
			}
			else{
				inputObj.checked = false;
			}
			inputObj.onchange();
		}
		else{
			inputObj.value = value;
/*			
			if(inputObj.getAttribute("flag_change")=="1"){
				ItemChange(inputObj,inputObj.getAttribute("rowChange")-1);
			}
			else{
*/			
				var eventObj = document.createEventObject();
				var prevDisabledValue = inputObj.disabled;
				inputObj.disabled = false;
				inputObj.fireEvent("onchange",eventObj);
				inputObj.disabled = prevDisabledValue;
				//inputObj.onchange();	
//			}			
		}
		return true;
	}

// Date and time function . Returns current date and time of the computer
function AO_IsFirstDateGreatThanSecond(strDateFirst,strDateSecond)
{
	var strDateFirstDateObj = AO_ConvertDateToDateObject(strDateFirst);
	var strDateSecondDateObj = AO_ConvertDateToDateObject(strDateSecond);
	
	if (strDateFirstDateObj > strDateSecondDateObj )	
		return true;
	else
		return false;
}

function AO_IsFirstDateGreatEqualThanSecond(strDateFirst,strDateSecond)
{
	var strDateFirstDateObj = AO_ConvertDateToDateObject(strDateFirst);
	var strDateSecondDateObj = AO_ConvertDateToDateObject(strDateSecond);
	if (strDateFirstDateObj >= strDateSecondDateObj )
		return true;
	else
		return false;
}

function AO_ConvertTimeToDateObject(strDate)
{
	var str;
	// Convert to the same format "y-d-m"
	var tmpDate = new Date();
	var arr = strDate.split(":");
	
	tmpDate.setHours(arr[0]);
	tmpDate.setMinutes(arr[1]); 
	tmpDate.setSeconds(0);
	
	return tmpDate;
}

function AO_IsDateValid(strDate)
	{
		if ((strDate == null) || (strDate.trim() == ""))
			return false;
		
		try{
			var tmpDate = new Date();
			var str;
			// Convert to the same format "y-d-m"
			var arr = strDate.split("-");
			if (arr.length != 3)
			{
				str = GoInternal(strDate);
				arr = str.split("-");
				if (arr.length != 3)
					return false;
			}
			
			tmpDate.setFullYear(arr[0]);
			tmpDate.setMonth(Number(arr[1]) -1 );
			tmpDate.setDate(arr[2]);
			return true;
		}
		catch(e){return false;}
	}



function AO_ConvertDateToDateObject(strDate)
{
	var tmpDate = new Date();
	strDate = GoInternal(strDate)
	// Convert to the same format "y-d-m"
	var arr = strDate.split("-");
	
	tmpDate.setFullYear(arr[0]);
	tmpDate.setMonth(Number(arr[1]) -1 );
	tmpDate.setDate(arr[2]);
	
	tmpDate.setMinutes(0);
	tmpDate.setHours(0);
	tmpDate.setSeconds(0);
	
	return tmpDate;
}

 

function AO_IsGreatThanNow(strDate)
{
	var tmpDate = AO_ConvertDateToDateObject(strDate);
	var res = tmpDate.CompareTo(new Date());
	if( res > 0 )
		return true
	else
		return false;
}

function AO_IsGreaterOrEqualNow(strDate)
{
	var tmpDate = AO_ConvertDateToDateObject(strDate);
	var res = tmpDate.CompareTo(new Date());
	if( res > -1 )
		return true
	else
		return false;
}

function AO_TodayNowXML()
{
	return AO_TodayXML() +"T"+AO_TimeNowXML();
}
function AO_TimeNowXML()
{
	return (AO_FormatDateTime(AO_Now(),"time") + ":00");
}
function AO_TimeNow()
{
	return (AO_FormatDateTime(AO_Now(),"time"));
}
function AO_TodayXML()
{
	var dt=new Date();	
	var daysOffset = 25569  // Number of days 01/01/1970
	var tmpSecond = 60000;  // one second in millisecond
	var tmpDay = 86400000; //one day in millisecond
	dt=AO_Lng2Date(parseInt(daysOffset + ((dt.getTime()-dt.getTimezoneOffset()*tmpSecond)/tmpDay)));
	return dt;	
}

function AO_ConvertDateObjectToXml(tmpDate,tmpTime)
{
	if (tmpDate == null)
		tmpDate =  new Date();
	
	var hour,minutes,seconds;
	if (tmpTime == null)
	{
		hour=tmpDate.getHours();
		minutes=tmpDate.getMinutes();
		seconds = tmpDate.getSeconds();
	}
	else
	{
		hour=tmpTime.getHours();
		minutes=tmpTime.getMinutes();
		seconds = tmpTime.getSeconds();
	}
	
	hour=hour<10?("0"+hour):hour;

	minutes=minutes<10?("0"+minutes):minutes;

	seconds=seconds<10?("0"+seconds):seconds;
	
	var year = tmpDate.getFullYear();
	var month = tmpDate.getMonth() + 1;
	month=month<10?("0"+month):month;
	var day = tmpDate.getDate();
	day=day<10?("0"+day):day;
	
	return year + '-' + month + '-' + day + 'T' + hour + ':' + minutes + ':' + seconds
}

function AO_ConvertDateObjectToTime(tmpDate)
{
	if (tmpDate == null)
		tmpDate =  new Date();
		
	var hour=tmpDate.getHours();
	hour=hour<10?("0"+hour):hour;
	var minutes=tmpDate.getMinutes();
	minutes=minutes<10?("0"+minutes):minutes;
	return  hour + ':' + minutes ;
}

function AO_ConvertDateObjectToDate(tmpDate)
{
	return AO_UDF(AO_ConvertDateObjectToXML(tmpDate));
}

function AO_ConvertDateObjectToXML(tmpDate)
{
	if (tmpDate == null)
		tmpDate =  new Date();
		
	var dateStr;
	var year = tmpDate.getFullYear();
	var month = tmpDate.getMonth() + 1;
	month=month<10?("0"+month):month;
	var day = tmpDate.getDate();
	day=day<10?("0"+day):day;
	dateStr = year + '-' + month + '-' + day
	return dateStr;
}
	
function AO_RevRGB(ColorsArray)
{
	ColorsArray=ColorsArray.split(",");
	var red=Number(ColorsArray[0]);
	var green=Number(ColorsArray[1]);
	var blue=Number(ColorsArray[2]);
   var res= blue + (green * 256) + (red * 65536);
	res= res.toString(16);
	res="#"+res.toUpperCase();
 
 return res;
}

//get the tab index of the current alias
function AO_GetCurrentTab(alias)
{
	var tmpTab = i;
	for (var i=0;i<m_PageAliases.length;i++)
		if (m_PageAliases[i]==alias){
			tmpTab=i;
			//m_currentRow[currTab]=null;
			break;
		}		
	return tmpTab;
}

//get the array of xsl that build the current alias
function AO_GetPageXslNames(tmpTab,alias)
{
	var xrefNull = false;
	if (m_XrefSpecs[tmpTab]==null) xrefNull=true;
	var objXSLArr=null;
		
	//if (m_action=="new") alias="_TabControl";
	//update by eli harel 23-03-2005
	//get all xsl source for the specified xref
	if (xrefNull || (m_XrefSpecs[tmpTab].xrefPage==null))
	{
		objXSLArr=new Array();
		objXSLArr[0] = "_" + alias + "XSL";
	}
	else if(m_XrefSpecs[tmpTab].xrefPageArr != null)
	{
		objXSLArr=new Array();
		for(var j=0;j<m_XrefSpecs[tmpTab].xrefPageArr.length;j++)
		{
			objXSLArr[j]=m_XrefSpecs[tmpTab].xrefPageArr[j];
		}
	}
	else 
	{
		objXSLArr=new Array();
		objXSLArr[0] = m_XrefSpecs[tmpTab].xrefPage;
	}
	
	return objXSLArr;
}

//check if the current page contain any mandatory fields
function AO_IsPageContainMandatory(alias)
{
	try
	{
		var objXSLArr = AO_GetPageXslNames(AO_GetCurrentTab(alias),alias);
		var index = 0;
		for(;index<objXSLArr.length;index++)
		{
			var res = GetMandatoryFields(objXSLArr[index],0);
			if(typeof(res) != "undefined") break;
		}
		return (index<(objXSLArr.length));
	}
	catch(err)
	{
		return true;
	}
}



function AO_FocusFirstObject(scopeID,caller_function)
{	
	function GetXslName(alias)
	{
		if (m_XrefSpecs[tmpTab]==null) xrefNull=true;	
	}
	AO_CheckXrefPermissions(null);
	AS_TreatUIPermissions(m_currentAlias);	
	
	var object;
	var isImplemented=false;
	try
	{
	//ASAP #IL0402110005
		isImplemented=f_SetFocus(m_currentAlias);
		if (isImplemented) return;
	}catch(e){}
	
	if( m_skipFocusOnFirst )
	{
		m_skipFocusOnFirst = false;
		return;
	}
	if(document.getElementById(m_currentAlias)==null)return;
	var objects = (typeof(m_action)!="undefined"&&(m_action=="maint" || m_action=="new"))?document.getElementById(m_currentAlias).all:_TabControl.all;
	if (scopeID!=null)
	{
		objects=document.getElementById(scopeID);
		if (objects==null) return;
		objects=objects.all;
	}
	var len = objects.length;
	for (var i=0;i<len;i++)
	{
		object=objects[i];
		var tName = object.tagName.trim();
		var cName = object.className.trim();
		
		if (tName.match(/table/ig))
		{
			
			if  ( (object.onclick != null) &&
				  (object.onclick.toString().trim().match(/selectrow/i)) )
			
			{
				
				try{			
					object.focus();
					object.click();
				}catch(e){}
				break;
			}
		}
		
		if ( !(cName.match(/dis/ig)) &&
			 (tName.match(/input|textarea|select/ig)) &&
			 !(cName.match(/sort|checkbox|flat_input/ig)) &&
			 (cName.match(/input_form|input_search|input_date|input_numeric1|input_numeric|/ig)) &&
			 (object.style.visibility != 'hidden') &&
			 (object.style.display != 'none') &&
			 (object.type != 'hidden') &&
			 (object.disabled != true) &&
			 (object.readOnly != true) &&
			 (object.id != null) &&
			 (object.id.trim() != '') 
			)
		{
			try{
				if (scopeID!=null)
				{
					document.getElementById(scopeID).focus();
				}
				object.focus();
				if (!object.type.toLowerCase().match(/select|radio|button|checkbox/ig)
				&& caller_function != "SelectEditableRow")
				{
					
					object.click();
					
				}

			}catch(e){}
			break;
		}
	}
	if(typeof(m_action) != "undefined" && (m_action=="new" || m_action=="maint"))
	{
		//change made for performance issue for pages with large grid 
		//invoke hook function that enable the application to set the
		//part of the page to check for mandatory fields or to ignore 
		//madatory check.
		if(AO_IsPageContainMandatory(m_currentAlias))
		{
			 CheckMandatory(document.all(m_currentAlias),false);
		}
	}
}



function AO_ChangeXsl(alias,path)
{
	m_XSLPath["_"+alias+"XSL"] = path;
	AO_ClearXSLCache(alias);
}
// Clears XSL cache
function AO_ClearXSLCache(type)
{
	try
	{
		type = typeof(type)=="undefined"?"both":type;
		alias = typeof(alias)!="undefined"&&alias!=""?alias:m_currentAlias;
		if(AO_GetPrimaryWindow().top.control_frame.m_XSLCache[_GetCurrentPageName()] != null &&
			AO_GetPrimaryWindow().top.control_frame.m_XSLCache[_GetCurrentPageName()]["_"+ alias+"XSL"] != null)
		{
			if(type.toLowerCase() == "both" || type.toLowerCase() == "xslcache")
			{
				AO_GetPrimaryWindow().top.control_frame.m_XSLCache[_GetCurrentPageName()]["_"+ alias+"XSL"]=null;		
			}
			if(type.toLowerCase() == "both" || type.toLowerCase() == "xsl")
			{
				AO_GetPrimaryWindow().top.control_frame.m_XSL[_GetCurrentPageName()]["_"+ alias+"XSL"]=null;		
			}
		}
	}
	catch(err)
	{/*do nothing*/}
}


//refresh cache
function AO_RefreshXSLCache(setGlobal)
{
	try
	{
	    setGlobal = typeof(setGlobal)=="undefined"?false:setGlobal;
		AO_GetPrimaryWindow().top.control_frame.m_XSL[_GetCurrentPageName()]["_"+ m_currentAlias+"XSL"] = m_primaryXSL;
		var objXSLT=new ActiveXObject('MSXML2.FreeThreadedDOMDocument');
		objXSLT.async = false;
		objXSLT.loadXML(m_primaryXSL.xml);

		objCache   = new ActiveXObject("MSXML2.XSLTemplate");
		objCache.stylesheet = objXSLT;

		AO_GetPrimaryWindow().top.control_frame.m_XSLCache[_GetCurrentPageName()]["_"+ m_currentAlias+"XSL"] = objCache;
		if( setGlobal ) m_primaryXSLCache = objCache;
		
	}
	catch(err)
	{
		AO_ClearXSLCache();
	}
}

function AS_MarkAll_CB(boName,checked,tableName)
{
	var rows=m_primaryXML.selectNodes("//"+boName+"/row");
	tableName = tableName==null?"tblLinks":tableName;
	var len=rows.length,num,row,elm;
	var oTable = document.getElementById(tableName);
	var len = oTable.rows.length;
	for (var i=0;i<len;i++)
	{
	    var row = oTable.rows[i];
	    row.getElementsByTagName("INPUT")[0].checked = checked;
	}
}

function AO_GetCheckBoxOnOffValues(textObj,name)
{
	var value_on="Y",value_off="N";
	var ResultArray=new Array();
	if(validateObj.IsNothing(name)) return null;
	if (textObj.value_on!=null || textObj.value_off!=null)
	{
		if (textObj.value_on!=null)
			value_on=textObj.value_on;
		if (textObj.value_off!=null)
			value_off=textObj.value_off;	
	}
	else
	{
		var cbDDLB=null;
		if( validateObj.IsNothing(m_primaryXML)==false)
		{
			cbDDLB=m_primaryXML.selectSingleNode("//root/ddlb/"+name);
		}
		else
		{
			var xmlDocumentDDLB = document.all("ddlb_xml");
			var len = xmlDocumentDDLB.length;
			for(var i=0;i<len;i++)
			{
				var doc = xmlDocumentDDLB[i].XMLDocument;
				cbDDLB=doc.selectSingleNode("//root/ddlb/"+name);
				if( cbDDLB != null ) break;
			}
		}
		if (cbDDLB!=null) 
		{
			value_on=cbDDLB.getAttribute("on");
			value_off=cbDDLB.getAttribute("off");
		}
	}
	ResultArray["on"]=value_on;
	ResultArray["off"]=value_off;
    return ResultArray;
}

function AO_LoadNextState(prev,voiceIndication,reloadPage)
{
	m_RealoadPage = validateObj.IsDefined(reloadPage)?true:reloadPage;
	if (prev==null) prev=false;	
	if (voiceIndication==null) voiceIndication=true;
	var len=1, curr=1;
	if(validateObj.IsNothing(m_primaryXML)) return;
	var sMainBoName = "main";
	try
	{
	    sMainBoName = m_pageBOs[0].split(":")[0];
	}
	catch(err)
	{/*do nothing*/}
	try
	{
		if (_GetGlobalVar("cacheBCName")!=null)
		{
			var cacheObj=_GetGlobalVar("cacheBCName");
			var cacheXML=_GetGlobalVar("cacheXML");
			if (!validateObj.IsNothing(cacheXML) && cacheObj==m_BCName)
			{
				//check the cache xml type if string or xml document object
				if( typeof(cacheXML) == "String" )
				{
					var len=cacheXML.length;
					cacheXML=cacheXML.substring(9,len-3);
					var xmlObj=new ActiveXObject("microsoft.xmldom");
					xmlObj.loadXML(cacheXML)
				}
				else
				{
					xmlObj = cacheXML;
				}
				if (xmlObj != null && xmlObj.xml != "")
				{
					var primaryKeyName="";
					//alert(primaryKeyName);
					var primaryKeyValue=null;
					var xmlNode=null;
					primaryKeyName = validateObj.InvokeHook("AO_GetCustomerPrimaryKeyName");
					if(primaryKeyName == "" || primaryKeyName == null) primaryKeyName = m_primaryXML.selectSingleNode("/root/"+sMainBoName).getAttribute("primaryKeys");
					try
					{
					    primaryKeyValue=m_primaryXML.selectSingleNode("/root/"+sMainBoName+"/row/"+primaryKeyName);
					    //alert("/root/row["+primaryKeyName+" $eq$ '" + primaryKeyValue.text+"']");
					    xmlNode=xmlObj.selectSingleNode("/root/row["+primaryKeyName+" $eq$ '" + primaryKeyValue.text+"']");													
					}catch(err){/*do nothing*/}
					//if the current primary key is not the real key that used for retrieve
					if(xmlNode == null)
					{
				        //get the node name from the xml cache, this node name is the primary key
				        primaryKeyName = xmlObj.selectSingleNode("/root/row/node()[text() $eq$ '"+m_objParamsBuilder.macroParams[0]+"']").nodeName;
				        primaryKeyValue=m_primaryXML.selectSingleNode("/root/"+sMainBoName+"/row/"+primaryKeyName);
				        xmlNode=xmlObj.selectSingleNode("/root/row["+primaryKeyName+" $eq$ '" + m_objParamsBuilder.macroParams[0]+"']");													
					}
					if (primaryKeyValue!=null && primaryKeyValue.text!="")
					{
						var returnArray=new Array();
						
						if (xmlNode!=null) 
						{		
							var prevXmlNode,nextXMLNode=xmlNode;					
							
							 if (!voiceIndication)
							{
								var rows=xmlObj.selectNodes("/root/row");
								len=rows.length;
								var row;
								var i=0;
								for (i=0;i<len;i++)
								{
									row=rows[i];
									if (row.getAttribute("number")!=null && row.getAttribute("number")!="") break;
									row.setAttribute("number",i+1);
								}
								returnArray["current_record_number"]=xmlNode.getAttribute("number");
								prevXmlNode=xmlNode.previousSibling;
								nextXMLNode=xmlNode.nextSibling;
								if (prevXmlNode!=null && prevXmlNode.nodeName=="row")
									returnArray["prev_value"]=prevXmlNode.selectSingleNode(primaryKeyName).text
								else 
									returnArray["prev_value"]="N/A"
								if (nextXMLNode!=null && nextXMLNode.nodeName=="row")
									returnArray["next_value"]=nextXMLNode.selectSingleNode(primaryKeyName).text
								else 
									returnArray["next_value"]="N/A"	
								returnArray["result"]=true;
								returnArray["record_count"]=len;									
								return returnArray;														
							}
							else
							{
								if (prev)
								{
									xmlNode=xmlNode.previousSibling;
								}
								else
								{
									xmlNode=xmlNode.nextSibling;
								}
//								try
//								{
//									var rowIdStr = _GetGlobalVar("ScrollerRowID");
//									if(	validateObj.IsDefined(rowIdStr) )
//									{
//										var rowId = parseInt(rowIdStr.split("_")[1]);
//										if (prev) rowId--;
//										else rowId++;
//										rowIdStr = rowIdStr.split("_")[0]+"_"+rowId;
//									}
//									_SetGlobalVar("ScrollerRowID",rowIdStr);
//								}
//								catch(err)
//								{/*do nothing*/}
								if (xmlNode!=null && xmlNode.nodeName=="row")
								{
									if (voiceIndication)
									{
									    _SetGlobalVar("ScrollerRowID",xmlNode.getAttribute("number"));
										var newPKValue=xmlNode.selectSingleNode(primaryKeyName).text;
										var action=_GetGlobalVar(_GetPageName(document.location.href));
										if (action!=null && action!="")
										{	
											action=unescape(action);
											action=action.replace(primaryKeyValue.text, newPKValue);
										}
										else
										{
											action="action=retrieve&where_cond="+newPKValue;
										}
										//alert(newPKValue);
										//alert(_GetPageName(document.location.href) + "?action=retrieve&where_cond="+newPKValue);
										_SetGlobalVar("Module_GroupAlias",m_curGroupAlias);			
										_SetGlobalVar("Module_PageAlias",m_currentAlias);												
										_OpenWindowEx(_GetPageName(document.location.href) + "?"+action);
										m_RealoadPage = true;
									}
								}
								else 
								{
									if (voiceIndication)
										WriteError("record not exist");
									else
										return false;							
								}
							}
						}
						else if (voiceIndication) alert("AO_LoadNextState():xmlNode is null");
					}
				}
				
			}
		}	
		return false;	
	}
	catch(e)
	{
		if (voiceIndication) WriteError("AO_LoadNextState():General error:"+e.description);
		return false;
	}				
	return false;				
}

function AO_LoadPreviousState()
{
	AO_LoadNextState(true,true);
}


function AO_SaveCacheHistory(BCName,XMLString,field,order)
{
	if(typeof(XMLString) == "object" )
	{
		var xmlObj = XMLString;
		var sortNode=xmlObj.selectSingleNode("/root/Sort");
		var sortField=validateObj.IsDefined(field)?field:null;
		var sortOrder=validateObj.IsDefined(order)?order:null;
		
		if (sortNode!=null)
		{
			sortField=sortNode.getAttribute("order");
			sortOrder=sortNode.getAttribute("sort");
		}
		
		if (sortField!=null)
		{
		    var fieldArr = field.split("@");
		    var sortExpression = "";
		    var sortOrder=(sortOrder=="+"?"ascending":"descending");
			
		    for(var index=0;index<fieldArr.length;index++)
		    {
		        sortExpression += String.prototype.Format("<xsl:sort select='{0}' order='{1}'/>",fieldArr[index],sortOrder);
		    }
			
			var xmlSortTrans='<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">'+
				'<xsl:output method="xml"/>'+
				'<xsl:template match="@*|node()">'+
				'<xsl:copy><xsl:apply-templates select="@*|node()" /></xsl:copy>'+
				'</xsl:template>'+
				'<xsl:template match="root"><xsl:copy><xsl:apply-templates select="@*"/><xsl:apply-templates select="node()">'+
				sortExpression+'</xsl:apply-templates></xsl:copy></xsl:template>'+
				'<xsl:template match="row"><xsl:copy><xsl:apply-templates select="@status"/><xsl:apply-templates select="node()">'+
				'</xsl:apply-templates></xsl:copy></xsl:template>'+
				'</xsl:stylesheet>'
			var objSortXSL=new ActiveXObject ("microsoft.xmldom");
			objSortXSL.async=false;
			objSortXSL.loadXML(xmlSortTrans);
			var objResult=new ActiveXObject ("microsoft.xmldom");
			xmlObj.transformNodeToObject(objSortXSL,objResult);
		}	
		//XMLString = xmlObj.xml;
		_SetGlobalVar("cacheXML",objResult);
	}
	else if(typeof(XMLString) == "String" )
	{
		_SetGlobalVar("cacheXML","<![CDATA["+XMLString+"]]>");
	}
	_SetGlobalVar("cacheBCName",BCName);
}

function AO_DisplayNavigationButtons()
{
	try
	{
		var elmNav=document.getElementById("next_prev_state_nav_tr");
		if (elmNav==null) return;
		elmNav.style.display="none";
		var res=AO_LoadNextState(true,false,false);
		var elmPrev=document.getElementById("prev_state_nav_btn");
		var elmNext=document.getElementById("next_state_nav_btn");
		var elmText=document.getElementById("state_nav_text_td");
		if (typeof(res)!="object")
		{
			if (elmPrev!=null)
			{
				__DisableElment(elmPrev,elmPrev.tagName.toLowerCase());		
				elmPrev.style.filter="alpha(opacity=50)";
			}
			if (elmNext!=null)
			{
				__DisableElment(elmNext,elmNext.tagName.toLowerCase());		
				elmNext.style.filter="alpha(opacity=50)";		
			}
			if (elmText!=null)
				elmText.innerText="1/1";
		}
		else
		{
			if (elmText!=null)
			{
				var str="";
				if (res["current_record_number"]!=null && res["record_count"]!=null)
				{
					str=res["current_record_number"]+"/"+res["record_count"];
					elmText.innerText=str;
				}
			}		
			if (elmNext!=null)
			{
				
				if (res["next_value"]!=null && res["next_value"]!="N/A")
				{
					elmNext.title=res["next_value"];
					elmNext.style.filter="";
					__EnableElement(elmNext,elmNext.tagName.toLowerCase());
				}
				else
				{
					__DisableElment(elmNext,elmNext.tagName.toLowerCase());		
					elmNext.style.filter="alpha(opacity=50)";											
				}
			}
			if (elmPrev!=null)
			{
				
				if (res["prev_value"]!=null && res["prev_value"]!="N/A")
				{
					elmPrev.title=res["prev_value"];
					elmPrev.style.filter="";
					__EnableElement(elmPrev,elmPrev.tagName.toLowerCase());
				}
				else
				{
					__DisableElment(elmPrev,elmPrev.tagName.toLowerCase());		
					elmPrev.style.filter="alpha(opacity=50)";											
				}
			}
			
		}
		if (elmText.innerText!="1/1") elmNav.style.display="";
	}
	catch(e){alert("AO_DisplayNavigationButtons(): general error")}
}

function AO_SyncWindowsState(stateXML)
{
    m_primaryXML.loadXML(stateXML);
    _primaryXML.XMLDocument = m_primaryXML;
	CreateXMLDOM(true);
	return true;
}
//-- new functionality for ILOG
function AO_BOPagging()
{
    var _NextResultDelagte = null;
    var _ErrorDelagte = null;
    var _boName = "";
    var _macroName = "";
    var _params = null;
    var _xmlRequest = "";
    var _recordLimit;
    var _totalRetrieved = 0;
    var _totalRecords = 0;
    var _message = "";
    this.OnNextResult = function (functionHandler)
    {        
        if(typeof(functionHandler) == "string" )
        {
            _NextResultDelagte = function(rowsXML,status)
            {                
                return eval(String.prototype.Format("{0}({1},{2})",functionHandler,"rowsXML","status"));
            }
        }
        else if(typeof(functionHandler) == "function" )
        {
            _NextResultDelagte = functionHandler;
        }
    }
    
    this.OnError = function (functionHandler)
    {
        if(typeof(functionHandler) == "string" )
        {
            _ErrorDelagte = function(rowsXML,status)
            {
                eval(String.prototype.Format("{0}({1})",functionHandler,"error"));
            }
        }
        else if(typeof(functionHandler) == "function" )
        {
            _ErrorDelagte = functionHandler;
        }
    }
    this.GetFirstBOPage = function (boName,macroName,params,message,fromRecordNumber,recordLimit)
    {              
        try
        {
            _boName = boName;
            _macroName = macroName;
            _params = params;            
            _message = "Getting " + (message==null?boName:message) + " {0}";
            window.status = String.prototype.Format(_message,"...");
            _xmlRequest = String.prototype.Format("<root xmlns:dt='urn:schemas-microsoft-com:datatypes'><GetCurrentState pageName='{0}' stateID='{1}'>",_GetCurrentPageName(),m_StateID);
	        _xmlRequest += String.prototype.Format("<BO alias='{0}'></BO></GetCurrentState></root>",boName);	   
            _totalRetrieved = fromRecordNumber==null?0:fromRecordNumber;
            _recordLimit = recordLimit==null?100:recordLimit;
           
            SOAP_InteractWithServerAsync2(macroName,
                                          boName,
                                          params,
                                          "",
                                          _xmlRequest,
                                          _totalRetrieved,
                                          _recordLimit,
                                          false, 
                                          false,
                                          "m_BOPagging.EndInvoke");
        }
        catch(err)
        {
            alert(err.description);
        }
    }
    
    
    this.EndInvoke = function (SOAPResult)
    {   
        try
        {            
            if(SOAPResult != null && SOAP_IsError(SOAPResult))
            {	
                if(AO_CheckSessionTimeOut(SOAPResult)) return;
                var errorMsg = SOAP_Format_Error_Message(SOAPResult)
                var showError = _ErrorDelagte(errorMsg);
                if(showError) WriteError(errorMsg);
                return;
            }	
            var tmp_PrimaryXML = SOAP_Get_XMLObj(SOAPResult);
            var tmpXML = tmp_PrimaryXML.xml;
            var oNode = m_primaryXML.selectSingleNode(String.prototype.Format("/root/{0}",_boName));
            var oTmpNode = tmp_PrimaryXML.selectSingleNode(String.prototype.Format("/root/{0}",_boName));            	
            var nodesCollection = oTmpNode.selectNodes("row");	 
            var rowNumbers = nodesCollection.length;
            _totalRecords = parseInt(oTmpNode.getAttribute("totalRows"));                     
            if (oNode != null)
            {
                for(var index=0;index<rowNumbers;index++)
                {
                    oTmpNode = nodesCollection[index];
                    oNode.appendChild(oTmpNode);	
                }
            }
            else
            {                                
                m_primaryXML.documentElement.appendChild(oTmpNode);
            }
            var status = "";
            _totalRetrieved += rowNumbers;
            var continueFetching = (_totalRetrieved < _totalRecords);
            status = continueFetching?"progress":"complete";            
            continueFetching = _NextResultDelagte(tmpXML,status);	
            if(continueFetching)
            {            
                window.status = String.prototype.Format(_message,String.prototype.Format("{0}/{1} ...",_totalRetrieved,_totalRecords));                       
                GetNextBOPage();
            }
        }
        catch(err)
        {
            alert(err.description);
        }
    }
    
    function GetNextBOPage()
    {                
        var remainedRecord = _totalRecords-_totalRetrieved;
        if(remainedRecord<=(_recordLimit*1.5)) _recordLimit = -1;        
        SOAP_GetStateUIAsync2(_xmlRequest, (_totalRetrieved+1), _recordLimit,"m_BOPagging.EndInvoke");
    }
}


//for fixing note attach asterisk.
function RetrieveAp_AttachXrefCnt(tablename,tablekey,attachNumber){
    var err;
    var strFields = new Array();
    var strValues = new Array();
    var strTypes = new Array();
    var strOperators = new Array();           
    var currentPageNum = 1;
    var cnt=0;
    strFields[0] = "a_table_name"; 
    strFields[1] = "a_table_key";  
    strValues[0] = tablename;
    strValues[1] = tablekey;                    
    strTypes[0] = "argument";
    strTypes[1] = "argument";
    strOperators[0] = "=";
    strOperators[1] = "=";
    var m_searchString=BuildXML4Search("notes", "RetrieveNotesModuleXrefCnt", strFields, strValues,strTypes,strOperators,currentPageNum);  
    var SOAPResult=SOAP_RetrieveXML(m_searchString);
    if (SOAP_IsError(SOAPResult))
    {
     WriteError(SOAP_Format_Error_Message(SOAPResult));
     return 0;
    }

    var retXML = SOAP_Get_XMLObj(SOAPResult);
    cnt = retXML.selectNodes("root/row").length;
    if (cnt>0)
    {
    return cnt;
    }
    else
    {
    cnt = 0;
    return cnt;
    }
}

function RetrieveAp_AttachCnt(tablename,tablekey)
{
    var err;
    var strFields = new Array();
    var strValues = new Array();
    var strTypes = new Array();
    var strOperators = new Array();
    var currentPageNum = 1;
    var cnt=0; 
    strFields[0] = "a_table_name"; 
    strFields[1] = "a_table_key";  
    strValues[0] = tablename;
    strValues[1] = tablekey; 
    strTypes[0] = "argument";
    strTypes[1] = "argument";   
    strOperators[0] = "=";
    strOperators[1] = "="; 
    var m_searchString=BuildXML4Search("ap_attachments", "RetrieveAttachmentsCount", strFields, strValues,strTypes,strOperators,currentPageNum);  
    var SOAPResult=SOAP_RetrieveXML(m_searchString); 
    if (SOAP_IsError(SOAPResult))
    {
        WriteError(SOAP_Format_Error_Message(SOAPResult));
        return 0;
    }
    var retXML = SOAP_Get_XMLObj(SOAPResult);	
    cnt = retXML.selectNodes("root/row").length;
    if (cnt>0)
    {
		return cnt
    }
    else
    {
		cnt = 0;
		return cnt;
    }
	
}
//ASAP IL0711050006 rollback all changes related to the attachment count US028432 BHunter(03.16.07)
function UpdateAttachmentCount(tablename,tablekey,attachmentCount)
{
    if ((tablename == null)||(tablename == ""))
    {
       var col_array=tablekey.split("^");
       tablename = col_array[0];
       tablekey = col_array[1];
    }
    var _ApAttachmentCount = Number(RetrieveAp_AttachCnt(tablename,tablekey));
    var _ApAttachXrefCount = Number(RetrieveAp_AttachXrefCnt(tablename,tablekey));
    var CountToUpdate = _ApAttachXrefCount - _ApAttachmentCount;
    var cnt = Number(attachmentCount);
    if (CountToUpdate > 0 )
	{
	    cnt = cnt + CountToUpdate;
	    return cnt;
	}
	else
    {
	    return cnt;
	}	
}

