##############################################################################
#
# Copyright (c) 2003 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Sample vocabulary supporting state abbreviations.

$Id: states.py 27731 2004-10-01 18:22:45Z jim $
"""
from zope.interface import implements
from zope.schema import interfaces
from zope.schema import Choice

# This table is based on information from the United States Postal Service:
# http://www.usps.com/ncsc/lookups/abbreviations.html#states
_states = {
    'AL': u'Alabama',
    'AK': u'Alaska',
    'AS': u'American Samoa',
    'AZ': u'Arizona',
    'AR': u'Arkansas',
    'CA': u'California',
    'CO': u'Colorado',
    'CT': u'Connecticut',
    'DE': u'Delaware',
    'DC': u'District of Columbia',
    'FM': u'Federated States of Micronesia',
    'FL': u'Florida',
    'GA': u'Georgia',
    'GU': u'Guam',
    'HI': u'Hawaii',
    'ID': u'Idaho',
    'IL': u'Illinois',
    'IN': u'Indiana',
    'IA': u'Iowa',
    'KS': u'Kansas',
    'KY': u'Kentucky',
    'LA': u'Louisiana',
    'ME': u'Maine',
    'MH': u'Marshall Islands',
    'MD': u'Maryland',
    'MA': u'Massachusetts',
    'MI': u'Michigan',
    'MN': u'Minnesota',
    'MS': u'Mississippi',
    'MO': u'Missouri',
    'MT': u'Montana',
    'NE': u'Nebraska',
    'NV': u'Nevada',
    'NH': u'New Hampshire',
    'NJ': u'New Jersey',
    'NM': u'New Mexico',
    'NY': u'New York',
    'NC': u'North Carolina',
    'ND': u'North Dakota',
    'MP': u'Northern Mariana Islands',
    'OH': u'Ohio',
    'OK': u'Oklahoma',
    'OR': u'Oregon',
    'PW': u'Palau',
    'PA': u'Pennsylvania',
    'PR': u'Puerto Rico',
    'RI': u'Rhode Island',
    'SC': u'South Carolina',
    'SD': u'South Dakota',
    'TN': u'Tennessee',
    'TX': u'Texas',
    'UT': u'Utah',
    'VT': u'Vermont',
    'VI': u'Virgin Islands',
    'VA': u'Virginia',
    'WA': u'Washington',
    'WV': u'West Virginia',
    'WI': u'Wisconsin',
    'WY': u'Wyoming',
    }


class State(object):
    __slots__ = 'value', 'title'
    implements(interfaces.ITerm)

    def __init__(self, value, title):
        self.value = value
        self.title = title

for v,p in _states.iteritems():
    _states[v] = State(v, p)


class IStateVocabulary(interfaces.IVocabulary):
    """Vocabularies that support the states database conform to this."""


class StateVocabulary(object):
    __slots__ = ()
    implements(IStateVocabulary)

    def __init__(self, object=None):
        pass

    def __contains__(self, value):
        return value in _states

    def __iter__(self):
        return _states.itervalues()

    def __len__(self):
        return len(_states)

    def getTerm(self, value):
        return _states[value]


class StateSelectionField(Choice):

    vocabulary = StateVocabulary()

    def __init__(self, **kw):
        super(StateSelectionField, self).__init__(
            vocabulary=StateSelectionField.vocabulary,
            **kw)
        self.vocabularyName = "states"
