org.alfresco.po.share.site.calendar.CalendarPage.java Source code

Java tutorial

Introduction

Here is the source code for org.alfresco.po.share.site.calendar.CalendarPage.java

Source

/*
 * #%L
 * share-po
 * %%
 * Copyright (C) 2005 - 2016 Alfresco Software Limited
 * %%
 * This file is part of the Alfresco software. 
 * If the software was purchased under a paid Alfresco license, the terms of 
 * the paid license agreement will prevail.  Otherwise, the software is 
 * provided under the following open source license terms:
 * 
 * Alfresco is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * Alfresco is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 * 
 * You should have received a copy of the GNU Lesser General Public License
 * along with Alfresco. If not, see <http://www.gnu.org/licenses/>.
 * #L%
 */
package org.alfresco.po.share.site.calendar;

import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static java.util.concurrent.TimeUnit.SECONDS;

import java.util.Calendar;
import java.util.concurrent.TimeUnit;

import org.alfresco.po.HtmlPage;
import org.alfresco.po.RenderTime;
import org.alfresco.po.RenderWebElement;
import org.alfresco.po.share.site.SitePage;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;

/**
 * Site Calendar Page object
 * relating to Share site Calendar page
 * 
 * @author Marina.Nenadovets
 */

public class CalendarPage extends SitePage {
    private Log logger = LogFactory.getLog(this.getClass());

    int waitInMilliSeconds = 2000;
    @RenderWebElement
    @FindBy(id = "HEADER_SITE_CALENDAR")
    private WebElement calendarHeader;
    private static final By ADD_EVENT = By
            .cssSelector("#template_x002e_toolbar_x002e_calendar_x0023_default-addEvent-button-button");
    private static final By TAB_CONTAINER = By.cssSelector("div[id*='defaultView']");

    // Buttons
    private static final By DAY_BUTTON = By.cssSelector("button[id$='_default-day-button']");
    private static final By WEEK_BUTTON = By.cssSelector("button[id$='_default-week-button']");
    private static final By MONTH_BUTTON = By.cssSelector("button[id$='_default-month-button']");
    private static final By AGENDA_BUTTON = By.cssSelector("button[id$='_default-agenda-button']");

    // Confirmation that expected tab opened
    private static final By DAY_TAB_TABLE = By.cssSelector("div[class='fc-view fc-view-agendaDay fc-agenda']");
    private static final By WEEK_TAB_TABLE = By.cssSelector("div[class='fc-view fc-view-agendaWeek fc-agenda']");
    private static final By MONTH_TAB_TABLE = By.cssSelector("div[class='fc-view fc-view-month fc-grid']");
    private static final By AGENDA_LINK_PREVIOUS = By.cssSelector("a[class='previousEvents agendaNav']");
    @SuppressWarnings("unused")
    private static final By AGENDA_LINK_NEXT = By.cssSelector("a[class='nextEvents agendaNav']");

    private final static String DAY_TAB_ADD_EVENT = "//tr[contains(@class,'fc-slot%s')]//div";
    private final static String WEEK_TAB_ADD_EVENT = "//div[contains(@class,'agendaWeek')]//table[@class='fc-agenda-slots']/tbody/tr[%s]/td/div";
    private final static String MONTH_TAB_ADD_EVENT = "//td[not(contains(@class,'fc-other-month'))]//div[@class='fc-day-content']/preceding-sibling::div[@class='fc-day-number' and text()='%s']";

    private static final By SHOW_ALL_HOURS_BUTTON = By.xpath("//button[@title='Show all hours']");
    private static final By SHOW_WORKING_HOURS_BUTTON = By.xpath("//button[@title='Show working hours']");

    private static final By EDIT_PANEL = By.cssSelector("div[id$='eventEditPanel-dialog']");
    private static final By INFO_PANEL = By.cssSelector("div[id$='eventInfoPanel_c']");

    private static final By ICALL_FED_LINK = By.cssSelector("a[id$='default-publishEvents-button-button']");

    // Tag panel
    private static final By SHOW_ALL_ITEMS_LINK = By.cssSelector("a[rel='-all-']");
    private final static String TAG_LINK = "//a[@class='tag-link' and @rel='%s']";

    /**
     * Enum for choose Calendar Tab or Add event button
     */
    public enum ActionEventVia {
        DAY_TAB(DAY_BUTTON), WEEK_TAB(WEEK_BUTTON), MONTH_TAB(MONTH_BUTTON), AGENDA_TAB(
                AGENDA_BUTTON), ADD_EVENT_BUTTON(ADD_EVENT);

        public final By contentLocator;

        ActionEventVia(By createEventVia) {
            this.contentLocator = createEventVia;

        }
    }

    /**
     * Enum for choose event type for some tab
     */
    public enum EventType {
        // Check links for all tabs
        // for DAY_TAB
        DAY_TAB_SINGLE_EVENT(
                "//div[contains(@class,'agendaDay')]//div[contains(text(),'%s')]/../../parent::a"), DAY_TAB_ALL_DAY_EVENT(
                        "//div[contains(@class,'agendaDay')]//span[contains(text(),'%s')]/../parent::a"), DAY_TAB_MULTIPLY_EVENT(
                                "//div[contains(@class,'agendaDay')]//div[contains(text(),'%s')]/../../parent::a"),

        // for WEEK_TAB
        WEEK_TAB_SINGLE_EVENT(
                "//div[contains(@class,'agendaWeek')]//div[contains(text(),'%s')]/../../parent::a"), WEEK_TAB_ALL_DAY_EVENT(
                        "//div[contains(@class,'agendaWeek')]//span[contains(text(),'%s')]/../parent::a"), WEEK_TAB_MULTIPLY_EVENT(
                                "//div[contains(@class,'agendaWeek')]//div[contains(text(),'%s')]/../../parent::a"),

        // for MONTH_TAB
        MONTH_TAB_SINGLE_EVENT(
                "//div[contains(@class,'month')]//span[contains(text(),'%s')]/../parent::a"), MONTH_TAB_ALL_DAY_EVENT(
                        "//div[contains(@class,'month')]//span[contains(text(),'%s')]/../parent::a"), MONTH_TAB_MULTIPLY_EVENT(
                                "//div[contains(@class,'month')]//span[contains(text(),'%s')]/../parent::a"),

        // for AGENDA_TAB
        AGENDA_TAB_SINGLE_EVENT(
                "//div[contains(@class,'agendaview')]//a[contains(text(),'%s')]"), AGENDA_TAB_ALL_DAY_EVENT(
                        "//div[contains(@class,'agendaview')]//a[contains(text(),'%s')]"), AGENDA_TAB_MULTIPLY_EVENT(
                                "//div[contains(@class,'agendaview')]//a[contains(text(),'%s')]");

        public String contentLocator;

        private EventType(String contentLocator) {
            this.contentLocator = contentLocator;
        }

        public String getXpathLocator() {
            return contentLocator;
        }
    }

    /**
     * Enum for check time during day
     */
    public enum HoursFromTable {
        // Check displayed hours
        FIRST_ALL_HOUR("//tr[contains(@class,'fc-slot0')]/th[contains(text(),'00:00')]"), FIRST_WORKING_HOUR(
                "//tr[contains(@class,'fc-slot0')]/th[contains(text(),'07:00')]"), LAST_WORKING_HOUR(
                        "//tr[contains(@class,'fc-slot22')]/th[contains(text(),'18:00')]"), LAST_ALL_HOUR(
                                "//tr[contains(@class,'fc-slot46')]/th[contains(text(),'23:00')]");

        public String contentLocator;

        private HoursFromTable(String contentLocator) {
            this.contentLocator = contentLocator;
        }

        public String getXpathLocator() {
            return contentLocator;
        }
    }

    @SuppressWarnings("unchecked")
    @Override
    public CalendarPage render(RenderTime timer) {
        basicRender(timer);
        return this;
    }

    @SuppressWarnings("unchecked")
    @Override
    public CalendarPage render() {
        return render(new RenderTime(maxPageLoadingTime));
    }

    /**
     * Method click on button 'Add event'
     * 
     * @return AddEventForm
     */
    public AddEventForm clickOnAddEvent() {
        try {
            findAndWait(ADD_EVENT).click();
            logger.info("Click add event button");
        } catch (NoSuchElementException e) {
            logger.debug("Unable to locate Add Event button");
        } catch (TimeoutException te) {
            logger.debug("The operation has timed out");
        }
        return factoryPage.instantiatePage(driver, AddEventForm.class);
    }

    /**
     * Method click on button 'Add event' or on Tab for adding event
     * 
     * @return AddEventForm
     */
    public AddEventForm clickOnTabOrButtonAddEvent(ActionEventVia createEventVia) {
        try {

            if (createEventVia == null) {
                throw new IllegalArgumentException("Tab Name is required");
            }

            if (createEventVia != null) {
                switch (createEventVia) {
                case DAY_TAB:
                    String dayXpath = String.format(DAY_TAB_ADD_EVENT,
                            Calendar.getInstance().get(Calendar.HOUR_OF_DAY));
                    WebElement element1 = findAndWait(By.xpath(dayXpath));
                    element1.click();
                    break;
                case WEEK_TAB:
                    String weekXpath = String.format(WEEK_TAB_ADD_EVENT,
                            Calendar.getInstance().get(Calendar.HOUR_OF_DAY) * 2);
                    WebElement element2 = findAndWait(By.xpath(weekXpath));
                    element2.click();
                    break;
                case MONTH_TAB:
                    String monthXpath = String.format(MONTH_TAB_ADD_EVENT,
                            Calendar.getInstance().get(Calendar.DATE));
                    WebElement element3 = findAndWait(By.xpath(monthXpath));
                    element3.click();
                    break;
                case AGENDA_TAB:
                    findAndWait(ADD_EVENT).click();
                    break;
                case ADD_EVENT_BUTTON:
                    findAndWait(ADD_EVENT).click();
                    break;
                default:
                    findAndWait(ADD_EVENT).click();
                    break;
                }
            }
        } catch (NoSuchElementException e) {
            logger.debug("Unable to locate Add Event button");
        } catch (TimeoutException te) {
            logger.debug("The operation has timed out");
        }
        return factoryPage.instantiatePage(driver, AddEventForm.class);
    }

    /**
     * Method for event creation
     * 
     * @return CalendarPage
     */
    public HtmlPage createEvent(String whatField, String whereField, String description, boolean allDay) {
        return createEvent(null, whatField, whereField, description, null, null, null, null, null, allDay);
    }

    /**
     * Method for event creation
     * 
     * @param createEventVia ActionEventVia
     * @param whatField String
     * @param whereField String
     * @param description String
     * @param startDate String
     * @param startTime String
     * @param endDate String
     * @param endTime String
     * @param tags String
     * @param allDay boolean
     * @return CalendarPage
     */

    public HtmlPage createEvent(ActionEventVia createEventVia, String whatField, String whereField,
            String description, String startDate, String startTime, String endDate, String endTime, String tags,
            boolean allDay) {
        return createEvent(createEventVia, whatField, whereField, description, null, null, startDate, startTime,
                null, null, endDate, endTime, tags, allDay);
    }

    /**
     * @param createEventVia ActionEventVia
     * @param whatField String
     * @param whereField String
     * @param description String
     * @param startYear String
     * @param startMonth String
     * @param startDate String
     * @param startTime String
     * @param endYear String
     * @param endMonth String
     * @param endDate String
     * @param endTime String
     * @param tags String
     * @param allDay boolean
     * @return CalendarPage
     */
    public HtmlPage createEvent(ActionEventVia createEventVia, String whatField, String whereField,
            String description, String startYear, String startMonth, String startDate, String startTime,
            String endYear, String endMonth, String endDate, String endTime, String tags, boolean allDay) {
        logger.info("Create event with name " + whatField);
        try {
            AddEventForm addEventForm;
            CalendarPage calendarPage = getCurrentPage().render();
            CalendarContainer calendarContainer = factoryPage.instantiatePage(driver, CalendarContainer.class);
            if (createEventVia != null) {
                switch (createEventVia) {
                case DAY_TAB:
                    calendarPage = (CalendarPage) calendarPage.chooseDayTab();
                    addEventForm = calendarPage.clickOnTabOrButtonAddEvent(ActionEventVia.DAY_TAB);
                    break;
                case WEEK_TAB:
                    calendarPage = (CalendarPage) calendarPage.chooseWeekTab();
                    addEventForm = calendarPage.clickOnTabOrButtonAddEvent(ActionEventVia.WEEK_TAB);
                    break;
                case MONTH_TAB:
                    calendarPage = (CalendarPage) calendarPage.chooseMonthTab();
                    addEventForm = calendarPage.clickOnTabOrButtonAddEvent(ActionEventVia.MONTH_TAB);
                    break;
                case AGENDA_TAB:
                    calendarPage = (CalendarPage) calendarPage.chooseAgendaTab();
                    addEventForm = calendarPage.clickOnTabOrButtonAddEvent(ActionEventVia.AGENDA_TAB);
                    break;
                case ADD_EVENT_BUTTON:
                    addEventForm = calendarPage.clickOnAddEvent();
                    break;
                default:
                    addEventForm = calendarPage.clickOnAddEvent();
                    break;
                }
            } else {
                addEventForm = calendarPage.clickOnAddEvent();
            }

            if (whatField != null && !whatField.isEmpty()) {
                addEventForm.setWhatField(whatField);
            }
            if (whereField != null && !whereField.isEmpty()) {
                addEventForm.setWhereField(whereField);
            }
            if (description != null && !description.isEmpty()) {
                addEventForm.setDescriptionField(description);
            }
            if (description != null && !description.isEmpty()) {
                addEventForm.setDescriptionField(description);
            }

            if (startYear != null && !startYear.isEmpty()) {
                addEventForm.clickStartDatePicker();
                calendarContainer.setYear(startYear);
                calendarContainer.setDate("1");
            }

            if (startMonth != null && !startMonth.isEmpty()) {
                addEventForm.clickStartDatePicker();
                calendarContainer.setMonth(startMonth);
                calendarContainer.setDate("1");

            }
            if (startDate != null && !startDate.isEmpty()) {
                addEventForm.clickStartDatePicker();
                calendarContainer.setDate(startDate);
            }

            if (endYear != null && !endYear.isEmpty()) {
                addEventForm.clickEndDatePicker();
                calendarContainer.setYear(endYear);
                calendarContainer.setDate("1");
            }

            if (endMonth != null && !endMonth.isEmpty()) {
                addEventForm.clickEndDatePicker();
                calendarContainer.setMonth(endMonth);
                if (endDate != null && !endDate.isEmpty()) {

                    calendarContainer.setDate(endDate);
                } else
                    calendarContainer.setDate("1");
            } else {
                if (endDate != null && !endDate.isEmpty()) {

                    addEventForm.clickEndDatePicker();
                    calendarContainer.setDate(endDate);
                }
            }

            if (startTime != null && !startTime.isEmpty()) {
                addEventForm.setStartTimeField(startTime);
            }

            if (endTime != null && !endTime.isEmpty()) {
                addEventForm.setEndTimeField(endTime);
            }

            if (tags != null) {
                addEventForm.setTagsField(tags);
                addEventForm.clickAddTag();
            }

            if (allDay) {
                addEventForm.setAllDayCheckbox();

            }
            addEventForm.clickSave();
        } catch (TimeoutException te) {
            logger.debug("The operation has timed out");
        } catch (NoSuchElementException nse) {
            logger.debug("Unable to find the elements");
        }
        waitUntilElementDisappears(EDIT_PANEL,
                TimeUnit.SECONDS.convert(getDefaultWaitTime(), TimeUnit.MILLISECONDS));
        waitUntilNotVisible(By.cssSelector(".message"), "created",
                TimeUnit.SECONDS.convert(getDefaultWaitTime(), TimeUnit.MILLISECONDS));
        if (tags != null) {
            String tagXpath = String.format(TAG_LINK, tags.split(" ")[0]);
            waitUntilElementPresent(By.xpath(tagXpath),
                    TimeUnit.SECONDS.convert(getDefaultWaitTime(), TimeUnit.MILLISECONDS));
        }
        return getCurrentPage();
    }

    /**
     * Method to verify whether Add Even Link is available
     * 
     * @return true if displayed
     */
    public boolean isAddEventPresent() {
        try {
            return findAndWait(ADD_EVENT, 2000).isDisplayed();
        } catch (TimeoutException nse) {
            return false;
        }
    }

    /**
     * Method for event edition
     * 
     * @param eventName String
     * @param eventType EventType
     * @param editEventVia ActionEventVia
     * @param whatField String
     * @param whereField String
     * @param description String
     * @param startDate String
     * @param startTime String
     * @param endDate String
     * @param endTime String
     * @param tags String
     * @param allDay boolean
     * @return CalendarPage
     */
    public HtmlPage editEvent(String eventName, EventType eventType, ActionEventVia editEventVia, String whatField,
            String whereField, String description, String startDate, String startTime, String endDate,
            String endTime, String tags, boolean allDay, String[] removeTag) {
        logger.info("Edit event with name " + whatField);
        try {
            EditEventForm editEventForm = null;
            CalendarPage calendarPage = getCurrentPage().render();
            CalendarContainer calendarContainer = factoryPage.instantiatePage(driver, CalendarContainer.class);
            InformationEventForm informationEventForm;
            if (editEventVia != null) {
                switch (editEventVia) {
                case DAY_TAB:
                    calendarPage = (CalendarPage) calendarPage.chooseDayTab();
                    informationEventForm = calendarPage.clickOnEvent(eventType, eventName);
                    editEventForm = informationEventForm.clickOnEditEvent();
                    break;
                case WEEK_TAB:
                    calendarPage = (CalendarPage) calendarPage.chooseWeekTab();
                    informationEventForm = calendarPage.clickOnEvent(eventType, eventName);
                    editEventForm = informationEventForm.clickOnEditEvent();
                    break;
                case MONTH_TAB:
                    calendarPage = (CalendarPage) calendarPage.chooseMonthTab();
                    informationEventForm = calendarPage.clickOnEvent(eventType, eventName);
                    editEventForm = informationEventForm.clickOnEditEvent();
                    break;
                case AGENDA_TAB:
                    calendarPage = (CalendarPage) calendarPage.chooseAgendaTab();
                    informationEventForm = calendarPage.clickOnEvent(eventType, eventName);
                    editEventForm = informationEventForm.clickOnEditEvent();
                    break;
                default:
                    break;
                }
            } else {
                throw new IllegalArgumentException("Parameter editEventVia is required");
            }

            if (whatField != null && !whatField.isEmpty()) {
                editEventForm.setWhatField(whatField);
            }
            if (whereField != null && !whereField.isEmpty()) {
                editEventForm.setWhereField(whereField);
            }
            if (description != null && !description.isEmpty()) {
                editEventForm.setDescriptionField(description);
            }
            if (description != null && !description.isEmpty()) {
                editEventForm.setDescriptionField(description);
            }

            if (startDate != null && !startDate.isEmpty()) {
                editEventForm.clickStartDatePicker();
                calendarContainer.setDate(startDate);
            }

            if (startTime != null && !startTime.isEmpty()) {
                editEventForm.setStartTimeField(startTime);
            }

            if (endDate != null && !endDate.isEmpty()) {
                editEventForm.clickEndDatePicker();
                calendarContainer.setDate(endDate);
            }

            if (endTime != null && !endTime.isEmpty()) {
                editEventForm.setEndTimeField(endTime);
            }

            if (tags != null) {
                editEventForm.setTagsField(tags);
                editEventForm.clickAddTag();
            }

            if (allDay) {
                editEventForm.setAllDayCheckbox();
            }

            if (removeTag != null) {
                editEventForm.removeTag(removeTag);
            }

            editEventForm.clickSave();
        } catch (TimeoutException te) {
            logger.debug("The operation has timed out");
        } catch (NoSuchElementException nse) {
            logger.debug("Unable to find the elements");
        }
        waitUntilElementDisappears(EDIT_PANEL,
                TimeUnit.SECONDS.convert(getDefaultWaitTime(), TimeUnit.MILLISECONDS));
        if (tags != null) {
            String tagXpath = String.format(TAG_LINK, tags.split(" ")[0]);
            waitUntilElementPresent(By.xpath(tagXpath),
                    TimeUnit.SECONDS.convert(getDefaultWaitTime(), TimeUnit.MILLISECONDS));
        }
        if (removeTag != null) {
            String tagXpath = String.format(TAG_LINK, removeTag[0]);
            waitUntilElementDisappears(By.xpath(tagXpath),
                    TimeUnit.SECONDS.convert(getDefaultWaitTime(), TimeUnit.MILLISECONDS));
        }
        return getCurrentPage();
    }

    /**
     * Method for event deletion
     * 
     * @param eventName String
     * @param eventType EventType
     * @param editEventVia ActionEventVia
     * @return CalendarPage
     */
    public HtmlPage deleteEvent(String eventName, EventType eventType, ActionEventVia editEventVia) {
        logger.info("Delete event with name " + eventName);
        try {
            DeleteEventForm deleteEventForm;
            CalendarPage calendarPage = getCurrentPage().render();
            InformationEventForm informationEventForm;
            if (editEventVia != null) {
                switch (editEventVia) {
                case DAY_TAB:
                    calendarPage = (CalendarPage) calendarPage.chooseDayTab();
                    informationEventForm = calendarPage.clickOnEvent(eventType, eventName);
                    deleteEventForm = informationEventForm.clickOnDeleteEvent();
                    deleteEventForm.confirmDeleteEvent();
                    break;
                case WEEK_TAB:
                    calendarPage = (CalendarPage) calendarPage.chooseWeekTab();
                    informationEventForm = calendarPage.clickOnEvent(eventType, eventName);
                    deleteEventForm = informationEventForm.clickOnDeleteEvent();
                    deleteEventForm.confirmDeleteEvent();
                    break;
                case MONTH_TAB:
                    calendarPage = (CalendarPage) calendarPage.chooseMonthTab();
                    informationEventForm = calendarPage.clickOnEvent(eventType, eventName);
                    deleteEventForm = informationEventForm.clickOnDeleteEvent();
                    deleteEventForm.confirmDeleteEvent();
                    break;
                case AGENDA_TAB:
                    calendarPage = (CalendarPage) calendarPage.chooseAgendaTab();
                    informationEventForm = calendarPage.clickOnEvent(eventType, eventName);
                    deleteEventForm = informationEventForm.clickOnDeleteEvent();
                    deleteEventForm.confirmDeleteEvent();
                    break;
                default:
                    break;
                }
            } else {
                throw new IllegalArgumentException("Parameter editEventVia is required");
            }
        } catch (TimeoutException te) {
            logger.debug("The operation has timed out");
        } catch (NoSuchElementException nse) {
            logger.debug("Unable to find the elements");
        }
        waitUntilElementDisappears(INFO_PANEL,
                TimeUnit.SECONDS.convert(getDefaultWaitTime(), TimeUnit.MILLISECONDS));
        waitUntilNotVisible(By.cssSelector(".message"), "was deleted",
                TimeUnit.SECONDS.convert(getDefaultWaitTime(), TimeUnit.MILLISECONDS));
        String linkEventXpath = String.format(eventType.getXpathLocator(), eventName);
        waitUntilElementDeletedFromDom(By.xpath(linkEventXpath), SECONDS.convert(maxPageLoadingTime, MILLISECONDS));
        return getCurrentPage();
    }

    /**
     * Choose day tab
     * 
     * @return HtmlPage
     */
    public HtmlPage chooseDayTab() {
        try {
            logger.info("Choose day tab");
            findAndWait(DAY_BUTTON).click();
        } catch (NoSuchElementException e) {
            logger.debug("Unable to locate Day button");
        } catch (TimeoutException te) {
            logger.debug("The operation has timed out");
        }
        waitForPageLoad(SECONDS.convert(maxPageLoadingTime, MILLISECONDS));
        synchronized (this) {
            try {
                this.wait(waitInMilliSeconds);
            } catch (InterruptedException e) {
            }
        }
        return getCurrentPage();
    }

    /**
     * Choose week tab
     * 
     * @return CalendarPage
     */
    public HtmlPage chooseWeekTab() {
        try {
            logger.info("Choose week tab");
            findAndWait(WEEK_BUTTON).click();
        } catch (NoSuchElementException e) {
            logger.debug("Unable to locate Week button");
        } catch (TimeoutException te) {
            logger.debug("The operation has timed out");
        }
        waitForPageLoad(SECONDS.convert(maxPageLoadingTime, MILLISECONDS));
        synchronized (this) {
            try {
                this.wait(waitInMilliSeconds);
            } catch (InterruptedException e) {
            }
        }
        return getCurrentPage();
    }

    /**
     * Choose month tab
     * 
     * @return CalendarPage
     */
    public HtmlPage chooseMonthTab() {
        try {
            logger.info("Choose month tab");
            findAndWait(MONTH_BUTTON).click();
        } catch (NoSuchElementException e) {
            logger.debug("Unable to locate Month button");
        } catch (TimeoutException te) {
            logger.debug("The operation has timed out");
        }
        waitForPageLoad(SECONDS.convert(maxPageLoadingTime, MILLISECONDS));
        synchronized (this) {
            try {
                this.wait(waitInMilliSeconds);
            } catch (InterruptedException e) {
            }
        }
        return getCurrentPage();
    }

    /**
     * Choose agenda tab
     * 
     * @return CalendarPage
     */
    public HtmlPage chooseAgendaTab() {
        try {
            logger.info("Choose agenda tab");
            findAndWait(AGENDA_BUTTON).click();
        } catch (NoSuchElementException e) {
            logger.debug("Unable to locate Agenda button");
        } catch (TimeoutException te) {
            logger.debug("The operation has timed out");
        }
        waitForPageLoad(SECONDS.convert(maxPageLoadingTime, MILLISECONDS));
        synchronized (this) {
            try {
                this.wait(waitInMilliSeconds);
            } catch (InterruptedException e) {
            }
        }
        return getCurrentPage();
    }

    /**
     * Check that day tab opened
     * 
     * @return true if day tab opened
     */
    public boolean isDayTabOpened() {
        try {
            logger.info("Check is day tab opened");
            WebElement dayTab = driver.findElement(DAY_TAB_TABLE);
            return dayTab.isDisplayed();
        } catch (NoSuchElementException te) {
            logger.debug("Unable to locate day tab table");
            return false;
        }
    }

    /**
     * Check that week tab opened
     * 
     * @return true if week tab opened
     */
    public boolean isWeekTabOpened() {
        try {
            logger.info("Check is week tab opened");
            WebElement weekTab = driver.findElement(WEEK_TAB_TABLE);
            return weekTab.isDisplayed();
        } catch (NoSuchElementException te) {
            logger.debug("Unable to locate week tab table");
            return false;
        }
    }

    /**
     * Check that month tab opened
     * 
     * @return true if month tab opened
     */
    public boolean isMonthTabOpened() {
        try {
            logger.info("Check is month tab opened");
            WebElement monthTab = driver.findElement(MONTH_TAB_TABLE);
            return monthTab.isDisplayed();
        } catch (NoSuchElementException te) {
            logger.debug("Unable to locate month tab table");
            return false;
        }
    }

    /**
     * Check that agenda tab opened
     * 
     * @return true if agenda tab opened
     */
    public boolean isAgendaTabOpened() {
        try {
            logger.info("Check is agenda tab opened");
            WebElement linkPreviousEvent = driver.findElement(AGENDA_LINK_PREVIOUS);
            return linkPreviousEvent.isDisplayed();
        } catch (NoSuchElementException te) {
            logger.debug("Unable to locate link for agenda tab");
            return false;
        }
    }

    /**
     * Check that event present
     * 
     * @return true if event present
     */
    public boolean isEventPresent(EventType eventType, String eventName) {
        try {
            logger.info("Check that link with name " + eventName + " presented at the current tab");
            if (!eventName.isEmpty()) {
                waitUntilAlert();
                String linkEventXpath = String.format(eventType.getXpathLocator(), eventName);
                WebElement element = driver.findElement(By.xpath(linkEventXpath));
                return element.isDisplayed();
            } else {
                return false;
            }
        } catch (NoSuchElementException te) {
            logger.debug("Unable to locate expected link on tab table");
            return false;
        } catch (StaleElementReferenceException se) {
            return isEventPresent(eventType, eventName);
        }
    }

    /**
     * Method show All Hours
     * 
     * @return CalendarPage
     */
    public HtmlPage showAllHours() {
        try {
            logger.info("Click show all hours");
            findAndWait(SHOW_ALL_HOURS_BUTTON).click();
        } catch (NoSuchElementException e) {
            logger.debug("Unable to locate 'show all hours' button");
        } catch (TimeoutException te) {
            logger.debug("The operation has timed out");
        }
        return getCurrentPage();
    }

    /**
     * Check that button show All Hours displayed
     * 
     * @return true if button displayed
     */
    public boolean showAllHoursButtonDisplayed() {
        try {
            logger.info("Check 'show all hours' button displayed");
            WebElement button = driver.findElement(SHOW_ALL_HOURS_BUTTON);
            return button.isDisplayed();
        } catch (NoSuchElementException te) {
            logger.debug("Unable to locate 'show all hours' button");
            return false;
        }
    }

    /**
     * Method show Working Hours
     * 
     * @return CalendarPage
     */
    public HtmlPage showWorkingHours() {
        try {
            logger.info("Click show working hours");
            findAndWait(SHOW_WORKING_HOURS_BUTTON).click();
        } catch (NoSuchElementException e) {
            logger.debug("Unable to locate 'show working hours' button");
        } catch (TimeoutException te) {
            logger.debug("The operation has timed out");
        }
        return getCurrentPage();
    }

    /**
     * Check that button show Working Hours displayed
     * 
     * @return true if button displayed
     */
    public boolean showWorkingHoursButtonDisplayed() {
        try {
            logger.info("Check 'show working hours' button displayed");
            WebElement button = driver.findElement(SHOW_WORKING_HOURS_BUTTON);
            return button.isDisplayed();
        } catch (NoSuchElementException te) {
            logger.debug("Unable to locate 'show working hours' button");
            return false;
        }
    }

    /**
     * Check that element presented(e.g. for hour element )
     * 
     * @return String
     */
    public boolean checkTableHours(HoursFromTable xpath) {
        try {
            return driver.findElement(By.xpath(xpath.getXpathLocator())).isDisplayed();
        } catch (TimeoutException te) {
            throw new UnsupportedOperationException("Exceeded time to find the text.", te);
        }
    }

    /**
     * Check that element presented(e.g. for hour element )
     *
     * @param eventType EventType
     * @param eventName String
     * @return InformationEventForm
     */
    public InformationEventForm clickOnEvent(EventType eventType, String eventName) {
        try {
            if (isEventPresent(eventType, eventName)) {
                logger.info("Click on event link with name " + eventName + "if it presented at the current tab");
                String linkEventXpath = String.format(eventType.getXpathLocator(), eventName);
                WebElement element = findAndWait(By.xpath(linkEventXpath));
                element.click();
            } else {
                throw new NoSuchElementException("Unable to locate expected link on tab table");
            }
        } catch (NoSuchElementException te) {
            logger.debug("Unable to locate expected link on tab table");
        } catch (StaleElementReferenceException se) {
            return clickOnEvent(eventType, eventName);
        }
        return factoryPage.instantiatePage(driver, InformationEventForm.class);
    }

    /**
     * Method return href for iCalFeed button
     * 
     * @return String
     */
    public String clickIcalFeedButton() {
        String iCallHref = null;
        try {

            logger.info("Click on iCallFeed link");
            WebElement element = findAndWait(ICALL_FED_LINK);
            element.click();

        } catch (NoSuchElementException te) {
            logger.debug("Unable to locate expected link on tab table");
        }
        return iCallHref;
    }

    /**
     * Method return href for iCalFeed button
     * 
     * @return String
     */
    public String getIcalFeedHref() {
        String iCallHref = null;
        try {

            logger.info("Get href for iCallFeed link");
            WebElement element = findAndWait(ICALL_FED_LINK);
            iCallHref = element.getAttribute("href");

        } catch (NoSuchElementException te) {
            logger.debug("Unable to locate expected link on tab table");
        }
        return iCallHref;
    }

    /**
     * Check that link 'Show all items' present
     * 
     * @return true if this link presented
     */
    public boolean isShowAllItemsPresent() {
        try {
            logger.info("Check is link 'Show all items' present");
            WebElement link = driver.findElement(SHOW_ALL_ITEMS_LINK);
            return link.isDisplayed();
        } catch (NoSuchElementException te) {
            logger.debug("Unable to locate link 'Show all items'");
            return false;
        }
    }

    /**
     * Method click link 'Show all items'
     * 
     * @return CalendarPage
     */
    public HtmlPage clickShowAllItems() {
        try {
            logger.info("Click link 'Show all items'");
            findAndWait(SHOW_ALL_ITEMS_LINK).click();
        } catch (NoSuchElementException e) {
            logger.debug("Unable to locate link 'Show all items'");
        } catch (TimeoutException te) {
            logger.debug("The operation has timed out");
        }

        synchronized (this) {
            try {
                this.wait(waitInMilliSeconds);
            } catch (InterruptedException e) {
            }
        }
        return getCurrentPage();
    }

    /**
     * Check that tag link present
     * 
     * @return true if tag link presented
     */
    public boolean isTagPresent(String tagName) {
        try {
            logger.info("Check is tag '" + tagName + "' present");
            String tagXpath = String.format(TAG_LINK, tagName);
            WebElement element = driver.findElement(By.xpath(tagXpath));
            return element.isDisplayed();
        } catch (NoSuchElementException te) {
            logger.debug("Unable to locate expected taf link " + tagName);
            return false;
        } catch (StaleElementReferenceException se) {
            return isTagPresent(tagName);
        }
    }

    /**
     * Method click link 'Show all items'
     * 
     * @return CalendarPage
     */
    public HtmlPage clickTagLink(String tagName) {
        String tagXpath;
        WebElement element;
        try {
            logger.info("Click tag link with name '" + tagName + "'");
            tagXpath = String.format(TAG_LINK, tagName);
            element = driver.findElement(By.xpath(tagXpath));
            element.click();
        } catch (NoSuchElementException e) {
            logger.debug("Unable to locate tag link with name '" + tagName + "'");
        } catch (TimeoutException te) {
            logger.debug("The operation has timed out");
        }

        synchronized (this) {
            try {
                this.wait(waitInMilliSeconds);
            } catch (InterruptedException e) {
            }
        }
        return getCurrentPage();
    }

    /**
     * Method to check whether it is possible to add an event
     * 
     * @param viaTab
     * @return boolean
     */
    public boolean isAddEventClickable(ActionEventVia viaTab) {
        if (viaTab == null) {
            throw new UnsupportedOperationException("Via Tab parameter is missing");
        }

        if (viaTab == ActionEventVia.AGENDA_TAB) {

            if (getTheNumOfEvents(ActionEventVia.AGENDA_TAB) > 0) {
                return false;
            } else {
                return isElementDisplayed(By.cssSelector("div[id*='defaultView']>span>a"));
            }
        } else {
            WebElement container = findAndWait(TAB_CONTAINER);
            return container.getAttribute("class").contains("calendar-editable");
        }
    }

    /**
     * Method to return the number of events
     * 
     * @param viaTab ActionEventVia
     * @return int
     */
    public int getTheNumOfEvents(ActionEventVia viaTab) {
        int size = 0;
        switch (viaTab) {
        case AGENDA_TAB:
            if (!isElementDisplayed(By.cssSelector("tbody[class*='data']>tr"))) {
                size = 0;
            } else {
                size = driver.findElements(By.cssSelector("tbody[class*='data']>tr")).size();
            }
            break;
        default:
            size = 0;
        }
        return size;
    }

    public void closeEventDialog() {
        driver.findElement(By.cssSelector("div#eventInfoPanel a.container-close")).click();
    }
}