/*******************************************************************************
 * Copyright (c) 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.jface.examples.databinding.model;

import org.eclipse.jface.databinding.converter.IConverter;
 
public class StateConverter implements IConverter {
	
	/*
	 * State Abbreviations
	 *  
	 * From: http://www.usps.com/ncsc/lookups/usps_abbreviations.html
	 * 
	 * ALABAMA -> AL
	 * ALASKA -> AK
	 * AMERICAN SAMOA -> AS
	 * ARIZONA -> AZ
	 * ARKANSAS -> AR
	 * CALIFORNIA -> CA
	 * COLORADO -> CO
	 * CONNECTICUT -> CT
	 * DELAWARE -> DE
	 * DISTRICT OF COLUMBIA -> DC
	 * FEDERATED STATES OF MICRONESIA -> FM
	 * FLORIDA -> FL
	 * GEORGIA -> GA
	 * GUAM -> GU
	 * HAWAII -> HI
	 * IDAHO -> ID
	 * ILLINOIS -> IL
	 * INDIANA -> IN
	 * IOWA -> IA
	 * KANSAS -> KS
	 * KENTUCKY -> KY
	 * LOUISIANA -> LA
	 * MAINE -> ME
	 * MARSHALL ISLANDS -> MH
	 * MARYLAND -> MD
	 * MASSACHUSETTS -> MA
	 * MICHIGAN -> MI
	 * MINNESOTA -> MN
	 * MISSISSIPPI -> MS
	 * MISSOURI -> MO
	 * MONTANA -> MT
	 * NEBRASKA -> NE
	 * NEVADA -> NV
	 * NEW HAMPSHIRE -> NH
	 * NEW JERSEY -> NJ
	 * NEW MEXICO -> NM
	 * NEW YORK -> NY
	 * NORTH CAROLINA -> NC
	 * NORTH DAKOTA -> ND
	 * NORTHERN MARIANA ISLANDS -> MP
	 * OHIO -> OH
	 * OKLAHOMA -> OK
	 * OREGON -> OR
	 * PALAU -> PW
	 * PENNSYLVANIA -> PA
	 * PUERTO RICO -> PR
	 * RHODE ISLAND -> RI
	 * SOUTH CAROLINA -> SC
	 * SOUTH DAKOTA -> SD
	 * TENNESSEE -> TN
	 * TEXAS -> TX
	 * UTAH -> UT
	 * VERMONT -> VT
	 * VIRGIN ISLANDS -> VI
	 * VIRGINIA -> VA
	 * WASHINGTON -> WA
	 * WEST VIRGINIA -> WV
	 * WISCONSIN -> WI
	 * WYOMING -> WY
	 */
	public final static String[] STATE_LETTERS = new String[] {
			  "AL","AK","AZ","AR","CA","CO","CT","DE","DC","FL","GA","GU","HI",
			  "ID","IL","IN","IA","KS","KY","LA","ME","MD","MA","MI","MN","MS",
			  "MO","MT","NE","NV","NH","NJ","NM","NY","NC","ND","OH","OK","OR",
			  "PA","PR","RI","SC","SD","TN","TX","UT","VA","VI","WA","WV","WI", "WY" 
	};
	public final static String[] STATE_NAMES = new String[] {
			"Alabama","Alaska","Arizona","Arkansas","California","Colorado","CONNECTICUT","Delaware","Washington DC","Florida","Georgia","GUAM","Hawaii",
			"Idaho","Illinois","Indiana","Iowa","Kansas","KENTUCKY","LOUISIANA","MAINE","MARYLAND","Michigan","MASSACHUSETTS","Minnesota","Mississippi",
			"MISSOURI","MONTANA","NEBRASKA","Nevada","New Hampshire","New Jersey","New Mexico","New York","North Carolina","North Dakota","Ohio","Oklahmoa","Oregon",
			"Pensylvania","PUERTO RICO","Rhode Island","South Carolina","South Dakota","TENNESSEE","Texas","Utah","VERMONT", "VIRGIN ISLANDS","Virginia","Washington","West Virginia","Wisconsin", "Wyoming"
	};

	public Class getModelType() {
		return String.class;
	}
	public Class getTargetType() {
		return String.class;
	}
	public Object convertTargetToModel(Object targetObject) {
		String stateName = (String)targetObject;
		if(stateName != null){
			for (int i = 0; i < STATE_NAMES.length; i++) {
				if(STATE_NAMES[i].equalsIgnoreCase(stateName)){
					return STATE_LETTERS[i];
				}
			}
		}
		return null;
	}
	public Object convertModelToTarget(Object modelObject) {
		// Return the state name for the letter
		String stateLetter = (String)modelObject;
		if(stateLetter != null){
			for (int i = 0; i < STATE_LETTERS.length; i++) {
				if(STATE_LETTERS[i].equals(stateLetter)){
					return STATE_NAMES[i];
				}
			}
		}
		return "??" + STATE_LETTERS + "??";
	}
}
