Index: zipcode.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/zipcode/zipcode.module,v
retrieving revision 1.4.4.5
diff -u -p -r1.4.4.5 zipcode.module
--- zipcode.module	8 Sep 2007 20:21:03 -0000	1.4.4.5
+++ zipcode.module	15 Nov 2007 20:32:27 -0000
@@ -15,6 +15,7 @@
 function zipcode_field_info() {
   return array(
     'fr_zipcode' => array('label' => t('French postal codes')),
+    'uk_zipcode' => array('label' => t('United Kingdom postal codes')),
     'ca_zipcode' => array('label' => t('Canadian postal codes')),
     'us_zipcode' => array('label' => t('US zipcodes')),
     'nl_zipcode' => array('label' => t('Dutch zipcodes')),
@@ -33,6 +34,11 @@ function zipcode_field_settings($op, $fi
         	'value' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE),
       	);
       }
+      if ($field['type'] == 'uk_zipcode'){ 
+         $columns = array(
+            	'value' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE),
+          );
+      }
       if ($field['type'] == 'ca_zipcode'){ 
          $columns = array(
             	'value' => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE),
@@ -90,7 +96,7 @@ function zipcode_field_formatter_info() 
   return array(
     'default' => array(
       'label' => 'Default',
-      'field types' => array('fr_zipcode', 'ca_zipcode', 'us_zipcode', 'nl_zipcode', 'au_zipcode'),
+      'field types' => array('fr_zipcode', 'uk_zipcode', 'ca_zipcode', 'us_zipcode', 'nl_zipcode', 'au_zipcode'),
     ),
   );
  }
@@ -118,7 +124,7 @@ function zipcode_widget_info() {
   return array(
     'zipcode' => array(
       'label' => t('Textfield'),
-      'field types' => array('fr_zipcode', 'ca_zipcode', 'us_zipcode', 'nl_zipcode', 'au_zipcode'),
+      'field types' => array('fr_zipcode', 'uk_zipcode', 'ca_zipcode', 'us_zipcode', 'nl_zipcode', 'au_zipcode'),
     ),
   );
 }
@@ -188,7 +194,10 @@ function zipcode_widget($op, &$node, $fi
     	        if ($field['type'] == 'fr_zipcode') { 
 	  	  $node_field[0]['value'] = format_fr_zipcode($node_field[0]['value']);
 	        }
-    	        if ($field['type'] == 'ca_zipcode') { 
+     	        if ($field['type'] == 'uk_zipcode') { 
+	          $node_field[0]['value'] = format_uk_zipcode($node_field[0]['value']);
+	        }
+   	        if ($field['type'] == 'ca_zipcode') { 
 	          $node_field[0]['value'] = format_ca_zipcode($node_field[0]['value']);
 	        }
 		if ($field['type'] == 'us_zipcode') { 
@@ -214,7 +223,10 @@ function zipcode_widget($op, &$node, $fi
               if ($field['type'] == 'fr_zipcode' && !valid_fr_zipcode($item['value'])) {
                 form_set_error($field['field_name'],t('"%value" is not a valid french postal code.<br>Postal codes should only contains 4 or 5 numbers',array('%value' => $item['value'])));
               }
-              if ($field['type'] == 'ca_zipcode' && !valid_ca_zipcode($item['value'])) {
+              if ($field['type'] == 'uk_zipcode' && !valid_uk_zipcode($item['value'])) {
+                form_set_error($field['field_name'],t('"%value" is not a valid United Kingom postal code.<br>Postal codes should be like AB1 C23 or AB1C23 ...',array('%value' => $item['value'])));
+              }
+             if ($field['type'] == 'ca_zipcode' && !valid_ca_zipcode($item['value'])) {
                 form_set_error($field['field_name'],t('"%value" is not a canadian valid postal code.<br>Postal codes should be like Z5Z 5Z5 or Z5Z5Z5 ...',array('%value' => $item['value'])));
               }
               if ($field['type'] == 'us_zipcode' && !valid_us_zipcode($item['value'])) {
@@ -255,6 +267,37 @@ function valid_fr_zipcode($zipcodestring
   }
 }  
 
+function valid_uk_zipcode($zipcodestring) {
+
+  $zipcodestring = trim($zipcodestring);
+
+
+   // See http://www.govtalk.gov.uk/gdsc/html/noframes/PostCode-2-1-Release.htm
+    $in  = 'ABDEFGHJLNPQRSTUWXYZ';
+    $fst = 'ABCDEFGHIJKLMNOPRSTUWYZ';
+    $sec = 'ABCDEFGHJKLMNOPQRSTUVWXY';
+    $thd = 'ABCDEFGHJKSTUW';
+    $fth = 'ABEHMNPRVWXY';
+    $num = '0123456789';
+    $nom = '0123456789';
+    $gap = '\s\.';
+
+    if (preg_match("/^[$fst][$num][$gap]*[$nom][$in][$in]$/i", $zipcodestring) ||
+        preg_match("/^[$fst][$num][$num][$gap]*[$nom][$in][$in]$/i", $zipcodestring) ||
+        preg_match("/^[$fst][$sec][$num][$gap]*[$nom][$in][$in]$/i", $zipcodestring) ||
+        preg_match("/^[$fst][$sec][$num][$num][$gap]*[$nom][$in][$in]$/i", $zipcodestring) ||
+        preg_match("/^[$fst][$num][$thd][$gap]*[$nom][$in][$in]$/i", $zipcodestring) ||
+        preg_match("/^[$fst][$sec][$num][$fth][$gap]*[$nom][$in][$in]$/i", $zipcodestring)) {
+        return true;
+    } else {
+        return false;
+    }
+
+
+
+
+} 
+
 function valid_ca_zipcode($zipcodestring) {
 
   $zipcodestring = trim($zipcodestring);
@@ -326,6 +369,12 @@ function format_fr_zipcode($zipcodestrin
   return $zipcodestring;
 }
 
+function format_uk_zipcode($zipcodestring) {
+
+  $zipcodestring = strtoupper(trim($zipcodestring));
+ 
+  return $zipcodestring;
+}
 
 function format_ca_zipcode($zipcodestring) {
 
@@ -358,4 +407,4 @@ function format_au_zipcode($zipcodestrin
   $zipcodestring = trim($zipcodestring);
   //do some formatting 
   return $zipcodestring;
-}
\ No newline at end of file
+}
