#
#   pso.fields.py  - Python Service Objects Form Tag lib
#
#   Author: Thanos Vassilakis thanos@0x01.com
#
#   	Copyright (c) thanos vassilakis 2000,2001, 2002
#
#	This library is free software; you can redistribute it and/or 
#	modify it under the terms of the GNU Lesser General Public License 
#	as published by the Free Software Foundation; either version 2.1 of the 
#	License, or (at your option) any later version.
#
#	This library is distributed in the hope that it will be useful, but 
#	WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
#	or FITNESS FOR A PARTICULAR PURPOSE.  
#	See the GNU Lesser General Public License for more details.
#
#	See terms of license at gnu.org. 
#
#   $Id: fields.py,v 1.5 2004/07/12 04:03:31 thanos Exp $
#
__version__="$Revision: 1.5 $"

from string import letters, digits
from form import  ValidationFailure,FieldMissing,  ValidationError, DefaultField, Select, Input
from isocodes import USStates
from validation import isZipCode

class StateSelect(Select):
	OPTIONS=( ('NN','Non US or Canada'), ) + USStates

	
			
			
			

	
class ZipInput(Input):
	def validate(self, handler):
		value = Input.validate(self, handler)
		if not value: return ''
		try:
			isZipCode(value)
		except Exception, e:	
			raise ValidationError(self.getName(), '%s' % e)
		return value


class PhoneInput(Input):
	def validate(self, handler):
		value = Input.validate(self, handler)
		if not value: return ''
		
		
	


class EmailInput(Input):
	def validate(self, handler):
		value = Input.validate(self, handler)
		if len(value):
			if value.count('@') != 1:
				raise ValidationError(self.getName(), 'invalid e-mail')
			if value.count('.') < 1:
				raise ValidationError(self.getName(), 'invalid e-mail')
		return value

class UrlInput(Input):
        def validate(self, handler):
                value = Input.validate(self, handler)
		if value:
			from urllib import urlopen
			try:
				urlopen(value)
			except:
				raise ValidationError(self.getName(), 'invalide url')
                return value

class UserIdInput(Input):
	SIZE=5

	VALIDCHAR = letters+digits
	REQUIRED=1

	def validate(self, handler):
		value = Input.validate(self, handler)
		v = [ch for ch in value if ch not in self.VALIDCHAR]
		if v:
			raise ValidationError(value, 'login id must be alphnumerical [a-z, A-Z, 0-9]')
		size = int(self.getAttrs().get('size', str(self.SIZE)))
		if len(value) < size:
			raise ValidationError(value, 'login id must be  %d character or longer' % size)
		return value