/*
 *   Licensed to the Apache Software Foundation (ASF) under one
 *   or more contributor license agreements.  See the NOTICE file
 *   distributed with this work for additional information
 *   regarding copyright ownership.  The ASF licenses this file
 *   to you under the Apache License, Version 2.0 (the
 *   "License"); you may not use this file except in compliance
 *   with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing,
 *   software distributed under the License is distributed on an
 *   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 *   KIND, either express or implied.  See the License for the
 *   specific language governing permissions and limitations
 *   under the License.
 *
 */

package org.apache.directory.fortress.web.integration;

import java.io.File;
import java.util.List;
import java.util.concurrent.TimeUnit;

import io.github.bonigarcia.wdm.ChromeDriverManager;
import io.github.bonigarcia.wdm.MarionetteDriverManager;
import org.apache.commons.lang.StringUtils;
import org.apache.directory.fortress.core.util.Config;
import org.apache.log4j.Logger;
import org.junit.*;
import static org.junit.Assert.*;

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.remote.LocalFileDetector;
import org.apache.directory.fortress.web.common.GlobalIds;

/**
 * This class uses apache selenium firefox or chrome driver for running fortress-web automated tests.
 * <p>
 <ol>
 <li>Firefox: mvn test -Dtest=FortressWebSeleniumITCase</li>
 <li>Chrome:  mvn test -Dtest=FortressWebSeleniumITCase -Dweb.driver=chrome</li>
 </ol>
 *
 * @author <a href="mailto:dev@directory.apache.org">Apache Directory Project</a>
 */
public class FortressWebSeleniumITCase
{
    public static final String ROLES = "ROLES";
    public static final String POBJS = "POBJS";
    public static final String PERMS = "PERMS";
    public static final String SSDS = "SSDS";
    public static final String DSDS = "DSDS";
    public static final String OUSERS = "OUSERS";
    public static final String OUPRMS = "OUPRMS";
    public static final String ADMRLES = "ADMRLES";
    public static final String ADMOBJS = "ADMOBJS";
    public static final String ADMPERMS = "ADMPERMS";
    public static final String PLCYS = "PLCYS";
    public static final String GROUPS = "GROUPS";
    public static final String BINDS = "BINDS";
    public static final String AUTHZ = "AUTHZ";
    public static final String MODS = "MODS";
    public static final String FORTRESS_WEB = "/fortress-web";
    private static final String DRIVER_SYS_PROP = "web.driver";
    private WebDriver driver;
    private String baseUrl;
    private boolean acceptNextAlert = true;

    private enum DriverType
    {
        FIREFOX,
        CHROME
    }

    private static DriverType driverType = DriverType.FIREFOX;
    private StringBuffer verificationErrors = new StringBuffer();
    private static final Logger log = Logger.getLogger( FortressWebSeleniumITCase.class.getName() );

    @Before
    public void setUp() throws Exception
    {
        // http default:
        baseUrl = "http://localhost:8080";
        //baseUrl = "http://10.71.6.75:8080";

        //baseUrl = "http://fortressdemo2.com:8080";

        // https:
        //baseUrl = "https://localhost:8443";
        //baseUrl = "https://NY1SCOLFTDEMO01:8443";

        driver.manage().timeouts().implicitlyWait( 5, TimeUnit.SECONDS );
    }

    @BeforeClass
    public static void setupClass()
    {
        String szDriverType = System.getProperty( DRIVER_SYS_PROP );
        if( StringUtils.isNotEmpty( szDriverType ) && szDriverType.equalsIgnoreCase( DriverType.CHROME.toString() ))
        {
            driverType = DriverType.CHROME;
            ChromeDriverManager.getInstance().setup();
        }
        else
        {
            driverType = DriverType.FIREFOX;
            MarionetteDriverManager.getInstance().setup();
        }
    }

    @Before
    public void setupTest()
    {
        if ( driverType.equals( DriverType.CHROME ) )
        {
            driver = new ChromeDriver( );
        }
        else
        {
            driver = new FirefoxDriver( );
        }
        driver.manage().window().maximize();
    }

    @After
    public void teardown()
    {
        if (driver != null)
        {
            driver.quit();
        }
    }

    @Test
    public void testCase1() throws Exception
    {
        log.info( "Begin FortressWebSeleniumITCase 1" );
        driver.get( baseUrl + FORTRESS_WEB );
        login( "test", "password" );
        TUtils.sleep( 1 );

        // zoom out:
        WebElement html = driver.findElement(By.tagName("html"));
        html.sendKeys( Keys.chord( Keys.CONTROL, Keys.SUBTRACT ) );

        boolean skipFirstHalf = false;
        //boolean skipFirstHalf = true;
        boolean skipSecondHalf = false;
        //boolean skipSecondHalf = true;

        if ( !skipFirstHalf )
        {
            users();
            roles();
            pobjs();
            perms();
            ssds();
            dsds();
            ouusers();
            ouperms();
        }

        if ( !skipSecondHalf )
        {
            admrles();
            admobjs();
            admperms();
            plcys();
            groups();

            if( Config.getInstance().isOpenldap())
            {
               binds();
               authzs();
               mods();
            }
        }

        /*****
         *  LOGOUT
         */
        driver.findElement( By.linkText( "LOGOUT" ) ).click();
        log.info( "End FortressWebSeleniumITCase" );
        //driver.findElement( By.linkText( "glob:search*" ) ).click();
    }


    @Test
    public void testCase2() throws Exception
    {
        log.info( "Begin FortressWebSeleniumITCase 2" );
        driver.get( baseUrl + FORTRESS_WEB );
        login( "test1", "password" );
        TUtils.sleep( 1 );
        doNegativeLinkTest( ROLES, "RolePage", "test1" );
        doNegativeLinkTest( POBJS, "ObjectPage", "test1" );
        doNegativeLinkTest( PERMS, "PermPage", "test1" );
        doNegativeLinkTest( SSDS, "SdStaticPage", "test1" );
        doNegativeLinkTest( DSDS, "SdDynamicPage", "test1" );
        doNegativeLinkTest( OUSERS, "OuUserPage", "test1" );
        doNegativeLinkTest( OUPRMS, "OuPermPage", "test1" );
        doNegativeLinkTest( ADMRLES, "RoleAdminPage", "test1" );
        doNegativeLinkTest( ADMOBJS, "ObjectAdminPage", "test1" );
    }

    private void login( String userId, String password )
    {
        driver.findElement( By.id( GlobalIds.USER_ID ) ).clear();
        driver.findElement( By.id( GlobalIds.USER_ID ) ).sendKeys( userId );
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.PASSWORD ) ).clear();
        driver.findElement( By.id( GlobalIds.PASSWORD ) ).sendKeys( password );
        TUtils.sleep( 1 );
        driver.findElement( By.name( GlobalIds.LOGIN ) ).click();
    }

    private void users()
    {
        String TEST_ROLE_NAME = "T15ROLE1";
        String TEST_ADMIN_ROLE_NAME = "T3AdmRle1";

        /*****
         *  USERS_PAGE TESTS
         */
        driver.findElement( By.linkText( "USERS" ) ).click();
        //driver.findElement( By.id( "roleRb" ) ).click();
        driver.findElement( By.id( "roleAssignLinkLbl" ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( ">" ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.name( "userformsearchfields:" + GlobalIds.SEARCH ) ).click();
        driver.findElement( By.id( GlobalIds.FIELD_1 ) ).clear();
        driver.findElement( By.id( GlobalIds.FIELD_1 ) ).sendKeys( "dev1" );
        driver.findElement( By.id( "ouAssignLinkLbl" ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.name( "userformsearchfields:" + GlobalIds.SEARCH ) ).click();
        TUtils.sleep( 1 );
        WebElement table = driver.findElement(By.id("usertreegrid"));
        List<WebElement> allRows = table.findElements(By.tagName("tr"));
        allRows.get( 4 ).findElement(By.className("imxt-cell")).click();
        TUtils.sleep( 1 );
        allRows.get( 5 ).findElement(By.className("imxt-cell")).click();
        TUtils.sleep( 1 );
        allRows.get( 6 ).findElement(By.className("imxt-cell")).click();
        TUtils.sleep( 1 );
        driver.findElement( By.name( GlobalIds.CLEAR ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.USER_ID ) ).sendKeys( "selTestU1" );
        driver.findElement( By.id( GlobalIds.PASSWORD ) ).clear();
        driver.findElement( By.id( GlobalIds.PASSWORD ) ).sendKeys( "password" );
        driver.findElement( By.id( GlobalIds.OU ) ).clear();
        driver.findElement( By.id( GlobalIds.OU ) ).sendKeys( "dev1" );
        driver.findElement( By.name( GlobalIds.OU_SEARCH ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        TUtils.sleep( 1 );
        /*
        TODO: FIX ME:
                driver.findElement( By.name( GlobalIds.POLICY_SEARCH ) ).click();
                TUtils.sleep( 2 );
                driver.findElement( By.linkText( ">" ) ).click();
                TUtils.sleep( 1 );
                driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
                TUtils.sleep( 1 );
        */
        driver.findElement( By.name( GlobalIds.ADD ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.ROLE_ASSIGNMENTS_LABEL ) ).click();
        //( ( JavascriptExecutor ) driver ).executeScript( "$(document.getElementById('roles')).val('role1');" );
        driver.findElement( By.id( GlobalIds.ASSIGN_NEW_ROLE ) ).sendKeys( TEST_ROLE_NAME );
        driver.findElement( By.id( GlobalIds.BEGIN_TIME_RC ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_TIME_RC ) ).sendKeys( "8:00 AM" );
        driver.findElement( By.id( GlobalIds.END_TIME_RC ) ).clear();
        driver.findElement( By.id( GlobalIds.END_TIME_RC ) ).sendKeys( "5:00 PM" );
        driver.findElement( By.id( GlobalIds.BEGIN_DATE_RC ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_DATE_RC ) ).sendKeys( "1/1/2013" );
        driver.findElement( By.id( GlobalIds.END_DATE_RC ) ).clear();
        driver.findElement( By.id( GlobalIds.END_DATE_RC ) ).sendKeys( "1/1/2099" );
        driver.findElement( By.id( GlobalIds.BEGIN_LOCK_DATE_RC ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_LOCK_DATE_RC ) ).sendKeys( "6/1/2013" );
        driver.findElement( By.id( GlobalIds.END_LOCK_DATE_RC ) ).clear();
        driver.findElement( By.id( GlobalIds.END_LOCK_DATE_RC ) ).sendKeys( "6/15/2013" );
        driver.findElement( By.id( GlobalIds.TIMEOUT_RC ) ).clear();
        driver.findElement( By.id( GlobalIds.TIMEOUT_RC ) ).sendKeys( "120" );
        driver.findElement( By.id( GlobalIds.SUNDAY_RC ) ).click();
        driver.findElement( By.id( GlobalIds.MONDAY_RC ) ).click();
        driver.findElement( By.id( GlobalIds.TUESDAY_RC ) ).click();
        driver.findElement( By.id( GlobalIds.WEDNESDAY_RC ) ).click();
        driver.findElement( By.id( GlobalIds.THURSDAY_RC ) ).click();
        driver.findElement( By.id( GlobalIds.FRIDAY_RC ) ).click();
        driver.findElement( By.id( GlobalIds.SATURDAY_RC ) ).click();
        driver.findElement( By.name( GlobalIds.ASSIGN ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.ROLE_ASSIGNMENTS_LABEL ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.ASSIGN_NEW_ROLE ) ).clear();
        TUtils.sleep( 2 );
        driver.findElement( By.name( GlobalIds.ROLES_SEARCH ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.linkText( "3" ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.name( GlobalIds.ASSIGN ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.id( "adminRoleAssignmentsLabel" ) ).click();
            /*
                    if(driver.findElement( By.name( "adminRoles" ) ).isDisplayed())
                    {
                        System.out.println("adminRoles is displayed!!!");
                    }
                    else
                    {
                        System.out.println("adminRoles is NOT displayed!!!");
                    }
            */
        //( ( JavascriptExecutor ) driver ).executeScript( "$(document.getElementById('adminRoles')).val" +
        //    "('DemoAdminUsers');" );
        driver.findElement( By.id( GlobalIds.ASSIGN_NEW_ADMIN_ROLE ) ).sendKeys( TEST_ADMIN_ROLE_NAME );
        driver.findElement( By.id( GlobalIds.BEGIN_TIME_ARC ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_TIME_ARC ) ).sendKeys( "8:00 AM" );
        driver.findElement( By.id( GlobalIds.END_TIME_ARC ) ).clear();
        driver.findElement( By.id( GlobalIds.END_TIME_ARC ) ).sendKeys( "5:00 PM" );
        driver.findElement( By.id( GlobalIds.BEGIN_DATE_ARC ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_DATE_ARC ) ).sendKeys( "1/1/2013" );
        driver.findElement( By.id( GlobalIds.END_DATE_ARC ) ).clear();
        driver.findElement( By.id( GlobalIds.END_DATE_ARC ) ).sendKeys( "1/1/2099" );
        driver.findElement( By.id( GlobalIds.BEGIN_LOCK_DATE_ARC ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_LOCK_DATE_ARC ) ).sendKeys( "6/1/2013" );
        driver.findElement( By.id( GlobalIds.END_LOCK_DATE_ARC ) ).clear();
        driver.findElement( By.id( GlobalIds.END_LOCK_DATE_ARC ) ).sendKeys( "6/15/2013" );
        driver.findElement( By.id( GlobalIds.TIMEOUT_ARC ) ).clear();
        driver.findElement( By.id( GlobalIds.TIMEOUT_ARC ) ).sendKeys( "180" );
        driver.findElement( By.id( GlobalIds.MONDAY_ARC ) ).click();
        driver.findElement( By.id( GlobalIds.TUESDAY_ARC ) ).click();
        driver.findElement( By.id( GlobalIds.WEDNESDAY_ARC ) ).click();
        driver.findElement( By.id( GlobalIds.THURSDAY_ARC ) ).click();
        driver.findElement( By.id( GlobalIds.FRIDAY_ARC ) ).click();
        driver.findElement( By.name( GlobalIds.ASSIGN_ADMIN_ROLE ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.id( "adminRoleAssignmentsLabel" ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.name( "adminRoles.search" ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.linkText( ">" ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( ">" ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.name( GlobalIds.ASSIGN_ADMIN_ROLE ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.id( "contactInformationLabel" ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.DESCRIPTION ) ).clear();
        driver.findElement( By.id( GlobalIds.DESCRIPTION ) ).sendKeys( "Selenium Test User" );
        driver.findElement( By.id( GlobalIds.EMPLOYEE_TYPE ) ).clear();
        driver.findElement( By.id( GlobalIds.EMPLOYEE_TYPE ) ).sendKeys( "Test User" );
        driver.findElement( By.id( GlobalIds.TITLE ) ).clear();
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.TITLE ) ).sendKeys( "TestUser" );

        // TODO: Fixme.  The chrome driver.findElement( By.id(  ) ).sendKeys can't find focus....
        if( ! driverType.equals( DriverType.CHROME ) )
        {
            ( ( JavascriptExecutor ) driver ).executeScript( "$(document.getElementById('emails')).show();" );
            TUtils.sleep( 1 );
            driver.findElement( By.id( GlobalIds.EMAILS ) ).click();
            driver.findElement( By.id( GlobalIds.EMAILS ) ).clear();
            TUtils.sleep( 1 );
            driver.findElement( By.id( GlobalIds.EMAILS ) ).sendKeys( "joeuser@selenium.com" );
            TUtils.sleep( 1 );
            ( ( JavascriptExecutor ) driver ).executeScript( "$(document.getElementById('phones')).show();" );
            driver.findElement( By.id( GlobalIds.PHONES ) ).clear();
            TUtils.sleep( 1 );
            driver.findElement( By.id( GlobalIds.PHONES ) ).sendKeys( "555-555-5555" );
            ( ( JavascriptExecutor ) driver ).executeScript( "$(document.getElementById('mobiles')).show();" );
            driver.findElement( By.id( GlobalIds.MOBILES ) ).clear();
            driver.findElement( By.id( GlobalIds.MOBILES ) ).sendKeys( "222-222-2222" );
            driver.findElement( By.id( GlobalIds.ADDRESS_ASSIGNMENTS_LABEL ) ).click();
            TUtils.sleep( 1 );
            ( ( JavascriptExecutor ) driver ).executeScript( "$(document.getElementById('addresses')).show();" );
            driver.findElement( By.id( GlobalIds.ADDRESSES ) ).click();
            driver.findElement( By.id( GlobalIds.ADDRESSES ) ).clear();
            driver.findElement( By.id( GlobalIds.ADDRESSES ) ).sendKeys( "9 Manor Road" );
            driver.findElement( By.id( GlobalIds.ADDRESS_CITY ) ).clear();
            driver.findElement( By.id( GlobalIds.ADDRESS_CITY ) ).sendKeys( "Salina" );
            driver.findElement( By.id( GlobalIds.ADDRESS_STATE ) ).clear();
            driver.findElement( By.id( GlobalIds.ADDRESS_STATE ) ).sendKeys( "KS" );
            driver.findElement( By.id( GlobalIds.ADDRESS_COUNTRY ) ).clear();
            driver.findElement( By.id( GlobalIds.ADDRESS_COUNTRY ) ).sendKeys( "US" );
            driver.findElement( By.id( GlobalIds.ADDRESS_POSTAL_CODE ) ).clear();
            driver.findElement( By.id( GlobalIds.ADDRESS_POSTAL_CODE ) ).sendKeys( "67401" );
            driver.findElement( By.id( GlobalIds.ADDRESS_POST_OFFICE_BOX ) ).clear();
            driver.findElement( By.id( GlobalIds.ADDRESS_POST_OFFICE_BOX ) ).sendKeys( "422" );
            driver.findElement( By.id( GlobalIds.ADDRESS_BUILDING ) ).clear();
            driver.findElement( By.id( GlobalIds.ADDRESS_BUILDING ) ).sendKeys( "2929" );
            driver.findElement( By.id( GlobalIds.ADDRESS_DEPARTMENT_NUMBER ) ).clear();
            driver.findElement( By.id( GlobalIds.ADDRESS_DEPARTMENT_NUMBER ) ).sendKeys( "2222" );
            driver.findElement( By.id( GlobalIds.ADDRESS_ROOM_NUMBER ) ).clear();
            driver.findElement( By.id( GlobalIds.ADDRESS_ROOM_NUMBER ) ).sendKeys( "555" );
        }

        driver.findElement( By.id( GlobalIds.TEMPORAL_CONSTRAINTS_LABEL ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.BEGIN_TIME_P ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_TIME_P ) ).sendKeys( "8:00 AM" );
        driver.findElement( By.id( GlobalIds.END_TIME_P ) ).clear();
        driver.findElement( By.id( GlobalIds.END_TIME_P ) ).sendKeys( "5:00 PM" );
        driver.findElement( By.id( GlobalIds.BEGIN_DATE_P ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_DATE_P ) ).sendKeys( "1/1/2013" );
        driver.findElement( By.id( GlobalIds.END_DATE_P ) ).clear();
        driver.findElement( By.id( GlobalIds.END_DATE_P ) ).sendKeys( "1/1/2099" );
        driver.findElement( By.id( GlobalIds.BEGIN_LOCK_DATE_P ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_LOCK_DATE_P ) ).sendKeys( "6/1/2013" );
        driver.findElement( By.id( GlobalIds.END_LOCK_DATE_P ) ).clear();
        driver.findElement( By.id( GlobalIds.END_LOCK_DATE_P ) ).sendKeys( "6/15/2013" );
        driver.findElement( By.id( GlobalIds.TIMEOUT_P ) ).clear();
        driver.findElement( By.id( GlobalIds.TIMEOUT_P ) ).sendKeys( "0" );
        driver.findElement( By.id( GlobalIds.SUNDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.MONDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.TUESDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.WEDNESDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.THURSDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.FRIDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.SATURDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.SYSTEM_INFO_LABEL ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.SYSTEM ) ).click();
        driver.findElement( By.id( GlobalIds.CN ) ).clear();
        driver.findElement( By.id( GlobalIds.CN ) ).sendKeys( "Firstname Lastname" );
        driver.findElement( By.id( GlobalIds.SN ) ).clear();
        driver.findElement( By.id( GlobalIds.SN ) ).sendKeys( "Lastname" );
        driver.findElement( By.id( GlobalIds.IMPORT_PHOTO_LABEL ) ).click();
        TUtils.sleep( 1 );
        WebElement element = driver.findElement( By.name( "upload" ) );
        LocalFileDetector detector = new LocalFileDetector();
        String path = "./src/test/resources/p1.jpeg";
        File f = detector.getLocalFile( path );
        element.sendKeys( f.getAbsolutePath() );
        driver.findElement( By.name( GlobalIds.SAVE ) ).click();
        TUtils.sleep( 3 );
        driver.findElement( By.name( GlobalIds.COMMIT ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.IMPORT_PHOTO_LABEL ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.name( GlobalIds.DELETE ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.SYSTEM_INFO_LABEL ) ).click();
        driver.findElement( By.id( GlobalIds.SYSTEM ) ).click();
        driver.findElement( By.name( GlobalIds.COMMIT ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.name( GlobalIds.DELETE ) ).click();
        TUtils.sleep( 1 );
    }

    private void roles()
    {
        driver.findElement( By.linkText( ROLES ) ).click();
        driver.findElement( By.id( GlobalIds.SEARCH_VAL ) ).clear();
        driver.findElement( By.id( GlobalIds.SEARCH_VAL ) ).sendKeys( "oamt13" );
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        driver.findElement( By.id( GlobalIds.NAME ) ).clear();
        driver.findElement( By.id( GlobalIds.NAME ) ).sendKeys( "SelTestRole" );
        driver.findElement( By.id( GlobalIds.DESCRIPTION ) ).clear();
        driver.findElement( By.id( GlobalIds.DESCRIPTION ) ).sendKeys( "Selenium Test Role" );
        driver.findElement( By.name( GlobalIds.PARENTROLES_SEARCH ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.linkText( ">" ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( ">" ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.name( GlobalIds.ADD ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.TEMPORAL_CONSTRAINTS_LABEL ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.BEGIN_TIME_P ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_TIME_P ) ).sendKeys( "8:00 AM" );
        driver.findElement( By.id( GlobalIds.END_TIME_P ) ).clear();
        driver.findElement( By.id( GlobalIds.END_TIME_P ) ).sendKeys( "5:00 PM" );
        driver.findElement( By.id( GlobalIds.BEGIN_DATE_P ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_DATE_P ) ).sendKeys( "1/1/2013" );
        driver.findElement( By.id( GlobalIds.END_DATE_P ) ).clear();
        driver.findElement( By.id( GlobalIds.END_DATE_P ) ).sendKeys( "1/1/2099" );
        driver.findElement( By.id( GlobalIds.BEGIN_LOCK_DATE_P ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_LOCK_DATE_P ) ).sendKeys( "6/1/2013" );
        driver.findElement( By.id( GlobalIds.END_LOCK_DATE_P ) ).clear();
        driver.findElement( By.id( GlobalIds.END_LOCK_DATE_P ) ).sendKeys( "6/15/2013" );
        driver.findElement( By.id( GlobalIds.TIMEOUT_P ) ).clear();
        driver.findElement( By.id( GlobalIds.TIMEOUT_P ) ).sendKeys( "0" );
        driver.findElement( By.id( GlobalIds.SUNDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.MONDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.TUESDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.WEDNESDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.THURSDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.FRIDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.SATURDAY_P ) ).click();
        driver.findElement( By.name( GlobalIds.COMMIT ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.name( GlobalIds.DELETE ) ).click();
        TUtils.sleep( 1 );
    }

    private void pobjs()
    {
        driver.findElement( By.linkText( POBJS ) ).click();
        driver.findElement( By.id( GlobalIds.SEARCH_VAL ) ).sendKeys( "t" );
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        TUtils.sleep( 1 );
    }

    private void perms()
    {
        driver.findElement( By.linkText( PERMS ) ).click();
        driver.findElement( By.id( "permObject" ) ).sendKeys( "/cal" );
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        TUtils.sleep( 1 );
    }

    private void ssds()
    {
        driver.findElement( By.linkText( SSDS ) ).click();
        driver.findElement( By.id( "roleRb" ) ).click();
        driver.findElement( By.id( GlobalIds.SEARCH_VAL ) ).sendKeys( "oamT16SDR6" );
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        TUtils.sleep( 1 );
    }

    private void dsds()
    {
        driver.findElement( By.linkText( DSDS ) ).click();
        driver.findElement( By.id( "roleRb" ) ).click();
        driver.findElement( By.id( GlobalIds.SEARCH_VAL ) ).sendKeys( "oamT13DSD6" );
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        TUtils.sleep( 1 );
    }

    private void ouusers()
    {
        driver.findElement( By.linkText( OUSERS ) ).click();
        driver.findElement( By.id( GlobalIds.SEARCH_VAL ) ).sendKeys( "d" );
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        TUtils.sleep( 1 );
    }

    private void ouperms()
    {
        driver.findElement( By.linkText( OUPRMS ) ).click();
        driver.findElement( By.id( GlobalIds.SEARCH_VAL ) ).sendKeys( "a" );
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
    }

    private void admrles()
    {
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( ADMRLES ) ).click();
        driver.findElement( By.id( GlobalIds.SEARCH_VAL ) ).clear();
        driver.findElement( By.id( GlobalIds.SEARCH_VAL ) ).sendKeys( "t" );
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        driver.findElement( By.id( GlobalIds.NAME ) ).clear();
        driver.findElement( By.id( GlobalIds.NAME ) ).sendKeys( "SelTestAdminRole" );
        driver.findElement( By.id( GlobalIds.DESCRIPTION ) ).clear();
        driver.findElement( By.id( GlobalIds.DESCRIPTION ) ).sendKeys( "Selenium Test Admin Role" );
        driver.findElement( By.name( GlobalIds.PARENTROLES_SEARCH ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.linkText( ">" ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( ">" ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        TUtils.sleep( 2 );
        // DELEGATION DETAILS:
        driver.findElement( By.name( GlobalIds.ROLEAUXPANEL + ":" + GlobalIds.USEROU_SEARCH ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.name( GlobalIds.ROLEAUXPANEL + ":" + GlobalIds.PERMOU_SEARCH ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        driver.findElement( By.id( GlobalIds.BEGIN_RANGE ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_RANGE ) ).sendKeys( "oamT6D" );
        driver.findElement( By.name( GlobalIds.ROLEAUXPANEL + ":" + GlobalIds.BEGIN_RANGE_SEARCH ) ).click();
        TUtils.sleep( 1 );

        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        driver.findElement( By.name( GlobalIds.ROLEAUXPANEL + ":" + GlobalIds.BEGIN_INCLUSIVE ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.name( GlobalIds.ROLEAUXPANEL + ":" + GlobalIds.END_RANGE_SEARCH ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        driver.findElement( By.name( GlobalIds.ROLEAUXPANEL + ":" + GlobalIds.END_INCLUSIVE ) ).click();
        driver.findElement( By.name( GlobalIds.ADD ) ).click();
        TUtils.sleep( 2 );

        driver.findElement( By.id( GlobalIds.TEMPORAL_CONSTRAINTS_LABEL ) ).click();
        TUtils.sleep( 2 );
        driver.findElement( By.id( GlobalIds.BEGIN_TIME_P ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_TIME_P ) ).sendKeys( "8:00 AM" );
        driver.findElement( By.id( GlobalIds.END_TIME_P ) ).clear();
        driver.findElement( By.id( GlobalIds.END_TIME_P ) ).sendKeys( "5:00 PM" );
        driver.findElement( By.id( GlobalIds.BEGIN_DATE_P ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_DATE_P ) ).sendKeys( "1/1/2013" );
        driver.findElement( By.id( GlobalIds.END_DATE_P ) ).clear();
        driver.findElement( By.id( GlobalIds.END_DATE_P ) ).sendKeys( "1/1/2099" );
        driver.findElement( By.id( GlobalIds.BEGIN_LOCK_DATE_P ) ).clear();
        driver.findElement( By.id( GlobalIds.BEGIN_LOCK_DATE_P ) ).sendKeys( "6/1/2013" );
        driver.findElement( By.id( GlobalIds.END_LOCK_DATE_P ) ).clear();
        driver.findElement( By.id( GlobalIds.END_LOCK_DATE_P ) ).sendKeys( "6/15/2013" );
        driver.findElement( By.id( GlobalIds.TIMEOUT_P ) ).clear();
        driver.findElement( By.id( GlobalIds.TIMEOUT_P ) ).sendKeys( "0" );
        driver.findElement( By.id( GlobalIds.SUNDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.MONDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.TUESDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.WEDNESDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.THURSDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.FRIDAY_P ) ).click();
        driver.findElement( By.id( GlobalIds.SATURDAY_P ) ).click();
        driver.findElement( By.name( GlobalIds.COMMIT ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.name( GlobalIds.DELETE ) ).click();
        TUtils.sleep( 1 );
    }

    private void admobjs()
    {
        driver.findElement( By.linkText( ADMOBJS ) ).click();
        driver.findElement( By.id( GlobalIds.SEARCH_VAL ) ).sendKeys( "u" );
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        TUtils.sleep( 1 );
    }

    private void admperms()
    {
        driver.findElement( By.linkText( ADMPERMS ) ).click();
        driver.findElement( By.id( "objectAssignLinkLbl" ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        TUtils.sleep( 1 );
    }

    private void plcys()
    {
        driver.findElement( By.linkText( PLCYS ) ).click();
        driver.findElement( By.id( GlobalIds.SEARCH_VAL ) ).sendKeys( "oamTP1" );
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        TUtils.sleep( 1 );
    }

    private void groups()
    {
        driver.findElement( By.linkText( GROUPS ) ).click();
        driver.findElement( By.id( "searchVal" ) ).sendKeys( "t" );
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        TUtils.sleep( 1 );
        TUtils.sleep( 1 );
        WebElement table = driver.findElement(By.id("grouptreegrid"));
        List<WebElement> allRows = table.findElements(By.tagName("tr"));
        allRows.get( 4 ).findElement(By.className("imxt-cell")).click();
        TUtils.sleep( 1 );
        allRows.get( 5 ).findElement(By.className("imxt-cell")).click();
        TUtils.sleep( 1 );
        allRows.get( 6 ).findElement(By.className("imxt-cell")).click();
        TUtils.sleep( 1 );
        driver.findElement( By.name( GlobalIds.CLEAR ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.id( GlobalIds.NAME ) ).sendKeys( "selGroup1" );
        driver.findElement( By.id( GlobalIds.DESCRIPTION ) ).clear();
        driver.findElement( By.id( GlobalIds.DESCRIPTION ) ).sendKeys( "Selenium Test Create Group Node" );
        driver.findElement( By.id( "protocol" ) ).clear();
        driver.findElement( By.id( "protocol" ) ).sendKeys( "test" );
        driver.findElement( By.name( "memberProps_input" ) ).clear();
        driver.findElement( By.name( "memberProps_input" ) ).sendKeys( "testKey1=testVal1" );

        driver.findElement( By.name( "members.search" ) ).click();
        TUtils.sleep( 2 );
        //driver.findElement( By.className( "next" ) ).click();
        driver.findElement( By.linkText( "5" ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        TUtils.sleep( 1 );
        driver.findElement( By.name( GlobalIds.ADD ) ).click();
        TUtils.sleep( 1 );
    }

    private void binds()
    {
        driver.findElement( By.linkText( BINDS ) ).click();
        driver.findElement( By.id( GlobalIds.USER_ID ) ).clear();
        driver.findElement( By.id( GlobalIds.USER_ID ) ).sendKeys( "jtsuser1" );
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        TUtils.sleep( 1 );
        WebElement table = driver.findElement(By.id("bindtreegrid"));
        // Now get all the TR elements from the table
        List<WebElement> allRows = table.findElements(By.tagName("tr"));
        // And iterate over them, getting the cells
        allRows.get( 4 ).findElement(By.className("imxt-cell")).click();
        TUtils.sleep( 1 );
        allRows.get( 5 ).findElement(By.className("imxt-cell")).click();
        TUtils.sleep( 1 );
        allRows.get( 6 ).findElement(By.className("imxt-cell")).click();
        TUtils.sleep( 1 );
    }

    private void authzs()
    {
        driver.findElement( By.linkText( AUTHZ ) ).click();
        driver.findElement( By.id( GlobalIds.OBJ_NAME ) ).clear();
        driver.findElement( By.id( GlobalIds.OBJ_NAME ) ).sendKeys( "org.apache.directory.fortress.core.impl.AdminMgrImpl" );
        driver.findElement( By.name( "admin" ) ).click();
        driver.findElement( By.id( "permLinkLbl" ) ).click();
        TUtils.sleep( 1 );
        //driver.findElement( By.linkText( "6" ) ).click();
        driver.findElement( By.linkText( GlobalIds.SELECT ) ).click();
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        TUtils.sleep( 1 );
        WebElement table = driver.findElement(By.id("authztreegrid"));
        // Now get all the TR elements from the table
        List<WebElement> allRows = table.findElements(By.tagName("tr"));
        // And iterate over them, getting the cells
        allRows.get( 4 ).findElement(By.className("imxt-cell")).click();
        TUtils.sleep( 1 );
        allRows.get( 5 ).findElement(By.className("imxt-cell")).click();
        TUtils.sleep( 1 );
        allRows.get( 6 ).findElement(By.className("imxt-cell")).click();
        TUtils.sleep( 1 );
    }

    private void mods()
    {
        driver.findElement( By.linkText( MODS ) ).click();
        driver.findElement( By.id( GlobalIds.USER_ID ) ).clear();
        driver.findElement( By.id( GlobalIds.USER_ID ) ).sendKeys( "test" );
        driver.findElement( By.name( GlobalIds.SEARCH ) ).click();
        TUtils.sleep( 5 );
        WebElement table = driver.findElement(By.id("modtreegrid"));
        // Now get all the TR elements from the table
        List<WebElement> allRows = table.findElements(By.tagName("tr"));
        // And iterate over them, getting the cells
        allRows.get( 5 ).findElement(By.className("imxt-cell")).click();
    }

    private void nextPage(String szTableName)
    {
        WebElement table = driver.findElement( By.id( szTableName ) );
        List<WebElement> allRows = table.findElements( By.tagName( "a" ) );
        for (WebElement row : allRows)
        {
            String szText = row.getText();
            if(szText.equals( "Go to the next page" ))
                row.click();
            log.debug( "row text=" + row.getText());
        }
    }

    @After
    public void tearDown() throws Exception
    {
        driver.quit();
        String verificationErrorString = verificationErrors.toString();
        if ( !"".equals( verificationErrorString ) )
        {
            fail( verificationErrorString );
        }
    }

    private boolean isElementPresent( By by )
    {
        try
        {
            driver.findElement( by );
            return true;
        }
        catch ( NoSuchElementException e )
        {
            return false;
        }
    }

    private boolean isAlertPresent()
    {
        try
        {
            driver.switchTo().alert();
            return true;
        }
        catch ( NoAlertPresentException e )
        {
            return false;
        }
    }

    private String closeAlertAndGetItsText()
    {
        try
        {
            Alert alert = driver.switchTo().alert();
            String alertText = alert.getText();
            if ( acceptNextAlert )
            {
                alert.accept();
            }
            else
            {
                alert.dismiss();
            }
            return alertText;
        }
        finally
        {
            acceptNextAlert = true;
        }
    }

    private void doNegativeLinkTest( String linkName, String pageName, String userId)
    {
        log.info("Negative link:" + linkName + " test for " + userId);
        try
        {
            if(driver.findElement( By.linkText( linkName ) ).isEnabled())
            {
                fail("Negative Link Test Failed UserId: " + userId + " Link: " + linkName);
            }
            fail("Negative Button Test Failed UserId: " + userId + " Link: " + linkName);
        }
        catch (org.openqa.selenium.NoSuchElementException e)
        {
            // pass
        }
        try
        {
            if(driver.findElement( By.linkText( linkName ) ).isEnabled())
            {
                fail("Negative Link Test Failed UserId: " + userId + " Link: " + linkName);
            }
        }
        catch (org.openqa.selenium.NoSuchElementException e)
        {
            // pass
        }

        // Check that Spring security is enforcing page level security:
        String unauthorizedUrl = baseUrl + FORTRESS_WEB + "/wicket/bookmarkable/org.apache.directory.fortress.web." + pageName;
        driver.get( unauthorizedUrl );
        if(is403())
        {
            // pass
            TUtils.sleep( 1 );
            driver.navigate().back();
        }
        else
        {
            fail("Spring Security Test Failed URL: " + unauthorizedUrl + "." + GlobalIds.ADD);
        }
    }

    private boolean is403()
    {
        try
        {
            driver.findElement(By.id("web_403"));
            return true;
        }
        catch (NoSuchElementException e)
        {
            return false;
        }
    }
}
