package your.app.util;

import java.text.Collator;
import java.util.Locale;

import com.webobjects.eocontrol.EOSortOrdering;
import com.webobjects.eocontrol.EOSortOrdering.ComparisonSupport;
import com.webobjects.foundation.NSKeyValueCoding;

import er.extensions.localization.ERXLocalizer;

public class NaturalOrderStringSortSupport extends ComparisonSupport {
	private static Class<?> stringClass = String.class;
	private static final int MAGIC = -42;

	public static void initialize() {
		EOSortOrdering.ComparisonSupport.setSupportForClass(new NaturalOrderStringSortSupport(), String.class);
	}

	private Collator collator() {
		Locale locale = ERXLocalizer.currentLocalizer().locale();
		if (locale == null) {
			locale = Locale.getDefault();
		}
		return Collator.getInstance(locale);
	}

	private static int _handleNulls(Object object1, Object object2) {
		if (object1 == null || object1 == NSKeyValueCoding.NullValue) {
			if (object2 == null || object2 == NSKeyValueCoding.NullValue)
				return 0;
			return -1;
		}
		if (object2 == null || object2 == NSKeyValueCoding.NullValue)
			return 1;
		return MAGIC;
	}

	@Override
    protected int _genericCompareTo(Object object1, Object object2) {
			int i = _handleNulls(object1, object2);
			if (i != MAGIC)
				return i;
			Class<?> clazz = object1.getClass();
			if (clazz == stringClass) {
				String s1 = object1.toString();
				String s2 = object2.toString();
				return Strings.compareNatural(collator(), s1, s2);
			}
		return super._genericCompareTo(object1, object2);
	}

	@Override
    protected int _genericCaseInsensitiveCompareTo(Object object1, Object object2) {
		int i = _handleNulls(object1, object2);
		if (i != MAGIC)
			return i;
		Class<?> clazz = object1.getClass();
		if (clazz == stringClass) {
			String s1 = object1.toString().toUpperCase();
			String s2 = object2.toString().toUpperCase();
			return Strings.compareNatural(collator(), s1, s2);
		}
		return super._genericCaseInsensitiveCompareTo(object1, object2);
	}
}
