/*
 *******************************************************************************
 * Copyright (C) 1996-2000, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 *
 * $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/impl/LocaleUtility.java,v $
 * $Date: 2002/06/19 21:03:12 $
 * $Revision: 1.4 $
 *  *****************************************************************************************
 */
 
package com.ibm.icu.impl;

import java.util.Locale;

/**
 * A class to hold utility functions missing from java.util.Locale.
 */
public class LocaleUtility {

    /**
     * A helper function to convert a string of the form
     * aa_BB_CC to a locale object.  Why isn't this in Locale?
     */
    public static Locale getLocaleFromName(String name) {
        String language = "";
        String country = "";
        String variant = "";

        int i1 = name.indexOf('_');
        if (i1 < 0) {
            language = name;
        } else {
            language = name.substring(0, i1);
            ++i1;
            int i2 = name.indexOf('_', i1);
            if (i2 < 0) {
                country = name.substring(i1);
            } else {
                country = name.substring(i1, i2);
                variant = name.substring(i2+1);
            }
        }

        return new Locale(language, country, variant);
    }

    /**
     * Compare two locale strings of the form aa_BB_CC, and
     * return true if parent is a 'strict' fallback of child, that is,
     * if child =~ "^parent(_.+)*" (roughly).
     */
    public static boolean isFallbackOf(String parent, String child) {
        if (!child.startsWith(parent)) {
            return false;
        }
        int i = parent.length();
        return (i == child.length() ||
                child.charAt(i) == '_');
    }

    /**
     * Compare two locales, and return true if the parent is a
     * 'strict' fallback of the child (parent string is a fallback
     * of child string).
     */
    public static boolean isFallbackOf(Locale parent, Locale child) {
        return isFallbackOf(parent.toString(), child.toString());
    }


    /**
     * You'd think that Locale canonicalizes, since it munges the
     * renamed languages, but it doesn't quite.  It forces the region
     * to be upper case but doesn't do anything about the language or
     * variant.  Our canonical form is 'lower_UPPER_UPPER'.  
     */
    public static String canonicalLocaleString(String id) {
	if (id != null) {
	    int x = id.indexOf("_");
	    if (x == -1) {
		id = id.toLowerCase(Locale.ENGLISH);
	    } else {
		StringBuffer buf = new StringBuffer();
		buf.append(id.substring(0, x).toLowerCase(Locale.ENGLISH));
		buf.append(id.substring(x).toUpperCase(Locale.ENGLISH));
		    
		int len = buf.length();
		int n = len;
		while (--n >= 0 && buf.charAt(n) == '_') {};
		if (++n != len) {
		    buf.delete(n, len);
		}
		id = buf.toString();
	    }
	}
	return id;
    }

    /*
    public static String getDisplayLanguage(String languageID, Locale l) {
    }

    public static String getDisplayRegion(String regionID, Locale l) {
    }

    public static String getDisplayVariant(String variantID, Locale l) {
    }

    public static String getDisplayName(String localeName) {
	return getDisplayName(getLocaleFromString(localeName));
    }

    public static String getDisplayName(Locale locale) {
	String lang = locale.getLanguage();
	String region = locale.getCountry();
	String var = locale.getVariant();

	StringBuffer buf = new StringBuffer(lang);
    }
    */
}
