<cfcomponent>
	<cfset module.name="">
	<cfset module.retrievedFromDB=false>
	<cfset module.form.pageAction="list">
	<cfset module.form.prefix="">
	<cfset module.form.isEdit=false>
	<cfset module.list.orderBy="">
	<cfset module.list.pageNumber="1">
	<cfset variables=StructNew()>
	
	<cffunction name="init" access="public" output="false"
		hint="Initialize variables">
		<cfset module.retrievedFromDB=false>
	</cffunction>

	<cffunction name="setModuleName" access="public" output="false"
		hint="Set the name of the module">
		<cfargument name="name" type="string" required="yes">
		<cfset module.name=arguments.name>
	</cffunction>
	
	<cffunction name="getModuleName" access="public" output="false" returntype="string"
		hint="Get the name of the module">
		<cfreturn module.name>
	</cffunction>
	
	<cffunction name="setRetrievedFromDB" access="public" output="false"
		hint="Set flag that data was retrieved from DB">
		<cfset module.retrievedFromDB=true>
	</cffunction>
	
	<cffunction name="isRetrievedFromDB" access="public" output="false" returntype="boolean"
		hint="Verify if data vas retrieved from DB">
		<cfreturn module.retrievedFromDB>
	</cffunction>
	
	<cffunction name="setFormPageAction" access="public" output="false"
		hint="Set form.pageAction">
		<cfargument name="pageAction" type="string" required="yes">
		<cfset module.form.pageAction=arguments.pageAction>
	</cffunction>
	
	<cffunction name="getFormPageAction" access="public" output="false" returntype="string"
		hint="Get form.pageAction">
		<cfreturn module.form.pageAction>
	</cffunction>
	
	<cffunction name="setFormPrefix" access="public" output="false" 
		hint="Set form.prefix">
		<cfargument name="prefix" type="string" required="yes">
		<cfset module.form.prefix=arguments.prefix>
	</cffunction>
	
	<cffunction name="getFormPrefix" access="public" output="false" returntype="string"
		hint="Get form.prefix">
		<cfreturn module.form.prefix>
	</cffunction>

	<cffunction name="setFormIsEdit" access="public" output="false" 
		hint="Set form.isEdit">
		<cfargument name="isEdit" type="boolean" required="yes">
		<cfset module.form.isEdit=arguments.isEdit>
	</cffunction>
	
	<cffunction name="getFormIsEdit" access="public" output="false" returntype="boolean"
		hint="Get form.isEdit">
		<cfreturn module.form.isEdit>
	</cffunction>

	<cffunction name="getFormObjectId" access="public" output="false" returntype="numeric"
		hint="get the form.objectId. This module must be overwriten in implementation">
		<cfreturn 0>
	</cffunction>
	
	<cffunction name="setFormObjectId" access="public" output="false" 
		hint="set the form.objectId. This module must be overwriten in implementation">
		<cfargument name="objectId" type="numeric" required="yes">
	</cffunction>
	
	<cffunction name="setListOrderBy" access="public" output="false"
		hint="set list.orderBy">
		<cfargument name="orderBy" type="string" required="yes">
		<cfset module.list.orderBy=arguments.orderBy>
	</cffunction>
	
	<cffunction name="getListOrderBy" access="public" output="false" returntype="string"
		hint="get list.orderBy">
		<cfreturn module.list.orderBy>
	</cffunction>
	
	<cffunction name="setListPageNumber" access="public" output="false"
		hint="set list.pageNumber">
		<cfargument name="pageNumber" type="numeric" required="yes">
		<cfset module.list.pageNumber=arguments.pageNumber>
	</cffunction>
	
	<cffunction name="getListPageNumber" access="public" output="false" returntype="numeric"
		hint="get list.pageNumber">
		<cfreturn module.list.pageNumber>
	</cffunction>

	<cffunction name="getFormParamters" access="public" output="false">
		<cfargument name="form" type="struct" required="yes">
		<cfargument name="appModuleNumber" type="string" required="no" default="">
		<cfif StructKeyExists(arguments.form, module.name & arguments.appModuleNumber & "_orderBy")>
			<cfset setListOrderBy(arguments.form[module.name & arguments.appModuleNumber & "_orderBy"])>
		</cfif>
		<cfif StructKeyExists(arguments.form, module.name & arguments.appModuleNumber & "_pageNumber")>
			<cfset setListPageNumber(arguments.form[module.name & arguments.appModuleNumber & "_pageNumber"])>
		</cfif>
		<cfif StructKeyExists(arguments.form, module.name & arguments.appModuleNumber & "_pageAction")>
			<cfset setFormPageAction(arguments.form[module.name & arguments.appModuleNumber & "_pageAction"])>
		</cfif>
		<cfif StructKeyExists(arguments.form, module.name & arguments.appModuleNumber & "_objectId")>
			<cfset setFormObjectId(arguments.form[module.name & arguments.appModuleNumber & "_objectId"])>
		</cfif>
		<cfloop list="#StructKeyList(variables)#" index="parameterName">
			<cfset _parameterName=module.form.prefix & parameterName>
			<cfif StructKeyExists(arguments.form, _parameterName)>
				<cfset variables[parameterName]=arguments.form[_parameterName]>
			</cfif>
		</cfloop>
	</cffunction>

	<cffunction name="setFormParamters" access="public" returntype="struct" output="false">
		<cfargument name="form" type="struct" required="yes">
		<cfloop list="#StructKeyList(variables)#" index="parameterName">
			<cfset _parameterName=module.form.prefix & parameterName>
			<cfset arguments.form[_parameterName]=variables[parameterName]>
		</cfloop>
		<cfreturn arguments.form>
	</cffunction>

	<cffunction name="getFieldOrderBy" access="public" output="false" returntype="string">
		<cfargument name="appModuleNumber" type="string" required="no" default="">
		<cfset var _result='<input type="hidden" name="#module.name##arguments.appModuleNumber#_orderBy" id="#module.name##arguments.appModuleNumber#_orderBy" value="#getListOrderBy()#">'>
		<cfreturn _result>
	</cffunction>

	<cffunction name="getFieldPageNumber" access="public" output="false" returntype="string">
		<cfargument name="appModuleNumber" type="string" required="no" default="">
		<cfset var _result='<input type="hidden" name="#module.name##arguments.appModuleNumber#_pageNumber" id="#module.name##arguments.appModuleNumber#_pageNumber" value="#getListPageNumber()#">'>
		<cfreturn _result>
	</cffunction>

	<cffunction name="getFieldPageAction" access="public" output="false" returntype="string">
		<cfargument name="appModuleNumber" type="string" required="no" default="">
		<cfset var _pageAction=module.form.pageAction>
		<cfset var _result='<input type="hidden" name="#module.name##arguments.appModuleNumber#_pageAction" id="#module.name##arguments.appModuleNumber#_pageAction" value="'>
		<cfif FindNoCase("insert", _pageAction) or FindNoCase("update", _pageAction)>
			<cfset _pageAction="view">
		</cfif>
		<cfset _result=_result & _pageAction & '">'>
		<cfreturn _result>
	</cffunction>

	<cffunction name="getFieldObjectId" access="public" output="false" returntype="string">
		<cfargument name="appModuleNumber" type="string" required="no" default="">
		<cfset var _result='<input type="hidden" name="#module.name##arguments.appModuleNumber#_objectId" id="#module.name##arguments.appModuleNumber#_objectId" value="#getFormObjectId()#">'>
		<cfreturn _result>
	</cffunction>

	<!--- dateTime methods --->
	<cffunction name="parseDate" access="public" returntype="date" output="false">
		<cfargument name="dateString" type="string" required="yes" default="">
		<cftry>
			<cfset result=LSParseDateTime(arguments.dateString)>
			<cfcatch type="any">
				<cfthrow message="Date is in ivalid format. Valid formats are [dd/mm/yyyy] or [dd/mm/yyyy hh:mm:ss]">
			</cfcatch>
		</cftry>
		<cfreturn result>
	</cffunction>
	
	<!--- encoder methods --->
	<cffunction name="parseCurrency" access="public" output="false" returntype="numeric" 
		hint="due to bug in CF it is better to use this method">
		<cfargument name="string" type="string" required="yes" default="0">
		<cfif compare(arguments.string, "0")>
			<cfset arguments.string=Replace(arguments.string, ",", "", "all")>
			<cfset arguments.string=Replace(arguments.string, "$", "", "all")>
			<cfset arguments.string=LSParseNumber(arguments.string)>
		</cfif>
		<cfreturn arguments.string>
	</cffunction>
	
	<cffunction name="Standardize" access="public" returntype="string" output="false" hint="Function to standardize names and texts">
		<cfargument name="string" type="string" required="yes" default="">
		<!---
		<cfreturn REReplace(arguments.string, "(\w)(\w+)", "\u\1\L\2", "all")>
		--->
		<cfreturn UCase(arguments.string)>
	</cffunction>
	
	<cffunction name="encode" access="public" returntype="string" output="false" hint="Method to encode a string">
		<cfargument name="string" type="string" required="yes" default="">
		<cfset var result="">
		<cfif application.encode>
			<cfset result=URLEncodedFormat(Trim(arguments.string))>
		<cfelse>
			<cfset result=Trim(arguments.string)>
		</cfif>
		<cfreturn result>
	</cffunction>

	<cffunction name="decode" access="public" returntype="string" output="false" hint="Method to decode a string">
		<cfargument name="string" type="string" required="yes" default="">
		<cfset var result="">
		<cfif application.encode>
			<cfset result=URLDecode(REReplace(REReplace(arguments.string, "\r\n", "", "all"), "\n", "", "all"))>
		<cfelse>
			<cfset result=arguments.string>
		</cfif>
		<cfreturn result>
	</cffunction>

	<cffunction name="encodeAndTrim" access="public" returntype="string" output="false" hint="Method to encodes a string and trim it to specified lngth">
		<cfargument name="string" type="string" required="yes" default="">
		<cfargument name="length" type="numeric" required="yes" default="64">
		<cfset var result="">
		<cfif application.encode>
			<cfset result=URLEncodedFormat(Left(Trim(arguments.string), arguments.length))>
		<cfelse>
			<cfset result=Left(Trim(arguments.string), arguments.length)>
		</cfif>
		<cfreturn result>
	</cffunction>
	
	<cffunction name="NL2BR" access="public" returntype="string" output="false" hint="Method to convert new line to &lt;br&gt;">
		<cfargument name="string" type="string" required="yes" default="">
		<cfset var result=REReplace(arguments.string, "\n\r", "<br>", "all")>
		<cfset result=REReplace(result, "\r\n", "<br>", "all")>
		<cfset result=REReplace(result, "\n", "<br>", "all")>
		<cfset result=REReplace(result, "\r", "<br>", "all")>
		<cfreturn result>
	</cffunction>

	<cffunction name="BR2NL" access="public" returntype="string" output="false" hint="Method to convert &lt;br&gt; tags to new line">
		<cfargument name="string" type="string" required="yes" default="">
		<cfset var result=REReplace(arguments.string, "<br>", "\n\r", "all")>
		<cfreturn result>
	</cffunction>
</cfcomponent>