<cfcomponent output="false" extends="base">



	<cffunction name="init" returntype="Any" output="false" access="public">
		<cfset var Arg = -1/>
		<cfset This = super.init(ArgumentCollection=Arguments)/>
		<cfset setPeriods(ListToArray("Yearly,Quarterly,Monthly"))/>

		<cfreturn This/>
	</cffunction>


<!---
	<cffunction name="initCodeLabelMaps" output="false" access="private">
		<cfset This.CodeLabel = Struct
			( Package = Struct
				( sim   : 'Simple'
				, dev   : 'Developer'
				, comm  : 'Community'
				, photo : 'Photography'
				)
			, Level = Struct
				( std : 'Standard'
				, mid : 'Mid'
				, adv : 'Advanced'
				)
			, Period = Struct
				( y : 'Yearly'
				, q : 'Quarterly'
				, m : 'Monthly'
				)
			)/>

		<cfset var Type = -1/>
		<cfset var Code = -1/>
		<cfset This.LabelCode = Struct()/>
		<cfloop item="Type" collection="#This.CodeLabel#">
			<cfset This.LabelCode[Type] = Struct()/>
			<cfloop item="Code" collection="#This.CodeLabel[Type]#">
				<cfset This.LabelCode[Type][This.CodeLabel[Type][Code]] = Code/>
			</cfloop>
		</cfloop>
	</cffunction>

	<cffunction name="Code" output="false" access="private">
		<cfargument name="Type"/>
		<cfargument name="Label"/>
		<cfif StructKeyExists(This.LabelCode[Arguments.Type],Arguments.Label)>
			<cfreturn This.LabelCode[Arguments.Type][Arguments.Label]/>
		<cfelse>
			<cfreturn Arguments.Label/>
		</cfif>
	</cffunction>

	<cffunction name="Label" output="false" access="private">
		<cfargument name="Type"/>
		<cfargument name="Code"/>
		<cfif StructKeyExists(This.LabelCode[Arguments.Type],Arguments.Code)>
			<cfreturn This.CodeLabel[Arguments.Type][Arguments.Code]/>
		<cfelse>
			<cfreturn Arguments.Code/>
		</cfif>
	</cffunction>
--->






	<cffunction name="Info" returntype="String" output="false" access="public">
		<cfargument name="package" type="string"/>
		<cfargument name="level"   type="string" required="false"/>
		<cfargument name="feature" type="string"/>
		<cfargument name="units"   type="boolean" default="true"/>
		<cfargument name="html"    type="boolean" default="false"/>
		<cfset var qryInfo = -1/>

		<cfquery name="qryInfo" datasource="#This.Datasource#">
			SELECT d_value AS value
			     , f_units AS units
			FROM data
			JOIN feature ON (f_id = d_feature)
			WHERE d_package = <cfqueryparam value="#Arguments.Package#"/>
			<cfif StructKeyExists(Arguments,'Level')>
				AND d_level = <cfqueryparam value="#Arguments.Level#"/>
			</cfif>
			AND d_feature = <cfqueryparam value="#Arguments.Feature#"/>
		</cfquery>

		<cfif Arguments.Units AND Len(qryInfo.units)>
			<cfif NOT ListFind('MB,GB',qryInfo.units)>
				<cfif Arguments.Html>
					<cfreturn XmlFormat(qryInfo.units) & qryInfo.value/>
				<cfelse>
					<cfreturn qryInfo.units & qryInfo.value/>
				</cfif>
			<cfelse>
				<cfif Arguments.Html>
					<cfreturn qryInfo.value & '<span class="units">#qryInfo.units#</span>'/>
				<cfelse>
					<cfreturn qryInfo.value & qryInfo.units/>
				</cfif>
			</cfif>
		<cfelse>
			<cfreturn qryInfo.value/>
		</cfif>
	</cffunction>



	<cffunction name="Label" returntype="String" output="false" access="public">
		<cfset var argName = LCase(StructKeyList(Arguments))/>
		<cfif ListFind('package,level,category,feature',argName)>
			<cfset var qryLbl = -1/>
			<cfquery name="qryLbl" datasource="#This.Datasource#">
				SELECT #Left(argName,1)#_label AS label
				FROM #argName#
				WHERE #Left(argName,1)#_id = <cfqueryparam value="#Arguments[argName]#" cfsqltype="CF_SQL_VARCHAR"/>
			</cfquery>
			<cfif qryLbl.RecordCount>
				<cfreturn qryLbl.label/>
			<cfelse>
				<cfreturn Arguments[1]/>
			</cfif>
		<cfelse>
			<cfreturn '[undefined #argName# #Arguments[1]#]'/>
		</cfif>
	</cffunction>


	<cffunction name="Units" returntype="String" output="false" access="public">
		<cfargument name="feature" type="String" required="false"/>
		<cfset var qryUnits = -1/>
		<cfquery name="qryUnits" datasource="#This.Datasource#">
			SELECT DISTINCT f_units AS units
			FROM feature
			<cfif StructKeyExists(Arguments,'Feature')>
			WHERE f_id IN (<cfqueryparam value="#Arguments.Feature#" list="true"/>)
			</cfif>
			ORDER BY f_order ASC
		</cfquery>
		<cfset var Result = ValueList(qryUnits.units)/>
		<cfif Len(Result)>
			<cfif ListLen(Result) GT 1>
				<cfset Result = ListChangeDelims(Result,'),(')/>
			</cfif>
			<cfreturn "(#Result#)"/>
		<cfelse>
			<cfreturn ""/>
		</cfif>
	</cffunction>



	<cffunction name="Categories" returntype="String" output="false" access="public">
		<cfargument name="priority"	type="String" required="false"/>
		<cfargument name="package"  type="String" required="false"/>
		<cfset var qryCats = -1/>
		<cfquery name="qryCats" datasource="#This.Datasource#">
			SELECT DISTINCT c_id AS category
			FROM category
			<cfif StructKeyExists(Arguments,'priority') OR StructKeyExists(Arguments,'package')>
				JOIN feature ON (f_category = c_id)
			</cfif>
			<cfif StructKeyExists(Arguments,'package')>
				JOIN data    ON (d_feature = f_id)
			</cfif>
			WHERE 1=1
			<cfif StructKeyExists(Arguments,'priority')>
				AND f_priority IN (<cfqueryparam value="#Arguments.Priority#" list="true"/>)
			</cfif>
			<cfif StructKeyExists(Arguments,'package')>
				AND d_package IN (<cfqueryparam value="#Arguments.Package#" list="true"/>)
			</cfif>
			ORDER BY c_order ASC
		</cfquery>
		<cfreturn ValueList(qryCats.category)/>
	</cffunction>


	<cffunction name="Features" returntype="String" output="false" access="public">
		<cfargument name="category" type="String" required="false"/>
		<cfargument name="priority"	type="String" required="false"/>
		<cfargument name="package"  type="String" required="false"/>
		<cfset var qryFeats = -1/>
		<cfquery name="qryFeats" datasource="#This.Datasource#">
			SELECT DISTINCT f_id AS feature
			FROM category
			JOIN feature ON (f_category = c_id)
			JOIN data    ON (d_feature = f_id)
			WHERE 1=1
			<cfif StructKeyExists(Arguments,'category')>
				AND f_category IN (<cfqueryparam value="#Arguments.Category#" list="true"/>)
			</cfif>
			<cfif StructKeyExists(Arguments,'priority')>
				AND f_priority IN (<cfqueryparam value="#Arguments.Priority#" list="true"/>)
			</cfif>
			<cfif StructKeyExists(Arguments,'package')>
				AND d_package IN (<cfqueryparam value="#Arguments.Package#" list="true"/>)
			</cfif>
			ORDER BY c_order, f_order ASC
		</cfquery>
		<cfreturn ValueList(qryFeats.feature)/>
	</cffunction>


	<cffunction name="Levels" returntype="String" output="false" access="public">
		<cfargument name="package"  type="String" required="false"/>
		<cfargument name="labels"   type="Boolean" default="false"/>
		<cfset var qryLvls = -1/>
		<cfquery name="qryLvls" datasource="#This.Datasource#">
			SELECT DISTINCT l_id AS level_id, l_label AS level_label
			FROM level
			<cfif StructKeyExists(Arguments,'package')>
			JOIN data ON (d_level = l_id)
			WHERE d_package IN (<cfqueryparam value="#Arguments.Package#" list="true"/>)
			</cfif>
			ORDER BY l_order ASC
		</cfquery>
		<cfif Arguments.Labels>
			<cfset var Result = ""/>
			<cfloop query="qryLvls">
				<cfset Result = ListAppend(Result,level_id &':'& level_label)/>
			</cfloop>
			<cfreturn Result/>
		<cfelse>
			<cfreturn ValueList(qryLvls.level_id)/>
		</cfif>
	</cffunction>


	<cffunction name="Packages" returntype="String" output="true" access="public">
		<cfargument name="labels"   type="Boolean" default="false"/>
		<cfset var qryPkgs = -1/>
		<cfquery name="qryPkgs" datasource="#This.Datasource#">
			SELECT DISTINCT p_id AS package_id, p_label AS package_label
			FROM package
			ORDER BY p_order ASC
		</cfquery>
		<cfif Arguments.Labels>
			<cfset var Result = ""/>
			<cfloop query="qryPkgs">
				<cfset Result = ListAppend(Result,package_id &':'& package_label)/>
			</cfloop>
			<cfreturn Result/>
		<cfelse>
			<cfreturn ValueList(qryPkgs.package_id)/>
		</cfif>
	</cffunction>


	<cffunction name="getPeriods" returntype="String" output="false" access="public">
		<cfreturn ArrayToList(Variables.Periods)/>
	</cffunction>
	<cffunction name="setPeriods" output="false" access="public">
		<cfargument name="1"/>
		<cfreturn Variables.Periods = Arguments[1]/>
	</cffunction>


</cfcomponent>