<cfcomponent extends="components.common.formObject">
	<cfset variables.idState=0>
	<cfset variables.state=CreateObject("component", "components.corporate.infState")>
	<cfset variables.idCity=0>
	<cfset variables.city=CreateObject("component", "components.corporate.infCity")>
	<cfset variables.idNeighbour=0>
	<cfset variables.name="">
	<cfset variables.postalCode="">
	<cfset module.list.orderBy="infNeighbour.name">

	<cffunction name="init" access="remote" output="false">
		<cfset variables.idState=0>
		<cfset variables.state=CreateObject("component", "components.corporate.infState")>
		<cfset variables.idCity=0>
		<cfset variables.city=CreateObject("component", "components.corporate.infCity")>
		<cfset variables.idNeighbour=0>
		<cfset variables.name="">
		<cfset variables.postalCode="">
	</cffunction>
	
	<cffunction name="getFormObjectId" access="public" output="false" returntype="numeric">
		<cfreturn getIdNeighbour()>
	</cffunction>
	
	<cffunction name="setFormObjectId" access="public" output="false">
		<cfargument name="objectId" type="numeric" required="yes">
		<cfset setIdNeighbour(arguments.objectId)>
	</cffunction>

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

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

	<cffunction name="getState" access="remote" returntype="components.corporate.infState" output="false">
		<cfset variables.state=CreateObject("component", "components.corporate.infState")>
		<cfset variables.state.setIdState(variables.idState)>
		<cfset variables.state.get()>
		<cfreturn variables.state>
	</cffunction>

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

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

	<cffunction name="getCity" access="remote" returntype="components.corporate.infCity" output="false">
		<cfset variables.city=CreateObject("component", "components.corporate.infCity")>
		<cfset variables.city.setIdState(variables.idState)>
		<cfset variables.city.setIdCity(variables.idCity)>
		<cfset variables.city.get()>
		<cfreturn variables.city>
	</cffunction>

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

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

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

	<cffunction name="getName" access="remote" returntype="string" output="false">
		<cfreturn variables.name>
	</cffunction>

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

	<cffunction name="getPostalCode" access="remote" returntype="string" output="false">
		<cfreturn variables.postalCode>
	</cffunction>

	<cffunction name="get" access="remote" output="false">
		<cfquery name="getQuery" datasource="#application.datasource#">
			SELECT 
				#getQueryString()#
			WHERE
				infNeighbour.idState=<cfqueryparam value="#variables.idState#" cfsqltype="cf_sql_integer">
				AND infNeighbour.idCity=<cfqueryparam value="#variables.idCity#" cfsqltype="cf_sql_integer">
				AND infNeighbour.idNeighbour=<cfqueryparam value="#variables.idNeighbour#" cfsqltype="cf_sql_integer">
		</cfquery>
		<cfif getQuery.recordcount gt 0>
			<cfset variables.idState=getQuery.idState>
			<cfset variables.idCity=getQuery.idCity>
			<cfset variables.idNeighbour=getQuery.idNeighbour>
			<cfset variables.name=getQuery.name>
			<cfset variables.postalCode=getQuery.postalCode>
		</cfif>
	</cffunction>

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

		<cfquery name="getListQuery" datasource="#application.datasource#">
			SELECT 
				#getQueryString()#
			WHERE
				infNeighbour.idState=<cfqueryparam value="#variables.idState#" cfsqltype="cf_sql_integer">
				AND infNeighbour.idCity=<cfqueryparam value="#variables.idCity#" cfsqltype="cf_sql_integer">
			ORDER BY <cfif Len(arguments.orderBy)>#URLDecode(arguments.orderBy)#<cfelse>#URLDecode(module.list.orderBy)#</cfif>
		</cfquery>
		<cfreturn getListQuery>
	</cffunction>
	
	<cffunction name="getQueryString" access="private" output="false" returntype="string">
		<cfset var result="
				infNeighbour.idState, infState.name AS state,
				infNeighbour.idCity, infCity.name AS city,
				infNeighbour.idNeighbour,
				infNeighbour.name,
				infNeighbour.postalCode
			FROM 
				infNeighbour
				LEFT JOIN infState ON infNeighbour.idState=infState.idState
				LEFT JOIN infCity ON infNeighbour.idCity=infCity.idCity AND infNeighbour.idState=infCity.idState
			">
		<cfreturn result>
	</cffunction>

	<cffunction name="createOptions" access="remote" returntype="numeric" output="true">
		<cfargument name="selected" required="yes" type="numeric" default="0">
		<cfargument name="idState" required="no" type="numeric" default="0">
		<cfargument name="idCity" required="no" type="numeric" default="0">
		<cfset var list="">
		<cfset var result=0>
		<cfif arguments.idState gt 0><cfset variables.idState=arguments.idState></cfif>
		<cfif arguments.idCity gt 0><cfset variables.idCity=arguments.idCity></cfif>
		<cfset list=getList("infNeighbour.name")>
		<cfif list.idNeighbour gt 0><cfset result=list.idNeighbour></cfif>
		<cfloop query="list">
			<cfif list.idNeighbour eq arguments.selected><cfset _selected=" selected"><cfset result=list.idNeighbour><cfelse><cfset _selected=""></cfif>
			<cfoutput><option value="#list.idNeighbour#"#_selected#>#list.name#</option></cfoutput>
		</cfloop>
		<cfreturn result>
	</cffunction>
	
	<cffunction name="getId" access="remote" returntype="struct" output="false">
		<cfset var result=StructNew()>
		<cfset result.id=0>
		<cfset result.message="">
		<cfquery name="getIdQuery" datasource="#application.datasource#">
			SELECT 
				idNeighbour 
			FROM 
				infNeighbour 
			WHERE 
				infNeighbour.idState=<cfqueryparam value="#variables.idState#" cfsqltype="cf_sql_integer">
				AND infNeighbour.idCity=<cfqueryparam value="#variables.idCity#" cfsqltype="cf_sql_integer">
				AND name=<cfqueryparam value="#variables.name#" cfsqltype="cf_sql_varchar" maxlength="255">
				<cfif variables.idNeighbour gt 0>
				AND idNeighbour != <cfqueryparam value="#variables.idNeighbour#" cfsqltype="cf_sql_integer">
				</cfif>
		</cfquery>
		<cfif getIdQuery.recordcount gt 0>
			<cfset result.id=getIdQuery.idNeighbour>
		</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.idState lt 1>
			<cfset result.message="Estado es un campo obligatorio">
			<cfreturn result>
		</cfif>
		<cfif variables.idCity lt 1>
			<cfset result.message="Delegacion/municipio es un campo obligatorio">
			<cfreturn result>
		</cfif>
		<cfif not Len(variables.name)>
			<cfset result.message="Nombre de colonia es un campo obligatorio">
			<cfreturn result>
		</cfif>
		<cfset result=getId()>
		<cfif result.id gt 0>
			<cfset result.message="Colonia con ese nombre ya existe">
			<cfreturn result>
		</cfif>
		<!--- variables ok --->
		<cftry>
			<cfquery name="createQuery" datasource="#application.datasource#">
				INSERT INTO infNeighbour
					(
					idState, idCity, idNeighbour, name, postalCode
					) 
				VALUES 
					(
					<cfqueryparam value="#variables.idState#" cfsqltype="cf_sql_integer">, 
					<cfqueryparam value="#variables.idCity#" cfsqltype="cf_sql_integer">, 
					<cfqueryparam value="#variables.idNeighbour#" cfsqltype="cf_sql_integer">, 
					<cfqueryparam value="#variables.name#" cfsqltype="cf_sql_varchar" maxlength="255">,
					<cfqueryparam value="#variables.postalCode#" cfsqltype="cf_sql_varchar" maxlength="8">
					)
			</cfquery>
			<cfset result=getId()>
			<cfset variables.idNeighbour=result.id>
			<!--- catch any error --->
			<cfcatch type="any">
				<cfset result.id=-1>
				<cfset result.message="Error [infNeighbour.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.idState lt 1>
			<cfset result.message="Estado es un campo obligatorio">
			<cfreturn result>
		</cfif>
		<cfif variables.idCity lt 1>
			<cfset result.message="Delegacion/municipio es un campo obligatorio">
			<cfreturn result>
		</cfif>
		<cfif not Len(variables.name)>
			<cfset result.message="Nombre de colonia es un campo obligatorio">
			<cfreturn result>
		</cfif>
		<cfset result=getId()>
		<cfif result.id gt 0>
			<cfset result.message="Colonia con ese nombre ya existe">
			<cfreturn result>
		</cfif>
		<!--- variables ok --->
		<cftry>
			<cfquery name="updateQuery" datasource="#application.datasource#">
				UPDATE infNeighbour
				SET 
					idState=<cfqueryparam value="#variables.idState#" cfsqltype="cf_sql_integer">, 
					idCity=<cfqueryparam value="#variables.idCity#" cfsqltype="cf_sql_integer">, 
					name=<cfqueryparam value="#variables.name#" cfsqltype="cf_sql_varchar" maxlength="255">,
					postalCode=<cfqueryparam value="#variables.postalCode#" cfsqltype="cf_sql_varchar" maxlength="8">
				WHERE 
					idNeighbour=<cfqueryparam value="#variables.idNeighbour#" cfsqltype="cf_sql_integer">
					AND idCity=<cfqueryparam value="#variables.idCity#" cfsqltype="cf_sql_integer">
					AND idState=<cfqueryparam value="#variables.idState#" cfsqltype="cf_sql_integer">
			</cfquery>
			<cfset result.id=variables.idNeighbour>
			<!--- catch any error --->
			<cfcatch type="any">
				<cfset result.id=-1>
				<cfset result.message="Error [infNeighbour.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="">
		<!--- check parameters --->
		<cftry>
			<cfquery name="deleteQuery" datasource="#application.datasource#">
				DELETE FROM infNeighbour
				WHERE 
					idNeighbour=<cfqueryparam value="#variables.idNeighbour#" cfsqltype="cf_sql_integer">
					AND idCity=<cfqueryparam value="#variables.idCity#" cfsqltype="cf_sql_integer">
					AND idState=<cfqueryparam value="#variables.idState#" 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 [infNeighbour.delete()]: " & cfcatch.Message & "<br>Details: " & cfcatch.Detail>
			</cfcatch>
		</cftry>
		<cfreturn result>
	</cffunction>
</cfcomponent>