/
area/
classes/net/sourceforge/pain/console/
classes/net/sourceforge/pain/logic/
classes/net/sourceforge/pain/logic/event/
classes/net/sourceforge/pain/logic/fn/util/
classes/net/sourceforge/pain/plugin/
classes/net/sourceforge/pain/plugin/reset/
classes/net/sourceforge/pain/plugin/shutdown/
classes/net/sourceforge/pain/plugin/social/
classes/net/sourceforge/pain/util/
classest/net/sourceforge/pain/db/data/
doc/
doc/paindb/resources/
src/net/sourceforge/pain/console/
src/net/sourceforge/pain/console/telnet/
src/net/sourceforge/pain/logic/
src/net/sourceforge/pain/logic/event/
src/net/sourceforge/pain/logic/fn/util/
src/net/sourceforge/pain/plugin/
src/net/sourceforge/pain/plugin/command/
src/net/sourceforge/pain/plugin/reset/
src/net/sourceforge/pain/plugin/shutdown/
src/net/sourceforge/pain/plugin/social/
src/net/sourceforge/pain/util/
tests/net/sourceforge/pain/db/data/
package net.sourceforge.pain.logic.fn;


import net.sourceforge.pain.*;
import net.sourceforge.pain.logic.fn.util.*;
import net.sourceforge.pain.data.*;
import net.sourceforge.pain.data.type.*;
import net.sourceforge.pain.db.*;

import java.util.*;


public final class GlobalFindFn {

	private GlobalFindFn() {
	}

	/** looking for player by exact name */
	public static Player findPlayerByName(String name) {
		if (name == null || name.length() < 3) {
			return null;
		}
		name = name.toLowerCase();
		DbClass dbClass = Core.getDB().getDbClass(Player.class);
		for (Iterator it = dbClass.extentIterator(); it.hasNext();) {
			Player p = (Player) it.next();
			if (name.equals(p.getLogin())) {
				return p;
			}
		}
		return null;
	}

	public static Player findActivePlayerByName(String name) {
		if (name == null) {
			return null;
		}
		name = name.toLowerCase();
		for (Player p = Core.getWorld().getFirstActivePlayer(); p != null; p = p.getNextActivePlayer()) {
			if (name.equals(p.getLogin())) {
				return p;
			}
		}
		return null;
	}

	public static Interactive findInteractiveByPrefix(LogicalObject actor, String prefix) {
		if (prefix == null || prefix.length() == 0) {
			return null;
		}
		prefix = prefix.toLowerCase();
		if (prefix.equals("self")) {
			Interactive i = (Interactive) actor.getRole(Interactive.class);
			if (i != null) {
				return i;
			}
		}
		String mostSimilarName = null;
		Interactive result = null;
		for (Iterator it = Core.getAllObjects(Interactive.class); it.hasNext();) {
			Interactive i = (Interactive) it.next();
			String inames[] = i.getTargetList();
			for (int j = 0; j < inames.length; j++) {
				String iname = inames[j];
				if (iname.startsWith(prefix)) {
					if (iname.length() == prefix.length()) {
						return i; // found exact
					}
					if (mostSimilarName == null) {
						mostSimilarName = iname;
						result = i;
						continue;
					} else {
						if (SpaceFindFn.isCloserTo(prefix, iname, mostSimilarName)) {
							if (result.is(Player.class) && !i.is(Player.class)) {
								// nothing to do, players has priority in global search
							} else {
								mostSimilarName = iname;
								result = i;
							}
						}
					}
				}
			}
		}
		return result;
	}

}