<cfcomponent extends="components.common.formObject">
	<cfset variables.idRepositoryFolder=0>
	<cfset variables.idParent=0>
	<cfset variables.parent="">
	<cfset variables.idProject=0>
	<cfset variables.project="">
	<cfset variables.name="">
	<cfset variables.description="">
	<cfset module.list.orderBy="name">

	<cffunction name="init" access="public" output="false">
		<cfset variables.idRepositoryFolder=0>
		<cfset variables.idProject=0>
		<cfset variables.project="">
		<cfset variables.idParent=0>
		<cfset variables.parent="">
		<cfset variables.name="">
		<cfset variables.description="">
	</cffunction>
	
	<cffunction name="getFormObjectId" access="public" output="false" returntype="numeric">
		<cfreturn getidRepositoryFolder()>
	</cffunction>
	
	<cffunction name="setFormObjectId" access="public" output="false">
		<cfargument name="objectId" type="numeric" required="yes">
		<cfset setidRepositoryFolder(arguments.objectId)>
	</cffunction>

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

	<cffunction name="getIdRepositoryFolder" access="public" returntype="numeric" output="false">
		<cfreturn variables.idRepositoryFolder>
	</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="setIdParent" access="public" output="false">
		<cfargument name="idParent" type="numeric" required="yes" default="0">
		<cfset variables.idParent=arguments.idParent>
	</cffunction>

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

	<cffunction name="getParent" access="public" returntype="components.corporate.repositoryFolder" output="false">
		<cfif not IsObject("variables.parent")><cfset variables.parent=CreateObject("component", "components.corporate.repositoryFolder")></cfif>
		<cfif (Compare(module.form.pageAction, "add") and not variables.parent.isRetrievedFromDB()) or variables.parent.getIdRepositoryFolder() neq variables.idParent>
			<cfset variables.parent=CreateObject("component", "components.corporate.repositoryFolder")>
			<cfset variables.parent.setIdRepositoryFolder(variables.idParent)>
			<cfset variables.parent.get()>
		</cfif>
		<cfreturn variables.parent>
	</cffunction>

	<cffunction name="setName" access="public" output="false">
		<cfargument name="name" type="string" required="yes" default="">
		<cfset variables.name=arguments.name>
	</cffunction>

	<cffunction name="getName" access="public" returntype="string" output="false">
		<cfreturn variables.name>
	</cffunction>
	
	<cffunction name="setDescription" access="public" output="false">
		<cfargument name="description" type="string" required="yes" default="">
		<cfset variables.description=arguments.description>
	</cffunction>

	<cffunction name="getDescription" access="public" returntype="string" output="false">
		<cfreturn variables.description>
	</cffunction>

	<cffunction name="setVariablesFromQuery" access="private" output="false">
		<cfargument name="getQuery" type="query" required="yes">
		<cfif getQuery.recordcount gt 0>
			<cfset variables.idRepositoryFolder=getQuery.idRepositoryFolder>
			<cfif Len(getQuery.idProject)><cfset variables.idProject=getQuery.idProject><cfelse><cfset variables.idProject=0></cfif>
			<cfif Len(getQuery.idParent)><cfset variables.idParent=getQuery.idParent><cfelse><cfset variables.idParent=0></cfif>
			<cfset variables.name=getQuery.name>
			<cfset variables.description=getQuery.description>
		</cfif>
	</cffunction>

	<cffunction name="get" access="public" output="false">
		<cfquery name="getQuery" datasource="#application.datasource#">
			SELECT 
				#getQueryString()#
			WHERE
				repositoryFolder.idRepositoryFolder=<cfqueryparam value="#variables.idRepositoryFolder#" cfsqltype="cf_sql_integer">
		</cfquery>
		<cfif getQuery.recordcount gt 0>
			<cfset setVariablesFromQuery(getQuery)>
		</cfif>
		<cfset module.retrievedFromDB=true>
	</cffunction>

	<cffunction name="getList" access="public" output="false" returntype="query">
		<cfargument name="orderBy" required="no" type="string" default="">

		<cfquery name="getListQuery" datasource="#application.datasource#">
			SELECT 
				#getQueryString()#
			WHERE 
				repositoryFolder.idProject<cfif variables.idProject gt 0>=<cfqueryparam value="#variables.idProject#" cfsqltype="cf_sql_integer"><cfelse> IS NULL</cfif>
				AND repositoryFolder.idParent<cfif variables.idParent gt 0>=<cfqueryparam value="#variables.idParent#" cfsqltype="cf_sql_integer"><cfelse> IS NULL</cfif>
				
			ORDER BY <cfif Len(arguments.orderBy)>#arguments.orderBy#<cfelse>#module.list.orderBy#</cfif>
		</cfquery>
		<cfreturn getListQuery>
	</cffunction>
	
	<cffunction name="getQueryString" access="private" output="false" returntype="string">
		<cfset var result="
				repositoryFolder.idRepositoryFolder,
				repositoryFolder.idParent, parent.name AS parent,
				repositoryFolder.idProject, project.name AS project,
				repositoryFolder.name,
				repositoryFolder.description
			FROM 
				repositoryFolder
			LEFT JOIN repositoryFolder AS parent ON repositoryFolder.idParent=parent.idRepositoryFolder
			LEFT JOIN project ON repositoryFolder.idProject=project.idProject
			">
		<cfreturn result>
	</cffunction>

	<cffunction name="createOptions" access="public" returntype="numeric" output="true">
		<cfargument name="selected" required="yes" type="numeric" default="0">
		<cfset var list=getList("repositoryFolder.idRepositoryFolder")>
		<cfset var result=0>
		<cfif list.idRepositoryFolder gt 0><cfset result=list.idRepositoryFolder></cfif>
		<cfloop query="list">
			<cfif list.idRepositoryFolder eq arguments.selected><cfset _selected=" selected"><cfset result=list.idRepositoryFolder><cfelse><cfset _selected=""></cfif>
			<cfoutput><option value="#list.idRepositoryFolder#"#_selected#>#list.name#</option></cfoutput>
		</cfloop>
		<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 
				idRepositoryFolder 
			FROM 
				repositoryFolder 
			WHERE 
				repositoryFolder.name=<cfqueryparam value="#variables.name#" cfsqltype="cf_sql_varchar" maxlength="255">
				AND repositoryFolder.idParent<cfif variables.idParent gt 0>=<cfqueryparam value="#variables.idParent#" cfsqltype="cf_sql_integer"><cfelse> IS NULL</cfif>
				<cfif variables.idProject gt 0>
				AND repositoryFolder.idProject<cfif variables.idProject gt 0>=<cfqueryparam value="#variables.idProject#" cfsqltype="cf_sql_integer"><cfelse> IS NULL</cfif>
				</cfif>
				<cfif variables.idRepositoryFolder gt 0>
				AND idRepositoryFolder != <cfqueryparam value="#variables.idRepositoryFolder#" cfsqltype="cf_sql_integer">
				</cfif>
		</cfquery>
		<cfif getIdQuery.recordcount gt 0>
			<cfset result.id=getIdQuery.idRepositoryFolder>
		</cfif>
		<cfreturn result>
	</cffunction>
	
	<cffunction name="create" access="public" returntype="struct" output="false">
		<cfset var result=StructNew()>
		<cfset result.id=0>
		<cfset result.message="">
		<!--- check parameters --->
		<cfif not Len(variables.name)>
			<cfset result.message="Nombre de carpeta es un campo obligatorio">
			<cfreturn result>
		</cfif>
		<cfset result=getId()>
		<cfif result.id gt 0>
			<cfset result.message="Carpeta con ese nombre ya existe">
			<cfreturn result>
		</cfif>
		<!--- variables ok --->
		<cftry>
			<cfquery name="createQuery" datasource="#application.datasource#">
				INSERT INTO repositoryFolder
					(
						idParent,
						idProject, 
						name, 
						description
					) 
				VALUES 
					(
					<cfif variables.idParent gt 0><cfqueryparam value="#variables.idParent#" cfsqltype="cf_sql_integer"><cfelse>NULL</cfif>, 
					<cfif variables.idProject gt 0><cfqueryparam value="#variables.idProject#" cfsqltype="cf_sql_integer"><cfelse>NULL</cfif>, 
					<cfqueryparam value="#variables.name#" cfsqltype="cf_sql_varchar" maxlength="255">,
					<cfqueryparam value="#variables.description#" cfsqltype="cf_sql_varchar" maxlength="255">
					)
			</cfquery>
			<cfset result=getId()>
			<cfset variables.idRepositoryFolder=result.id>
			<!--- 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="public" returntype="struct" output="false">
		<cfset var result=StructNew()>
		<cfset result.id=0>
		<cfset result.message="">
		<!--- check parameters --->
		<cfif not Len(variables.name)>
			<cfset result.message="Nombre de carpeta es un campo obligatorio">
			<cfreturn result>
		</cfif>
		<cfset result=getId()>
		<cfif result.id gt 0>
			<cfset result.message="Carpeta con ese nombre ya existe">
			<cfreturn result>
		</cfif>
		<!--- variables ok --->
		<cftry>
			<cfquery name="updateQuery" datasource="#application.datasource#">
				UPDATE repositoryFolder
				SET 
					name=<cfqueryparam value="#variables.name#" cfsqltype="cf_sql_varchar" maxlength="255">,
					description=<cfqueryparam value="#variables.description#" cfsqltype="cf_sql_varchar" maxlength="255">
				WHERE 
					idRepositoryFolder=<cfqueryparam value="#variables.idRepositoryFolder#" cfsqltype="cf_sql_integer">
			</cfquery>
			<cfset result.id=variables.idRepositoryFolder>
			<!--- 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="public" returntype="struct" output="false">
		<cfset var result=StructNew()>
		<cfset result.id=0>
		<cfset result.message="">
		<!--- check parameters --->
		<cftry>
			<cfquery name="deleteQuery1" datasource="#application.datasource#">
				DELETE FROM repositoryFolder
				WHERE 
					idParent=<cfqueryparam value="#variables.idRepositoryFolder#" cfsqltype="cf_sql_integer">
			</cfquery>
			<cfquery name="deleteQuery2" datasource="#application.datasource#">
				DELETE FROM repositoryFolder
				WHERE 
					idRepositoryFolder=<cfqueryparam value="#variables.idRepositoryFolder#" cfsqltype="cf_sql_integer">
			</cfquery>
			<cfset result.id=0>
			<cfset init()>
			<!--- 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>