<cfcomponent extends="components.common.formObject">
	<cfset variables.idRepositoryDocument=0>
	<cfset variables.idRepositoryFolder=0>
	<cfset variables.repositoryFolder="">
	<cfset variables.idServerFile=0>
	<cfset variables.serverFile="">

	<cfset variables.idProject=0>
	<cfset variables.project="">
	<cfset module.list.orderBy="displayName">
	
	<cffunction name="init" access="public" output="false">
		<cfset variables.idRepositoryDocument=0>
		<cfset variables.idRepositoryFolder=0>
		<cfset variables.repositoryFolder="">
		<cfset variables.idServerFile=0>
		<cfset variables.serverFile="">

		<cfset variables.idProject=0>
		<cfset variables.project="">
	</cffunction>

	<cffunction name="getFormObjectId" access="public" output="false" returntype="numeric">
		<cfreturn getIdRepositoryDocument()>
	</cffunction>
	
	<cffunction name="setFormObjectId" access="public" output="false">
		<cfargument name="objectId" type="numeric" required="yes">
		<cfset setIdRepositoryDocument(arguments.objectId)>
	</cffunction>
	
	<cffunction name="setIdRepositoryDocument" access="remote" output="false">
		<cfargument name="idRepositoryDocument" type="numeric" required="yes" default="0">
		<cfset variables.idRepositoryDocument=arguments.idRepositoryDocument>
	</cffunction>

	<cffunction name="getIdRepositoryDocument" access="remote" returntype="numeric" output="false">
		<cfreturn variables.idRepositoryDocument>
	</cffunction>

	<cffunction name="setIdRepositoryFolder" access="remote" output="false">
		<cfargument name="idRepositoryFolder" type="numeric" required="yes" default="0">
		<cfset variables.idRepositoryFolder=arguments.idRepositoryFolder>
	</cffunction>

	<cffunction name="getIdRepositoryFolder" access="remote" returntype="numeric" output="false">
		<cfreturn variables.idRepositoryFolder>
	</cffunction>

	<cffunction name="getRepositoryFolder" access="remote" returntype="components.corporate.repositoryFolder" output="false">
		<cfif not IsObject("variables.repositoryFolder")><cfset variables.repositoryFolder=CreateObject("component", "components.corporate.repositoryFolder")></cfif>
		<cfif not variables.repositoryFolder.isRetrievedFromDB()>
			<cfset variables.repositoryFolder=CreateObject("component", "components.corporate.repositoryFolder")>
			<cfset variables.repositoryFolder.setIdRepositoryFolder(variables.idRepositoryFolder)>
			<cfset variables.repositoryFolder.get()>
		</cfif>
		<cfreturn variables.repositoryFolder>
	</cffunction>

	<cffunction name="setIdServerFile" access="remote" output="false">
		<cfargument name="idServerFile" type="numeric" required="yes" default="0">
		<cfset variables.idServerFile=arguments.idServerFile>
	</cffunction>

	<cffunction name="getIdServerFile" access="remote" returntype="numeric" output="false">
		<cfreturn variables.idServerFile>
	</cffunction>

	<cffunction name="getServerFile" access="remote" returntype="components.corporate.serverFile" output="false">
		<cfif not IsObject("variables.serverFile")>
			<cfset variables.serverFile=CreateObject("component", "components.corporate.serverFile")>
		</cfif>
		<cfif Compare(module.form.pageAction, "add") and not variables.serverFile.isRetrievedFromDB()>
			<cfset variables.serverFile=CreateObject("component", "components.corporate.serverFile")>
			<cfset variables.serverFile.setIdServerFile(variables.idServerFile)>
			<cfset variables.serverFile.get()>
		</cfif>
		<cfreturn variables.serverFile>
	</cffunction>

	<cffunction name="setIdProject" access="public" output="false">
		<cfargument name="idProject" type="numeric" required="yes" default="0">
		<cfset variables.idProject=arguments.idProject>
	</cffunction>

	<cffunction name="getIdProject" access="public" returntype="numeric" output="false">
		<cfreturn variables.idProject>
	</cffunction>

	<cffunction name="getProject" access="public" returntype="components.corporate.project" output="false">
		<cfif not IsObject("variables.project")><cfset variables.project=CreateObject("component", "components.corporate.project")></cfif>
		<cfif (Compare(module.form.pageAction, "add") and not variables.project.isRetrievedFromDB()) or variables.project.getIdProject() neq variables.idProject>
			<cfset variables.project=CreateObject("component", "components.corporate.project")>
			<cfset variables.project.setIdProject(variables.idProject)>
			<cfset variables.project.get()>
		</cfif>
		<cfreturn variables.project>
	</cffunction>
	
	<cffunction name="get" access="remote" output="false">
		<cfquery name="getQuery" datasource="#application.datasource#">
			SELECT 
				#getQueryString()#
			WHERE
				repositoryDocument.idRepositoryDocument=<cfqueryparam value="#variables.idRepositoryDocument#" cfsqltype="cf_sql_integer">
		</cfquery>
		<cfif getQuery.recordcount gt 0>
			<cfset variables.idRepositoryFolder=getQuery.idRepositoryFolder>
			<cfif Len(getQuery.idServerFile)><cfset variables.idServerFile=getQuery.idServerFile><cfelse><cfset variables.idServerFile=0></cfif>
		</cfif>
		<cfset module.retrievedFromDB=true>
	</cffunction>

	<cffunction name="getList" access="remote" output="false" returntype="query">
		<cfquery name="getListQuery" datasource="#application.datasource#">
			SELECT 
				#getQueryString()#
			WHERE
				repositoryDocument.idRepositoryFolder=<cfqueryparam value="#variables.idRepositoryFolder#" cfsqltype="cf_sql_integer">
		</cfquery>
		<cfreturn getListQuery>
	</cffunction>

	<cffunction name="getQueryString" access="private" output="false" returntype="string">
		<cfset var result="
				repositoryDocument.idRepositoryDocument,
				repositoryDocument.idRepositoryFolder, repositoryFolder.name AS repositoryFolder,
				repositoryDocument.idServerFile, serverFile.displayName AS displayName, serverFile.serverFileName AS serverFileName
			FROM 
				repositoryDocument
			LEFT JOIN repositoryFolder ON repositoryDocument.idRepositoryFolder=repositoryFolder.idRepositoryFolder
			LEFT JOIN serverFile ON repositoryDocument.idServerFile=serverFile.idServerFile
			">
		<cfreturn result>
	</cffunction>
	
	<cffunction name="getId" access="public" returntype="struct" output="false">
		<cfset var result=StructNew()>
		<cfset result.id=0>
		<cfset result.message="">
		<cfquery name="getIdQuery" datasource="#application.datasource#">
			SELECT 
				idRepositoryDocument 
			FROM 
				repositoryDocument 
			WHERE 
				repositoryDocument.idRepositoryFolder=<cfqueryparam value="#variables.idRepositoryFolder#" cfsqltype="cf_sql_integer">
				AND repositoryDocument.idServerFile=<cfqueryparam value="#variables.idServerFile#" cfsqltype="cf_sql_integer">
				<cfif variables.idRepositoryDocument gt 0>
				AND idRepositoryDocument != <cfqueryparam value="#variables.idRepositoryDocument#" cfsqltype="cf_sql_integer">
				</cfif>
		</cfquery>
		<cfif getIdQuery.recordcount gt 0>
			<cfset result.id=getIdQuery.idRepositoryDocument>
		</cfif>
		<cfreturn result>
	</cffunction>
	
	<cffunction name="create" access="remote" returntype="struct" output="false">
		<cfset var result=StructNew()>
		<cfset result.id=0>
		<cfset result.message="">
		<!--- check parameters --->
		<cfif variables.idServerFile lt 1>
			<cfset result.message="idServerFile is obligatory">
			<cfreturn result>
		</cfif>
		<cfif variables.idRepositoryFolder lt 1>
			<cfset result.message="idRepositoryFolder is obligatory">
			<cfreturn result>
		</cfif>
		<!--- variables ok --->
		<cftry>
			<cfquery name="createQuery" datasource="#application.datasource#">
				INSERT INTO repositoryDocument
					(
					idRepositoryDocument, idRepositoryFolder, idServerFile
					) 
				VALUES 
					(
					<cfqueryparam value="#variables.idRepositoryDocument#" cfsqltype="cf_sql_integer">, 
					<cfqueryparam value="#variables.idRepositoryFolder#" cfsqltype="cf_sql_integer">,
					<cfqueryparam value="#variables.idServerFile#" cfsqltype="cf_sql_integer">
					)
			</cfquery>
			<cfset result=getId()>
			<!--- catch any error --->
			<cfcatch type="any">
				<cfset result.id=-1>
				<cfset result.message="Error [repositoryFolder.create()]: " & cfcatch.Message & "<br>Details: " & cfcatch.Detail>
			</cfcatch>
		</cftry>
		<cfreturn result>
	</cffunction>

	<cffunction name="update" access="remote" returntype="struct" output="false">
		<cfset var result=StructNew()>
		<cfset result.id=0>
		<cfset result.message="">
		<!--- check parameters --->
		<cfif variables.idServerFile lt 1>
			<cfset result.message="idServerFile is obligatory">
			<cfreturn result>
		</cfif>
		<cfif variables.idRepositoryDocument lt 1>
			<cfset result.message="idRepositoryDocument is obligatory">
			<cfreturn result>
		</cfif>
		<cfif variables.idRepositoryFolder lt 1>
			<cfset result.message="idRepositoryFolder is obligatory">
			<cfreturn result>
		</cfif>
		<!--- variables ok --->
		<cftry>
			<cfquery name="createQuery" datasource="#application.datasource#">
				UPDATE repositoryDocument SET 
					idRepositoryFolder=<cfqueryparam value="#variables.idRepositoryFolder#" cfsqltype="cf_sql_integer">,
					idServerFile=<cfqueryparam value="#variables.idServerFile#" cfsqltype="cf_sql_integer">
				WHERE 
					idRepositoryDocument=<cfqueryparam value="#variables.idRepositoryDocument#" cfsqltype="cf_sql_integer"> 
			</cfquery>
			<cfset result.id=variables.idRepositoryDocument>
			<!--- catch any error --->
			<cfcatch type="any">
				<cfset result.id=-1>
				<cfset result.message="Error [repositoryFolder.update()]: " & cfcatch.Message & "<br>Details: " & cfcatch.Detail>
			</cfcatch>
		</cftry>
		<cfreturn result>
	</cffunction>

	<cffunction name="delete" access="remote" returntype="struct" output="false">
		<cfset var result=StructNew()>
		<cfset result.id=0>
		<cfset result.message="">
		<cfset get()>
		<cfif variables.idServerFile gt 0>
			<cfset _deleteResult=getServerFile().delete()>
		</cfif>
		<!--- variables ok --->
		<cftry>
			<cfquery name="deleteQuery" datasource="#application.datasource#">
				DELETE FROM 
					repositoryDocument
				WHERE 
					repositoryDocument.idRepositoryDocument=<cfqueryparam value="#variables.idRepositoryDocument#" cfsqltype="cf_sql_integer">
			</cfquery>
			<!--- catch any error --->
			<cfcatch type="any">
				<cfset result.id=-1>
				<cfset result.message="Error [repositoryFolder.delete()]: " & cfcatch.Message & "<br>Details: " & cfcatch.Detail>
			</cfcatch>
		</cftry>
		<cfreturn result>
	</cffunction>
	
</cfcomponent>