// Path: src/main/java/com/outbrain/selenium/extjs/core/locators/ComponentLocator.java
// public abstract class ComponentLocator {
// 
//   /**
//    * Field sel.
//    */
//   private final Selenium selenium;
//   /**
//    * Field xtype.
//    */
//   private Xtype xtype;
//   /**
//    * Field textOrLable.
//    */
//   private String textOrLable;
// 
//   /**
//    * Method getComponentId.
//   
//    * @return String */
//   public abstract String getComponentId();
// 
//   /**
//    * Constructor for ComponentLocator.
//    * @param sel Selenium
//    * @param textOrLable String
//    * @param xtype Xtype
//    */
//   public ComponentLocator(final Selenium sel, final String textOrLable, final Xtype xtype) {
//     selenium = sel;
//     this.xtype = xtype;
//     setTextOrLable(textOrLable);
//   }
// 
//   /**
//    * Constructor for ComponentLocator.
//    * @param sel Selenium
//    * @param xtype Xtype
//    */
//   public ComponentLocator(final Selenium sel, final Xtype xtype) {
//     selenium = sel;
//     this.xtype = xtype;
//   }
// 
//   /**
//    * Constructor for ComponentLocator.
//    * @param sel Selenium
//    */
//   public ComponentLocator(final Selenium sel) {
//     selenium = sel;
// 
//   }
// 
//   /**
//    * Method getSelenium.
//   
//    * @return Selenium */
//   public Selenium getSelenium() {
//     return selenium;
//   }
// 
//   /**
//    * Method getXtype.  
//    * @return Xtype */
//   protected Xtype getXtype() {
//     return xtype;
//   }
// 
//   /**
//    * Method getTextOrLable.  
//    * @return String */
//   public String getTextOrLable() {
//     return textOrLable;
//   }
// 
//   /**
//    * Method setTextOrLable.
//    * @param textOrLable String
//    */
//   public void setTextOrLable(final String textOrLable) {
//     this.textOrLable = textOrLable;
//   }
// 
//   /**
//    * Method waitCmpNotNull.
//    * @param fullExpr String
//    * @return String */
//   protected String waitCmpNotNull(final String fullExpr) {
//     for (int second = 0;; second++) {
//       if (second >= 5) {
//         throw new RuntimeException("Timeout");
//       }
// 
//       try {
//         String componentId = null;
//         componentId = getSelenium().getEval(fullExpr);
//         if (!"null".equals(componentId)) {
//           return componentId;
//         }
//       } catch (final Exception e) {
//         // ignore
//       }
// 
//       try {
//         Thread.sleep(1000);
//       } catch (final InterruptedException e) {
//         // ignore
//       }
//     }
//   }
// }


import com.outbrain.selenium.extjs.core.locators.ComponentLocator;

package com.outbrain.selenium.extjs.components;


/**
 * @author Asaf Levy
 * @version $Revision: 1.0
 */
public class Field extends Component {

  /**
   * Constructor for Field.
   * @param locator ComponentLocator
   */
  public Field(final ComponentLocator locator) {
    super(locator);

  }

  /**
   * Method resetValue.
   */
  public void resetValue() {
    evalTrue(".setValue( '' )");
  }

  /**
   * Method getErrorText.
  
   * @return String */
  public String getErrorText() {
    return selenium.getText(getXPath() + "/../..//div[@class='x-form-invalid-msg']");
  }

  /**
   * Sets a data value into the field and validates it. To set the value directly without validation 
   * @param value
  
   * @return String */
  public String setValue(final String value) {
    return getEval(String.format(".setValue('%s')", value));
  }

  /**
   * Resets the current field value to the originally-loaded value and clears any validation messages
   */
  public void reset() {
    getEval(".reset()");
  }

  /**
   * Method type.
   * @param text String
   */
  public void type(final String text) {
    waitToLoad();

    focus();
    selenium.type(getComponentId(), text);
    blur();
  }

  /**
   * Method hasErrorText.
   * @param err String
  
   * @return boolean */
  public boolean hasErrorText(final String err) {
    final String text = getErrorText();

    return err.equals(text);
  }

  /**
   * return the value of component
  
   * @return String - theValue */
  public String getValue() {

// Path: src/main/java/com/outbrain/selenium/extjs/core/locators/ComponentLocator.java
// public abstract class ComponentLocator {
// 
//   /**
//    * Field sel.
//    */
//   private final Selenium selenium;
//   /**
//    * Field xtype.
//    */
//   private Xtype xtype;
//   /**
//    * Field textOrLable.
//    */
//   private String textOrLable;
// 
//   /**
//    * Method getComponentId.
//   
//    * @return String */
//   public abstract String getComponentId();
// 
//   /**
//    * Constructor for ComponentLocator.
//    * @param sel Selenium
//    * @param textOrLable String
//    * @param xtype Xtype
//    */
//   public ComponentLocator(final Selenium sel, final String textOrLable, final Xtype xtype) {
//     selenium = sel;
//     this.xtype = xtype;
//     setTextOrLable(textOrLable);
//   }
// 
//   /**
//    * Constructor for ComponentLocator.
//    * @param sel Selenium
//    * @param xtype Xtype
//    */
//   public ComponentLocator(final Selenium sel, final Xtype xtype) {
//     selenium = sel;
//     this.xtype = xtype;
//   }
// 
//   /**
//    * Constructor for ComponentLocator.
//    * @param sel Selenium
//    */
//   public ComponentLocator(final Selenium sel) {
//     selenium = sel;
// 
//   }
// 
//   /**
//    * Method getSelenium.
//   
//    * @return Selenium */
//   public Selenium getSelenium() {
//     return selenium;
//   }
// 
//   /**
//    * Method getXtype.  
//    * @return Xtype */
//   protected Xtype getXtype() {
//     return xtype;
//   }
// 
//   /**
//    * Method getTextOrLable.  
//    * @return String */
//   public String getTextOrLable() {
//     return textOrLable;
//   }
// 
//   /**
//    * Method setTextOrLable.
//    * @param textOrLable String
//    */
//   public void setTextOrLable(final String textOrLable) {
//     this.textOrLable = textOrLable;
//   }
// 
//   /**
//    * Method waitCmpNotNull.
//    * @param fullExpr String
//    * @return String */
//   protected String waitCmpNotNull(final String fullExpr) {
//     for (int second = 0;; second++) {
//       if (second >= 5) {
//         throw new RuntimeException("Timeout");
//       }
// 
//       try {
//         String componentId = null;
//         componentId = getSelenium().getEval(fullExpr);
//         if (!"null".equals(componentId)) {
//           return componentId;
//         }
//       } catch (final Exception e) {
//         // ignore
//       }
// 
//       try {
//         Thread.sleep(1000);
//       } catch (final InterruptedException e) {
//         // ignore
//       }
//     }
//   }
// }


// Path: src/main/java/com/outbrain/selenium/extjs/components/Field.java
import com.outbrain.selenium.extjs.core.locators.ComponentLocator;

package com.outbrain.selenium.extjs.components;


/**
 * @author Asaf Levy
 * @version $Revision: 1.0
 */
public class Field extends Component {

  /**
   * Constructor for Field.
   * @param locator ComponentLocator
   */
  public Field(final ComponentLocator locator) {
    super(locator);

  }

  /**
   * Method resetValue.
   */
  public void resetValue() {
    evalTrue(".setValue( '' )");
  }

  /**
   * Method getErrorText.
  
   * @return String */
  public String getErrorText() {
    return selenium.getText(getXPath() + "/../..//div[@class='x-form-invalid-msg']");
  }

  /**
   * Sets a data value into the field and validates it. To set the value directly without validation 
   * @param value
  
   * @return String */
  public String setValue(final String value) {
    return getEval(String.format(".setValue('%s')", value));
  }

  /**
   * Resets the current field value to the originally-loaded value and clears any validation messages
   */
  public void reset() {
    getEval(".reset()");
  }

  /**
   * Method type.
   * @param text String
   */
  public void type(final String text) {
    waitToLoad();

    focus();
    selenium.type(getComponentId(), text);
    blur();
  }

  /**
   * Method hasErrorText.
   * @param err String
  
   * @return boolean */
  public boolean hasErrorText(final String err) {
    final String text = getErrorText();

    return err.equals(text);
  }

  /**
   * return the value of component
  
   * @return String - theValue */
  public String getValue() {

    return getEval(".getValue()");
