/*******************************************************************************
 *  Copyright 2017-2018 Centre for Development of Advanced Computing(C-DAC), Pune
 *  
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *  
 *   http://www.apache.org/licenses/LICENSE-2.0
 *  
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *******************************************************************************/
package cdac.medinfo.sdk.dcm30_04.dicommodel.modules;



import cdac.medinfo.sdk.dcm30_04.baselibs.DicomV3Factory;
import cdac.medinfo.sdk.dcm30_04.baselibs.IssuerOfAdmissionIDSequence;
import cdac.medinfo.sdk.dcm30_04.baselibs.IssuerofAccessionNumberSequence;
import cdac.medinfo.sdk.dcm30_04.baselibs.OrderPlacerIdentifierSequence;
import cdac.medinfo.sdk.dcm30_04.baselibs.ReferringPhysicianIdentificationSequence;
import cdac.medinfo.sdk.dcm30_04.baselibs.RequestingPhysicianIdentificationSequence;
import cdac.medinfo.sdk.dcm30_04.baselibs.RequestingServiceCodeSequence;
import cdac.medinfo.sdk.dcm30_04.baselibs.Tag;
import cdac.medinfo.sdk.dcm30_04.commoninterface.IDataSet;
import cdac.medinfo.sdk.dcm30_04.commoninterface.ITag;
import cdac.medinfo.sdk.dcm30_04.exceptions.InvalidModuleException;
import cdac.medinfo.sdk.dcm30_04.utils.DicomConstants;
import cdac.medinfo.sdk.dcm30_04.utils.ISingleCollection;
import cdac.medinfo.sdk.dcm30_04.utils.SingleCollection;

/**
 \* This module describes the attributes in Imaging Service Request Module.
 */
public class ImagingServiceRequestModule extends Module
{

	
	/**
	 * The obj single collection.
	 */
	public static ISingleCollection<ITag> objSingleCollection = null;
	
	/**
	 * Creates Imaging Service Request Module with default initialization.
	 * @param objIDataSet the obj i data set
	 */
	public ImagingServiceRequestModule(IDataSet objIDataSet)
	{
		super(objIDataSet);
	}
	
	static
	{
		objSingleCollection = new SingleCollection<ITag>();
		objSingleCollection.add(new Tag(0x0040,0x2400));
		objSingleCollection.add(new Tag(0x0032,0x1032));
		objSingleCollection.add(new Tag(0x0032,0x1031));
		objSingleCollection.add(new Tag(0x0008,0x0090));
		objSingleCollection.add(new Tag(0x0008,0x0096));
		objSingleCollection.add(new Tag(0x0032,0x1033));
		objSingleCollection.add(new Tag(0x0032,0x1034));
		objSingleCollection.add(new Tag(0x0008,0x0050));
		objSingleCollection.add(new Tag(0x0008,0x0051));
		objSingleCollection.add(new Tag(0x0040,0x2004));
		objSingleCollection.add(new Tag(0x0040,0x2005));
		objSingleCollection.add(new Tag(0x0040,0x2016));
		objSingleCollection.add(new Tag(0x0040,0x0026));
		objSingleCollection.add(new Tag(0x0040,0x2017));
		objSingleCollection.add(new Tag(0x0040,0x2008));
		objSingleCollection.add(new Tag(0x0040,0x2009));
		objSingleCollection.add(new Tag(0x0040,0x2010));
		objSingleCollection.add(new Tag(0x0040,0x2011));
		objSingleCollection.add(new Tag(0x0038,0x0010));
		objSingleCollection.add(new Tag(0x0038,0x0014));
	}
	
	/**
	 * This method validates each Attribute in the Module according to the Type
	 * of the Attribute.Attributes are of 5 types.
	 * Type 1,Type 2 are Mandatory:
	 * Mandatory Attributes have to present in the Module.
	 * Type 1C,2C are Conditional:
	 * Conditional Attributes' presence depend on a condition.
	 * If the condition is satisfied the Attribute has to be present.
	 * Type 3 are Optional
	 * Optional Attributes can be added as and when required.
	 * @return true, if validate module
	 * @throws InvalidModuleException - If validation of Module fails
	 */
	public boolean validateModule()throws InvalidModuleException
	{
		//All Attributes are optional.
		return true;
	}
	
	/**
	 * This method returns the vector of keys representing the DataElements
	 * that belong to this module. 
	 * @return vector of Tags - returns the vector containing the collection of tags
	 */
	public ISingleCollection<ITag> getVectorOfKeys()
	{
		return objSingleCollection;
	}
	
	/**
	 * Sets attribute identifies user-defined comments on the Imaging Service Request.
	 * @param StrImagingServiceRequestComments - String identifies user-defined comments on the Imaging Service Request.
	 */
	public void setImagingServiceRequestComments(String StrImagingServiceRequestComments)
	{
		/* Accept user-defined comments on the Imaging Service Request in String format of type LT.
		 * Read the Transfer Syntax and check to create ImplicitDE or ExplicitDE .
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0040,0x2400, DicomConstants.DCM_DT_LT, StrImagingServiceRequestComments);
	}
	
	/**
	 * Return User-defined comments on the Imaging Service Request.
	 * @return String - String identifies User-defined comments on the Imaging Service Request.
	 */
	public String getImagingServiceRequestComments()
	{
		Object objValue = getValue(0x0040,0x2400);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	
	/**
	 * Sets attribute identifies Name of the physician who requested the Imaging Service Request.
	 * @param strRequestingPhysician - String identifies Name of the physician who requested the Imaging Service Request.
	 */
	public void setRequestingPhysician(String strRequestingPhysician)
	{
		/* Accept user-defined comments on the Requesting Physician in String format of type PN.
		 * Read the Transfer Syntax and check to create ImplicitDE or ExplicitDE .
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0032,0x1032, DicomConstants.DCM_DT_PN, strRequestingPhysician);
	}
	
	/**
	 * Return Name of the physician who requested the Imaging Service Request.
	 * @return String - identifies Name of the physician who requested the Imaging Service Request.
	 */
	public String getRequestingPhysician()
	{
		Object objValue = getValue(0x0032,0x1032);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	
	/**
	 * Identification of the physician who requested the
	 * Imaging Service Request. Only a single item shall
	 * be permitted in this sequence.
	 * @return RequestingPhysicianIdentificationSequence - instance of Referenced Reference Image Sequence.
	 */
	public RequestingPhysicianIdentificationSequence getRequestingPhysicianIdentificationSequence()
	{
		RequestingPhysicianIdentificationSequence objRequestingPhysicianIdentificationSequence = (RequestingPhysicianIdentificationSequence)getDicomValue(0x0032,0x1031);
		if(objRequestingPhysicianIdentificationSequence == null)
		{
			/*
			 * If the sequence object is not present in the DataSet, a new sequence object is created and
			 * the TransferSyntax and DictionaryReader is set into it as it is set in the Module. This ensures that 
			 * the DataElements getting added in the DataSet follow the same TransferSyntax and use the same
			 * DictionaryReader object as that of the module.
			 */
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			objRequestingPhysicianIdentificationSequence = (RequestingPhysicianIdentificationSequence)objDicomV3Factory.createSequence(0x0032,0x1031, objITransferSyntax, objIDictionaryReader);
			
			// This will add Data Element of SQ to the DataSet.
			addDataElement(0x0032,0x1031, DicomConstants.DCM_DT_SQ, objRequestingPhysicianIdentificationSequence.getValue());
		}
		return objRequestingPhysicianIdentificationSequence;
	}
	
	/**
	 * Sets attribute identifies Name of the patient's referring physician for this Imaging Service Request.
	 * @param strReferringPhysicianName - String identifies Name of the patient's referring physician for this Imaging Service Request.
	 */
	public void setReferringPhysicianName(String strReferringPhysicianName)
	{
		/*Accept Name of the patient's referring physician in String format of type PN.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0008, 0x0090, DicomConstants.DCM_DT_PN, strReferringPhysicianName);
	}
	
	/**
	 * Return Name of the patient's referring physician for this Imaging Service Request.
	 * @return String - Name of the patient's referring physician for this Imaging Service Request.
	 */
	public String getReferringPhysicianName()
	{
		Object objValue = getValue(0x0008,0x0090);
		if(objValue != null)
			return objValue.toString();		
		return null;
	}
	
	/**
	 * Identification of the patient's referring physician.
	 * Only a single item shall be permitted in this sequence.
	 * @return ReferringPhysicianIdentificationSequence - instance of Referenced Reference Image Sequence.
	 */
	public ReferringPhysicianIdentificationSequence getReferringPhysicianIdentificationSequence()
	{
		ReferringPhysicianIdentificationSequence objReferringPhysicianIdentificationSequence = (ReferringPhysicianIdentificationSequence)getDicomValue(0x0008,0x0096);
		if(objReferringPhysicianIdentificationSequence == null)
		{
			/*
			 * If the sequence object is not present in the DataSet, a new sequence object is created and
			 * the TransferSyntax and DictionaryReader is set into it as it is set in the Module. This ensures that 
			 * the DataElements getting added in the DataSet follow the same TransferSyntax and use the same
			 * DictionaryReader object as that of the module.
			 */
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			objReferringPhysicianIdentificationSequence = (ReferringPhysicianIdentificationSequence)objDicomV3Factory.createSequence(0x0008,0x0096, objITransferSyntax, objIDictionaryReader);
			
			// This will add Data Element of SQ to the DataSet.
			addDataElement(0x0008,0x0096, DicomConstants.DCM_DT_SQ, objReferringPhysicianIdentificationSequence.getValue());
		}
		return objReferringPhysicianIdentificationSequence;
	}
	
	/**
	 * Sets Institutional department where the request initiated.
	 * @param strRequestingService - Institutional department where the request initiated.
	 */
	public void setRequestingService(String strRequestingService)
	{
		/*Accept user-defined comments on the Requesting Service in String format of type LO.
		 * Read the Transfer Syntax and check to create ImplicitDE or ExplicitDE .
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0032,0x1033, DicomConstants.DCM_DT_LO, strRequestingService);	
	}
	
	/**
	 * Retrieves Institutional department where the request initiated.
	 * @return String - String Institutional department where the request initiated.
	 */
	public String getRequestingService()
	{
		Object objValue = getValue(0x0032,0x1033);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	
	/**
	 * This method provides the pre-initialized object of Requesting Service Code Sequence.
	 * 
	 * @return - object of Requesting Service Code Sequence. If the module contains the sequence object
	 * it returns the same otherwise it creates the sequence adds to the module with proper initialization
	 * and then returns the object of sequence
	 */
	public RequestingServiceCodeSequence getRequestingServiceCodeSequence()
	{
		RequestingServiceCodeSequence objRequestingServiceCodeSequence = (RequestingServiceCodeSequence)getDicomValue(0x0032, 0x1034);
		if(objRequestingServiceCodeSequence == null)
		{
			/*
			 * If the sequence object is not present in the DataSet, a new sequence object is created and
			 * the TransferSyntax and DictionaryReader is set into it as it is set in the Module. This ensures that 
			 * the DataElements getting added in the DataSet follow the same TransferSyntax and use the same
			 * DictionaryReader object as that of the module.
			 */
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			objRequestingServiceCodeSequence = (RequestingServiceCodeSequence)objDicomV3Factory.createSequence(0x0032, 0x1034, objITransferSyntax, objIDictionaryReader);
			
			// This will add Data Element of SQ to the DataSet.
			addDataElement(0x0032, 0x1034, DicomConstants.DCM_DT_SQ, objRequestingServiceCodeSequence.getValue());
		}
		return objRequestingServiceCodeSequence;
	}
	
	/**
	 * Sets departmental IS generated number that identifies the order for the Imaging Service Request.
	 * @param StrAccessionNumber departmental IS generated number that identifies the order for the Imaging Service Request.
	 */
	public void setAccessionNumber(String StrAccessionNumber)
	{
		/*Accept departmental IS generated number in String format of type SH.
		 * Read the Transfer Syntax and check to create ImplicitDE or ExplicitDE .
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0008,0x0050, DicomConstants.DCM_DT_SH, StrAccessionNumber);
	}
	
	/**
	 * Retrieves departmental IS generated number that identifies the order for the Imaging Service Request.
	 * @return departmental IS generated number that identifies the order for the Imaging Service Request.
	 */
	public String getAccessionNumber()
	{
		Object objValue = getValue(0x0008,0x0050);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	
	/**
	 * This method provides the pre-initialized object of Issuer of Accession Number Sequence.
	 * 
	 * @return - object of Issuer of Accession Number Sequence. If the module contains the sequence object
	 * it returns the same otherwise it creates the sequence adds to the module with proper initialization
	 * and then returns the object of sequence
	 */
	public IssuerofAccessionNumberSequence getIssuerofAccessionNumberSequence()
	{
		IssuerofAccessionNumberSequence objIssuerofAccessionNumberSequence = (IssuerofAccessionNumberSequence)getDicomValue(0x0008, 0x0051);
		if(objIssuerofAccessionNumberSequence == null)
		{
			/*
			 * If the sequence object is not present in the DataSet, a new sequence object is created and
			 * the TransferSyntax and DictionaryReader is set into it as it is set in the Module. This ensures that 
			 * the DataElements getting added in the DataSet follow the same TransferSyntax and use the same
			 * DictionaryReader object as that of the module.
			 */
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			objIssuerofAccessionNumberSequence = (IssuerofAccessionNumberSequence)objDicomV3Factory.createSequence(0x0008, 0x0051, objITransferSyntax, objIDictionaryReader);
			
			// This will add Data Element of SQ to the DataSet.
			addDataElement(0x0008, 0x0051, DicomConstants.DCM_DT_SQ, objIssuerofAccessionNumberSequence.getValue());
		}
		return objIssuerofAccessionNumberSequence;
	}
	
	/**
	 * Sets Date on which the Imaging Service Request was issued by the requester.
	 * @param StrIssueDateofImagingServiceRequest - Date on which the Imaging Service Request was issued by the requester.
	 */
	public void setIssueDateofImagingServiceRequest(String StrIssueDateofImagingServiceRequest)
	{
		/* Accept Overlay Date in String format of type DA.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Data Set
		 */
		addDataElement(0x0040,0x2004, DicomConstants.DCM_DT_DA, StrIssueDateofImagingServiceRequest);
	}
	
	/**
	 * Retrieves Date on which the Imaging Service Request was issued by the requester.
	 * @return String - Date on which the Imaging Service Request was issued by the requester.
	 */
	public String getIssueDateofImagingServiceRequest()
	{
		Object objValue = getValue(0x0040,0x2004);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	
	
	/**
	 * Sets Time at which the Imaging Service Request was issued by the requester.
	 * @param StrIssueTimeofImagingServiceRequest - Time at which the Imaging Service Request was issued by the requester.
	 */
	public void setIssueTimeofImagingServiceRequest(String StrIssueTimeofImagingServiceRequest)
	{
		/* Accept Imaging Service Request in String format of type TM.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Data Set
		 */
		addDataElement(0x0040,0x2005, DicomConstants.DCM_DT_TM, StrIssueTimeofImagingServiceRequest);
	}
	
	/**
	 * Retrieves Time at which the Imaging Service Request was issued by the requester.
	 * @return String - Time at which the Imaging Service Request was issued by the requester.
	 */
	public String getIssueTimeofImagingServiceRequest()
	{
		Object objValue = getValue(0x0040,0x2005);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	
	/**
	 * Sets the order number assigned to the Imaging Service Request by the party placing the order.
	 * @param StrPlacerOrderNumberImagingServiceRequest the order number assigned to the Imaging Service Request by the party placing the order.
	 */
	public void setPlacerOrderNumberImagingServiceRequest(String StrPlacerOrderNumberImagingServiceRequest)
	{
		/* Accept order number in String format of type LO.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Data Set
		 */
		addDataElement(0x0040,0x2016, DicomConstants.DCM_DT_LO, StrPlacerOrderNumberImagingServiceRequest);
	}
	
	/**
	 * The order number assigned to the Imaging Service Request by the party placing the order.
	 * @return String - the order number assigned to the Imaging Service Request by the party placing the order.
	 */
	public String getPlacerOrderNumberImagingServiceRequest()
	{
		Object objValue = getValue(0x0040,0x2016);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	
	/**
	 * This method provides the pre-initialized object of Order Placer Identifier Sequence.
	 * 
	 * @return - object of Order Placer Identifier Sequence. If the module contains the sequence object
	 * it returns the same otherwise it creates the sequence adds to the module with proper initialization
	 * and then returns the object of sequence
	 */
	public OrderPlacerIdentifierSequence getOrderPlacerIdentifierSequence()
	{
		OrderPlacerIdentifierSequence objOrderPlacerIdentifierSequence = (OrderPlacerIdentifierSequence)getDicomValue(0x0040, 0x0026);
		if(objOrderPlacerIdentifierSequence == null)
		{
			/*
			 * If the sequence object is not present in the DataSet, a new sequence object is created and
			 * the TransferSyntax and DictionaryReader is set into it as it is set in the Module. This ensures that 
			 * the DataElements getting added in the DataSet follow the same TransferSyntax and use the same
			 * DictionaryReader object as that of the module.
			 */
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			objOrderPlacerIdentifierSequence = (OrderPlacerIdentifierSequence)objDicomV3Factory.createSequence(0x0040, 0x0026, objITransferSyntax, objIDictionaryReader);
			
			// This will add Data Element of SQ to the DataSet.
			addDataElement(0x0040, 0x0026, DicomConstants.DCM_DT_SQ, objOrderPlacerIdentifierSequence.getValue());
		}
		return objOrderPlacerIdentifierSequence;
	}
	
	/**
	 * Sets the order number assigned to the Imaging Service Request by the party filling the order.
	 * @param StrFillerOrderNumberImagingServiceRequest the order number assigned to the Imaging Service Request by the party filling the order.
	 */
	public void setFillerOrderNumberImagingServiceRequest(String StrFillerOrderNumberImagingServiceRequest)
	{
		/*Accept order number in String format of type LO.
		 * Read the Transfer Syntax and check to create ImplicitDE or ExplicitDE .
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0040,0x2017, DicomConstants.DCM_DT_LO, StrFillerOrderNumberImagingServiceRequest);
	}
	
	/**
	 * The order number assigned to the Imaging Service Request by the party filling the order.
	 * @return String - the order number assigned to the Imaging Service Request by the party filling the order.
	 */
	public String getFillerOrderNumberImagingServiceRequest()
	{
		Object objValue = getValue(0x0040,0x2017);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	
	/**
	 * Sets the person who entered the Imaging Service Request into an Information System.
	 * @param StrOrderenteredby the person who entered the Imaging Service Request into an Information System.
	 */
	public void setOrderenteredby(String StrOrderenteredby)
	{
		/*Accept Patient's full legal name in String format of type PN.
		 * Read the Transfer Syntax and check to create ImplicitDE or ExplicitDE .
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0040,0x2008, DicomConstants.DCM_DT_PN, StrOrderenteredby);
	}
	
	/**
	 * Retrieves the person who entered the Imaging Service Request into an Information System.
	 * @return String - the person who entered the Imaging Service Request into an Information System.
	 */
	public String getOrderenteredby()
	{
		Object objValue = getValue(0x0040,0x2008);
		if(objValue != null)
			return objValue.toString();
		return null;		
	}
	
	/**
	 * Sets the location at which the Imaging Service Request was entered.
	 * @param StrOrderEntererLocation the location at which the Imaging Service Request was entered.
	 */
	public void setOrderEntererLocation(String StrOrderEntererLocation)
	{
		/*Accept location in String format of type SH.
		 * Read the Transfer Syntax and check to create ImplicitDE or ExplicitDE .
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0040,0x2009, DicomConstants.DCM_DT_SH, StrOrderEntererLocation);
	}
	
	/**
	 * Retrieves the location at which the Imaging Service Request was entered.
	 * @return String - the location at which the Imaging Service Request was entered.
	 */
	public String getOrderEntererLocation()
	{
		Object objValue = getValue(0x0040,0x2009);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	
	/**
	 * Sets telephone Number at which additional information can be retrieved.
	 * @param StrOrderCallbackPhoneNumber telephone Number at which additional information can be retrieved.
	 */
	public void setOrderCallbackPhoneNumber(String StrOrderCallbackPhoneNumber)
	{
		/*Accept telephone Number in String format of type SH.
		 * Read the Transfer Syntax and check to create ImplicitDE or ExplicitDE .
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0040,0x2010, DicomConstants.DCM_DT_SH, StrOrderCallbackPhoneNumber);
	}
	
	/**
	 * Retrieves telephone Number at which additional information can be retrieved.
	 * @return String - telephone Number at which additional information can be retrieved.
	 */
	public String getOrderCallbackPhoneNumber()
	{
		Object objValue = getValue(0x0040,0x2010);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	
	/**
	 * Sets Order Callback Telecom Information.
	 * 
	 * @param strOrderCallbackTelecomInformation - String value of Order Callback Telecom Information
	 */
	public void setOrderCallbackTelecomInformation(String strOrderCallbackTelecomInformation)
	{
		/* Accept Order Callback Telecom Information in String format of type LT.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0040, 0x2011, DicomConstants.DCM_DT_LT, strOrderCallbackTelecomInformation);
	}

	/**
	 * Return Order Callback Telecom Information.
	 * 
	 * @return  - String value of Order Callback Telecom Information
	 */
	public String getOrderCallbackTelecomInformation()
	{
		Object objectValue = getValue(0x0040, 0x2011);
		if(objectValue!=null)
			return objectValue.toString();
		return null;
	}
	
	/**
	 * Sets Admission ID.
	 * Identification number of the visit as assigned by the health care provider
	 * @param strAdmissionID String value of Admission ID.
	 */
	public void setAdmissionID(String strAdmissionID)
	{
		/* Accept Admission ID String format of type LO.
		 * Read the Transfer Syntax and check if ImplicitDE or ExplicitDE to create.
		 * Set the iGroupNumber and iElementNumber to ImplicitDE object 
		 * Set the iVRType
		 * Set length from the element
		 * Add this element to the Hash Map
		 */
		addDataElement(0x0038, 0x0010, DicomConstants.DCM_DT_LO, strAdmissionID);
	}

	/**
	 * Retrieves Admission ID.
	 * Identification number of the visit as assigned by the health care provider
	 * @return String - String value of Admission ID.
	 */
	public String getAdmissionID()
	{
		Object objValue = getValue(0x0038,0x0010);
		if(objValue != null)
			return objValue.toString();
		return null;
	}
	
	/**
	 * This method provides the pre-initialized object of Issuer Of Admission ID Sequence.
	 * 
	 * @return - object of Issuer Of Admission ID Sequence. If the module contains the sequence object
	 * it returns the same otherwise it creates the sequence adds to the module with proper initialization
	 * and then returns the object of sequence
	 */
	public IssuerOfAdmissionIDSequence getIssuerOfAdmissionIDSequence()
	{
		IssuerOfAdmissionIDSequence objIssuerOfAdmissionIDSequence = (IssuerOfAdmissionIDSequence)getDicomValue(0x0038, 0x0014);
		if(objIssuerOfAdmissionIDSequence == null)
		{
			/*
			 * If the sequence object is not present in the DataSet, a new sequence object is created and
			 * the TransferSyntax and DictionaryReader is set into it as it is set in the Module. This ensures that 
			 * the DataElements getting added in the DataSet follow the same TransferSyntax and use the same
			 * DictionaryReader object as that of the module.
			 */
			DicomV3Factory objDicomV3Factory = DicomV3Factory.createInstance();
			objIssuerOfAdmissionIDSequence = (IssuerOfAdmissionIDSequence)objDicomV3Factory.createSequence(0x0038, 0x0014, objITransferSyntax, objIDictionaryReader);
			
			// This will add Data Element of SQ to the DataSet.
			addDataElement(0x0038, 0x0014, DicomConstants.DCM_DT_SQ, objIssuerOfAdmissionIDSequence.getValue());
		}
		return objIssuerOfAdmissionIDSequence;
	}
}