/*
 * JBoss, Home of Professional Open Source
 * Copyright 2013, Red Hat, Inc. and individual contributors
 * by the @authors tag. See the copyright.txt in the distribution for a
 * full listing of individual contributors.
 *
 * This 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 2.1 of
 * the License, or (at your option) any later version.
 *
 * This software 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 this software; if not, write to the Free
 * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
 * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
 */

package org.richfaces.ui.iteration;

import static org.junit.Assert.assertEquals;

import java.util.List;

import org.jboss.test.faces.htmlunit.HtmlUnitEnvironment;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.richfaces.CustomizedHtmlUnitEnvironment;
import org.richfaces.ui.common.HtmlConstants;

import com.gargoylesoftware.htmlunit.html.DomNode;
import com.gargoylesoftware.htmlunit.html.HtmlElement;
import com.gargoylesoftware.htmlunit.html.HtmlPage;

/**
 * @author Anton Belevich
 *
 */
public class DataScrollerRenderTest {
    private HtmlUnitEnvironment environment;

    @Before
    public void setUp() {
        environment = new CustomizedHtmlUnitEnvironment();
        // environment.withWebRoot(new File("src/test/resources"));
        environment.withResource("/WEB-INF/faces-config.xml", "org/richfaces/ui/iteration/faces-config.xml");
        environment.withResource("/test.xhtml", "org/richfaces/ui/iteration/dataTableTest.xhtml");
        environment.start();
    }

    @Test
    public void testEncoding() throws Exception {
        HtmlPage page = environment.getPage("/test.jsf");

        String scrollerId = "scroller1";
        // first scroll
        List<?> nodes = page.getByXPath("//*[@id = 'form:scroller1']");

        assertEquals(1, nodes.size());
        HtmlElement span = (HtmlElement) nodes.get(0);
        assertEquals("span", span.getNodeName());
        assertEquals("rf-ds", span.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        // first/fastRewind/previous buttons with arrows
        HtmlElement first = getFirstButton(page, scrollerId);
        assertEquals("span", first.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-first rf-ds-dis", first.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        HtmlElement fastRewind = getFastRewindButton(page, scrollerId);
        assertEquals("span", fastRewind.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-fastrwd rf-ds-dis", fastRewind.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        HtmlElement previous = getPreviousButton(page, scrollerId);
        assertEquals("span", previous.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-prev rf-ds-dis", previous.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        // currently selected digital button
        HtmlElement dc1 = getDigitalButton(page, scrollerId, 1);
        assertEquals("span", dc1.getNodeName());
        assertEquals("rf-ds-nmb-btn rf-ds-act", dc1.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        // digital buttons
        HtmlElement d2 = getDigitalButton(page, scrollerId, 2);
        assertEquals("a", d2.getNodeName());
        assertEquals("rf-ds-nmb-btn", d2.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());
        assertEquals("javascript:void(0);", d2.getAttribute(HtmlConstants.HREF_ATTR));

        HtmlElement d3 = getDigitalButton(page, scrollerId, 3);
        assertEquals("a", d3.getNodeName());
        assertEquals("rf-ds-nmb-btn", d3.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());
        assertEquals("javascript:void(0);", d3.getAttribute(HtmlConstants.HREF_ATTR));

        HtmlElement d4 = getDigitalButton(page, scrollerId, 4);
        assertEquals("a", d4.getNodeName());
        assertEquals("rf-ds-nmb-btn", d4.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());
        assertEquals("javascript:void(0);", d4.getAttribute(HtmlConstants.HREF_ATTR));

        HtmlElement d5 = getDigitalButton(page, scrollerId, 5);
        assertEquals("a", d5.getNodeName());
        assertEquals("rf-ds-nmb-btn", d5.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());
        assertEquals("javascript:void(0);", d5.getAttribute(HtmlConstants.HREF_ATTR));

        // next/fastForward/last buttons with arrows
        HtmlElement next = getNextButton(page, scrollerId);
        assertEquals("a", next.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-next", next.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());
        assertEquals("javascript:void(0);", next.getAttribute(HtmlConstants.HREF_ATTR));

        HtmlElement fastForward = getFastForwardButton(page, scrollerId);
        assertEquals("a", fastForward.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-fastfwd", fastForward.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());
        assertEquals("javascript:void(0);", fastForward.getAttribute(HtmlConstants.HREF_ATTR));

        HtmlElement last = getLastButton(page, scrollerId);
        assertEquals("a", last.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-last", last.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());
        assertEquals("javascript:void(0);", last.getAttribute(HtmlConstants.HREF_ATTR));
    }

    @Test
    @Ignore // broke with the jQuery 1.6.2 upgrade
    public void testOutDataScrollerFirstLastButtons() throws Exception {
        HtmlPage page = environment.getPage("/test.jsf");
        String firstScrollerId = "scroller1";

        // dataScroller inside dataTable 'footer' facet
        String secondScrollerId = "richTable:scroller2";

        HtmlElement last = getLastButton(page, firstScrollerId);
        last.click();
        checkLastPageButtons(page, firstScrollerId, secondScrollerId);

        HtmlElement first = getFirstButton(page, firstScrollerId);
        first.click();
        checkFirstPageButtons(page, firstScrollerId, secondScrollerId);
    }

    @Test
    @Ignore // broke with the jQuery 1.6.2 upgrade
    public void testInnerDataScrollerFirstLastButtons() throws Exception {
        HtmlPage page = environment.getPage("/test.jsf");
        String firstScrollerId = "scroller1";

        // dataScroller inside dataTable 'footer' facet
        String secondScrollerId = "richTable:scroller2";

        HtmlElement last = getLastButton(page, secondScrollerId);
        last.click();
        checkLastPageButtons(page, firstScrollerId, secondScrollerId);

        HtmlElement first = getFirstButton(page, secondScrollerId);
        first.click();
        checkFirstPageButtons(page, firstScrollerId, secondScrollerId);
    }

    @Test
    @Ignore // broke with the jQuery 1.6.2 upgrade
    public void testOutDataScrollerNextPreviousButtons() throws Exception {
        HtmlPage page = environment.getPage("/test.jsf");
        String firstScrollerId = "scroller1";

        // dataScroller inside dataTable 'footer' facet
        String secondScrollerId = "richTable:scroller2";

        for (int i = 2; i <= 5; i++) {
            HtmlElement next = getNextButton(page, firstScrollerId);

            next.click();

            HtmlElement currentDigital1 = getDigitalButton(page, firstScrollerId, i);
            assertEquals("span", currentDigital1.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital1.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // if scroller inside dataTable has switched
            HtmlElement currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            assertEquals("span", currentDigital2.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital2.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // check if page has switched
            assertEquals(i + " page content", getCurrentPageContent(page, i));
        }

        checkLastPageButtons(page, firstScrollerId, secondScrollerId);

        // scroll back
        for (int i = 4; i >= 1; i--) {
            HtmlElement previous = getPreviousButton(page, firstScrollerId);
            previous.click();
            HtmlElement currentDigital1 = getDigitalButton(page, firstScrollerId, i);

            assertEquals("span", currentDigital1.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital1.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // if scroller inside dataTable has switched
            HtmlElement currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            assertEquals("span", currentDigital2.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital2.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // check if page has switched
            assertEquals(i + " page content", getCurrentPageContent(page, i));
        }

        checkFirstPageButtons(page, firstScrollerId, secondScrollerId);
    }

    @Test
    @Ignore // broke with the jQuery 1.6.2 upgrade
    public void testInnerDataScrollerNextPreviousButtons() throws Exception {
        HtmlPage page = environment.getPage("/test.jsf");
        String firstScrollerId = "scroller1";

        // dataScroller inside dataTable 'footer' facet
        String secondScrollerId = "richTable:scroller2";

        for (int i = 2; i <= 5; i++) {
            HtmlElement next = getNextButton(page, secondScrollerId);
            next.click();
            HtmlElement currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            assertEquals("span", currentDigital2.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital2.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // if scroller outside dataTable has switched
            HtmlElement currentDigital1 = getDigitalButton(page, firstScrollerId, i);
            assertEquals("span", currentDigital1.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital1.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // check if page has switched
            assertEquals(i + " page content", getCurrentPageContent(page, i));
        }

        checkLastPageButtons(page, firstScrollerId, secondScrollerId);

        // scroll back
        for (int i = 4; i >= 1; i--) {
            HtmlElement previous = getPreviousButton(page, secondScrollerId);
            previous.click();

            HtmlElement currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            assertEquals("span", currentDigital2.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital2.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // if scroller inside dataTable has switched
            HtmlElement currentDigital1 = getDigitalButton(page, firstScrollerId, i);
            assertEquals("span", currentDigital1.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital1.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // check if page has switched
            assertEquals(i + " page content", getCurrentPageContent(page, i));
        }

        checkFirstPageButtons(page, firstScrollerId, secondScrollerId);
    }

    @Test
    @Ignore // broke with the jQuery 1.6.2 upgrade
    public void testOutDataScrollerFastButtons() throws Exception {
        HtmlPage page = environment.getPage("/test.jsf");
        String firstScrollerId = "scroller1";

        // dataScroller inside dataTable 'footer' facet
        String secondScrollerId = "richTable:scroller2";

        for (int i = 3; i <= 5; i = i + 2) {
            HtmlElement ff = getFastForwardButton(page, firstScrollerId);

            ff.click();

            HtmlElement currentDigital1 = getDigitalButton(page, firstScrollerId, i);
            assertEquals("span", currentDigital1.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital1.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // if scroller inside dataTable has switched
            HtmlElement currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            assertEquals("span", currentDigital2.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital2.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // check if page has switched
            assertEquals(i + " page content", getCurrentPageContent(page, i));
        }

        checkLastPageButtons(page, firstScrollerId, secondScrollerId);

        // scroll back
        for (int i = 3; i >= 1; i = i - 2) {
            HtmlElement fr = getFastRewindButton(page, firstScrollerId);
            fr.click();
            HtmlElement currentDigital1 = getDigitalButton(page, firstScrollerId, i);

            assertEquals("span", currentDigital1.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital1.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // if scroller inside dataTable has switched
            HtmlElement currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            assertEquals("span", currentDigital2.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital2.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // check if page has switched
            assertEquals(i + " page content", getCurrentPageContent(page, i));
        }

        checkFirstPageButtons(page, firstScrollerId, secondScrollerId);
    }

    @Test
    @Ignore // broke with the jQuery 1.6.2 upgrade
    public void testInnerDataScrollerFastButtons() throws Exception {
        HtmlPage page = environment.getPage("/test.jsf");
        String firstScrollerId = "scroller1";

        // dataScroller inside dataTable 'footer' facet
        String secondScrollerId = "richTable:scroller2";

        for (int i = 3; i <= 5; i = i + 2) {
            HtmlElement ff = getFastForwardButton(page, secondScrollerId);
            ff.click();
            HtmlElement currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            assertEquals("span", currentDigital2.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital2.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // if scroller outside dataTable has switched
            HtmlElement currentDigital1 = getDigitalButton(page, firstScrollerId, i);
            assertEquals("span", currentDigital1.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital1.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // check if page has switched
            assertEquals(i + " page content", getCurrentPageContent(page, i));
        }

        checkLastPageButtons(page, firstScrollerId, secondScrollerId);

        // scroll back
        for (int i = 3; i >= 1; i = i - 2) {
            HtmlElement fr = getFastRewindButton(page, secondScrollerId);
            fr.click();

            HtmlElement currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            assertEquals("span", currentDigital2.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital2.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // if scroller inside dataTable has switched
            HtmlElement currentDigital1 = getDigitalButton(page, firstScrollerId, i);
            assertEquals("span", currentDigital1.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital1.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // check if page has switched
            assertEquals(i + " page content", getCurrentPageContent(page, i));
        }

        checkFirstPageButtons(page, firstScrollerId, secondScrollerId);
    }

    @Test
    @Ignore // broke with the jQuery 1.6.2 upgrade
    public void testOutDataScrollerDigitalButtons() throws Exception {
        HtmlPage page = environment.getPage("/test.jsf");
        String firstScrollerId = "scroller1";

        // dataScroller inside dataTable 'footer' facet
        String secondScrollerId = "richTable:scroller2";

        for (int i = 2; i <= 5; i++) {
            HtmlElement currentDigital1 = getDigitalButton(page, firstScrollerId, i);
            currentDigital1.click();

            currentDigital1 = getDigitalButton(page, firstScrollerId, i);
            assertEquals("span", currentDigital1.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital1.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // if scroller inside dataTable has switched
            HtmlElement currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            assertEquals("span", currentDigital2.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital2.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // check if page has switched
            assertEquals(i + " page content", getCurrentPageContent(page, i));
        }

        checkLastPageButtons(page, firstScrollerId, secondScrollerId);

        // scroll back
        for (int i = 4; i >= 1; i--) {
            HtmlElement currentDigital1 = getDigitalButton(page, firstScrollerId, i);
            currentDigital1.click();

            currentDigital1 = getDigitalButton(page, firstScrollerId, i);
            assertEquals("span", currentDigital1.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital1.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // if scroller inside dataTable has switched
            HtmlElement currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            assertEquals("span", currentDigital2.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital2.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // check if page has switched
            assertEquals(i + " page content", getCurrentPageContent(page, i));
        }

        checkFirstPageButtons(page, firstScrollerId, secondScrollerId);
    }

    @Test
    @Ignore // broke with the jQuery 1.6.2 upgrade
    public void testInnerDataScrollerDigitalButtons() throws Exception {
        HtmlPage page = environment.getPage("/test.jsf");
        String firstScrollerId = "scroller1";

        // dataScroller inside dataTable 'footer' facet
        String secondScrollerId = "richTable:scroller2";

        for (int i = 2; i <= 5; i++) {
            HtmlElement currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            currentDigital2.click();

            currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            assertEquals("span", currentDigital2.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital2.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // if scroller outside dataTable has switched
            HtmlElement currentDigital1 = getDigitalButton(page, firstScrollerId, i);
            assertEquals("span", currentDigital1.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital1.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // check if page has switched
            assertEquals(i + " page content", getCurrentPageContent(page, i));
        }

        checkLastPageButtons(page, firstScrollerId, secondScrollerId);

        // scroll back
        for (int i = 4; i >= 1; i--) {
            HtmlElement currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            currentDigital2.click();

            currentDigital2 = getDigitalButton(page, secondScrollerId, i);
            assertEquals("span", currentDigital2.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital2.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // if scroller inside dataTable has switched
            HtmlElement currentDigital1 = getDigitalButton(page, firstScrollerId, i);
            assertEquals("span", currentDigital1.getNodeName());
            assertEquals("rf-ds-nmb-btn rf-ds-act", currentDigital1.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

            // check if page has switched
            assertEquals(i + " page content", getCurrentPageContent(page, i));
        }

        checkFirstPageButtons(page, firstScrollerId, secondScrollerId);
    }

    @After
    public void tearDown() {
        environment.release();
        environment = null;
    }

    private void checkFirstPageButtons(HtmlPage page, String firstScrollerId, String secondScrollerId) throws Exception {
        HtmlElement fastForward = getFastForwardButton(page, firstScrollerId);
        HtmlElement last = getLastButton(page, firstScrollerId);
        HtmlElement next = getNextButton(page, firstScrollerId);

        // check right buttons
        assertEquals("a", fastForward.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-fastfwd", fastForward.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("a", last.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-last", last.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("a", next.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-next", next.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        fastForward = getFastForwardButton(page, secondScrollerId);
        last = getLastButton(page, secondScrollerId);
        next = getNextButton(page, secondScrollerId);

        assertEquals("a", fastForward.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-fastfwd", fastForward.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("a", last.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-last", last.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("a", next.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-next", next.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        // check if left buttons is disabled
        HtmlElement fastRewind = getFastRewindButton(page, firstScrollerId);
        HtmlElement first = getFirstButton(page, firstScrollerId);
        HtmlElement previous = getPreviousButton(page, firstScrollerId);

        assertEquals("span", fastRewind.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-fastrwd rf-ds-dis", fastRewind.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("span", first.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-first rf-ds-dis", first.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("span", previous.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-prev rf-ds-dis", previous.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        fastRewind = getFastRewindButton(page, secondScrollerId);
        first = getFirstButton(page, secondScrollerId);
        next = getNextButton(page, secondScrollerId);

        assertEquals("span", fastRewind.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-fastrwd rf-ds-dis", fastRewind.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("span", first.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-first rf-ds-dis", first.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("span", previous.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-prev rf-ds-dis", previous.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());
    }

    private void checkLastPageButtons(HtmlPage page, String firstScrollerId, String secondScrollerId) throws Exception {
        // check if right buttons is disabled
        HtmlElement fastForward = getFastForwardButton(page, firstScrollerId);
        HtmlElement last = getLastButton(page, firstScrollerId);
        HtmlElement next = getNextButton(page, firstScrollerId);

        assertEquals("span", fastForward.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-fastfwd rf-ds-dis", fastForward.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("span", last.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-last rf-ds-dis", last.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("span", next.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-next rf-ds-dis", next.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        fastForward = getFastForwardButton(page, secondScrollerId);
        last = getFastForwardButton(page, secondScrollerId);
        next = getNextButton(page, secondScrollerId);

        assertEquals("span", fastForward.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-fastfwd rf-ds-dis", fastForward.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("span", last.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-fastfwd rf-ds-dis", last.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("span", next.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-next rf-ds-dis", next.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        // check if left buttons is enabled
        HtmlElement fastRewind = getFastRewindButton(page, firstScrollerId);
        HtmlElement first = getFirstButton(page, firstScrollerId);
        HtmlElement previous = getPreviousButton(page, firstScrollerId);

        assertEquals("a", fastRewind.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-fastrwd", fastRewind.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("a", first.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-first", first.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("a", previous.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-prev", previous.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        fastRewind = getFastRewindButton(page, secondScrollerId);
        first = getFirstButton(page, secondScrollerId);
        previous = getPreviousButton(page, secondScrollerId);

        assertEquals("a", fastRewind.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-fastrwd", fastRewind.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("a", first.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-first", first.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());

        assertEquals("a", previous.getNodeName());
        assertEquals("rf-ds-btn rf-ds-btn-prev", previous.getAttribute(HtmlConstants.CLASS_ATTRIBUTE).trim());
    }

    private String getCurrentPageContent(HtmlPage page, int i) throws Exception {
        HtmlElement content = page.getFirstByXPath("//*[@id = 'form:richTable:" + (--i) + ":pageContent']");
        DomNode text = content.getFirstChild();
        assertEquals(DomNode.TEXT_NODE, text.getNodeType());
        return text.getNodeValue();
    }

    private HtmlElement getPreviousButton(HtmlPage page, String scrollerId) {
        return page.getFirstByXPath("//*[@id = 'form:" + scrollerId + "_ds_prev']");
    }

    private HtmlElement getNextButton(HtmlPage page, String scrollerId) {
        return page.getFirstByXPath("//*[@id = 'form:" + scrollerId + "_ds_next']");
    }

    private HtmlElement getFastRewindButton(HtmlPage page, String scrollerId) {
        return page.getFirstByXPath("//*[@id = 'form:" + scrollerId + "_ds_fr']");
    }

    private HtmlElement getFirstButton(HtmlPage page, String scrollerId) {
        return page.getFirstByXPath("//*[@id = 'form:" + scrollerId + "_ds_f']");
    }

    private HtmlElement getFastForwardButton(HtmlPage page, String scrollerId) {
        return page.getFirstByXPath("//*[@id = 'form:" + scrollerId + "_ds_ff']");
    }

    private HtmlElement getLastButton(HtmlPage page, String scrollerId) {
        return page.getFirstByXPath("//*[@id = 'form:" + scrollerId + "_ds_l']");
    }

    private HtmlElement getDigitalButton(HtmlPage page, String scrollerId, int i) {
        return page.getFirstByXPath("//*[@id = 'form:" + scrollerId + "_ds_" + i + "']");
    }
}
