<cfcomponent name="Aministrator">

	<cffunction name="init" access="public" output="false" returntype="any">
		<cfargument name="applicationManager" required="true" type="any">

			<cfset variables.blogManager = arguments.applicationManager>
		
		<cfreturn this />
	</cffunction>


	<cffunction name="getUsersBlogs" access="public" output="false" returntype="array">
		<cfargument name="username" type="String" required="true" />

			<cfset var blogsManager = variables.blogManager.getBlogsManager() />
			<cfset var blogs =  ""/>
			<cfset var authorsManager = variables.blogManager.getauthorsManager() />
			<cfset var author =  authorsManager.getAuthorByUsername(arguments.username,true) />
			
			<cfset blogs =  blogsManager.getBlogsByAuthor(author.getId()) />
			
		<cfreturn blogs />
	</cffunction>
	
	<cffunction name="getBlog" access="public" output="false" returntype="any">

			<!--- @TODO get only blogs for user --->
			<cfreturn variables.blogManager.getBlog() />
			
	</cffunction>

<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="getAuthors" access="public" output="false" returntype="array">

			<cfset var authorsManager = variables.blogManager.getauthorsManager() />
			<cfset var authors =  authorsManager.getAuthors() />
			
		<cfreturn authors />
	</cffunction>

<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="getAuthor" access="public" output="false" returntype="any">
		<cfargument name="id" type="String" required="true" />
		
			<cfset var authorsManager = variables.blogManager.getauthorsManager() />
			<cfset var author =  authorsManager.getAuthorById(arguments.id,true) />
			
		<cfreturn author />
	</cffunction>
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="getAuthorByUsername" access="public" output="false" returntype="any">
		<cfargument name="username" type="String" required="true" />
		
			<cfset var authorsManager = variables.blogManager.getauthorsManager() />
			<cfset var author =  authorsManager.getAuthorByUsername(arguments.username,true) />
			
		<cfreturn author />
	</cffunction>	

<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="getPages" access="public" output="false" returntype="array">
		<cfargument name="from" type="numeric" default="1" required="false" />
		<cfargument name="count" type="numeric" default="0" required="false" />
				
			<cfset var pagesManager = variables.blogManager.getPagesManager() />
			<cfset var pages = pagesManager.getPages(arguments.from,arguments.count,true) />			
		
		<cfreturn pages />
	</cffunction>	

<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="getRecentPosts" access="public" output="false" returntype="array">
		<cfargument name="maxCount" type="numeric" default="0" required="false" />
				
			<cfset var postsManager = variables.blogManager.getPostsManager() />
			<cfset var posts = postsManager.getPosts(1,arguments.maxCount,true) />			
		
		<cfreturn posts />
	</cffunction>	

	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="getPost" access="public" output="false" returntype="any">
		<cfargument name="postId" type="String" required="true" />
					
			<cfset var postsManager = variables.blogManager.getPostsManager() />
			<cfset var post = postsManager.getPostById(arguments.postId,true) />
	
		<cfreturn post />
	</cffunction>
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="getPage" access="public" output="false" returntype="any">
		<cfargument name="pageId" type="String" required="true" />
					
			<cfset var pagesManager = variables.blogManager.getPagesManager() />
			<cfset var page = pagesManager.getPageById(arguments.pageId,true) />
	
		<cfreturn page />
	</cffunction>		
	
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="newPost" access="public" output="false" returntype="struct">		
		<cfargument name="title" type="string" required="true" />
		<cfargument name="content" type="string" required="true" />
		<cfargument name="excerpt" type="string" required="false" default="" />
		<cfargument name="publish" type="boolean" required="false" default="true" hint="If false, post will be saved as draft" />		
	<!---	<cfargument name="blogid" type="String" required="false" default="1" hint="" /> --->
		<cfargument name="authorId" type="String" required="false" default="1" hint="" />
		<cfargument name="allowComments" type="boolean" required="false" default="true" hint="" />
		<cfargument name="postedOn" type="string" required="false" default="#now()#" hint="" />
		<cfargument name="user" required="false" type="any">
		
		<!---@TODO add category array as argument --->
		
			<cfset var postsManager = variables.blogManager.getPostsManager() />
			<cfset var authors = variables.blogManager.getAuthorsManager() />
			<cfset var post = variables.blogManager.getObjectFactory().createPost() />
			<cfset var result = "" />

				<!---make a new post --->
				<cfset post.setAuthorId(arguments.authorId) />
				<cfset post.setContent(arguments.content) />
				<cfset post.setTitle(arguments.title) />
				<cfset post.setBlogId(variables.blogManager.getBlog().getId()) />
				<cfset post.setCommentsAllowed(arguments.allowComments) />
				<cfset post.setPostedOn(arguments.postedOn) />
				<cfset post.setExcerpt(arguments.excerpt) />
				
				<cfif arguments.publish>
					<cfset post.setStatus("published") />
				<cfelse>
					<cfset post.setStatus("draft") />
				</cfif>
				
				<!--- @TODO decide what to do with raw data argument --->
				<cfset result = postsManager.addPost(post,structnew()) />

		
		<cfreturn result />
	</cffunction>
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="editPost" access="public" output="false" returntype="any">		
		<cfargument name="postId" type="String" required="true" />
		<cfargument name="title" type="string" required="true" />
		<cfargument name="content" type="string" required="true" />
		<cfargument name="excerpt" type="string" required="false"  />
		<cfargument name="publish" type="boolean" required="false" default="true" hint="If false, post will be saved as draft" />		
		<cfargument name="allowComments" type="boolean" required="false" hint="" />
		<cfargument name="postedOn" type="string" required="false" hint="When this post is to be published" />
		<cfargument name="user" required="false" type="any">
		
		<!---@TODO add category array as argument --->
		
			<cfset var postsManager = variables.blogManager.getPostsManager() />
			<cfset var post = postsManager.getPostById(arguments.postId,true) />
			<!---<cfset var authorId = 0 /> --->
			<cfset var result = "" />
							
				<!--- populate post --->
				<cfset post.setContent(arguments.content) />
				<cfset post.setTitle(arguments.title) />
				
				<cfif structkeyexists(arguments,"excerpt")>
					<cfset post.setExcerpt(arguments.excerpt) />
				</cfif>
				
				<cfif structkeyexists(arguments,"allowComments")>
					<cfset post.setCommentsAllowed(arguments.allowComments) />
				</cfif>
				
				<cfif structkeyexists(arguments,"postedOn")>
					<cfset post.setPostedOn(arguments.postedOn) />
				</cfif>
				
				<cfif arguments.publish>
					<cfset post.setStatus("published") />
				<cfelse>
					<cfset post.setStatus("draft") />
				</cfif>
				
				<!--- @TODO decide what to do with raw data argument --->
				<cfset result = postsManager.editPost(post,structnew()) />
		
		<cfreturn result />
	</cffunction>		

<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="deletePost" access="public" output="false" returntype="any">		
		<cfargument name="postId" type="String" required="true" />
		<cfargument name="user" required="false" type="any">
		
			<cfset var postsManager = variables.blogManager.getPostsManager() />
			<cfset var post = postsManager.getPostById(arguments.postId,true) />
			<cfset var result = "" />			
										
				<!--- populate post --->
				<cfset post.setId(arguments.postId) />

				<!--- @TODO decide what to do with raw data argument --->
				<cfset result = postsManager.deletePost(post,structnew()) />
		
		<cfreturn result />
	</cffunction>
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="newPage" access="public" output="false" returntype="struct">		
<!---		<cfargument name="blogid" type="String" required="true" /> --->
		<cfargument name="title" type="string" required="true" />
		<cfargument name="content" type="string" required="true" />
		<cfargument name="publish" type="boolean" required="false" default="true" hint="If false, post will be saved as draft" />		
		<cfargument name="parentPage" type="string" required="false" default="" />
		<cfargument name="template" type="string" required="false" default="" />
		<cfargument name="sortOrder" type="numeric" required="false" default="1" />
		<cfargument name="authorId" type="String" required="false" default="1" hint="" />
		<cfargument name="allowComments" type="boolean" required="false" default="true" hint="" />
		<cfargument name="user" required="false" type="any">
		
			<cfset var pagesManager = variables.blogManager.getPagesManager() />
			<cfset var page = variables.blogManager.getObjectFactory().createPage() />
			<cfset var result = "" />

				<!---make a new page --->
				<cfset page.setAuthorId(arguments.authorId) />
				<cfset page.setContent(arguments.content) />
				<cfset page.setTitle(arguments.title) />
				<cfset page.setTemplate(arguments.template) />
				<cfset page.setParentPageId(arguments.parentPage) />
				<cfset page.setSortOrder(arguments.sortOrder) />
				<cfset page.setCommentsAllowed(arguments.allowComments) />
				<cfset page.setBlogId(variables.blogManager.getBlog().getId()) />
				<cfset page.setExcerpt(arguments.excerpt) />
				
				<cfif arguments.publish>
					<cfset page.setStatus("published") />
				<cfelse>
					<cfset page.setStatus("draft") />
				</cfif>
				
				<!--- @TODO decide what to do with raw data argument --->
				<cfset result = pagesManager.addPage(page,structnew(),getAuthor(arguments.authorId)) />
		
		<cfreturn result />
	</cffunction>	
	
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="editPage" access="public" output="false" returntype="any">		
		<cfargument name="pageId" type="String" required="true" />
		<cfargument name="title" type="string" required="true" />
		<cfargument name="content" type="string" required="true" />
		<cfargument name="excerpt" type="string" required="false" default="" />
		<cfargument name="publish" type="boolean" required="false" default="true" hint="If false, post will be saved as draft" />		
		<cfargument name="parentPage" type="string" required="false" default="" />
		<cfargument name="template" type="string" required="false" default="" />
		<cfargument name="sortOrder" type="numeric" required="false" default="1" />
		<cfargument name="allowComments" type="boolean" required="false" default="true" hint="" />
		<cfargument name="user" required="false" type="any">
		
			<cfset var pagesManager = variables.blogManager.getPagesManager() />
			<cfset var page = pagesManager.getPageById(arguments.pageId,true) />
			<cfset var result = "" />
							
				<!--- populate post --->
				<cfset page.setContent(arguments.content) />
				<cfset page.setTitle(arguments.title) />
				<cfset page.setCommentsAllowed(arguments.allowComments) />
				<cfset page.setSortOrder(arguments.sortOrder) />
				<cfset page.setParentPageId(arguments.parentPage) />
				<cfset page.setExcerpt(arguments.excerpt) />
				<cfset page.setTemplate(arguments.template) />
				
				<cfif arguments.publish>
					<cfset page.setStatus("published") />
				<cfelse>
					<cfset page.setStatus("draft") />
				</cfif>
				
				<!--- @TODO decide what to do with raw data argument --->
				<cfset result = pagesManager.editPage(page,structnew()) />
		
		<cfreturn result />
	</cffunction>
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="deletePage" access="public" output="false" returntype="any">		
		<cfargument name="pageId" type="String" required="true" />
		<cfargument name="user" required="false" type="any">
		
			<cfset var manager = variables.blogManager.getPagesManager() />
			<cfset var page = manager.getPageById(arguments.pageId,true) />
			<cfset var result = "" />			
										
				<!--- populate post --->
				<cfset page.setId(arguments.pageId) />

				<!--- @TODO decide what to do with raw data argument --->
				<cfset result = manager.deletePage(page,structnew()) />
		
		<cfreturn result />
	</cffunction>	
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="newAuthor" access="public" output="false" returntype="struct">		
		<cfargument name="username" type="string" required="true" />
		<cfargument name="password" type="string" required="true" />
		<cfargument name="name" type="string" required="true"  />
		<cfargument name="email" type="string" required="true" />
		<cfargument name="description" type="string" required="false" default="" />
		<cfargument name="user" required="false" type="any">
		
			<cfset var authorsManager = variables.blogManager.getauthorsManager() />
			<cfset var author = variables.blogManager.getObjectFactory().createAuthor() />
			<cfset var result = "" />
			<!--- give access to all blogs --->
			<cfset var blogs = variables.blogManager.getBlogsManager().getBlogs() />
			
				<cfset author.setUsername(arguments.username)/>
				<cfset author.setPassword(arguments.password) />
				<cfset author.setName(arguments.name) />
				<cfset author.setEmail(arguments.email) />
				<cfset author.setDescription(arguments.description) />
				<cfset author.setBlogs(blogs) />

				<cfset result = authorsManager.addAuthor(author,structnew()) />
		
		<cfreturn result />
	</cffunction>
	
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="editAuthor" access="public" output="false" returntype="struct">		
		<cfargument name="id" type="string" required="true" />
		<cfargument name="username" type="string" required="true" />
		<cfargument name="password" type="string" required="true" />
		<cfargument name="name" type="string" required="true"  />
		<cfargument name="email" type="string" required="true" />
		<cfargument name="description" type="string" required="false" default="" />
		<cfargument name="user" required="false" type="any">
		
			<cfset var authorsManager = variables.blogManager.getauthorsManager() />
			<cfset var author = getAuthor(arguments.id) />
			<cfset var result = "" />
			<!--- give access to all blogs --->
			<cfset var blogs = variables.blogManager.getBlogsManager().getBlogs() />

				<cfset author.setUsername(arguments.username)/>
				<cfset author.setPassword(arguments.password) />
				<cfset author.setName(arguments.name) />
				<cfset author.setEmail(arguments.email) />
				<cfset author.setDescription(arguments.description) />
				<cfset author.setBlogs(blogs) />

				<cfset result = authorsManager.editAuthor(author,structnew()) />
		
		<cfreturn result />
	</cffunction>		
		

<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="editBlog" access="public" output="false" returntype="any">		
		<cfargument name="title" type="string" required="true" />
		<cfargument name="tagline" type="string" required="true" />
		<cfargument name="description" type="string" required="false" default="" />
		<cfargument name="url" type="string" required="false" default="true" hint="" />		
		<cfargument name="skin" type="string" required="false" default="" hint="" />
		<cfargument name="user" required="false" type="any">

			<cfset var blog = variables.blogManager.getBlog().clone() />
			<cfset var result = "" />
				
				<cfif right(arguments.url,1) NEQ "/">
					<cfset arguments.url = arguments.url & "/">
				</cfif>
								
				<cfset blog.setTagline(arguments.tagline) />
				<cfset blog.setTitle(arguments.title) />
				<cfset blog.setdescription(arguments.description) />
				<cfset blog.setUrl(arguments.url) />
				
				<cfif len(arguments.skin)>
					<cfset blog.setSkin(arguments.skin) />
				</cfif>
				
				<cfset blog.setBasePath(GetPathFromURL(arguments.url)) />
				
				<!--- @TODO decide what to do with raw data argument --->
				<cfset result =  variables.blogManager.getBlogsManager().editBlog(blog,structnew(),structnew(),arguments.user) />
			
				<!--- reload app to see changes in live site --->
				<cfset variables.blogManager.reloadConfig() />
		<cfreturn result />
	</cffunction>		


<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="editCategory" access="public" output="false" returntype="any">
		<cfargument name="id" type="String" required="true" />
		<cfargument name="title" type="string" required="true" />
		<cfargument name="description" type="string" required="false" default="" />
		<cfargument name="user" required="false" type="any">

			<cfset var category = getCategory(arguments.id) />
			<cfset var result = "" />
				
				<cfset category.setTitle(arguments.title) />
				<cfset category.setdescription(arguments.description) />

				<!--- @TODO decide what to do with raw data argument --->
				<cfset result =  variables.blogManager.getCategoriesManager().editCategory(category,structnew()) />
		
		<cfreturn result />
	</cffunction>


<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="newCategory" access="public" output="false" returntype="any">
		<cfargument name="title" type="string" required="true" />
		<cfargument name="description" type="string" required="false" default="" />
		<cfargument name="user" required="false" type="any">

			<cfset var category = variables.blogManager.getObjectFactory().createCategory() />
			<cfset var result = "" />
				
				<cfset category.setTitle(arguments.title) />
				<cfset category.setdescription(arguments.description) />
				<cfset category.setBlogId(variables.blogManager.getBlog().getId()) />

				<!--- @TODO decide what to do with raw data argument --->
				<cfset result =  variables.blogManager.getCategoriesManager().addCategory(category,structnew()) />
		
		<cfreturn result />
	</cffunction>

<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
<!---	<cffunction name="getUserInfo" access="remote" output="false" returntype="any">
		<cfargument name="username" type="String" required="true" />

			<cfset var author = variables.blogManager.getObjectFactory().createAuthor() />
			<cfset var authors = variables.blogManager.getAuthorsManager() />

				<cfset author = authors.getAuthorByUsername(arguments.username) />

		<cfreturn author />
	</cffunction> --->
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="getCategory" access="public" output="false" returntype="any">
		<cfargument name="categoryId" type="String" required="true" />
					
			<cfset var categoriesManager = variables.blogManager.getCategoriesManager() />
			<cfset var categories = categoriesManager.getCategoryById(arguments.categoryId,true) />	
			
		<cfreturn categories />
	</cffunction>		
		
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="getCategories" access="public" output="false" returntype="any">
		<cfargument name="blogid" type="String" required="false" default="1" hint="Ignored" />

			<cfset var categoriesManager = variables.blogManager.getCategoriesManager() />
			<cfset var categories = categoriesManager.getCategories(true) />	
			
		<cfreturn categories />
	</cffunction>		

<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="setPostCategories" access="public" output="false" returntype="any">
		<cfargument name="postId" type="String" required="true" />
		<cfargument name="categories" type="array" required="true" />
		
			<cfset var postsManager = variables.blogManager.getPostsManager() />
			<cfset var result = "" />
			<cfset result = postsManager.setPostCategories(argumentCollection=arguments) />

		<cfreturn result />
	</cffunction>
	
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="getSkins" access="public" output="false" returntype="array">

			<cfset var skins = arraynew(1) />
			<cfset var skin = "" />
			<cfset var dirs = "" />
			<cfset var skindata = "" />
			<cfset var skinxmlfile = "" />
			<cfset var dir = variables.blogManager.getBlog().getSetting('skinsDirectory') />

			<cfif NOT len(dir)>
				<!--- use default --->
				<cfset dir = replacenocase(GetDirectoryFromPath(GetCurrentTemplatePath()),"components","skins") />
			</cfif>
			<cfdirectory name="dirs" directory="#dir#" action="list">
				
				<cfoutput query="dirs">
					<cfset skinxmlfile = directory & "/" & name & "/skin.xml"/>
					<cfif fileexists(skinxmlfile)>
						<cffile action="read" file="#skinxmlfile#" variable="skindata">
						<cfset skindata = xmlparse(skindata).skin />
						<cfset skin = structnew() />
						<cfset skin.name = skindata.xmlAttributes.name />
						<cfset skin.id = skindata.xmlAttributes.id />
						<cfset skin.lastModified = skindata.xmlAttributes.lastModified />
						<cfset skin.version = skindata.xmlAttributes.version />
						<cfset skin.description = skindata.description.xmltext />
						<cfset skin.thumbnail = skindata.thumbnail.xmltext />
						<cfset arrayappend(skins,skin) />
					</cfif>
				</cfoutput>
		<cfreturn skins />
	</cffunction>


<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="getPlugins" access="public" output="false" returntype="array">

			<cfset var dir = variables.blogManager.getBlog().getSetting('pluginsDir') & "/user/"/>
			<cfset var allPlugins = createObject("component","PluginLoader").findPlugins(dir) />
			<cfset var activePlugins = arraytolist(variables.blogManager.getPluginQueue().getPluginNames())/>
			<cfset var i = 0/>
			<cfloop from="1" to="#arraylen(allPlugins)#" index="i">
				<cfif listfind(activePlugins,allPlugins[i].id)>
					<cfset allPlugins[i].active = true />
				<cfelse>
					<cfset allPlugins[i].active = false />
				</cfif>
			</cfloop>
			
		<cfreturn allPlugins />
	</cffunction>	
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="getSkin" access="public" output="false" returntype="any">
		<cfargument name="id" type="String" required="true" />
			<cfset var skin = "" />
			<cfset var skindata = "" />
			<cfset var skinxmlfile = "" />
			<cfset var dir = variables.blogManager.getBlog().getSetting('skinsDirectory') />
			<cfset var i = 0 />
			<cfset var pagetemplate = "">

			<cfif NOT len(dir)>
				<!--- use default --->
				<cfset dir = replacenocase(GetDirectoryFromPath(GetCurrentTemplatePath()),"components","skins") />
			</cfif>

			<cfset skinxmlfile = dir & "/" & arguments.id & "/skin.xml"/>
				<cffile action="read" file="#skinxmlfile#" variable="skindata">
				<cfset skindata = xmlparse(skindata).skin />
				<cfset skin = structnew() />
				<cfset skin.name = skindata.xmlAttributes.name />
				<cfset skin.id = skindata.xmlAttributes.id />
				<cfset skin.lastModified = skindata.xmlAttributes.lastModified />
				<cfset skin.version = skindata.xmlAttributes.version />
				<cfset skin.description = skindata.description.xmltext />
				<cfset skin.thumbnail = skindata.thumbnail.xmltext />
				<cfset skin.adminEditorCss = skindata.adminEditorCss.xmltext />
				<cfset skin.license = skindata.license.xmltext />
				<cfset skin.pageTemplates = arraynew(1) />
				
				<cfloop from="1" to="#arraylen(skindata.pageTemplates.xmlchildren)#" index="i">
					<cfset pagetemplate = structnew() />
					<cfset pagetemplate.file = skindata.pageTemplates.xmlchildren[i].xmlattributes.file />
					<cfset pagetemplate.name = skindata.pageTemplates.xmlchildren[i].xmlattributes.name />
					<cfif fileexists("#dir#/#arguments.id#/#pagetemplate.file#")>
						<cfset skin.pageTemplates[i] = pagetemplate />
					</cfif>
				</cfloop>

		<cfreturn skin />
	</cffunction>

<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="activatePlugin" access="public" output="false" returntype="any">
		<cfargument name="plugin" type="String" required="true" />
		<cfargument name="pluginId" type="String" required="true" />
		<cfargument name="user" required="false" type="any">
			<cfset var blog = variables.blogManager.getBlog()/>
			<cfset var dir = blog.getSetting('pluginsPrefsPath')/>
			<cfset var result = structnew()/>
			<cfset var id = blog.getId()/>
			<cfset var pluginPrefs = createObject("component","utilities.Preferences").init(dir)>
			<cfset var currentlist = pluginPrefs.get(id,"userPlugins","")/>
			<cfset var pluginObj = ""/>
			
			<cfset result.message = createObject("component","Message") />
			
			<cfif NOT listfind(currentList,plugin)>
				<cfset currentList = listappend(currentlist,plugin)>
				<cfset pluginPrefs.put(id,"userPlugins", currentList) />
				<cfset result.message.setstatus("success") />
				<cfset result.message.settext("Plugin activated")/>
				<cfset variables.blogManager.reloadConfig()/>
				<cfset pluginObj = variables.blogManager.getPluginQueue().getPlugin(arguments.pluginId)/>
				<cfset pluginObj.setup()/>
				
				<cfset notifyAPI(arguments.user.getUsername(),arguments.user.getPassword())>
			<cfelse>
				<cfset result.message.setstatus("error") />
				<cfset result.message.settext("Plugin was already active")/>
			</cfif>
		
		<cfreturn result />
	</cffunction>
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="deactivatePlugin" access="public" output="false" returntype="any">
		<cfargument name="plugin" type="String" required="true" />
		<cfargument name="pluginId" type="String" required="true" />
		<cfargument name="user" required="false" type="any">
			<cfset var blog = variables.blogManager.getBlog()/>
			<cfset var dir = blog.getSetting('pluginsPrefsPath')/>
			<cfset var result = structnew()/>
			<cfset var id = blog.getId()/>
			<cfset var pluginPrefs = createObject("component","utilities.Preferences").init(dir)>
			<cfset var currentlist = pluginPrefs.get(id,"userPlugins","")/>
			<cfset var pluginObj = ""/>
			
			<cfset result.message = createObject("component","Message") />
			
			<cfif listfind(currentList,plugin)>
				<cfset currentList = listdeleteat(currentlist,listfind(currentlist,plugin))>
				<cfset pluginPrefs.put(id,"userPlugins", currentList) />
				<cfset result.message.setstatus("success") />
				<cfset result.message.settext("Plugin de-activated")/>
				<cfset pluginObj = variables.blogManager.getPluginQueue().getPlugin(arguments.pluginId)/>
				<cfset pluginObj.unsetup()/>
				
				<cfset notifyAPI(arguments.user.getUsername(),arguments.user.getPassword())>
				<cfset variables.blogManager.reloadConfig()/>
			<cfelse>
				<cfset result.message.setstatus("error") />
				<cfset result.message.settext("Plugin was not active")/>
			</cfif>
			
			
		<cfreturn result />
	</cffunction>

<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="getPageTemplates" access="public" output="false" returntype="array">

			<cfset var templates = "" />
			<cfset var id = variables.blogManager.getBlog().getSkin() />
			<cfset templates = getSkin(id).pageTemplates />
		
			
		<cfreturn templates />
	</cffunction>				
	
<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="checkCredentials" access="public" output="false" returntype="boolean">
		<cfargument name="username" type="String" required="true" />
		<cfargument name="password" type="String" required="true" />
		
			<cfset var authors = variables.blogManager.getAuthorsManager() />
			<cfreturn authors.checkCredentials(arguments.username,arguments.password) />
	</cffunction>		

<!--- ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: --->
	<cffunction name="notifyAPI" access="public" output="false" returntype="void">
		<cfargument name="username" type="String" required="true" />
		<cfargument name="password" type="String" required="true" />
		<cfargument name="event" type="String" required="false" default="configChanged" />
		
			<cftry>
			<cfinvoke webservice="#variables.blogManager.getBlog().getUrl()#api/APIService.cfc?wsdl" method="dataUpdated" timeout="1">
				<cfinvokeargument name="username" value="#arguments.username#">
				<cfinvokeargument name="password" value="#arguments.password#">
				<cfinvokeargument name="event" value="#arguments.event#">
			</cfinvoke>
			<cfcatch type="any"></cfcatch>
			</cftry>
	</cffunction>	
	
	<cfscript>
/**
 * Returns the path from a specified URL.
 * 
 * @param this_url 	 URL to parse. 
 * @return Returns a string. 
 * @author Shawn Seley (shawnse@aol.com) 
 * @version 1, February 21, 2002 
 */
function GetPathFromURL(this_url) {
	var first_char        = "";
	var re_found_struct   = "";
	var path              = "";
	var i                 = 0;
	var cnt               = 0;
	
	this_url = trim(this_url);
	
	first_char = Left(this_url, 1);
	if (Find(first_char, "./")) {
		// relative URL (ex: "../dir1/filename.html" or "/dir1/filename.html")
		re_found_struct = REFind("[^##\?]+", this_url, 1, "True");
	} else if(Find("://", this_url)){
		// absolute URL    (ex: "ftp://user:pass@ftp.host.com")
		re_found_struct = REFind("/[^##\?]*", this_url, Find("://", this_url)+3, "True");
	} else {
		// abbreviated URL (ex: "user:pass@ftp.host.com")
		re_found_struct = REFind("/[^##\?]*", this_url, 1, "True");
	}
	
	if (re_found_struct.pos[1] GT 0)  {
		// get path with filename (if exists)
		path = Mid(this_url, re_found_struct.pos[1], re_found_struct.len[1]);
		
		// chop off the filename
 		if(find("/", path)) {
			i = len(path) - find("/" ,reverse(path)) +1;
			cnt = len(path) -i;
			if (cnt LT 1) cnt =1;
			if (REFind("[^##\?]+\.[^##\?]+", Right(path, cnt))){
				// if the part after the last slash is a file name then chop it off
				path = Left(path, i);
			}
		}
		return path;
	} else {
		return "";
	}
}

/**
 * Returns the host from a specified URL.
 * RE fix for MX, thanks to Tom Lane
 * 
 * @param this_url 	 URL to parse. (Required)
 * @return Returns a string. 
 * @author Shawn Seley (shawnse@aol.com) 
 * @version 2, August 23, 2002 
 */
function GetHostFromURL(this_url) {
	var first_char       = "";
	var re_found_struct  = "";
	var num_expressions  = 0;
	var num_dots         = 0;
	var this_host        = "";
	
	this_url = trim(this_url);
	
	first_char = Left(this_url, 1);
	if (Find(first_char, "./")) {
		return "";   // relative URL = no host   (ex: "../dir1/filename.html" or "/dir1/filename.html")
	} else if(Find("://", this_url)){
		// absolute URL    (ex: "pass@ftp.host.com">ftp://user:pass@ftp.host.com")
		re_found_struct = REFind("[^@]*@([^/:\?##]+)|([^/:\?##]+)", this_url, Find("://", this_url)+3, "True");
	} else {
		// abbreviated URL (ex: "user:pass@ftp.host.com")
		re_found_struct = REFind("[^@]*@([^/:\?##]+)|([^/:\?##]+)", this_url, 1, "True");
	}
	
	if (re_found_struct.pos[1] GT 0) {
		num_expressions = ArrayLen(re_found_struct.pos);
                if(re_found_struct.pos[num_expressions] is 0) num_expressions = num_expressions - 1;
		this_host = Mid(this_url, re_found_struct.pos[num_expressions], re_found_struct.len[num_expressions]);
		num_dots = (Len(this_host) - Len(Replace(this_host, ".", "", "ALL")));;
		if ((not FindOneOf("/@:", this_url)) and (num_dots LT 2)){
			// since this URL doesn't contain any "/" or "@" or ":" characters and since the "host" has fewer than two dots (".")
			// then it is probably actually a file name
			return ""; 
		}
		return this_host;
	} else {
		return "";
	}
}
</cfscript>
	
</cfcomponent>
