
var NEW_VERSION =1;
/****************************************************************************/	

//---- Toolbar Buttons Constants -----
var tbcEXIT             = 1050007;
var tbcBACK             = 1050001; 
var tbcREFRESH          = 1050002;
var tbcSEND_AS_TASK     = 1050003;
var tbcADD_TO_FAVORITES = 2906;

//---- Feedbacks Constants -----
var fcSUCCESS = 1090003;
var fcFAIL    = 1090005;
var fcNO_CHANGES_HAVE_BEEN_MADE = 1090031;
var fcDELETE = 1090050;
var fcDATA_CHANGED = 1090002;
var fcNEW_OBJECT = 1090036;
var fcPERMISSION_DENIED = 1090010;
var fcGENERAL_DELETE = 171090003;
//---- Actions Constants For Execute -----
var acUPDATE = 3;
var acDELETE = 2;
var acSAVE   = 1;

//---- Actions Permissions Used for checking permissions on operations!
var pUPDATE = 2;
var pDELETE = 4;
var pCREATE = 1;

//--- ToolbarActions Used for disabling/enabling buttons
var tbaCREATE = 1;
var tbaDELETE = 2;
var tbaUPDATE = 3;
var tbaREAD = 4;


//---- Datatypes -------------------------
var dtADDRESS = '22';
var dtOBJECT_BROWSER	= '24';
var dtDATE = '7';

var m_aWindowsToSave = new Array();
	
function catchKeys()
{
	var bPermissionDenied = false;
	
	if(m_oClient == null)	return;
	
	if(window.event.ctrlKey)
	{									
		if(event.keyCode== 83) //save
		{
			var iAction = m_ObjectID>-1 ? pUPDATE : pCREATE;
			if (canI(iAction))
				m_oClient.Save();
			else
				bPermissionDenied = true;
			
		}
		if(event.keyCode== 78) //new
		{
			if (canI(pCREATE))
				m_oClient.New();
			else
				bPermissionDenied = true;
		}
		
		if(event.keyCode== 68) //delete
		{
			if (canI(pDELETE))
				m_oClient.Delete();
			else
				bPermissionDenied = true;
		}
		//window.event.returnValue = true;
		//alert(window.event.ctrlKey)
		if(bPermissionDenied==true) Msgbox(fcPERMISSION_DENIED);
		return true;
	}
}

		
function initClient(SaveAction,CheckFrames,GridToRefresh)
{
	m_oClient = new Client(m_ObjectID,m_ClassID,m_PageID,SaveAction,CheckFrames,GridToRefresh);
	m_oClient.Onload();
	document.body.attachEvent('onkeydown' ,catchKeys)
}

function getClient()
{
	return m_oClient;
}

function ClientChangeSaveAction(MethodID)
{
	this.SaveAction = MethodID;
}
	
function ClientTakeADPOnly()
{
	return(this.SaveADPOnly);
}

function ClientSetADPFlag(state)
{
	this.SaveADPOnly = state;
}
	
function ClientOnload()
{
	var sClassName;
	if(m_oClient.ObjectID == -1)
	{
		disableAction(tbaCREATE);
		disableAction(tbaDELETE);						
		
		sClassName = new Array();
		sClassName[0]= new String();
		sClassName[0] = m_sClassName;
		//Msgbox(fcNEW_OBJECT,sClassName)
		m_bCanNavigate=false;
	}
	
	if(typeof(privateOnload)=="function")
		privateOnload();
}

function ClientNew()
{
	var bResult = true;

	if(m_ObjectID==-1) return;
	
	if(hasDataChanged())
	{
		if(Msgbox(fcDATA_CHANGED))
		{
			var iAction = m_ObjectID>-1 ? pUPDATE : pCREATE;
			if (canI(iAction))
				bResult = m_oClient.Save();
		}
	}		
	
	if(bResult) reloadGeminiWindow(-1);
}

function ClientExit()
{
	var bResult = true;
	
	if(hasDataChanged())
		if (Msgbox(fcDATA_CHANGED))  // DOES THE USER WISH TO SAVE CHANGES
			bResult = m_oClient.Save();// SAVE
	
	if(bResult) 
	    closeWindow(true);		
}

function ClientPrint()
{
}
	
function ClientMultiDelete(FeedbackID)
{
	var arrSelection;
	var params=new Array();
	var oGrid = null;
	var iIndex;
	var sSelectedIDs="";
	var iSelectionLength;
	
	var Response;
	var ResponseArguments;
	var arrItemsNames;
	var ltempID;
	var sName;


	var oGrid = getGrid();
	arrSelection = oGrid.GetSelection();
	
	oGrid = getGrid();
	iSelectionLength = arrSelection.length;
	
	if(iSelectionLength <= 0)
	{
		Msgbox(1090023);
		return;
	}	
	
	if (!Msgbox(fcDELETE))
	{
		oGrid.MarkAll(false);
		return;
	}
		
	for (iIndex=0 ; iIndex< iSelectionLength ; iIndex++)
	{
		if( iIndex > 0 )
			sSelectedIDs += ",";
		sSelectedIDs += arrSelection[iIndex].ldbId ;
	}
			
	params[0]=new brokerParam("IDS", sSelectedIDs);
	Response = sendThroughBroker(this.ClassID, acDELETE, params);
	
	if(typeof(privateMultiDeleteResponse)=="function")
		privateMultiDeleteResponse(Response);
	else
	{
		if (Response.getResult())
		{
			Msgbox(1090003);
		}
		else
		{
			ResponseArguments = Response.getArguments();
			
			arrItemsNames=new Array();
			arrItemsNames[0]=new String();
			iSelectionLength = ResponseArguments.Count();
					
			for(iIndex=0 ; iIndex < iSelectionLength ; iIndex++)
			{ 
				if (iIndex>0) 
				    arrItemsNames[0] += '\n';
						
				ltempID = ResponseArguments.Item(iIndex).getValue();						
				
				sName  = oGrid.GetItem(ltempID,'NAME');
				if (sName.length == 0)
				    sName  = oGrid.GetItem(ltempID,'NO');
				
				arrItemsNames[0] += sName;	
			}
			//var iMessage = (Response.getFeedback()  == -1) ? fcGENERAL_DELETE : Response.getFeedback() ;
			var iMessage = (FeedbackID == null) ? fcGENERAL_DELETE : FeedbackID;
			Msgbox(iMessage,arrItemsNames);
		}
		refreshNow(false);
	}
}


function ClientDelete()
{
	var Response;
	var iIndex=0;
	var oParameters = new Array();
	
	if (this.ObjectID==-1) 
	{
		closeWindow(false);
		return;
	}
	
	if (!Msgbox(fcDELETE)) 
	    return;

	oParameters[0] = new brokerParam("ID", this.ObjectID);
	if (typeof(privateXmlDelete)=="function")
		privateXmlDelete(oParameters);
	
	Response = sendThroughBroker(this.ClassID,acDELETE,oParameters);		
		
	if(typeof(privateDeleteResponse)=="function")
		privateDeleteResponse(Response);
	else
	{
		if(handleResponse(Response)) 
		    return;
		
		if (Response.getResult())
		{				
			if(typeof(privateGetDeleteResponse)=="function")
				privateGetDeleteResponse(Response);
		
			if(window.opener)
				if (!window.opener.closed)								
					refreshOpener(false,true);			
			
			closeWindow(false);			
		}
		else
		{
			var iMessage = (Response.getFeedback()  == -1) ? fcFAIL : Response.getFeedback() ;
			Msgbox(iMessage);
		}
	}
}	
		
function ClientSave(oParameters)
{
	var oResponse;
	var iIndex = 0,iRequestsIndex=0;
	var iWindowsLength;
	var iMethod;
	var oRequest = null;
	var iMethod;	
	
	if(!this.Validate()) return false;

	if (!hasDataChanged() &&  this.ObjectID>0)
	{				
		Msgbox(fcNO_CHANGES_HAVE_BEEN_MADE);
		return true;
	}			
	oRequest = this.Retreive(oParameters);
		

	// check for iframes - and retrieve data from them 
	if (typeof(m_oLinkFramePairs) == 'object' && this.CheckFrames==true) 
	{
		for (var iIndex=0;iIndex<m_oLinkFramePairs.length;iIndex++)
		{
			sFrameName  = 'Frame' + m_oLinkFramePairs[iIndex].Frame;
			try
			{					
				if (frames(sFrameName).m_oClient!=null)
					oRequest.Add(frames(sFrameName).m_oClient.Retreive(oParameters));
			}
			catch(e){}
		}
	}	
			
	//oResponse = sendThroughBroker(this.ClassID,iMethod,oRequest);
	oResponse = SendRequestThroughBroker(oRequest)

	return (this.Response(oResponse));		
}


function ClientValidate()
{		
	if (!validateFields(this.PageID)) return false;
	//--- Additional Validation (private) ----
	if(typeof(privateValidate)=="function")		
		if (!privateValidate()) return false;	

	// check for iframes - and validate the data
	if (typeof(m_oLinkFramePairs) == 'object' && this.CheckFrames==true) 
	{
		for (var iIndex=0;iIndex<m_oLinkFramePairs.length;iIndex++)
		{
			sFrameName  = 'Frame' + m_oLinkFramePairs[iIndex].Frame;
			try
			{
				if (frames(sFrameName).m_oClient!=null)
					if(!frames(sFrameName).m_oClient.Validate(frames(sFrameName).m_oClient.PageID)) 
					    return false;
			}
			catch(e){}
		}
	}	
	return true;
}

function ClientGetXML(oParameters)
{
    //--- Get Additional XML (private) ----
	if(typeof(privateXML)=="function")
		privateXML(oParameters);	
			
	//---- Build XML and  return the Parameters ----
	buildXML(oParameters);									
	
	//--- Get Custom Form XML 
	if(typeof(getCustomFormData) == "function")
		getCustomFormData(oParameters);
}

function ClientGetRawXML(oParameters)
{						 
	buildXML(oParameters, true);									
}

function getSpecialElements(oRequest)
{
	
	
	//Get Special Elements - ClientGrid
	if(typeof(m_arrClientGrid) != 'undefined')
		if(m_arrClientGrid != null)
			for(var i=0 ; i < m_arrClientGrid.length ; i++)
				m_arrClientGrid[i].getXml(oRequest)
	
	// Special Element - Address
	/*if(typeof(m_arAddresses)!='undefined')
	{
		if(m_arAddresses!=null)
		{
			for(var i=0 ; i < m_arAddresses.length ; i++)
			{
				//oRequest.Add(m_arAddresses[i].GetRequest());
				m_arAddresses[i].getAddressXml(oRequest)
			}
		}
	}*/
}


function ClientRetreive(oParameters)
{							
	if (oParameters == null)
	    oParameters = new Array();
	
	var Arguments;		
	var oParameter;
	var index=0;
	var iMethod =   ((this.SaveAction==-1) ?  ((this.ObjectID==-1) ? acSAVE : acUPDATE) : this.SaveAction);				
	var oRequest = createBrokerRequest(this.ClassID,iMethod)

	//--- Get XML For Save ----
	this.GetXML(oParameters);	 
	Arguments = oRequest.getArguments();
	
	if (oParameters!=null)
		while (index < oParameters.length)
		{
			oParameter = oParameters[index];
			Arguments.Add(oParameter.name, oParameter.value + '');
			index++;
		}
	else
		Arguments.Add('Broker', 'Broker');
	
	getSpecialElements(oRequest);

	return oRequest;
}

function ClientResponse(oResponse)
{
	var bResult = false;
	var sFrameName;
		
	//--- First Send the Response object to private handling if exists
	if(typeof(privateResponse)=="function")
		bResult = privateResponse(oResponse);
	else
		bResult = ClientHandleResponse(oResponse);			
	return(bResult);
}


function ClientSendTask()
{
	var oTempAttch,oCollec;

	oCollec=new Collection();
	oTempAttch=new Attachment(-1,this.ClassID,this.ObjectID);
	oCollec.Add(oTempAttch);
	oTempAttch=null;
	
	sendAsTask(oCollec, m_sClassName + ": " + m_sInstanceName);
}

function ClientWellFormJavaScript(value)
{	
	//value = geminiReplaceAll(value, '"', '\\"');
	//value = geminiReplaceAll(value, "'", "\\'");
	return(value);
}
		
function ClientHandleResponse(oResponse,doStep)
{
	var Arguments,iMethod;
	var bResult=true;
	var oHeader;						
	Arguments = oResponse.getArguments();
		
	if(handleResponse(oResponse)) return(false);

	if(doStep!=null)
		doStep=doStep;
	else
		doStep = 3;
		
	bResult = oResponse.getResult();
	if (bResult)
	{			 
		if(doStep!=2)// doStep=1 
		{
			if(m_oClient.ObjectID == -1)  
			{
				m_ObjectID = oResponse.getObjectID();	
				m_oClient.ObjectID = m_ObjectID;				

				if(m_bApplyContext)	
					m_VirtualParentObjectID = m_ObjectID;
					
				enableAction(tbaCREATE);
				enableAction(tbaDELETE);
				
				m_bCanNavigate = true;
			}
			
			m_sInstanceName = ClientWellFormJavaScript(oResponse.getObjectName());
			/*
			oHeader = getDomElement('PageHeaderLabel');
			if (oHeader != null && m_sInstanceName!="")
			{					
				oHeader.innerHTML = m_sInstanceName;
			}					
			*/
			initHistory();
			
			if (typeof(m_oLinkFramePairs) == 'object' && this.CheckFrames==true) 
			{
				for (var iIndex=0; iIndex<m_oLinkFramePairs.length ;iIndex++)
				{
					sFrameName  = 'Frame' + m_oLinkFramePairs[iIndex].Frame;
					try
					{
						if (frames(sFrameName).m_oClient!=null)
							bResult = frames(sFrameName).m_oClient.Response(oResponse);
					}
					catch(e){}
				}
			}	
			
		}
		
		if(window.opener)
		{
			if (m_oClient.Refresh)
			{
				if (!window.opener.closed && (doStep >= 2) )	// doStep=2															
				{
					if (m_oClient.GridToRefresh != -1 && isInteger(m_oClient.GridToRefresh))
					{
						var oGrid = window.opener.getGridByID(m_oClient.GridToRefresh);
						if (null != oGrid)
							oGrid.Refresh();
									
					}
					else					
						refreshOpener();
				}
			}
		}
		Msgbox(fcSUCCESS);   
	}
	else
	{		
		var iFeedback = oResponse.getFeedback();			
		var iMessage = (iFeedback <= 0) ? fcFAIL : iFeedback;			
		Msgbox(iMessage);			 
	}
	
	return(bResult);
}



function buildXML(oParameters, TakeADPOnly)
{
	var item,itemsCount;
	var form,formsIndex;
	var findex;
	var iindex;
	var sXmlName;		
	var jIndex = oParameters.length;
	var bIsMultiMeasurment;
	var arrRadio;
	var lRadioLength;
			
	TakeADPOnly = (TakeADPOnly == null ? false : TakeADPOnly);
	TakeADPOnly = (m_oClient.TakeADPOnly() || TakeADPOnly);

	formsIndex = window.document.forms.length;
	for(findex=0 ; findex<formsIndex ; findex++)
	{
		form = window.document.forms.item(findex);
		itemsCount = form.elements.length;

		for(iindex=0 ; iindex<itemsCount ; iindex++)
		{
		    item = form.elements.item(iindex);
			sXmlName = item.getAttribute("XML_NAME");
			
			if (((!TakeADPOnly) && (sXmlName == null || (trim(sXmlName)=="") || item.id =="ADDITIONAL_DATA" || item.getAttribute("ADDITIONAL_DATA") == "1")) || sXmlName == "noSubmit")
				continue;
			
			if(item.type=="checkbox")
				sValueToPass = item.checked ? 1 : 0;
			else if(item.type=="radio")
			{
				if(item.getAttribute("RETRIEVED")=="1")
					continue;
					
				arrRadio = document.getElementsByName(item.name);
				lRadioLength = arrRadio.length;
				for(var i=0 ; i<lRadioLength ; i++)
				{
					arrRadio[i].setAttribute("RETRIEVED","1");
					if(arrRadio[i].checked)
						sValueToPass = arrRadio[i].value;
				}
			}	
			else
			{
			    if (item.getAttribute("DATATYPE"))
			    {
			        switch (item.getAttribute("DATATYPE"))
			        {
			            /*case 'NUMBER' : 
			            case '3':       //adInteger
			            case '5':       //adDouble
			            case '20':      //adBigInteger
			            case '131':     //adNumeric							
			            //bIsMultiMeasurment = eval(item.getAttribute("IS_MULTI_MEASURMENT"));					
			            //if (bIsMultiMeasurment!=null)
			            //sValueToPass = ConvertToServerUnits(getDomElement(item.name));
			            //else
			            sValueToPass = item.value;
			            break;	*/ 

			            case 'DATE':
			            case dtDATE:    //adDate	
			                sValueToPass = ConvertToServerFormat(getDomElement(item.id).value);
			                if (sValueToPass == "null") sValueToPass = "";
			                break;
			            case dtADDRESS:
			            case dtOBJECT_BROWSER:
			                {
			                    // temporary fix for FF, needs investigation why getAttribute is not always working.
                                if (item.NUMERIC_VALUE == undefined || typeof (item.NUMERIC_VALUE) == 'undefined')
                                    sValueToPass = item.getAttribute("NUMERIC_VALUE");
                                else
                                {    
    		                        sValueToPass = item.NUMERIC_VALUE;
    		                    }
			                    break;
			                }
			            default:
			                sValueToPass = item.value;
			                break;
			        } // end switch
			    }
			    else
			    {
			        sValueToPass = item.value;			       
			    }
			}
			
			if(TakeADPOnly)
			{
			

				if(item.getAttribute("ADDITIONAL_DATA") == "1")
					oParameters[jIndex++] = new brokerParam(sXmlName, sValueToPass, item.DATATYPE);
			}
			else
				oParameters[jIndex++] = new brokerParam(sXmlName, sValueToPass);
			
		} // end For loop
		
	} // end For loop

	oParameters[oParameters.length] = new brokerParam("ID", m_oClient.ObjectID);
	
	/*if((!TakeADPOnly) && (typeof(getAdditionalDataArgument)=="function"))
	{debugger
		oParameters[oParameters.length] = new brokerParam("ADDITIONAL_DATA",getAdditionalDataArgument());
	}*/
	
	
	//CLEAN THE RADIO BUTTONS

	// Chanhe By Nir //
	/*
	arrRadio = document.getElementsByName("RADIO");
	lRadioLength = arrRadio.length;
	for(var i=0 ; i<lRadioLength ; i++)
	{
		arrRadio[i].setAttribute("RETRIEVED","0");			
	}
	*/
	arrRadio = document.getElementsByTagName("input");
	lRadioLength = arrRadio.length;
	for(var i=0 ; i<lRadioLength ; i++)
	{
		if (arrRadio[i].type.toUpperCase() == 'RADIO')
			arrRadio[i].setAttribute("RETRIEVED","0");			
	}
	
	
}


function Request(lClassID,sMethod)
{
	this.ClassID 	= lClassID;
	this.Method 	= sMethod;
	this.Arguments 	= new Array(); 		//Array of brokerParams
	this.Children   = new Array(); 		//Array of Requests
}


function createBrokerRequest(classID,methodName,Parameters,children, secured, callBack, interval, transactional, timeout , oWindow )
{
	var Request, Arguments;
	var oParameter;
	var index=0;
	var oBroker = getBroker();
	var Response;
	var oPage;
	
	if (oWindow == null) 
		oWindow = window;
	
	if ((callBack!=null) && (interval!=null))
		Request = oBroker.createRequest(callBack, interval, oWindow);
	else
		Request = oBroker.createRequest(oWindow);
	
	if (transactional!=false)
		Request.setRequiresTransaction(true);

	if (secured == true) 
		Request.setSecured();
	
	if (timeout!=null)
		Request.setTimeout(timeout);	
	
	Request.setClass(parseFloat(classID));
	Request.setMethod(parseFloat(methodName));		
	Request.setPage(parseFloat(m_PageID),
				 	parseFloat(m_ObjectID),
					parseFloat(m_ClassID),
					parseFloat(m_ParentObjectID), 
					parseFloat(m_ParentClassID), 
					parseFloat(m_SubType), 
					parseFloat(m_TaskID), 
					parseFloat(m_VirtualParentObjectID),
					parseFloat(m_VirtualParentClassID));
	
	return Request;
}

function SendRequestThroughBroker(oRequest,methodName)
{
	var Response;
	var methodName='3';
	var oBroker = getBroker();
	
	setHourglass(true);
	Response = oRequest.Submit(false);
	setHourglass(false);
	if (Response!=null)
	{
		//updateAlerts(Response.getAlerts());
		if(Response.getResult())
		{
			if((methodName=='1')||(methodName=='3')||(methodName=='2'))
				setPageValues();
		}
		else	
		{	
			try
			{
				var arErrors = Response.getErrors();
				var stError = null;
				// to log
				for (index=0; index < arErrors.size(); index++)
				{
					stError = arErrors.elementAt(index);
					WriteToLog('An Error has accured  : #' + stError.getNumber() + ' - ' + stError.getDescription());
				}			
				// and to spy				
				if (oBroker.getSpy() != null)
					oBroker.getSpy().SetErrors(arErrors);				
			}
			catch(e) {}
		}
	}
	return(Response);

}


function canI(iAction)
{
	return (m_iPermissions & iAction);
}



function Client(ObjectID,ClassID,PageID,SaveAction,CheckFrames,GridToRefresh)
{
	//--- Properties ---
	this.ObjectID 			= ObjectID;
	this.ClassID  			= ClassID;
	this.PageID   			= PageID;	
	this.SaveAction 		= SaveAction==null ? -1 : SaveAction;
	this.CheckFrames 		= CheckFrames==null ? true : CheckFrames;
	this.GridToRefresh		= GridToRefresh==null ? -1 : GridToRefresh;	
	
	this.SaveADPOnly = false;	
}

//--- Object Methods ---
Client.prototype.Save     = ClientSave;
Client.prototype.Delete   = ClientDelete;
Client.prototype.New      = ClientNew;
Client.prototype.Exit     = ClientExit;		
Client.prototype.Retreive = ClientRetreive;
Client.prototype.Response = ClientResponse;
Client.prototype.Validate = ClientValidate;
Client.prototype.GetXML   = ClientGetXML;
Client.prototype.GetRawXML   = ClientGetRawXML;
Client.prototype.Onload   = ClientOnload;
Client.prototype.HandleResponse = ClientHandleResponse;
Client.prototype.MultiDelete = ClientMultiDelete;   
Client.prototype.SendTask = ClientSendTask;	
Client.prototype.Print = ClientPrint;		
Client.prototype.GridToRefresh = -1;	
Client.prototype.Refresh = true;
Client.prototype.ChangeSaveAction = ClientChangeSaveAction;

Client.prototype.TakeADPOnly = ClientTakeADPOnly;
Client.prototype.SetADPFlag = ClientSetADPFlag;
