Skip to content
Snippets Groups Projects
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
FunctionalCourseUtil.java 67.83 KiB
/**
 * <a href="http://www.openolat.org">
 * OpenOLAT - Online Learning and Training</a><br>
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License"); <br>
 * you may not use this file except in compliance with the License.<br>
 * You may obtain a copy of the License at the
 * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
 * <p>
 * Unless required by applicable law or agreed to in writing,<br>
 * software distributed under the License is distributed on an "AS IS" BASIS, <br>
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
 * See the License for the specific language governing permissions and <br>
 * limitations under the License.
 * <p>
 * Initial code contributed and copyrighted by<br>
 * frentix GmbH, http://www.frentix.com
 * <p>
 */
package org.olat.util;

import java.io.IOException;
import java.io.StringWriter;
import java.net.MalformedURLException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.apache.commons.lang.ArrayUtils;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.exception.MethodInvocationException;
import org.apache.velocity.exception.ParseErrorException;
import org.apache.velocity.exception.ResourceNotFoundException;
import org.olat.core.logging.OLog;
import org.olat.core.logging.Tracing;

import com.thoughtworks.selenium.Selenium;

/**
 * Description: <br>
 * 
 * @author jkraehemann, joel.kraehemann@frentix.com, frentix.com
 */
public class FunctionalCourseUtil {
	private final static OLog log = Tracing.createLoggerFor(FunctionalCourseUtil.class);
	
	private final static Pattern categoryPattern = Pattern.compile("/([^/]+)");
	
	public final static String COURSE_RUN_CSS = "o_course_run";
	public final static String COURSE_OPEN_EDITOR_CSS = "o_sel_course_open_editor";
	
	public final static String COURSE_TAB_ACTIVE_CSS = "b_nav_active";
	public final static String COURSE_TAB_CLOSE_CSS = "b_nav_tab_close";
	
	public final static String COURSE_EDITOR_NODE_LINKS_ID = "o_course_node_links";
	public final static String COURSE_EDITOR_PUBLISH_CSS = "b_toolbox_publish";
	public final static String COURSE_EDITOR_PUBLISH_WIZARD_SELECT_ALL_CSS = "o_sel_course_publish_selectall_cbb";
	public final static String COURSE_EDITOR_PUBLISH_WIZARD_ACCESS_ID = "o_fioaccessBox_SELBOX";
	public final static String COURSE_EDITOR_PUBLISH_WIZARD_CATALOG_ID = "o_fiocatalogBox_SELBOX";
	public final static String ADD_TO_CATALOG_YES_VALUE = "yes";
	public final static String ADD_TO_CATALOG_NO_VALUE = "no";
	public final static String CATALOG_SUBCATEGORY_ICON_CSS = "o_catalog_cat_icon";
	public final static String ADD_TO_CATALOG_CSS = "o_sel_publish_add_to_catalog";
	public final static String CATALOG_CSS = "o_sel_catalog_chooser_tree";
	
	public final static String COURSE_EDITOR_INSERT_CONTENT_CSS = "b_toolbox_content";
	public final static String CREATE_COURSE_NODE_TARGET_POSITION_ITEM_CSS = "b_selectiontree_item";
	
	public final static String COURSE_EDITOR_OVERVIEW_RADIO_GROUP_CSS = "";
	public final static String COURSE_EDITOR_CHOOSE_OVERVIEW_FILE_CSS = "o_sel_filechooser_create";
	public final static String COURSE_EDITOR_UPLOAD_OVERVIEW_FILE_CSS = "o_sel_upload_buttons";
	
	public final static String EPORTFOLIO_ADD_CSS = "b_eportfolio_add";
	
	public final static String STRUCTURE_ICON_CSS = "o_st_icon";
	public final static String FORUM_ICON_CSS = "o_fo_icon";
	public final static String BLOG_ICON_CSS = "o_blog_icon";
	
	public final static String FORUM_TOOLBAR_CSS = "o_forum_toolbar";
	public final static String FORUM_THREAD_NEW_CSS = "o_sel_forum_thread_new";
	public final static String FORUM_ARCHIVE_CSS = "o_sel_forum_archive";
	public final static String FORUM_FILTER_CSS = "o_sel_forum_filter";
	
	public final static String WIKI_CREATE_ARTICLE_CSS = "o_sel_wiki_search";
	public final static String WIKI_ARTICLE_BOX_CSS = "o_wikimod-article-box";
	public final static String WIKI_EDIT_FORM_WRAPPER_CSS = "o_wikimod_editform_wrapper";
	
	public final static String BLOG_CREATE_ENTRY_CSS = "o_sel_feed_item_new";
	public final static String BLOG_EDIT_ENTRY_CSS = "o_sel_feed_item_edit";
	public final static String BLOG_DELETE_ENTRY_CSS = "o_sel_feed_item_delete";
	public final static String BLOG_READ_ENTRY_CSS = "o_post-readmorelinks";
	public final static String BLOG_FORM_CSS = "o_sel_blog_form";
	public final static String BLOG_POST_CSS = "o_blog_post";
	public final static String BLOG_YEAR_CSS = "b_year";
	public final static String BLOG_MONTH_CSS = "b_month";
	
	public final static String TEST_CHOOSE_REPOSITORY_FILE_CSS = "o_sel_test_choose_repofile";
	public final static String CP_CHOOSE_REPOSITORY_FILE_CSS = "o_sel_cp_choose_repofile";
	public final static String WIKI_CHOOSE_REPOSITORY_FILE_CSS = "o_sel_wiki_choose_repofile";
	public final static String FEED_CHOOSE_REPOSITORY_FILE_CSS = "o_sel_feed_choose_repofile";
	public final static String MAP_CHOOSE_REPOSITORY_FILE_CSS = "o_sel_map_choose_repofile";
	
	public final static String REPOSITORY_POPUP_CSS = "o_sel_search_referenceable_entries";
	
	public final static String REPOSITORY_POPUP_CREATE_RESOURCE_CSS = "o_sel_repo_popup_create_resource";
	public final static String REPOSITORY_POPUP_IMPORT_RESOURCE_CSS = "o_sel_repo_popup_import_resource";
	
	public final static String REPOSITORY_POPUP_ALL_RESOURCES_CSS = "o_sel_repo_popup_all_resources";
	public final static String REPOSITORY_POPUP_MY_RESOURCES_CSS = "o_sel_repo_popup_my_resources";
	public final static String REPOSITORY_POPUP_SEARCH_RESOURCES_CSS = "o_sel_repo_popup_search_resources";
	
	public final static String MAP_EDIT_CSS = "o_sel_edit_map";
	
	public final static String BLOG_NO_POSTS_CSS = "o_blog_no_posts";
	
	public final static String PODCAST_NO_EPISODES_CSS = "o_podcast_no_episodes";
	
	public enum CourseNodeTab {
		TITLE_AND_DESCRIPTION,
		VISIBILITY,
		ACCESS,
		CONTENT;
	};
	
	public enum VisibilityOption {
		BLOCKED_FOR_LEARNERS,
		DEPENDING_ON_DATE,
		DEPENDING_ON_GROUP,
		DEPENDING_ON_ASSESSMENT,
		APPLY_TO_OWNERS_AND_TUTORS(DEPENDING_ON_ASSESSMENT);
		
		private VisibilityOption requires;
		
		VisibilityOption(){
			this(null);
		}
		
		VisibilityOption(VisibilityOption requires){
			setRequires(requires);
		}

		public VisibilityOption getRequires() {
			return requires;
		}

		public void setRequires(VisibilityOption requires) {
			this.requires = requires;
		}
	};
	
	public enum AccessOption {
		BLOCKED_FOR_LEARNERS,
		DEPENDING_ON_DATE,
		DEPENDING_ON_GROUP,
		DEPENDING_ON_ASSESSMENT,
		APPLY_TO_OWNERS_AND_TUTORS(DEPENDING_ON_ASSESSMENT);
		
		private AccessOption requires;
		
		AccessOption(){
			this(null);
		}
		
		AccessOption(AccessOption requires){
			setRequires(requires);
		}

		public AccessOption getRequires() {
			return requires;
		}

		public void setRequires(AccessOption requires) {
			this.requires = requires;
		}
	}
	
	public enum CourseOverview {
		AUTOMATIC("system"),
		AUTOMATIC_AND_PREVIEW("peekview"),
		SINGLEPAGE("file"),
		NONE("delegate");
		
		private String value;
		
		CourseOverview(String value){
			setValue(value);
		}

		public String getValue() {
			return value;
		}

		public void setValue(String value) {
			this.value = value;
		}
	}
	
	public enum CourseNodeAlias {
		STRUCTURE("o_st_icon"), // NOT really a course node
		SP("o_sp_icon"),
		FORUM("o_fo_icon"),
		WIKI("o_wiki_icon"),
		BLOG("o_blog_icon"),
		CP("o_cp_icon"),
		SCORM("o_scorm_icon"),
		BC("o_bc_icon"),
		PODCAST("o_podcast_icon"),
		DIALOG("o_dialog_icon"),
		ASSESSMENT("o_ms_icon"),
		TASK("o_ta_icon"),
		PORTFOLIO_TASK("o_ep_icon"),
		IQ_TEST("o_iqtest_icon"),
		IQ_SELFTEST("o_iqself_icon"),
		IQ_QUESTIONAIRE("o_iqsurv_icon"),
		ENROLMENT("o_en_icon"),
		PROJECT_BROKER("o_projectbroker_icon"),
		NOTIFICATIONS("o_infomsg_icon"),
		MEMBERS("o_cmembers_icon"),
		CALENDAR("o_cal_icon"),
		LINK_LIST("o_ll_icon"),
		CONTACT("o_co_icon");
		
		private String iconCss;
		
		CourseNodeAlias(String iconCss){
			setIconCss(iconCss);
		}

		public String getIconCss() {
			return iconCss;
		}

		public void setIconCss(String iconCss) {
			this.iconCss = iconCss;
		}
	}
	
	public enum AccessSettings {
		OWNERS("1"),
		OWNERS_AND_AUTHORS("2"),
		ALL_REGISTERED_USERS("3"),
		REGISTERED_USERS_AND_GUESTS("4"),
		MEMBERS_ONLY("membersonly");
		
		private String accessValue;
		
		AccessSettings(String accessValue){
			setAccessValue(accessValue);
		}

		public String getAccessValue() {
			return accessValue;
		}

		public void setAccessValue(String accessValue) {
			this.accessValue = accessValue;
		}
	}
	
	public enum CourseEditorCourseTab {
		TITLE_AND_DESCRIPTION,
		VISIBILITY,
		ACCESS,
		OVERVIEW,
		SCORE,
	}
	
	public enum CourseEditorIQTestTab {
		TITLE_AND_DESCRIPTION,
		VISIBILITY,
		ACCESS,
		TEST_CONFIGURATION;
	}
	
	public enum CourseEditorCpTab {
		TITLE_AND_DESCRIPTION,
		VISIBILITY,
		ACCESS,
		LEARNING_CONTENT;
	}
	
	public enum CourseEditorWikiTab {
		TITLE_AND_DESCRIPTION,
		VISIBILITY,
		ACCESS,
		LEARNING_CONTENT;
	}
	
	public enum CourseEditorBlogTab {
		TITLE_AND_DESCRIPTION,
		VISIBILITY,
		ACCESS,
		LEARNING_CONTENT;
	}
	
	public enum CourseEditorPodcastTab {
		TITLE_AND_DESCRIPTION,
		VISIBILITY,
		ACCESS,
		LEARNING_CONTENT;
	}
	
	public enum CourseEditorPortfolioTaskTab {
		TITLE_AND_DESCRIPTION,
		VISIBILITY,
		ACCESS,
		LEARNING_CONTENT,
		ASSESSMENT;
	}
	
	public enum BlogEdit {
		TITLE,
		DESCRIPTION,
		CONTENT;
	}
	
	private String courseRunCss;
	private String courseOpenEditorCss;
	
	private String courseTabActiveCss;
	private String courseTabCloseCss;
	
	private String courseEditorNodeLinksId;
	private String courseEditorPublishCss;
	private String courseEditorPublishWizardSelectAllCss;
	private String courseEditorPublishWizardAccessId;
	private String courseEditorPublishWizardCatalogId;
	private String catalogSubcategoryIconCss;
	private String addToCatalogCss;
	private String catalogCss;
	
	private String courseEditorOverviewRadioGroupCss;
	private String courseEditorInsertContentCss;
	private String createCourseNodeTargetPositionItemCss;
	
	private String courseEditorChooseOverviewFileCss;
	private String courseEditorUploadOverviewFileCss;
	
	private String eportfolioAddCss;
	
	private String structureIconCss;
	private String forumIconCss;
	private String blogIconCss;
	
	private String forumToolbarCss;
	private String forumThreadNewCss;
	private String forumArchiveCss;
	private String forumFilterCss;
	
	private String wikiCreateArticleCss;
	private String wikiArticleBoxCss;
	private String wikiEditFormWrapperCss;
	
	private String blogCreateEntryCss;
	private String blogEditEntryCss;
	private String blogDeleteEntryCss;
	private String blogReadEntryCss;
	private String blogFormCss;
	private String blogPostCss;
	private String blogYearCss;
	private String blogMonthCss;
	
	private String testChooseRepositoryFileCss;
	private String cpChooseRepositoryFileCss;
	private String wikiChooseRepositoryFileCss;
	private String feedChooseRepositoryFileCss;
	private String mapChooseRepositoryFileCss;

	private String repositoryPopupCss;
	
	private String repositoryPopupCreateResourceCss;
	private String repositoryPopupImportResourceCss;
	
	private String repositoryPopupAllResourcesCss;
	private String repositoryPopupMyResourcesCss;
	private String repositoryPopupSearchResourcesCss;
	
	private String mapEditCss;
	
	private String blogNoPostsCss;
	private String podcastNoEpisodesCss;
	
	private FunctionalUtil functionalUtil;
	private FunctionalRepositorySiteUtil functionalRepositorySiteUtil;
	
	public FunctionalCourseUtil(FunctionalUtil functionalUtil, FunctionalRepositorySiteUtil functionalRepositorySiteUtil){
		this.functionalUtil = functionalUtil;
		this.functionalRepositorySiteUtil = functionalRepositorySiteUtil;
		
		setCourseRunCss(COURSE_RUN_CSS);
		setCourseOpenEditorCss(COURSE_OPEN_EDITOR_CSS);
		
		setCourseTabActiveCss(COURSE_TAB_ACTIVE_CSS);
		setCourseTabCloseCss(COURSE_TAB_CLOSE_CSS);
		
		setCourseEditorNodeLinksId(COURSE_EDITOR_NODE_LINKS_ID);
		setCourseEditorPublishCss(COURSE_EDITOR_PUBLISH_CSS);
		setCourseEditorPublishWizardSelectAllCss(COURSE_EDITOR_PUBLISH_WIZARD_SELECT_ALL_CSS);
		setCourseEditorPublishWizardAccessId(COURSE_EDITOR_PUBLISH_WIZARD_ACCESS_ID);
		setCourseEditorPublishWizardCatalogId(COURSE_EDITOR_PUBLISH_WIZARD_CATALOG_ID);
		setCatalogSubcategoryIconCss(CATALOG_SUBCATEGORY_ICON_CSS);
		setAddToCatalogCss(ADD_TO_CATALOG_CSS);
		setCatalogCss(CATALOG_CSS);
		
		setCourseEditorOverviewRadioGroupCss(COURSE_EDITOR_OVERVIEW_RADIO_GROUP_CSS);
		setCourseEditorInsertContentCss(COURSE_EDITOR_INSERT_CONTENT_CSS);
		setCreateCourseNodeTargetPositionItemCss(CREATE_COURSE_NODE_TARGET_POSITION_ITEM_CSS);
		
		setCourseEditorChooseOverviewFileCss(COURSE_EDITOR_CHOOSE_OVERVIEW_FILE_CSS);
		setCourseEditorUploadOverviewFileCss(COURSE_EDITOR_UPLOAD_OVERVIEW_FILE_CSS);
		
		setEportfolioAddCss(EPORTFOLIO_ADD_CSS);
		
		setStructureIconCss(STRUCTURE_ICON_CSS);
		setForumIconCss(FORUM_ICON_CSS);
		setBlogIconCss(BLOG_ICON_CSS);
		
		setForumToolbarCss(FORUM_TOOLBAR_CSS);
		setForumThreadNewCss(FORUM_THREAD_NEW_CSS);
		setForumArchiveCss(FORUM_ARCHIVE_CSS);
		setForumFilterCss(FORUM_FILTER_CSS);
		
		setWikiCreateArticleCss(WIKI_CREATE_ARTICLE_CSS);
		setWikiArticleBoxCss(WIKI_ARTICLE_BOX_CSS);
		setWikiEditFormWrapperCss(WIKI_EDIT_FORM_WRAPPER_CSS);
		
		setBlogCreateEntryCss(BLOG_CREATE_ENTRY_CSS);
		setBlogEditEntryCss(BLOG_EDIT_ENTRY_CSS);
		setBlogDeleteEntryCss(BLOG_DELETE_ENTRY_CSS);
		setBlogReadEntryCss(BLOG_READ_ENTRY_CSS);
		setBlogFormCss(BLOG_FORM_CSS);
		setBlogPostCss(BLOG_POST_CSS);
		setBlogYearCss(BLOG_YEAR_CSS);
		setBlogMonthCss(BLOG_MONTH_CSS);
		
		setTestChooseRepositoryFileCss(TEST_CHOOSE_REPOSITORY_FILE_CSS);
		setCpChooseRepositoryFileCss(CP_CHOOSE_REPOSITORY_FILE_CSS);
		setWikiChooseRepositoryFileCss(WIKI_CHOOSE_REPOSITORY_FILE_CSS);
		setFeedChooseRepositoryFileCss(FEED_CHOOSE_REPOSITORY_FILE_CSS);
		setMapChooseRepositoryFileCss(MAP_CHOOSE_REPOSITORY_FILE_CSS);
		
		setRepositoryPopupCss(REPOSITORY_POPUP_CSS);
		
		setRepositoryPopupCreateResourceCss(REPOSITORY_POPUP_CREATE_RESOURCE_CSS);
		setRepositoryPopupImportResourceCss(REPOSITORY_POPUP_IMPORT_RESOURCE_CSS);
		
		setRepositoryPopupAllResourcesCss(REPOSITORY_POPUP_ALL_RESOURCES_CSS);
		setRepositoryPopupMyResourcesCss(REPOSITORY_POPUP_MY_RESOURCES_CSS);
		setRepositoryPopupSearchResourcesCss(REPOSITORY_POPUP_SEARCH_RESOURCES_CSS);
		
		setMapEditCss(MAP_EDIT_CSS);
		
		setBlogNoPostsCss(BLOG_NO_POSTS_CSS);
		setPodcastNoEpisodesCss(PODCAST_NO_EPISODES_CSS);
	}
	
	/**
	 * Opens the nth course element within the specified course.
	 * 
	 * @param browser
	 * @param courseId
	 * @param nth
	 * @return true on success otherwise false
	 */
	public CourseNodeAlias open(Selenium browser, long courseId, int nth){
		if(!functionalRepositorySiteUtil.openCourse(browser, courseId))
			return(null);
		
		return(open(browser, nth));
	}

	/**
	 * Counts the course nodes.
	 * 
	 * @param browser
	 * @param learningResources
	 * @param courseNodes
	 * @param structuralNodes
	 * @return
	 */
	public int count(Selenium browser, boolean learningResources, boolean courseNodes, boolean structuralNodes){
		int count = -1;
		
		//TODO:JK: implement me
		
		return(count);
	}
	
	/**
	 * Returns the matching CourseNodeAlias of corresponding iconCss String.
	 * 
	 * @param iconCss
	 * @return
	 */
	public static CourseNodeAlias findCourseNodeAliasOfIconCss(String iconCss){

		if(iconCss == null){
			return (null);
		}
		
		CourseNodeAlias alias = null;
		
		if(iconCss.contains(CourseNodeAlias.SP.getIconCss())){
			alias = CourseNodeAlias.SP;
		}else if(iconCss.contains(CourseNodeAlias.FORUM.getIconCss())){
			alias = CourseNodeAlias.FORUM;
		}else if(iconCss.contains(CourseNodeAlias.WIKI.getIconCss())){
			alias = CourseNodeAlias.WIKI;
		}else if(iconCss.contains(CourseNodeAlias.BLOG.getIconCss())){
			alias = CourseNodeAlias.BLOG;
		}else if(iconCss.contains(CourseNodeAlias.CP.getIconCss())){
			alias = CourseNodeAlias.CP;
		}else if(iconCss.contains(CourseNodeAlias.SCORM.getIconCss())){
			alias = CourseNodeAlias.SCORM;
		}else if(iconCss.contains(CourseNodeAlias.BC.getIconCss())){
			alias = CourseNodeAlias.BC;
		}else if(iconCss.contains(CourseNodeAlias.PODCAST.getIconCss())){
			alias = CourseNodeAlias.PODCAST;
		}else if(iconCss.contains(CourseNodeAlias.DIALOG.getIconCss())){
			alias = CourseNodeAlias.DIALOG;
		}else if(iconCss.contains(CourseNodeAlias.ASSESSMENT.getIconCss())){
			alias = CourseNodeAlias.ASSESSMENT;
		}else if(iconCss.contains(CourseNodeAlias.TASK.getIconCss())){
			alias = CourseNodeAlias.TASK;
		}else if(iconCss.contains(CourseNodeAlias.PORTFOLIO_TASK.getIconCss())){
			alias = CourseNodeAlias.PORTFOLIO_TASK;
		}else if(iconCss.contains(CourseNodeAlias.IQ_TEST.getIconCss())){
			alias = CourseNodeAlias.IQ_TEST;
		}else if(iconCss.contains(CourseNodeAlias.IQ_SELFTEST.getIconCss())){
			alias = CourseNodeAlias.IQ_SELFTEST;
		}else if(iconCss.contains(CourseNodeAlias.IQ_QUESTIONAIRE.getIconCss())){
			alias = CourseNodeAlias.IQ_QUESTIONAIRE;
		}else if(iconCss.contains(CourseNodeAlias.ENROLMENT.getIconCss())){
			alias = CourseNodeAlias.ENROLMENT;
		}else if(iconCss.contains(CourseNodeAlias.PROJECT_BROKER.getIconCss())){
			alias = CourseNodeAlias.PROJECT_BROKER;
		}else if(iconCss.contains(CourseNodeAlias.NOTIFICATIONS.getIconCss())){
			alias = CourseNodeAlias.NOTIFICATIONS;
		}else if(iconCss.contains(CourseNodeAlias.MEMBERS.getIconCss())){
			alias = CourseNodeAlias.MEMBERS;
		}else if(iconCss.contains(CourseNodeAlias.CALENDAR.getIconCss())){
			alias = CourseNodeAlias.CALENDAR;
		}else if(iconCss.contains(CourseNodeAlias.LINK_LIST.getIconCss())){
			alias = CourseNodeAlias.LINK_LIST;
		}else if(iconCss.contains(CourseNodeAlias.CONTACT.getIconCss())){
			alias = CourseNodeAlias.CONTACT;
		}
		
		return(alias);
	}
	
	/**
	 * Opens the nth course element in the current course.
	 * 
	 * @param browser
	 * @param nth
	 * @return the matching CourseNodeAlias
	 */
	public CourseNodeAlias open(Selenium browser, int nth){
		functionalUtil.idle(browser);

		StringBuffer selectorBuffer = new StringBuffer();

		if(nth == -1){
			selectorBuffer.append("xpath=(//ul[contains(@class, 'b_tree_l0')]//li)//a");
			
			functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
			browser.click(selectorBuffer.toString());
			
			return(CourseNodeAlias.STRUCTURE);
		}else{
			selectorBuffer.append("xpath=(//ul[contains(@class, 'b_tree_l1')]//li)[")
			.append(nth + 1)
			.append("]//a[not(contains(@class, 'b_tree_level_open') or contains(@class, 'b_tree_level_close'))]");
		
	
			functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
			browser.click(selectorBuffer.toString());
			
			functionalUtil.idle(browser);
			String alias = browser.getAttribute(selectorBuffer.toString() + "@class");
			
			return(findCourseNodeAliasOfIconCss(alias));
		}
	}
	
	/**
	 * Opens the nth course element of course node type specified by alias in the current course.
	 * 
	 * @param browser
	 * @param alias
	 * @param nth
	 * @return true on success
	 */
	public boolean open(Selenium browser, CourseNodeAlias alias, int nth){
		functionalUtil.idle(browser);
		
		StringBuffer selectorBuffer = new StringBuffer();

		selectorBuffer.append("xpath=(//ul[contains(@class, 'b_tree_l1')]//li]//a[contains(@class, '")
		.append(alias.getIconCss())
		.append("')])[")
		.append(nth + 1)
		.append("]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToLoad(browser);
		
		return(true);
	}
	
	/**
	 * Opens the nth learning resource.
	 * 
	 * @param browser
	 * @param nth
	 * @return The matching CSS CourseNodeAlias
	 */
	public CourseNodeAlias openLearningResource(Selenium browser, int nth){
		//TODO:JK: implement me
		
		return(null);
	}
	
	/**
	 * Opens the nth course element within the specified course
	 * without using business paths.
	 * 
	 * @param browser
	 * @param courseId
	 * @param nth
	 * @return true on success otherwise false
	 */
	public boolean openWithoutBusinessPath(Selenium browser, long courseId, int nth){
		if(!functionalRepositorySiteUtil.openCourseWithoutBusinessPath(browser, courseId))
			return(false);

		functionalUtil.idle(browser);
		
		StringBuffer selectorBuffer = new StringBuffer();

		selectorBuffer.append("xpath=//ul[contains(@class, 'b_tree_l1')]//li[")
		.append(nth + 1)
		.append("]//a");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		return(true);
	}
	
	/**
	 * 
	 * @param browser
	 * @param title
	 * @return
	 */
	public boolean closeTab(Selenium browser, String title){
		functionalUtil.idle(browser);
		
		StringBuffer stringBuffer = new StringBuffer();
		
		stringBuffer.append("xpath=//li//div//a[@title='")
		.append(title)
		.append("']/../..//a[contains(@class, '")
		.append(getCourseTabCloseCss())
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, stringBuffer.toString());
		browser.click(stringBuffer.toString());
		
		functionalUtil.waitForPageToLoad(browser);
		
		return(true);
	}
	
	/**
	 * Closes the active tab.
	 * 
	 * @param browser
	 * @return
	 */
	public boolean closeActiveTab(Selenium browser){
		functionalUtil.idle(browser);
		
		StringBuffer stringBuffer = new StringBuffer();
		
		stringBuffer.append("xpath=//li[contains(@class, '")
		.append(getCourseTabActiveCss())
		.append("')]//a[contains(@class, '")
		.append(getCourseTabCloseCss())
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, stringBuffer.toString());
		browser.click(stringBuffer.toString());
		
		functionalUtil.waitForPageToLoad(browser);
		
		return(true);
	}
	
	/**
	 * Opens the course editor but the course must be opened.
	 * 
	 * @param browser
	 * @return true on success
	 */
	public boolean openCourseEditor(Selenium browser){
		functionalUtil.idle(browser);
		
		StringBuffer selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//a[contains(@class, '")
		.append(getCourseOpenEditorCss())
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToUnloadElement(browser, selectorBuffer.toString());
		
		return(true);
	}
	
	/**
	 * Reads the external link of the currently open course node within the editor.
	 * 
	 * @param browser
	 * @return
	 */
	public String readExternalLink(Selenium browser){
		if(!functionalUtil.openContentTab(browser, 0)){
			return(null);
		}

		functionalUtil.idle(browser);
		
		StringBuffer selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[@id='")
		.append(getCourseEditorNodeLinksId())
		.append("']//pre)[1]");
		
		return(browser.getText(selectorBuffer.toString()));
	}
	
	/**
	 * Extracts the repository entry key from business path.
	 * 
	 * @param businessPath
	 * @return
	 * @throws IOException
	 */
	public long extractRepositoryEntryKey(String businessPath) throws IOException{
		Pattern keyPattern = Pattern.compile("/RepositoryEntry/([0-9]+)/");
		Matcher keyMatcher = keyPattern.matcher(businessPath);
		
		if(!keyMatcher.find())
			throw new IOException("there's no repository entry key");
		
		return(Long.parseLong(keyMatcher.group(1)));
	}
	
	/**
	 * Reads the internal link of the currently open course node within the editor.
	 * 
	 * @param browser
	 * @return
	 */
	public String readInternalLink(Selenium browser){
		if(!functionalUtil.openContentTab(browser, 0)){
			return(null);
		}

		functionalUtil.idle(browser);
		
		StringBuffer selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[@id='")
		.append(getCourseEditorNodeLinksId())
		.append("']//pre)[2]");
		
		return(browser.getText(selectorBuffer.toString()));
	}
	
	/**
	 * Disables the specified access option, the course editor should be open.
	 * 
	 * @param browser
	 * @param option
	 * @param nthForm
	 * @return true on success
	 */
	public boolean disableAccessOption(Selenium browser, AccessOption option, int nthForm){
		//TODO:JK: implement me
		
		return(false);
	}
	
	/**
	 * Enables the specified access option, the course editor should be open.
	 * 
	 * @param browser
	 * @param option
	 * @param nthForm
	 * @return true on success
	 */
	public boolean enableAccessOption(Selenium browser, AccessOption option, int nthForm){
		//TODO:JK: implement me
		
		return(false);
	}
	
	/**
	 * Uploads an individual overview page of course, the course editor should be open.
	 * 
	 * @param browser
	 * @param file
	 * @return true on success
	 * @throws MalformedURLException 
	 */
	public boolean uploadOverviewPage(Selenium browser, URI file) throws MalformedURLException{
		if(!openCourseEditorCourseTab(browser, CourseEditorCourseTab.OVERVIEW)){
			return(false);
		}
		
		/* configure course to display single page */
		if(!functionalUtil.clickRadio(browser, getCourseEditorOverviewRadioGroupCss(), CourseOverview.SINGLEPAGE.getValue())){
			return(false);
		}
		
		functionalUtil.idle(browser);
		
		/* click "select or create page" */
		StringBuffer selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//a[contains(@class, '")
		.append(getCourseEditorChooseOverviewFileCss())
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		/* select file */
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//form//input[@type='file']");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.focus(selectorBuffer.toString());
		browser.type(selectorBuffer.toString(), file.toURL().getPath());
		
		/* click upload */
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//form//div[contains(@class, '")
		.append(getCourseEditorUploadOverviewFileCss())
		.append("')]//button[contains(@class, '")
		.append(functionalUtil.getButtonDirtyCss())
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToUnloadElement(browser, selectorBuffer.toString());
		
		return(true);
	}
	
	/**
	 * Creates xpath selectors to select catalog within the tree.
	 * 
	 * @param path
	 * @return
	 */
	public String createCatalogSelectors(Selenium browser, String path){
		if(path == null ||
				!path.startsWith("/")){
			return(null);
		}
		
		/*
		 * Determine best matching item by using regular expressions
		 */
		StringBuffer itemLocator = new StringBuffer();
		itemLocator.append("//div[contains(@class, 'b_selectiontree_item')]");
		
		VelocityContext context = new VelocityContext();

		context.put("treeSelector", itemLocator.toString());
		context.put("treePath", path);
		
		VelocityEngine engine = null;

		engine = new VelocityEngine();

		StringWriter sw = new StringWriter();
		Integer offset = null;
		
		try {
			engine.evaluate(context, sw, "catalogTreeEntryPosition", FunctionalEPortfolioUtil.class.getResourceAsStream("CatalogTreeEntryPosition.vm"));

			offset = new Integer(browser.getEval(sw.toString()));
			
			if(offset.intValue() == -1){
				return(null);
			}

		} catch (ParseErrorException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MethodInvocationException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ResourceNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		/* create selector */
		StringBuffer selectorBuffer = new StringBuffer();
				
		selectorBuffer.append("xpath=(//div[contains(@class, '")
		.append("b_selectiontree_item")
		.append("')]//input[@type='radio'])[position()='")
		.append(offset.intValue())
		.append("']");
		
		return(selectorBuffer.toString());
	}
	
	/**
	 * Publishes the entire course.
	 * 
	 * @param browser
	 * @param access
	 * @param catalog
	 * @return true on success
	 */
	public boolean publishEntireCourse(Selenium browser, AccessSettings access, String catalog){
		functionalUtil.idle(browser);
		
		/* click publish */
		StringBuffer selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//a[contains(@class, '")
		.append(getCourseEditorPublishCss())
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		/* select all course nodes */
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//a[contains(@class, '")
		.append(getCourseEditorPublishWizardSelectAllCss())
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToLoad(browser);
		functionalUtil.clickWizardNext(browser);
		
		/* access options */
		functionalUtil.waitForPageToLoadElement(browser, "id=" + getCourseEditorPublishWizardAccessId());
		
		if(access != null){
			functionalUtil.selectOption(browser, getCourseEditorPublishWizardAccessId(), access.getAccessValue());
		}
		
		functionalUtil.clickWizardNext(browser);
		
		/* add to catalog or not */
		functionalUtil.waitForPageToLoadElement(browser, "id=" + getCourseEditorPublishWizardCatalogId());
		
		if(catalog != null){
			functionalUtil.selectOption(browser, getCourseEditorPublishWizardCatalogId(), ADD_TO_CATALOG_YES_VALUE);
			
			/* click add to catalog */
			selectorBuffer = new StringBuffer();
			
			selectorBuffer.append("xpath=//a[contains(@class, '")
			.append(getAddToCatalogCss())
			.append("')]");
			
			browser.click(selectorBuffer.toString());
			
			String catalogSelector = createCatalogSelectors(browser, catalog);
			functionalUtil.idle(browser);
			functionalUtil.waitForPageToLoadElement(browser, catalogSelector);
			browser.click(catalogSelector);
			
			/* click choose */
			selectorBuffer = new StringBuffer();
			
			selectorBuffer.append("xpath=//div[contains(@class, '")
			.append(getCatalogCss())
			.append("')]//button[contains(@class, '")
			.append(functionalUtil.getButtonDirtyCss())
			.append("')]");
			
			functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
			
			browser.focus(selectorBuffer.toString());
			browser.click(selectorBuffer.toString());
			
			functionalUtil.waitForPageToUnloadElement(browser, selectorBuffer.toString());
		}else{
			functionalUtil.selectOption(browser, getCourseEditorPublishWizardCatalogId(), ADD_TO_CATALOG_NO_VALUE);
		}
		
		functionalUtil.clickWizardFinish(browser);
		functionalUtil.waitForPageToUnloadElement(browser, "id=" + getCourseEditorPublishWizardCatalogId());
		
		return(true);
	}

	/**
	 * Creates the specified course node in a opened course editor.
	 * 
	 * @param browser
	 * @param node
	 * @param title
	 * @param description
	 * @param position
	 * @return true on success otherwise false
	 */
	public boolean createCourseNode(Selenium browser, CourseNodeAlias node, String shortTitle, String longTitle, String description, int position){
		functionalUtil.idle(browser);
		
		/* click on the appropriate link to create node */
		StringBuffer selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//div[contains(@class, '")
		.append(getCourseEditorInsertContentCss())
		.append("')]")
		.append("//a[contains(@class, '")
		.append(node.getIconCss())
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());

		functionalUtil.waitForPageToLoad(browser);
		
		/* choose insertion point */
		functionalUtil.idle(browser);
		
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[contains(@class, 'b_window')]//form[@name='seltree']//div[contains(@class, '")
		.append(getCreateCourseNodeTargetPositionItemCss())
		.append("')]//input[@type='radio'])[")
		.append(position + 1)
		.append("]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[contains(@class, 'b_window')]//form[@name='seltree']//button[contains(@class, 'b_button_dirty')])[1]");
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		functionalUtil.waitForPageToUnloadElement(browser, selectorBuffer.toString());
		
		/* fill in short title */
		functionalUtil.idle(browser);
		
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[contains(@class, 'o_editor')]//form//input[@type='text'])[1]");
		
		browser.type(selectorBuffer.toString(), shortTitle);
		
		/* fill in long title */
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[contains(@class, 'o_editor')]//form//input[@type='text'])[2]");
		
		browser.type(selectorBuffer.toString(), longTitle);
		
		/* fill in description */
		functionalUtil.typeMCE(browser, description);
		
		/* click save */
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[contains(@class, 'o_editor')]//form//button)[1]");
		browser.click(selectorBuffer.toString());
		functionalUtil.waitForPageToLoad(browser);
		
		return(true);
	}
	
	/**
	 * Adds an artefact to eportfolio by clicking the appropriate
	 * button.
	 * 
	 * @param browser
	 * @return true on success
	 */
	public boolean addToEportfolio(Selenium browser, String binder, String page, String structure,
			String title, String description, String[] tags,
			FunctionalEPortfolioUtil functionalEPortfolioUtil){

		functionalUtil.idle(browser);
		
		/* open wizard */
		StringBuffer selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//a[contains(@class, '")
		.append(getEportfolioAddCss())
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToLoad(browser);
		
		if(binder != null){
			/* fill in wizard - title & description */
			functionalEPortfolioUtil.fillInTitleAndDescription(browser, title, description);
			
			/* fill in wizard - tags */
			functionalEPortfolioUtil.fillInTags(browser, tags);
			
			/* fill in wizard - destination */
			functionalEPortfolioUtil.selectTree(browser, binder, page, structure);
		}

		/* click finish */
		functionalUtil.clickWizardFinish(browser, functionalEPortfolioUtil.getArtefactWizardCss());
		
		return(true);
	}
	
	/**
	 * Opens the course with courseId and nth forum within the specified
	 * course.
	 * 
	 * @param browser
	 * @param courseId
	 * @param nth forum in the course
	 * @return true on success, otherwise false
	 */
	public boolean openForum(Selenium browser, long courseId, int nth){
		if(!functionalRepositorySiteUtil.openCourse(browser, courseId))
			return(false);

		functionalUtil.idle(browser);
		
		StringBuffer selectorBuffer = new StringBuffer();

		selectorBuffer.append("xpath=(//ul//li//a[contains(@class, '")
		.append(getForumIconCss())
		.append("')])[")
		.append(nth + 1)
		.append("]")
		.append("");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToLoad(browser);
		
		return(true);
	}
	
	/**
	 * Opens the specified forum in the course and posts a new topic.
	 * 
	 * @param browser
	 * @param courseId
	 * @param nthForum
	 * @param title
	 * @param message
	 * @return true on success, otherwise false
	 */
	public boolean postForumMessage(Selenium browser, long courseId, int nthForum, String title, String message){
		if(!openForum(browser, courseId, nthForum))
			return(false);

		functionalUtil.idle(browser);
		
		StringBuffer selectorBuffer = new StringBuffer();
		
		/* click open new topic */
		selectorBuffer.append("xpath=//div[contains(@class, '")
		.append(getForumToolbarCss())
		.append("')]//a[contains(@class, '")
		.append(getForumThreadNewCss())
		.append("')]");
		
		browser.click(selectorBuffer.toString());
		functionalUtil.waitForPageToLoad(browser);
		
		/* fill in form - title */
		functionalUtil.idle(browser);
		
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//div[contains(@class, '")
		.append(getCourseRunCss())
		.append("')]//form//input[@type='text']");
		
		browser.type(selectorBuffer.toString(), title);
		
//		functionalUtil.waitForPageToLoad(browser);
		
		/* fill in form - post */
		functionalUtil.typeMCE(browser, message);
		
		/* save form */
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//div[contains(@class, '")
		.append(getCourseRunCss())
		.append("')]//form//button[last()]");
		
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToLoad(browser);
		
		return(true);
	}
	
	/**
	 * Opens the wiki specified by id.
	 * 
	 * @param browser
	 * @param id
	 * @return
	 */
	public boolean openWiki(Selenium browser, long id){
		functionalUtil.openBusinessPath(browser, functionalUtil.getDeploymentUrl() + "/url/RepositoryEntry/" + id);
		
		return(true);
	}
	
	/**
	 * Creates a new wiki article.
	 * 
	 * @param browser
	 * @param wikiId
	 * @param pagename
	 * @param content
	 * @return true on success, otherwise false
	 */
	public boolean createWikiArticle(Selenium browser, long wikiId, String pagename, String content){
		if(!openWiki(browser, wikiId))
			return(false);

		functionalUtil.idle(browser);
		
		/* type pagename */
		StringBuffer selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//form//div[contains(@class, '")
		.append(getWikiCreateArticleCss())
		.append("')]/..//input[@type='text']");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		
		browser.type(selectorBuffer.toString(), pagename);
		
		/* click create */
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//form//div[contains(@class, '")
		.append(getWikiCreateArticleCss())
		.append("')]//button");
		
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToLoad(browser);
		
		/* edit content */
		functionalUtil.idle(browser);
		
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//div[contains(@class, '")
		.append(getWikiArticleBoxCss())
		.append("')]//a");
		
		browser.click(selectorBuffer.toString());

		functionalUtil.waitForPageToLoad(browser);
		
		
		/* fill in text area */
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//div[contains(@class, '")
		.append(getWikiEditFormWrapperCss())
		.append("')]//textarea");
		
		browser.type(selectorBuffer.toString(), content);
		
		/* click save */
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//div[contains(@class, '")
		.append(getWikiEditFormWrapperCss())
		.append("')]//button[last()]");
		
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToLoad(browser);
		
		return(true);
	}
	
	/**
	 * Opens the blog specified by id
	 * 
	 * @param browser
	 * @param id
	 * @return true on success, otherwise false
	 */
	public boolean openBlog(Selenium browser, long id){
		functionalUtil.openBusinessPath(browser, functionalUtil.getDeploymentUrl() + "/url/RepositoryEntry/" + id);
		
		return(true);
	}
	
	/**
	 * Opens the course with courseId and nth blog within the specified
	 * course.
	 * 
	 * @param browser
	 * @param courseId
	 * @param nth
	 * @return
	 */
	public boolean openBlogWithoutBusinessPath(Selenium browser, long courseId, int nth){
		if(!functionalRepositorySiteUtil.openCourse(browser, courseId))
			return(false);

		functionalUtil.idle(browser);
		
		StringBuffer selectorBuffer = new StringBuffer();

		selectorBuffer.append("xpath=(//ul//li//a[contains(@class, '")
		.append(getBlogIconCss())
		.append("')])[")
		.append(nth + 1)
		.append("]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToLoad(browser);
		
		return(true);
	}

	/**
	 * Imports an existing feed into blog.
	 * 
	 * @param browser
	 * @param url
	 * @return true on success
	 */
	public boolean importBlogFeed(Selenium browser, String url){

		functionalUtil.idle(browser);
		
		/* open popup to enter url */
		StringBuffer selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[contains(@class, '")
		.append(getBlogNoPostsCss())
		.append("')]//a[contains(@class, 'b_button')])[last()]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		/* enter url */
		functionalUtil.idle(browser);
		
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[contains(@class, 'b_window_content')]//form//input[@type='text'])[2]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.type(selectorBuffer.toString(), url);
		
		/* click save */
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[contains(@class, 'b_window_content')]//form//button[contains(@class, 'b_button_dirty')])[last()]");
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		return(true);
	}

	/**
	 * 
	 * @param browser
	 * @param nth
	 * @return
	 */
	public boolean openBlogEntry(Selenium browser, int nth){
		functionalUtil.idle(browser);
		
		StringBuffer selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//ul[contains(@class, '")
		.append(getBlogReadEntryCss())
		.append("')]//a)[")
		.append(nth + 1)
		.append("]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		functionalUtil.waitForPageToLoad(browser);
		
		return(true);
	}
	
	/**
	 * Clicks back button within open blog entry.
	 * 
	 * @param browser
	 * @return
	 */
	public boolean backBlogEntry(Selenium browser){
		functionalUtil.idle(browser);
		
		StringBuffer selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//div[contains(@class, '")
		.append(getBlogPostCss())
		.append("')]//a[contains(@class, '")
		.append(functionalUtil.getBackButtonCss())
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		functionalUtil.waitForPageToLoad(browser);
		
		return(true);
	}
	
	/**
	 * Create a new blog entry.
	 * 
	 * @param browser
	 * @param courseId
	 * @param nth
	 * @param title
	 * @param description
	 * @param content
	 * @return
	 */
	public boolean createBlogEntry(Selenium browser, long courseId, int nth,
			String title, String description, String content){
		return(editBlogEntry(browser, courseId, nth, title, description, content, -1, null));
	}
	
	
	/**
	 * Edit a blog entry.
	 * 
	 * @param browser
	 * @param blogId
	 * @param title
	 * @param description
	 * @param content
	 * @return true on success, otherwise false
	 */
	public boolean editBlogEntry(Selenium browser, long courseId, int nth,
			String title, String description, String content, int entry, BlogEdit[] edit){
		if(!openBlogWithoutBusinessPath(browser, courseId, nth))
			return(false);

		return(editBlogEntry(browser, title, description, content, entry, edit));
	}
	
	public boolean editBlogEntry(Selenium browser,
			String title, String description, String content, int entry, BlogEdit[] edit){
		StringBuffer selectorBuffer = new StringBuffer();
		
		if(edit == null){
			functionalUtil.idle(browser);
			
			/* open popup to enter url */
			selectorBuffer.append("xpath=(//div[contains(@class, '")
			.append(getBlogNoPostsCss())
			.append("')]//a[contains(@class, 'b_button')])");

			if(browser.isElementPresent(selectorBuffer.toString())){
				browser.click(selectorBuffer.toString());
			}else{
				/* click create */
				selectorBuffer = new StringBuffer();

				selectorBuffer.append("xpath=//a[contains(@class, '")
				.append(getBlogCreateEntryCss())
				.append("')]");

				browser.click(selectorBuffer.toString());
			}
		}else{
			if(edit.length > 0){
				selectorBuffer = new StringBuffer();
				
				selectorBuffer.append("xpath=(//a[contains(@class, '")
				.append(getBlogEditEntryCss())
				.append("')])[")
				.append(entry + 1)
				.append("]");
				
				functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
				browser.click(selectorBuffer.toString());
			}
		}
		
		/* fill in form - title */
		if(edit == null || ArrayUtils.contains(edit, BlogEdit.TITLE)){
			functionalUtil.idle(browser);

			selectorBuffer = new StringBuffer();

			selectorBuffer.append("xpath=(//form//div[contains(@class, '")
			.append(getBlogFormCss())
			.append("')]//input[@type='text'])[1]");

			functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());

			browser.type(selectorBuffer.toString(), title);
		}
		
		/* fill in form - description */
		if(edit == null || ArrayUtils.contains(edit, BlogEdit.DESCRIPTION)){
			functionalUtil.typeMCE(browser, getBlogFormCss(), 0, description);
		}
		
		/* fill in form - content */
		if(edit == null || ArrayUtils.contains(edit, BlogEdit.CONTENT)){
			functionalUtil.typeMCE(browser, getBlogFormCss(), 1, content);
		}
		
		/* save form */
		if(edit == null || edit.length > 0){
			selectorBuffer = new StringBuffer();

			selectorBuffer.append("xpath=//form//div[contains(@class, '")
			.append(getBlogFormCss())
			.append("')]//button[last() and contains(@class, '")
			.append(functionalUtil.getButtonDirtyCss())
			.append("')]");

			functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
			browser.click(selectorBuffer.toString());
			functionalUtil.waitForPageToLoad(browser);
		}
		
		return(true);
	}
	
	/**
	 * Imports an existing feed into podcast.
	 * 
	 * @param browser
	 * @param url
	 * @return true on success
	 */
	public boolean importPodcastFeed(Selenium browser, String url){
		functionalUtil.idle(browser);
		
		/* open popup to enter url */
		StringBuffer selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[contains(@class, '")
		.append(getPodcastNoEpisodesCss())
		.append("')]//a[contains(@class, 'b_button')])[last()]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		/* enter url */
		functionalUtil.idle(browser);
		
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[contains(@class, 'b_window_content')]//form//input[@type='text'])[2]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.type(selectorBuffer.toString(), url);
		
		/* click save */
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[contains(@class, 'b_window_content')]//form//button[contains(@class, 'b_button_dirty')])[last()]");
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		return(true);
	}
	
	/** 
	 * Opens the course configurations appropriate tab.
	 *
	 * @param browser
	 * @param tab
	 * @return true on success
	 */
	public boolean openCourseEditorCourseTab(Selenium browser, CourseEditorCourseTab tab){
		functionalUtil.idle(browser);
		
		return(functionalUtil.openContentTab(browser, tab.ordinal()));
	}
	
	/**
	 * Opens the test configurations appropriate tab.
	 * 
	 * @param browser
	 * @param tab
	 * @return true on success
	 */
	public boolean openCourseEditorIQTestTab(Selenium browser, CourseEditorIQTestTab tab){
		functionalUtil.idle(browser);
		
		return(functionalUtil.openContentTab(browser, tab.ordinal()));
	}
	
	/**
	 * Opens the content package configurations appropriate tab
	 * 
	 * @param browser
	 * @param tab
	 * @return true on success
	 */
	public boolean openCourseEditorCpTab(Selenium browser, CourseEditorCpTab tab){
		functionalUtil.idle(browser);
		
		return(functionalUtil.openContentTab(browser, tab.ordinal()));
	}
	
	/**
	 * Opens the wiki configurations appropriate tab.
	 * 
	 * @param browser
	 * @param tab
	 * @return true on success
	 */
	public boolean openCourseEditorWikiTab(Selenium browser, CourseEditorWikiTab tab){
		functionalUtil.idle(browser);
		
		return(functionalUtil.openContentTab(browser, tab.ordinal()));
	}
	
	/**
	 * Opens the blog configurations appropriate tab.
	 * 
	 * @param browser
	 * @param tab
	 * @return true on success
	 */
	public boolean openCourseEditorBlogTab(Selenium browser, CourseEditorBlogTab tab){
		functionalUtil.idle(browser);
		
		return(functionalUtil.openContentTab(browser, tab.ordinal()));
	}
	
	/**
	 * Opens the podcast configurations appropriate tab.
	 * 
	 * @param browser
	 * @param tab
	 * @return true on success
	 */
	public boolean openCourseEditorPodcastTab(Selenium browser, CourseEditorPodcastTab tab){
		functionalUtil.idle(browser);
		
		return(functionalUtil.openContentTab(browser, tab.ordinal()));
	}
	
	/**
	 * Opens the portfolio task configurations appropriate tab.
	 * 
	 * @param browser
	 * @param tab
	 * @return true on success
	 */
	public boolean openCourseEditorPortfolioTaskTab(Selenium browser, CourseEditorPortfolioTaskTab tab){
		functionalUtil.idle(browser);
		
		return(functionalUtil.openContentTab(browser, tab.ordinal()));
	}
	
	/**
	 * 
	 * @param browser
	 * @param chooseRepositoryCss
	 * @param key
	 * @return
	 */
	private boolean chooseRepositoryResource(Selenium browser, String chooseRepositoryCss, long key){
		functionalUtil.idle(browser);
		
		/* click on "choose, create or import file" button */
		StringBuffer selectorBuffer = new StringBuffer();

		selectorBuffer.append("xpath=//a[contains(@class, '")
		.append(chooseRepositoryCss)
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToLoad(browser);
		
		/* click search link */
		functionalUtil.idle(browser);
		
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//a[contains(@class, '")
		.append(getRepositoryPopupSearchResourcesCss())
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		/* type key and search */
		functionalUtil.idle(browser);
		
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//div[contains(@class, '")
		.append(FunctionalRepositorySiteUtil.SearchField.ID.getEntryCss())
		.append("')]//input[@type='text']");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.type(selectorBuffer.toString(), Long.toString(key));
		
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=(//div[contains(@class, '")
		.append(getRepositoryPopupCss())
		.append("')]//a[contains(@class, '")
		.append(functionalUtil.getButtonCss())
		.append("')])[last()]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		/* choose resource */
		functionalUtil.idle(browser);
		
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//div[contains(@class, '")
		.append(getRepositoryPopupCss())
		.append("')]//tr[contains(@class, '")
		.append(functionalUtil.getTableFirstChildCss())
		.append("') and contains(@class, '")
		.append(functionalUtil.getTableLastChildCss())
		.append("')]//td[contains(@class, '")
		.append(functionalUtil.getTableLastChildCss())
		.append("')]//a");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToUnloadElement(browser, selectorBuffer.toString());
		
		return(true);
	}
	
	/**
	 * Opens and fills in the "create resource" popup.
	 * 
	 * @param browser
	 * @param chooseRepositoryCss
	 * @param title
	 * @param description
	 * @return true on success
	 */
	private boolean createRepositoryResource(Selenium browser, String chooseRepositoryCss, String title, String description){
		functionalUtil.idle(browser);
		
		/* click on "choose, create or import file" button */
		StringBuffer selectorBuffer = new StringBuffer();

		selectorBuffer.append("xpath=//a[contains(@class, '")
		.append(chooseRepositoryCss)
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToLoad(browser);
		
		/* click create button */
		functionalUtil.idle(browser);
		
		selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//a[contains(@class, '")
		.append(getRepositoryPopupCreateResourceCss())
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		functionalUtil.waitForPageToLoad(browser);
		
		/* */
		return(functionalRepositorySiteUtil.fillInRepositoryEntryPopup(browser, title, description));
	}
	
	/**
	 * Creates a new test.
	 * 
	 * @param browser
	 * @param title
	 * @param description
	 * @return true on success
	 */
	public boolean createQTITest(Selenium browser, String title, String description){
		if(!openCourseEditorIQTestTab(browser, CourseEditorIQTestTab.TEST_CONFIGURATION))
			return(false);

		if(!createRepositoryResource(browser, getTestChooseRepositoryFileCss(), title, description)){
			return(false);
		}
				
		return(true);
	}
	
	/**
	 * Creates a new CP learning content.
	 * 
	 * @param browser
	 * @param title
	 * @param description
	 * @return true on success
	 */
	public boolean createCPLearningContent(Selenium browser, String title, String description){
		if(!openCourseEditorCpTab(browser, CourseEditorCpTab.LEARNING_CONTENT))
			return(false);
		
		if(!createRepositoryResource(browser, getCpChooseRepositoryFileCss(), title, description)){
			return(false);
		}
				
		return(true);
	}
	
	/**
	 * Creates a new wiki.
	 * 
	 * @param browser
	 * @param title
	 * @param description
	 * @return true on success
	 */
	public boolean createWiki(Selenium browser, String title, String description){
		if(!openCourseEditorWikiTab(browser, CourseEditorWikiTab.LEARNING_CONTENT))
			return(false);
		
		if(!createRepositoryResource(browser, getWikiChooseRepositoryFileCss(), title, description)){
			return(false);
		}
				
		return(true);
	}
	
	/**
	 * Choose an existing wiki.
	 * 
	 * @param browser
	 * @param wikiId
	 * @return
	 */
	public boolean chooseWiki(Selenium browser, long wikiId){
		if(!openCourseEditorWikiTab(browser, CourseEditorWikiTab.LEARNING_CONTENT))
			return(false);
		
		if(!chooseRepositoryResource(browser, getWikiChooseRepositoryFileCss(), wikiId)){
			return(false);
		}
		
		return(true);
	}
	/**
	 * Creates a new blog.
	 * 
	 * @param browser
	 * @param title
	 * @param description
	 * @return true on success
	 */
	public boolean createBlog(Selenium browser, String title, String description){
		if(!openCourseEditorBlogTab(browser, CourseEditorBlogTab.LEARNING_CONTENT))
			return(false);
		
		if(!createRepositoryResource(browser, getFeedChooseRepositoryFileCss(), title, description)){
			return(false);
		}
				
		return(true);
	}
	
	/**
	 * Creates a new podcast.
	 * 
	 * @param browser
	 * @param title
	 * @param description
	 * @return true on success
	 */
	public boolean createPodcast(Selenium browser, String title, String description){
		if(!openCourseEditorPodcastTab(browser, CourseEditorPodcastTab.LEARNING_CONTENT))
			return(false);
		
		if(!createRepositoryResource(browser, getFeedChooseRepositoryFileCss(), title, description)){
			return(false);
		}
				
		return(true);
	}
	
	/**
	 * Creates a new podcast.
	 * 
	 * @param browser
	 * @param title
	 * @param description
	 * @return true on success
	 */
	public boolean createPortfolioTask(Selenium browser, String title, String description){
		if(!openCourseEditorPortfolioTaskTab(browser, CourseEditorPortfolioTaskTab.LEARNING_CONTENT))
			return(false);
		
		if(!createRepositoryResource(browser, getMapChooseRepositoryFileCss(), title, description)){
			return(false);
		}
				
		return(true);
	}
	
	/**
	 * Opens the portfolio template editor in conjunction with this method the appropriate node and
	 * the appopriate tab should already be opened.
	 * 
	 * @param browser
	 * @return true on success
	 */
	public boolean openPortfolioTemplateEditor(Selenium browser){
		functionalUtil.idle(browser);
		
		StringBuffer selectorBuffer = new StringBuffer();
		
		selectorBuffer.append("xpath=//a[contains(@class, '")
		.append(getMapEditCss())
		.append("')]");
		
		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		
		return(true);
	}
	
	/**
	 * 
	 * @param browser
	 * @param file
	 * @return
	 */
	public boolean uploadFileToCourseFolder(Selenium browser, URI file){
		/* open upload dialog */
		functionalUtil.idle(browser);

		StringBuffer selectorBuffer = new StringBuffer();

		selectorBuffer.append("xpath=//a[contains(@class, 'b_briefcase_upload')]");

		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());

		/* attach file */
		functionalUtil.idle(browser);

		selectorBuffer = new StringBuffer();

		selectorBuffer.append("xpath=//form//input[@type='file']");

		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.attachFile(selectorBuffer.toString(), file.toString());

		/* upload file */
		selectorBuffer = new StringBuffer();

		selectorBuffer.append("xpath=//form//button[last() and contains(@class, '")
		.append(functionalUtil.getButtonDirtyCss())
		.append("')]");

		functionalUtil.waitForPageToLoadElement(browser, selectorBuffer.toString());
		browser.click(selectorBuffer.toString());
		return(true);
	}
	
	public FunctionalUtil getFunctionalUtil() {
		return functionalUtil;
	}

	public void setFunctionalUtil(FunctionalUtil functionalUtil) {
		this.functionalUtil = functionalUtil;
	}

	public FunctionalRepositorySiteUtil getFunctionalRepositorySiteUtil() {
		return functionalRepositorySiteUtil;
	}

	public void setFunctionalRepositorySiteUtil(
			FunctionalRepositorySiteUtil functionalRepositorySiteUtil) {
		this.functionalRepositorySiteUtil = functionalRepositorySiteUtil;
	}

	public String getCourseRunCss() {
		return courseRunCss;
	}

	public void setCourseRunCss(String courseRunCss) {
		this.courseRunCss = courseRunCss;
	}

	public String getCourseOpenEditorCss() {
		return courseOpenEditorCss;
	}

	public void setCourseOpenEditorCss(String courseOpenEditorCss) {
		this.courseOpenEditorCss = courseOpenEditorCss;
	}

	public String getCourseTabActiveCss() {
		return courseTabActiveCss;
	}

	public void setCourseTabActiveCss(String courseTabActiveCss) {
		this.courseTabActiveCss = courseTabActiveCss;
	}

	public String getCourseTabCloseCss() {
		return courseTabCloseCss;
	}

	public void setCourseTabCloseCss(String courseTabCloseCss) {
		this.courseTabCloseCss = courseTabCloseCss;
	}

	public String getCourseEditorNodeLinksId() {
		return courseEditorNodeLinksId;
	}

	public void setCourseEditorNodeLinksId(String courseEditorNodeLinksCss) {
		this.courseEditorNodeLinksId = courseEditorNodeLinksCss;
	}

	public String getCourseEditorPublishCss() {
		return courseEditorPublishCss;
	}

	public void setCourseEditorPublishCss(String courseEditorPublishCss) {
		this.courseEditorPublishCss = courseEditorPublishCss;
	}

	public String getCourseEditorPublishWizardSelectAllCss() {
		return courseEditorPublishWizardSelectAllCss;
	}

	public void setCourseEditorPublishWizardSelectAllCss(
			String courseEditorPublishWizardSelectAllCss) {
		this.courseEditorPublishWizardSelectAllCss = courseEditorPublishWizardSelectAllCss;
	}

	public String getCourseEditorPublishWizardAccessId() {
		return courseEditorPublishWizardAccessId;
	}

	public void setCourseEditorPublishWizardAccessId(
			String courseEditorPublishWizardAccessId) {
		this.courseEditorPublishWizardAccessId = courseEditorPublishWizardAccessId;
	}

	public String getCourseEditorPublishWizardCatalogId() {
		return courseEditorPublishWizardCatalogId;
	}

	public void setCourseEditorPublishWizardCatalogId(
			String courseEditorPublishWizardCatalogId) {
		this.courseEditorPublishWizardCatalogId = courseEditorPublishWizardCatalogId;
	}

	public String getAddToCatalogCss() {
		return addToCatalogCss;
	}

	public void setAddToCatalogCss(String addToCatalogCss) {
		this.addToCatalogCss = addToCatalogCss;
	}

	public String getCatalogCss() {
		return catalogCss;
	}

	public void setCatalogCss(String catalogCss) {
		this.catalogCss = catalogCss;
	}

	public String getCatalogSubcategoryIconCss() {
		return catalogSubcategoryIconCss;
	}

	public void setCatalogSubcategoryIconCss(String catalogSubcategoryIconCss) {
		this.catalogSubcategoryIconCss = catalogSubcategoryIconCss;
	}

	public String getCourseEditorOverviewRadioGroupCss() {
		return courseEditorOverviewRadioGroupCss;
	}

	public void setCourseEditorOverviewRadioGroupCss(
			String courseEditorOverviewRadioGroupCss) {
		this.courseEditorOverviewRadioGroupCss = courseEditorOverviewRadioGroupCss;
	}

	public String getCourseEditorInsertContentCss() {
		return courseEditorInsertContentCss;
	}

	public void setCourseEditorInsertContentCss(String courseEditorInsertContentCss) {
		this.courseEditorInsertContentCss = courseEditorInsertContentCss;
	}

	public String getCreateCourseNodeTargetPositionItemCss() {
		return createCourseNodeTargetPositionItemCss;
	}

	public void setCreateCourseNodeTargetPositionItemCss(
			String createCourseNodeTargetPositionItemCss) {
		this.createCourseNodeTargetPositionItemCss = createCourseNodeTargetPositionItemCss;
	}

	public String getCourseEditorChooseOverviewFileCss() {
		return courseEditorChooseOverviewFileCss;
	}

	public void setCourseEditorChooseOverviewFileCss(
			String courseEditorChooseOverviewFileCss) {
		this.courseEditorChooseOverviewFileCss = courseEditorChooseOverviewFileCss;
	}

	public String getCourseEditorUploadOverviewFileCss() {
		return courseEditorUploadOverviewFileCss;
	}

	public void setCourseEditorUploadOverviewFileCss(
			String courseEditorUploadOverviewFileCss) {
		this.courseEditorUploadOverviewFileCss = courseEditorUploadOverviewFileCss;
	}

	public String getEportfolioAddCss() {
		return eportfolioAddCss;
	}

	public void setEportfolioAddCss(String eportfolioAddCss) {
		this.eportfolioAddCss = eportfolioAddCss;
	}

	public String getStructureIconCss() {
		return structureIconCss;
	}

	public void setStructureIconCss(String structureIconCss) {
		this.structureIconCss = structureIconCss;
	}

	public String getForumIconCss() {
		return forumIconCss;
	}

	public void setForumIconCss(String forumIconCss) {
		this.forumIconCss = forumIconCss;
	}

	public String getBlogIconCss() {
		return blogIconCss;
	}

	public void setBlogIconCss(String blogIconCss) {
		this.blogIconCss = blogIconCss;
	}

	public String getForumToolbarCss() {
		return forumToolbarCss;
	}

	public void setForumToolbarCss(String forumToolbarCss) {
		this.forumToolbarCss = forumToolbarCss;
	}

	public String getForumThreadNewCss() {
		return forumThreadNewCss;
	}

	public void setForumThreadNewCss(String forumThreadNewCss) {
		this.forumThreadNewCss = forumThreadNewCss;
	}

	public String getForumArchiveCss() {
		return forumArchiveCss;
	}

	public void setForumArchiveCss(String forumArchiveCss) {
		this.forumArchiveCss = forumArchiveCss;
	}

	public String getForumFilterCss() {
		return forumFilterCss;
	}
	public void setForumFilterCss(String forumFilterCss) {
		this.forumFilterCss = forumFilterCss;
	}

	public String getWikiCreateArticleCss() {
		return wikiCreateArticleCss;
	}

	public void setWikiCreateArticleCss(String wikiCreateArticleCss) {
		this.wikiCreateArticleCss = wikiCreateArticleCss;
	}

	public String getWikiArticleBoxCss() {
		return wikiArticleBoxCss;
	}

	public void setWikiArticleBoxCss(String wikiArticleBoxCss) {
		this.wikiArticleBoxCss = wikiArticleBoxCss;
	}

	public String getWikiEditFormWrapperCss() {
		return wikiEditFormWrapperCss;
	}

	public void setWikiEditFormWrapperCss(String wikiEditFormWrapperCss) {
		this.wikiEditFormWrapperCss = wikiEditFormWrapperCss;
	}

	public String getBlogCreateEntryCss() {
		return blogCreateEntryCss;
	}

	public void setBlogCreateEntryCss(String blogCreateEntryCss) {
		this.blogCreateEntryCss = blogCreateEntryCss;
	}

	public String getBlogEditEntryCss() {
		return blogEditEntryCss;
	}

	public void setBlogEditEntryCss(String blogEditEntryCss) {
		this.blogEditEntryCss = blogEditEntryCss;
	}

	public String getBlogDeleteEntryCss() {
		return blogDeleteEntryCss;
	}

	public void setBlogDeleteEntryCss(String blogDeleteEntryCss) {
		this.blogDeleteEntryCss = blogDeleteEntryCss;
	}

	public String getBlogReadEntryCss() {
		return blogReadEntryCss;
	}

	public void setBlogReadEntryCss(String blogReadEntryCss) {
		this.blogReadEntryCss = blogReadEntryCss;
	}

	public String getBlogFormCss() {
		return blogFormCss;
	}

	public void setBlogFormCss(String blogFormCss) {
		this.blogFormCss = blogFormCss;
	}

	public String getBlogPostCss() {
		return blogPostCss;
	}

	public void setBlogPostCss(String blogPostCss) {
		this.blogPostCss = blogPostCss;
	}

	public String getBlogYearCss() {
		return blogYearCss;
	}

	public void setBlogYearCss(String blogYearCss) {
		this.blogYearCss = blogYearCss;
	}

	public String getBlogMonthCss() {
		return blogMonthCss;
	}

	public void setBlogMonthCss(String blogMonthCss) {
		this.blogMonthCss = blogMonthCss;
	}

	public String getTestChooseRepositoryFileCss() {
		return testChooseRepositoryFileCss;
	}

	public void setTestChooseRepositoryFileCss(String testChooseRepositoryFileCss) {
		this.testChooseRepositoryFileCss = testChooseRepositoryFileCss;
	}

	public String getCpChooseRepositoryFileCss() {
		return cpChooseRepositoryFileCss;
	}

	public void setCpChooseRepositoryFileCss(String cpChooseRepositoryFileCss) {
		this.cpChooseRepositoryFileCss = cpChooseRepositoryFileCss;
	}

	public String getWikiChooseRepositoryFileCss() {
		return wikiChooseRepositoryFileCss;
	}

	public void setWikiChooseRepositoryFileCss(String wikiChooseRepositoryFileCss) {
		this.wikiChooseRepositoryFileCss = wikiChooseRepositoryFileCss;
	}

	public String getFeedChooseRepositoryFileCss() {
		return feedChooseRepositoryFileCss;
	}

	public void setFeedChooseRepositoryFileCss(String feedChooseRepositoryFileCss) {
		this.feedChooseRepositoryFileCss = feedChooseRepositoryFileCss;
	}

	public String getMapChooseRepositoryFileCss() {
		return mapChooseRepositoryFileCss;
	}

	public void setMapChooseRepositoryFileCss(String mapChooseRepositoryFileCss) {
		this.mapChooseRepositoryFileCss = mapChooseRepositoryFileCss;
	}

	public String getRepositoryPopupCss() {
		return repositoryPopupCss;
	}

	public void setRepositoryPopupCss(String repositoryPopupCss) {
		this.repositoryPopupCss = repositoryPopupCss;
	}
	public String getRepositoryPopupCreateResourceCss() {
		return repositoryPopupCreateResourceCss;
	}

	public void setRepositoryPopupCreateResourceCss(String repositoryPopupCreateResourceCss) {
		this.repositoryPopupCreateResourceCss = repositoryPopupCreateResourceCss;
	}

	public String getRepositoryPopupImportResourceCss() {
		return repositoryPopupImportResourceCss;
	}

	public void setRepositoryPopupImportResourceCss(
			String repositoryPopupImportResourceCss) {
		this.repositoryPopupImportResourceCss = repositoryPopupImportResourceCss;
	}

	public String getRepositoryPopupAllResourcesCss() {
		return repositoryPopupAllResourcesCss;
	}

	public void setRepositoryPopupAllResourcesCss(
			String repositoryPopupAllResourcesCss) {
		this.repositoryPopupAllResourcesCss = repositoryPopupAllResourcesCss;
	}

	public String getRepositoryPopupMyResourcesCss() {
		return repositoryPopupMyResourcesCss;
	}

	public void setRepositoryPopupMyResourcesCss(
			String repositoryPopupMyResourcesCss) {
		this.repositoryPopupMyResourcesCss = repositoryPopupMyResourcesCss;
	}

	public String getRepositoryPopupSearchResourcesCss() {
		return repositoryPopupSearchResourcesCss;
	}

	public void setRepositoryPopupSearchResourcesCss(
			String repositoryPopupSearchResourcesCss) {
		this.repositoryPopupSearchResourcesCss = repositoryPopupSearchResourcesCss;
	}

	public String getMapEditCss() {
		return mapEditCss;
	}

	public void setMapEditCss(String mapEditCss) {
		this.mapEditCss = mapEditCss;
	}

	public String getBlogNoPostsCss() {
		return blogNoPostsCss;
	}

	public void setBlogNoPostsCss(String blogNoPostsCss) {
		this.blogNoPostsCss = blogNoPostsCss;
	}

	public String getPodcastNoEpisodesCss() {
		return podcastNoEpisodesCss;
	}

	public void setPodcastNoEpisodesCss(String podcastNoEpisodesCss) {
		this.podcastNoEpisodesCss = podcastNoEpisodesCss;
	}
	
}