package com.abmash.core.jquery;
import java.awt.Color;
import java.util.ArrayList;
import java.util.Arrays;
import org.apache.commons.lang.StringUtils;
import org.json.JSONException;
import com.abmash.REMOVE.core.htmlquery.condition.ColorCondition;
import com.abmash.core.jquery.command.*;
import com.abmash.core.jquery.command.FilterCSSCommand.CSSAttributeComparator;
import com.abmash.core.query.ColorOptions;
import com.abmash.core.query.DirectionOptions;
import com.abmash.core.query.DirectionType;
import com.abmash.core.query.predicate.Predicate;
import com.abmash.core.query.predicate.Predicates;
public class JQuery {
public enum StringMatcher {
EXACT, WORD, STARTSWITH, ENDSWITH, CONTAINS, EXISTS
}
ArrayList<Command> commands = new ArrayList<Command>();
String selector;
Double weight;
public JQuery(String selector, Double weight) {
this.selector = selector != null && !selector.equals("") ? selector : "'*:not(html,head,head *)'";
this.weight = weight != null ? weight : 1;
}
public JQuery addCommand(Command command) {
commands.add(command);
return this;
}
public JQuery addCommands(ArrayList<Command> commands) {
this.commands.addAll(commands);
return this;
}
public ArrayList<Command> getCommands() {
return commands;
}
public String getSelector() {
return selector;
}
public double getWeight() {
return weight;
}
// main commands
public JQuery find(String selector) {
return find(new FindCommand(selector));
}
public JQuery find(FindCommand command) {
commands.add(command);
return this;
}
public JQuery filter(String selector) {
return filter(new FilterCommand(selector));
}
public JQuery filter(FilterCommand command) {
commands.add(command);
return this;
}
public JQuery not(String selector) {
return not(new NotCommand(selector));
}
public JQuery not(NotCommand command) {
commands.add(command);
return this;
}
public JQuery add(String selector) {
return add(new AddCommand(selector));
}
public JQuery add(AddCommand command) {
commands.add(command);
return this;
}
public JQuery containsText(StringMatcher stringMatcher, String text) {
return containsText(new ContainsTextCommand(stringMatcher, text));
}
public JQuery containsText(ContainsTextCommand command) {
commands.add(command);
return this;
}
public JQuery containsAttribute(StringMatcher stringMatcher, String attributeName, String text) {
return containsAttribute(new ContainsAttributeCommand(stringMatcher, attributeName, text));
}
public JQuery containsAttribute(ContainsAttributeCommand command) {
commands.add(command);
return this;
}
public JQuery has(String selector) {
return has(new HasCommand(selector));
}
public JQuery has(HasCommand command) {
commands.add(command);
return this;
}
public JQuery contents() {
commands.add(new ContentsCommand());
return this;
}
// extended selector functionality
public JQuery xPath(String selector) {
return xPath(new XPathCommand(selector));
}
public JQuery xPath(XPathCommand command) {
commands.add(command);
return this;
}
public JQuery regex(String selector) {
return regex(new RegExCommand(selector));
}
public JQuery regex(RegExCommand command) {
commands.add(command);
return this;
}
public JQuery filterCSS(String attributeName, CSSAttributeComparator cssAttributeComparator, String value) {
commands.add(new FilterCSSCommand(attributeName, cssAttributeComparator, value));
return this;
}
public JQuery distinctDescendants() {
commands.add(new DistinctDescendantsCommand());
return this;
}
// commands with optional selectors
public JQuery parent() {
return parent("");
}
public JQuery parent(String selector) {
return parent(new ParentCommand(selector));
}
public JQuery parent(ParentCommand command) {
commands.add(command);
return this;
}
public JQuery ancestors() {
return ancestors("");
}
public JQuery ancestors(String selector) {
return ancestors(new AncestorsCommand(selector));
}
public JQuery ancestors(AncestorsCommand command) {
commands.add(command);
return this;
}
public JQuery children() {
return children("");
}
public JQuery children(String selector) {
return children(new ChildrenCommand(selector));
}
public JQuery children(ChildrenCommand command) {
commands.add(command);
return this;
}
public JQuery siblings() {
return siblings("");
}
public JQuery siblings(String selector) {
return siblings(new SiblingsCommand(selector));
}
public JQuery siblings(SiblingsCommand command) {
commands.add(command);
return this;
}
public JQuery next() {
return next("");
}
public JQuery next(String selector) {
return next(new NextCommand(selector));
}
public JQuery next(NextCommand command) {
commands.add(command);
return this;
}
public JQuery prev() {
return prev("");
}
public JQuery prev(String selector) {
return prev(new PrevCommand(selector));
}
public JQuery prev(PrevCommand command) {
commands.add(command);
return this;
}
// closeness and direction commands
public JQuery closeTo(DirectionOptions options, Predicates predicates) {
commands.add(new CloseToCommand(options, predicates));
return this;
}
public JQuery closeToLabel(DirectionOptions options, Predicates predicates) {
return closeTo(options.setType(DirectionType.CLOSETOLABEL), predicates);
}
public JQuery closeToClickableLabel(DirectionOptions options, Predicates predicates) {
return closeTo(options.setType(DirectionType.CLOSETOCLICKABLELABEL), predicates);
}
public JQuery above(DirectionOptions options, Predicates predicates) {
return closeTo(options.setType(DirectionType.ABOVE), predicates);
}
public JQuery below(DirectionOptions options, Predicates predicates) {
return closeTo(options.setType(DirectionType.BELOW), predicates);
}
public JQuery leftOf(DirectionOptions options, Predicates predicates) {
return closeTo(options.setType(DirectionType.LEFTOF), predicates);
}
public JQuery rightOf(DirectionOptions options, Predicates predicates) {
return closeTo(options.setType(DirectionType.RIGHTOF), predicates);
}
// color commands
public JQuery color(ColorOptions options) {
commands.add(new ColorCommand(options));
return this;
}
public JQuery color(Color color, double tolerance, double dominance) {
return color(new ColorOptions(color, tolerance, dominance));
}
// general methods
public JQuery setWeight(double weight) {
this.weight = weight;
return this;
}
public String toString() {
return toString(0);
}
public String toString(int intendationSpaces) {
String str = StringUtils.repeat(" ", intendationSpaces) + weight + ":" + "jQuery(" + selector + ")";
for(Command command: commands) {
str += "." + command.toString(intendationSpaces);
}
return str;
}
public JQuery clone() {
return clone(weight);
}
public JQuery clone(double newWeight) {
JQuery jQuery = new JQuery(selector, newWeight);
for(Command command: commands) {
jQuery.addCommand(command);
}
return jQuery;
}
}