<cfcomponent>

<cfparam name="Instance" default="#StructNew()#">

<cffunction name="Init" access="public" output="No">

	<cfargument name="UserName" type="string" required="Yes">

	<cfset var Temp = "">
	<cfset var UserRecord = "">
	<cfset var LoadBeginTime = GetTickCount()>
	<cfset var LoadEndTime = "">
	<!--- The previous lines should remain at the beginning of the method. --->

	<!--- Include UDFs as a private methods. --->
	<!--- If the UDFs do not already exist in this request, add them. --->
	<cfif not IsDefined("LDAPQuery")>
		<cfinclude template="/udf/Util/LDAPQuery.cfm">
	</cfif>
	<cfif not IsDefined("GetUserRecordForUserName")>
		<cfinclude template="/udf/User/GetUserRecordForUserName.cfm">
	</cfif>
	<cfif not IsDefined("GetUserTypesForUserName")>
		<cfinclude template="/udf/User/GetUserTypesForUserName.cfm">
	</cfif>
	<cfif not IsDefined("IsActivityFeePaidForUserName")>
		<cfinclude template="/udf/User/IsActivityFeePaidForUserName.cfm">
	</cfif>
	<cfif not IsDefined("GetUserDomainGroupsForUserName")>
		<cfinclude template="/udf/User/GetUserDomainGroupsForUserName.cfm">
	</cfif>
	<cfif not IsDefined("IsCourseAssistant")>
		<cfinclude template="/udf/Course/IsCourseAssistant.cfm">
	</cfif>
	<cfif not IsDefined("IsCourseInstructor")>
		<cfinclude template="/udf/Course/IsCourseInstructor.cfm">
	</cfif>
	<cfif not IsDefined("IsMailingListMember")>
		<cfinclude template="/udf/MailingList/IsMailingListMember.cfm">
	</cfif>
	<cfif not IsDefined("IsMailingListAdmin")>
		<cfinclude template="/udf/MailingList/IsMailingListAdmin.cfm">
	</cfif>
	<cfif not IsDefined("IsMailingListModerator")>
		<cfinclude template="/udf/MailingList/IsMailingListModerator.cfm">
	</cfif>

	<!--- Store user account-type information. --->
	<!--- Allow user to enter "acenet\username", "acenet/username" or "username". --->
	<cfset Instance.AuthUserName = LCase(ListLast(CGI.Auth_User, "\/"))>
	<cfset Instance.UserName = LCase(Arguments.UserName)>

	<cfset UserRecord = GetUserRecordForUserName(Arguments.UserName)>

	<cfset Instance.IDNumber = UserRecord.IDNumber>
	<cfset Instance.UEIDNumber = UserRecord.UEIDNumber>
	<cfset Instance.FirstName = UserRecord.FirstName>
	<cfset Instance.LastName = UserRecord.LastName>

	<!--- Retrieve query object containing user account's domain group membership. --->
	<cfset Instance.UserGroups = GetUserDomainGroupsForUserName(Arguments.UserName)>

	<!--- Retrieve user's user types and add to UserGroups query object. --->
	<cfset Temp = GetUserTypesForUserName(Arguments.UserName)>
	<cfif Temp.RecordCount>
		<cfloop query="Temp">
			<cfset QueryAddRow(Instance.UserGroups)>
			<cfset QuerySetCell(Instance.UserGroups, "GroupName", "user type " & LCase(Temp.UserType))>
		</cfloop>
	</cfif>

	<cfif IsActivityFeePaidForUserName(Arguments.UserName)>
		<cfset QueryAddRow(Instance.UserGroups)>
		<cfset QuerySetCell(Instance.UserGroups, "GroupName", "activity fee paid")>
	</cfif>

	<cfif IsCourseAssistant(Arguments.UserName)>
		<cfset QueryAddRow(Instance.UserGroups)>
		<cfset QuerySetCell(Instance.UserGroups, "GroupName", "acelink course assistant")>
	</cfif>

	<cfif IsCourseInstructor(Arguments.UserName)>
		<cfset QueryAddRow(Instance.UserGroups)>
		<cfset QuerySetCell(Instance.UserGroups, "GroupName", "acelink course instructor")>
	</cfif>

	<cfif IsMailingListMember(Arguments.UserName)>
		<cfset QueryAddRow(Instance.UserGroups)>
		<cfset QuerySetCell(Instance.UserGroups, "GroupName", "acelink mailing list members")>
	</cfif>

	<cfif IsMailingListAdmin(Arguments.UserName)>
		<cfset QueryAddRow(Instance.UserGroups)>
		<cfset QuerySetCell(Instance.UserGroups, "GroupName", "acelink mailing list admins")>
	</cfif>

	<cfif IsMailingListModerator(Arguments.UserName)>
		<cfset QueryAddRow(Instance.UserGroups)>
		<cfset QuerySetCell(Instance.UserGroups, "GroupName", "acelink mailing list moderators")>
	</cfif>

	<!--- Sort UserGroups query object in alphabetical order. --->
	<cfquery name="Temp" dbtype="query">
	SELECT DISTINCT
		GroupName
	FROM
		Instance.UserGroups
	ORDER BY
		GroupName
	</cfquery>

	<cfset Instance.UserGroups = Duplicate(Temp)>

	<!--- The following lines should remain at the end of the method. --->
	<cfset Instance.InstanceCreated = Now()>
	<cfset LoadEndTime = GetTickCount()>
	<cfset Instance.InstanceCreateDuration = LoadEndTime - LoadBeginTime>

</cffunction>

<cffunction name="AuthorizeUser" returntype="boolean" access="public" output="No" hint="Checks if user is in at least one of the argument groups">

	<cfargument name="AcceptedGroupsList" type="string" required="Yes">

	<cfset var AuthorizedGroups = "">

	<!--- Remove any leading spaces from the group name.  Leading spaces will cause --->
	<!--- incorrect query results. ' group name' does not equal 'group name' in SQL. --->
	<cfset var GroupsList = Replace(Arguments.AcceptedGroupsList, ", ", ",", "All")>
	<cfset GroupsList = ListQualify(LCase(GroupsList), "'", ",", "All")>

	<cfquery name="AuthorizedGroups" dbtype="query" debug>
	SELECT
		GroupName
	FROM
		Instance.UserGroups
	WHERE
		GroupName IN (#PreserveSingleQuotes(GroupsList)#)
	</cfquery>

	<cfif AuthorizedGroups.RecordCount>
		<cfreturn 1>
	<cfelse>
		<cfreturn 0>
	</cfif>

</cffunction>

<cffunction name="GetInstanceData" returntype="struct" access="public" output="No" hint="Returns all instance-related data">
	<cfreturn Duplicate(Instance)>
</cffunction>

<cffunction name="GetInstanceCreateDuration" returntype="numeric" access="public" output="No" hint="Returns milliseconds used to initialize instance">
	<cfreturn Instance.InstanceCreateDuration>
</cffunction>

<cffunction name="GetInstanceCreated" returntype="date" access="public" output="No" hint="Returns time instance was initialized">
	<cfreturn Instance.InstanceCreated>
</cffunction>

<cffunction name="GetUserName" returntype="string" access="public" output="No" hint="Returns Authenticated or Impersonated Acenet Account User Name">
	<cfreturn Instance.UserName>
</cffunction>

<cffunction name="GetAuthUserName" returntype="string" access="public" output="No" hint="Returns Authenticated Acenet Account User Name">
	<cfreturn Instance.AuthUserName>
</cffunction>

<cffunction name="GetEmailAddress" returntype="string" access="public" output="No" hint="Returns email address">
	<cfreturn Instance.UserName & "@evansville.edu">
</cffunction>

<cffunction name="GetIDNumber" returntype="string" access="public" output="No" hint="Returns ID Number">
	<cfreturn Instance.IDNumber>
</cffunction>

<cffunction name="GetUEIDNumber" returntype="string" access="public" output="No" hint="Returns UE ID Number">
	<cfreturn Instance.UEIDNumber>
</cffunction>

<cffunction name="GetFirstName" returntype="string" access="public" output="No" hint="Returns First Name">
	<cfreturn Instance.FirstName>
</cffunction>

<cffunction name="GetLastName" returntype="string" access="public" output="No" hint="Returns Last Name">
	<cfreturn Instance.LastName>
</cffunction>

<cffunction name="GetFullName" returntype="string" access="public" output="No" hint="Returns Full Name">
	<cfreturn Instance.FirstName & " " & Instance.LastName>
</cffunction>

<cffunction name="GetUserGroups" returntype="query" access="public" output="No" hint="Returns query object containing Acenet domain group membership">
	<cfreturn Duplicate(Instance.UserGroups)>
</cffunction>

</cfcomponent>