a bit of work on import. Charles Bozeman provided a compare function for

* xmlschemas.c: a bit of work on import.
* xmlschemastypes.c: Charles Bozeman provided a compare function
  for date/time types so min/max facet restrictions should work,
  indeterminate comparisons return an error instead of equal.
* test/schemas/date_0* result/schemas/date_0_0: specific test
  from Charles Bozeman too
Daniel
diff --git a/ChangeLog b/ChangeLog
index c789338..0758e2d 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+Wed May 22 08:38:19 CEST 2002 Daniel Veillard <daniel@veillard.com>
+
+	* xmlschemas.c: a bit of work on import.
+	* xmlschemastypes.c: Charles Bozeman provided a compare function
+	  for date/time types so min/max facet restrictions should work,
+	  indeterminate comparisons return an error instead of equal.
+	* test/schemas/date_0* result/schemas/date_0_0: specific test
+	  from Charles Bozeman too
+
 Sat May 18 09:54:12 CEST 2002 Daniel Veillard <daniel@veillard.com>
 
 	* libxml.3 doc/buildDocBookCatalog: apply a couple of patches
diff --git a/result/schemas/date_0_0 b/result/schemas/date_0_0
new file mode 100644
index 0000000..2554d30
--- /dev/null
+++ b/result/schemas/date_0_0
@@ -0,0 +1 @@
+./test/schemas/date_0.xml validates
diff --git a/result/schemas/date_0_0.err b/result/schemas/date_0_0.err
new file mode 100644
index 0000000..7cd39e8
--- /dev/null
+++ b/result/schemas/date_0_0.err
@@ -0,0 +1,420 @@
+Type of restriction 15 : ./test/schemas/date_0.xsd:55 :empty
+Type of simpletype22 : ./test/schemas/date_0.xsd:87 :simple
+Type of restriction 24 : ./test/schemas/date_0.xsd:102 :empty
+Type of restriction 5 : ./test/schemas/date_0.xsd:15 :empty
+Type of simpletype14 : ./test/schemas/date_0.xsd:54 :simple
+Type of holidays : ./test/schemas/date_0.xsd:98 :simple
+Type of choice 3 : ./test/schemas/date_0.xsd:11 :elements
+Type of simpletype4 : ./test/schemas/date_0.xsd:14 :simple
+Type of restriction 17 : ./test/schemas/date_0.xsd:64 :empty
+Type of restriction 7 : ./test/schemas/date_0.xsd:23 :empty
+Type of simpletype16 : ./test/schemas/date_0.xsd:63 :simple
+Type of simpletype6 : ./test/schemas/date_0.xsd:22 :simple
+Type of restriction 19 : ./test/schemas/date_0.xsd:72 :empty
+Type of restriction 9 : ./test/schemas/date_0.xsd:31 :empty
+Type of simpletype18 : ./test/schemas/date_0.xsd:71 :simple
+Type of simpletype8 : ./test/schemas/date_0.xsd:30 :simple
+Type of restriction 11 : ./test/schemas/date_0.xsd:39 :empty
+Type of sequence 2 : ./test/schemas/date_0.xsd:10 :elements
+Type of anontype1 : ./test/schemas/date_0.xsd:9 :elements
+Type of simpletype10 : ./test/schemas/date_0.xsd:38 :simple
+Type of restriction 21 : ./test/schemas/date_0.xsd:80 :empty
+Type of restriction 13 : ./test/schemas/date_0.xsd:47 :empty
+Type of simpletype20 : ./test/schemas/date_0.xsd:79 :simple
+Type of sequence 2 : ./test/schemas/date_0.xsd:10 :elements
+Type of simpletype12 : ./test/schemas/date_0.xsd:46 :simple
+Type of restriction 23 : ./test/schemas/date_0.xsd:88 :empty
+Building content model for date
+Content model of date:
+ regexp: '(null)' 
+12 atoms:
+ 00  atom: string once 'time' 
+ 01  atom: string once 'time1' 
+ 02  atom: string once 'time2' 
+ 03  atom: string once 'date1' 
+ 04  atom: string once 'date2' 
+ 05  atom: string once 'dt1' 
+ 06  atom: string once 'dt2' 
+ 07  atom: string once 'hol' 
+ 08  atom: string once 'year1' 
+ 09  atom: string once 'yearmon1' 
+ 10  atom: string once 'mon1' 
+ 11  atom: string once 'day1' 
+15 states:
+ state: 0, 12 transitions:
+  trans: atom 0, to 3
+  trans: atom 1, to 4
+  trans: atom 2, to 5
+  trans: atom 3, to 6
+  trans: atom 4, to 7
+  trans: atom 5, to 8
+  trans: atom 6, to 9
+  trans: atom 7, to 10
+  trans: atom 8, to 11
+  trans: atom 9, to 12
+  trans: atom 10, to 13
+  trans: atom 11, to 14
+ state: FINAL 1, 0 transitions:
+ state: 2, 14 transitions:
+  trans: removed
+  trans: count based 0, epsilon to 1
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+ state: 3, 26 transitions:
+  trans: removed
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+  trans: count based 0, epsilon to 1
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+ state: 4, 26 transitions:
+  trans: removed
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+  trans: count based 0, epsilon to 1
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+ state: 5, 26 transitions:
+  trans: removed
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+  trans: count based 0, epsilon to 1
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+ state: 6, 26 transitions:
+  trans: removed
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+  trans: count based 0, epsilon to 1
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+ state: 7, 26 transitions:
+  trans: removed
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+  trans: count based 0, epsilon to 1
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+ state: 8, 26 transitions:
+  trans: removed
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+  trans: count based 0, epsilon to 1
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+ state: 9, 26 transitions:
+  trans: removed
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+  trans: count based 0, epsilon to 1
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+ state: 10, 26 transitions:
+  trans: removed
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+  trans: count based 0, epsilon to 1
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+ state: 11, 26 transitions:
+  trans: removed
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+  trans: count based 0, epsilon to 1
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+ state: 12, 26 transitions:
+  trans: removed
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+  trans: count based 0, epsilon to 1
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+ state: 13, 26 transitions:
+  trans: removed
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+  trans: count based 0, epsilon to 1
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+ state: 14, 26 transitions:
+  trans: removed
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+  trans: count based 0, epsilon to 1
+  trans: counted 0, atom 0, to 3
+  trans: counted 0, atom 1, to 4
+  trans: counted 0, atom 2, to 5
+  trans: counted 0, atom 3, to 6
+  trans: counted 0, atom 4, to 7
+  trans: counted 0, atom 5, to 8
+  trans: counted 0, atom 6, to 9
+  trans: counted 0, atom 7, to 10
+  trans: counted 0, atom 8, to 11
+  trans: counted 0, atom 9, to 12
+  trans: counted 0, atom 10, to 13
+  trans: counted 0, atom 11, to 14
+1 counters:
+ 0: min 0 max 1073741823
+xmlSchemaValidateCallback: time, time, time
+xmlSchemaValidateCallback: time1, time1, time1
+xmlSchemaValidateCallback: time2, time2, time2
+xmlSchemaValidateCallback: time2, time2, time2
+xmlSchemaValidateCallback: date1, date1, date1
+xmlSchemaValidateCallback: date1, date1, date1
+xmlSchemaValidateCallback: date2, date2, date2
+xmlSchemaValidateCallback: date2, date2, date2
+xmlSchemaValidateCallback: date1, date1, date1
+xmlSchemaValidateCallback: date1, date1, date1
+xmlSchemaValidateCallback: dt1, dt1, dt1
+xmlSchemaValidateCallback: dt2, dt2, dt2
+xmlSchemaValidateCallback: hol, hol, hol
+xmlSchemaValidateCallback: hol, hol, hol
+xmlSchemaValidateCallback: hol, hol, hol
+xmlSchemaValidateCallback: hol, hol, hol
+xmlSchemaValidateCallback: year1, year1, year1
+xmlSchemaValidateCallback: yearmon1, yearmon1, yearmon1
+xmlSchemaValidateCallback: mon1, mon1, mon1
+xmlSchemaValidateCallback: day1, day1, day1
+xmlSchemaValidateCallback: dt2, dt2, dt2
+Element date content check succeeded
diff --git a/test/schemas/date_0.xml b/test/schemas/date_0.xml
new file mode 100644
index 0000000..3099d5e
--- /dev/null
+++ b/test/schemas/date_0.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0"?>
+<date>
+  <time>01:02:59</time>
+  <time1>01:02:59</time1>
+  <time2>12:59:59</time2>
+  <time2>11:59:59.01</time2>
+  <date1>2002-05-18</date1>
+  <date1>2002-05-19</date1>
+  <date2>1996-05-19Z</date2>
+  <date2>1996-05</date2>
+  <date1>2002-05-18Z</date1>
+  <date1>2000-05-18Z</date1>
+  <dt1>2000-05-18</dt1>
+  <dt2>2002-05-19T21:30:00.99</dt2>
+  <hol>--01-01</hol>
+  <hol>--07-04</hol>
+  <hol>--12-25</hol>
+  <hol>--05-19</hol>
+  <year1>2002</year1>
+  <yearmon1>2002-05</yearmon1>
+  <mon1>--05--</mon1>
+  <day1>---31</day1>
+  <dt2>2003-04-30T18:00:00-06:00</dt2>
+</date>
diff --git a/test/schemas/date_0.xsd b/test/schemas/date_0.xsd
new file mode 100644
index 0000000..aa919b0
--- /dev/null
+++ b/test/schemas/date_0.xsd
@@ -0,0 +1,121 @@
+<?xml version="1.0"?>
+<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
+  <xsd:annotation>
+    <xsd:documentation xml:lang="en">
+        Testing date/time data types
+    </xsd:documentation>
+  </xsd:annotation>
+  <xsd:element name="date">
+    <xsd:complexType>
+      <xsd:sequence>
+        <xsd:choice minOccurs="1" maxOccurs="unbounded">
+          <xsd:element name="time" type="xsd:time"/>
+          <xsd:element name="time1">
+            <xsd:simpleType>
+              <xsd:restriction base="xsd:time">
+                <xsd:maxInclusive value="23:59:59.9999999"/>
+                <xsd:minInclusive value="00:00:00"/>
+              </xsd:restriction>
+            </xsd:simpleType>
+          </xsd:element>
+          <xsd:element name="time2">
+            <xsd:simpleType>
+              <xsd:restriction base="xsd:time">
+                <xsd:maxInclusive value="13:50:50"/>
+                <xsd:minInclusive value="12:00:00"/>
+              </xsd:restriction>
+            </xsd:simpleType>
+          </xsd:element>
+          <xsd:element name="date1">
+            <xsd:simpleType>
+              <xsd:restriction base="xsd:date">
+                <xsd:maxExclusive value="2002-05-19"/>
+                <xsd:minExclusive value="1996-05-19"/>
+              </xsd:restriction>
+            </xsd:simpleType>
+          </xsd:element>
+          <xsd:element name="date2">
+            <xsd:simpleType>
+              <xsd:restriction base="xsd:date">
+                <xsd:maxInclusive value="2002-05-19Z"/>
+                <xsd:minInclusive value="1996-05-19Z"/>
+              </xsd:restriction>
+            </xsd:simpleType>
+          </xsd:element>
+          <xsd:element name="dt1">
+            <xsd:simpleType>
+              <xsd:restriction base="xsd:dateTime">
+                <xsd:maxExclusive value="2002-01-01T00:00:00Z"/>
+                <xsd:minExclusive value="1970-01-01T00:00:00Z"/>
+              </xsd:restriction>
+            </xsd:simpleType>
+          </xsd:element>
+          <xsd:element name="dt2">
+            <xsd:simpleType>
+              <xsd:restriction base="xsd:dateTime">
+                <xsd:maxInclusive value="2003-05-01T00:00:00Z"/>
+                <xsd:minInclusive value="1996-05-19T21:30:00Z"/>
+              </xsd:restriction>
+            </xsd:simpleType>
+          </xsd:element>
+          <xsd:element name="hol" type="holidays"/>
+          <xsd:element name="year1">
+            <xsd:simpleType>
+              <xsd:restriction base="xsd:gYear">
+                <xsd:maxInclusive value="2003Z"/>
+                <xsd:minInclusive value="1996Z"/>
+              </xsd:restriction>
+            </xsd:simpleType>
+          </xsd:element>
+          <xsd:element name="yearmon1">
+            <xsd:simpleType>
+              <xsd:restriction base="xsd:gYearMonth">
+                <xsd:maxInclusive value="2003-05Z"/>
+                <xsd:minInclusive value="1996-05Z"/>
+              </xsd:restriction>
+            </xsd:simpleType>
+          </xsd:element>
+          <xsd:element name="mon1">
+            <xsd:simpleType>
+              <xsd:restriction base="xsd:gMonth">
+                <xsd:maxInclusive value="--01--Z"/>
+                <xsd:minInclusive value="--05--Z"/>
+              </xsd:restriction>
+            </xsd:simpleType>
+          </xsd:element>
+          <xsd:element name="day1">
+            <xsd:simpleType>
+              <xsd:restriction base="xsd:gDay">
+                <xsd:maxInclusive value="---28"/>
+                <xsd:minInclusive value="---31"/>
+              </xsd:restriction>
+            </xsd:simpleType>
+          </xsd:element>
+        </xsd:choice>
+      </xsd:sequence>
+    </xsd:complexType>
+  </xsd:element>
+  <xsd:simpleType name='holidays'>
+    <xsd:annotation>
+      <xsd:documentation>some US holidays</xsd:documentation>
+    </xsd:annotation>
+    <xsd:restriction base='xsd:gMonthDay'>
+      <xsd:enumeration value='--01-01'>
+        <xsd:annotation>
+          <xsd:documentation>New Year's day</xsd:documentation>
+        </xsd:annotation>
+      </xsd:enumeration>
+      <xsd:enumeration value='--07-04'>
+        <xsd:annotation>
+          <xsd:documentation>4th of July</xsd:documentation>
+        </xsd:annotation>
+      </xsd:enumeration>
+      <xsd:enumeration value='--12-25'>
+        <xsd:annotation>
+          <xsd:documentation>Christmas</xsd:documentation>
+        </xsd:annotation>
+      </xsd:enumeration>
+    </xsd:restriction>
+  </xsd:simpleType>
+</xsd:schema>
+
diff --git a/xmlschemas.c b/xmlschemas.c
index d8a0225..15ff701 100644
--- a/xmlschemas.c
+++ b/xmlschemas.c
@@ -17,6 +17,7 @@
 #include <libxml/parser.h>
 #include <libxml/parserInternals.h>
 #include <libxml/hash.h>
+#include <libxml/uri.h>
 
 #include <libxml/xmlschemas.h>
 #include <libxml/schemasInternals.h>
@@ -35,6 +36,8 @@
 	    "Unimplemented block at %s:%d\n",				\
             __FILE__, __LINE__);
 
+#define XML_SCHEMAS_DEFAULT_NAMESPACE (const xmlChar *)"the default namespace"
+
 /*
  * The XML Schemas namespaces
  */
@@ -2161,6 +2164,127 @@
 }
 
 /**
+ * xmlSchemaParseImport:
+ * @ctxt:  a schema validation context
+ * @schema:  the schema being built
+ * @node:  a subtree containing XML Schema informations
+ *
+ * parse a XML schema Import definition
+ * *WARNING* this interface is highly subject to change
+ *
+ * Returns -1 in case of error, 0 if the declaration is inproper and
+ *         1 in case of success.
+ */
+static int
+xmlSchemaParseImport(xmlSchemaParserCtxtPtr ctxt, xmlSchemaPtr schema,
+                          xmlNodePtr node)
+{
+    xmlNodePtr child = NULL;
+    xmlChar *namespace;
+    xmlChar *schemaLocation;
+    xmlChar *previous;
+    xmlURIPtr check;
+
+    if ((ctxt == NULL) || (schema == NULL) || (node == NULL))
+        return (-1);
+
+    namespace = xmlGetProp(node, BAD_CAST "namespace");
+    if (namespace != NULL) {
+	check = xmlParseURI((const char *) namespace);
+	if (check == NULL) {
+	    xmlSchemaErrorContext(ctxt, schema, node, child);
+	    if ((ctxt != NULL) && (ctxt->error != NULL))
+		ctxt->error(ctxt->userData,
+			    "Import namespace attribute is not an URI: %s\n",
+			    namespace);
+	    xmlFree(namespace);
+	    return(-1);
+	} else {
+	    xmlFreeURI(check);
+	}
+    }
+    schemaLocation = xmlGetProp(node, BAD_CAST "schemaLocation");
+    if (schemaLocation != NULL) {
+	check = xmlParseURI((const char *) schemaLocation);
+	if (check == NULL) {
+	    xmlSchemaErrorContext(ctxt, schema, node, child);
+	    if ((ctxt != NULL) && (ctxt->error != NULL))
+		ctxt->error(ctxt->userData,
+		    "Import schemaLocation attribute is not an URI: %s\n",
+			    schemaLocation);
+	    if (namespace != NULL)
+		xmlFree(namespace);
+	    xmlFree(schemaLocation);
+	    return(-1);
+	} else {
+	    xmlFreeURI(check);
+	}
+    }
+    if (schema->schemasImports == NULL) {
+	schema->schemasImports = xmlHashCreate(10);
+	if (schema->schemasImports == NULL) {
+	    xmlSchemaErrorContext(ctxt, schema, node, child);
+	    if ((ctxt != NULL) && (ctxt->error != NULL))
+		ctxt->error(ctxt->userData,
+		    "Internal: failed to build import table\n");
+	    if (namespace != NULL)
+		xmlFree(namespace);
+	    if (schemaLocation != NULL)
+		xmlFree(schemaLocation);
+	    return(-1);
+	}
+    }
+    if (namespace == NULL) {
+	previous = xmlHashLookup(schema->schemasImports,
+		XML_SCHEMAS_DEFAULT_NAMESPACE);
+	if (schemaLocation != NULL) {
+	    if (previous != NULL) {
+		if (!xmlStrEqual(schemaLocation, previous)) {
+		    xmlSchemaErrorContext(ctxt, schema, node, child);
+		    if ((ctxt != NULL) && (ctxt->error != NULL))
+			ctxt->error(ctxt->userData,
+	"Redefining import for default namespace with a different URI: %s\n",
+	                            schemaLocation);
+		}
+	    } else {
+		xmlHashAddEntry(schema->schemasImports, 
+			XML_SCHEMAS_DEFAULT_NAMESPACE, schemaLocation);
+	    }
+	}
+    } else {
+	previous = xmlHashLookup(schema->schemasImports, namespace);
+	if (schemaLocation != NULL) {
+	    if (previous != NULL) {
+		if (!xmlStrEqual(schemaLocation, previous)) {
+		    xmlSchemaErrorContext(ctxt, schema, node, child);
+		    if ((ctxt != NULL) && (ctxt->error != NULL))
+			ctxt->error(ctxt->userData,
+	"Redefining import for namespace %s with a different URI: %s\n",
+	                            namespace, schemaLocation);
+		}
+	    } else {
+		xmlHashAddEntry(schema->schemasImports, 
+			namespace, schemaLocation);
+	    }
+	}
+    }
+    TODO
+
+    child = node->children;
+    while (IS_SCHEMA(child, "annotation")) {
+	child = child->next;
+    }
+    if (child != NULL) {
+	xmlSchemaErrorContext(ctxt, schema, node, child);
+	if ((ctxt != NULL) && (ctxt->error != NULL))
+	    ctxt->error(ctxt->userData,
+			"Import has unexpected content\n");
+	return(-1);
+    }
+    return(1);
+}
+
+/**
  * xmlSchemaParseChoice:
  * @ctxt:  a schema validation context
  * @schema:  the schema being built
@@ -2791,8 +2915,7 @@
 	    } else if (IS_SCHEMA(child, "include")) {
 		TODO
 	    } else if (IS_SCHEMA(child, "import")) {
-		/* xmlSchemaParseImport(ctxt, schema, child);*/
-		TODO
+		xmlSchemaParseImport(ctxt, schema, child);
 	    } else if (IS_SCHEMA(child, "redefine")) {
 		TODO
 	    }
diff --git a/xmlschemastypes.c b/xmlschemastypes.c
index 32b9bb6..4d63224 100644
--- a/xmlschemastypes.c
+++ b/xmlschemastypes.c
@@ -89,7 +89,7 @@
     /* would use long long but not portable */
     unsigned long base;
     unsigned int extra;
-    int sign:1;
+    unsigned int sign:1;
     int frac:7;
     int total:8;
 };
@@ -97,7 +97,7 @@
 struct _xmlSchemaVal {
     xmlSchemaValType type;
     union {
-	xmlSchemaValDecimal decimal;
+	xmlSchemaValDecimal     decimal;
         xmlSchemaValDate        date;
         xmlSchemaValDuration    dur;
     } value;
@@ -270,6 +270,9 @@
 static const long daysInMonthLeap[12] =
 	{ 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };
 
+#define MAX_DAYINMONTH(yr,mon)                                  \
+        (IS_LEAP(yr) ? daysInMonthLeap[mon - 1] : daysInMonth[mon - 1])
+
 #define VALID_MDAY(dt)						\
 	(IS_LEAP(dt->year) ?				        \
 	    (dt->day <= daysInMonthLeap[dt->mon - 1]) :	        \
@@ -289,6 +292,35 @@
 #define SECS_PER_HOUR           (60 * SECS_PER_MIN)
 #define SECS_PER_DAY            (24 * SECS_PER_HOUR)
 
+static const long dayInYearByMonth[12] =
+	{ 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
+static const long dayInLeapYearByMonth[12] =
+	{ 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
+
+#define DAY_IN_YEAR(day, month, year)				\
+        ((IS_LEAP(year) ?					\
+                dayInLeapYearByMonth[month - 1] :		\
+                dayInYearByMonth[month - 1]) + day)
+
+#ifdef DEBUG
+#define DEBUG_DATE(dt)                                                  \
+    xmlGenericError(xmlGenericErrorContext,                             \
+        "type=%o %04ld-%02u-%02uT%02u:%02u:%03f",                       \
+        dt->type,dt->value.date.year,dt->value.date.mon,                \
+        dt->value.date.day,dt->value.date.hour,dt->value.date.min,      \
+        dt->value.date.sec);                                            \
+    if (dt->value.date.tz_flag)                                         \
+        if (dt->value.date.tzo != 0)                                    \
+            xmlGenericError(xmlGenericErrorContext,                     \
+                "%+05d\n",dt->value.date.tzo);                          \
+        else                                                            \
+            xmlGenericError(xmlGenericErrorContext, "Z\n");             \
+    else                                                                \
+        xmlGenericError(xmlGenericErrorContext,"\n")
+#else
+#define DEBUG_DATE(dt)
+#endif
+
 /**
  * _xmlSchemaParseGYear:
  * @dt:  pointer to a date structure
@@ -548,6 +580,7 @@
 	if (!VALID_TZO(dt->tzo))
 	    return 2;
 
+	dt->tz_flag = 1;
 	break;
       }
     default:
@@ -615,7 +648,7 @@
 	}
 
 /**
- * xmlSchemaParseDates:
+ * xmlSchemaValidateDates:
  * @type: the predefined type
  * @dateTime:  string to analyze
  * @val:  the return computed value
@@ -627,7 +660,7 @@
  *         and -1 in case of internal or API error.
  */
 static int
-xmlSchemaParseDates (xmlSchemaTypePtr type, const xmlChar *dateTime,
+xmlSchemaValidateDates (xmlSchemaTypePtr type, const xmlChar *dateTime,
                         xmlSchemaValPtr *val) {
     xmlSchemaValPtr dt;
     int ret;
@@ -774,7 +807,7 @@
 }
 
 /**
- * xmlSchemaParseDuration:
+ * xmlSchemaValidateDuration:
  * @type: the predefined type
  * @duration:  string to analyze
  * @val:  the return computed value
@@ -786,7 +819,7 @@
  *         and -1 in case of internal or API error.
  */
 static int
-xmlSchemaParseDuration (xmlSchemaTypePtr type, const xmlChar *duration,
+xmlSchemaValidateDuration (xmlSchemaTypePtr type, const xmlChar *duration,
                         xmlSchemaValPtr *val) {
     const xmlChar  *cur = duration;
     xmlSchemaValPtr dur;
@@ -904,6 +937,7 @@
 	return(-1);
     if (type == NULL)
 	return(-1);
+
     if (val != NULL)
 	*val = NULL;
     if (type == xmlSchemaTypeStringDef) { 
@@ -918,7 +952,7 @@
 	return(1);
     } else if (type == xmlSchemaTypeDecimalDef) {
 	const xmlChar *cur = value, *tmp;
-	int frac = 0, main, neg = 0;
+	int frac = 0, len, neg = 0;
 	unsigned long base = 0;
 	if (cur == NULL)
 	    return(1);
@@ -933,7 +967,7 @@
 	    base = base * 10 + (*cur - '0');
 	    cur++;
 	}
-	main = cur - tmp;
+	len = cur - tmp;
 	if (*cur == '.') {
 	    cur++;
 	    tmp = cur;
@@ -951,13 +985,13 @@
 		v->value.decimal.base = base;
 		v->value.decimal.sign = neg;
 		v->value.decimal.frac = frac;
-		v->value.decimal.total = frac + main;
+		v->value.decimal.total = frac + len;
 		*val = v;
 	    }
 	}
 	return(0);
     } else if (type == xmlSchemaTypeDurationDef) {
-        return xmlSchemaParseDuration(type, value, val);
+        return xmlSchemaValidateDuration(type, value, val);
     } else if ((type == xmlSchemaTypeDatetimeDef) ||
                (type == xmlSchemaTypeTimeDef) ||
                (type == xmlSchemaTypeDateDef) ||
@@ -966,7 +1000,7 @@
                (type == xmlSchemaTypeGMonthDef) ||
                (type == xmlSchemaTypeGMonthDayDef) ||
                (type == xmlSchemaTypeGDayDef))         {
-        return xmlSchemaParseDates(type, value, val);
+        return xmlSchemaValidateDates(type, value, val);
     } else if (type == xmlSchemaTypePositiveIntegerDef) {
 	const xmlChar *cur = value;
 	unsigned long base = 0;
@@ -1102,7 +1136,7 @@
         { 0, 31, 62, 92, 123, 153, 184, 215, 245, 276, 306, 337} };
 
     if ((x == NULL) || (y == NULL))
-        return NULL;
+        return -2;
 
     /* months */
     mon = x->value.dur.mon - y->value.dur.mon;
@@ -1159,6 +1193,472 @@
         return -1;
 
     /* indeterminate */
+    return 2;
+}
+
+/*
+ * macros for adding date/times and durations
+ */
+#define FQUOTIENT(a,b)                  (floor(((double)a/(double)b)))
+#define MODULO(a,b)                     (a - FQUOTIENT(a,b) * b)
+#define FQUOTIENT_RANGE(a,low,high)     (FQUOTIENT((a-low),(high-low)))
+#define MODULO_RANGE(a,low,high)        ((MODULO((a-low),(high-low)))+low)
+
+/**
+ * _xmlSchemaDateAdd:
+ * @dt: an #xmlSchemaValPtr
+ * @dur: an #xmlSchemaValPtr of type #XS_DURATION
+ *
+ * Compute a new date/time from @dt and @dur. This function assumes @dt
+ * is either #XML_SCHEMAS_DATETIME, #XML_SCHEMAS_DATE, #XML_SCHEMAS_GYEARMONTH,
+ * or #XML_SCHEMAS_GYEAR.
+ *
+ * Returns date/time pointer or NULL.
+ */
+static xmlSchemaValPtr
+_xmlSchemaDateAdd (xmlSchemaValPtr dt, xmlSchemaValPtr dur)
+{
+    xmlSchemaValPtr ret;
+    long carry, tempdays, temp;
+    xmlSchemaValDatePtr r, d;
+    xmlSchemaValDurationPtr u;
+
+    if ((dt == NULL) || (dur == NULL))
+        return NULL;
+
+    ret = xmlSchemaNewValue(dt->type);
+    if (ret == NULL)
+        return NULL;
+
+    r = &(ret->value.date);
+    d = &(dt->value.date);
+    u = &(dur->value.dur);
+
+    /* normalization */
+    if (d->mon == 0)
+        d->mon = 1;
+
+    /* normalize for time zone offset */
+    u->sec -= (d->tzo * 60);
+    d->tzo = 0;
+
+    /* normalization */
+    if (d->day == 0)
+        d->day = 1;
+
+    /* month */
+    carry  = d->mon + u->mon;
+    r->mon = MODULO_RANGE(carry, 1, 13);
+    carry  = FQUOTIENT_RANGE(carry, 1, 13);
+
+    /* year (may be modified later) */
+    r->year = d->year + carry;
+    if (r->year == 0) {
+        if (d->year > 0)
+            r->year--;
+        else
+            r->year++;
+    }
+
+    /* time zone */
+    r->tzo     = d->tzo;
+    r->tz_flag = d->tz_flag;
+
+    /* seconds */
+    r->sec = d->sec + u->sec;
+    carry  = FQUOTIENT((long)r->sec, 60);
+    if (r->sec != 0.0) {
+        r->sec = MODULO(r->sec, 60.0);
+    }
+
+    /* minute */
+    carry += d->min;
+    r->min = MODULO(carry, 60);
+    carry  = FQUOTIENT(carry, 60);
+
+    /* hours */
+    carry  += d->hour;
+    r->hour = MODULO(carry, 24);
+    carry   = FQUOTIENT(carry, 24);
+
+    /*
+     * days
+     * Note we use tempdays because the temporary values may need more
+     * than 5 bits
+     */
+    if ((VALID_YEAR(r->year)) && (VALID_MONTH(r->mon)) &&
+                  (d->day > MAX_DAYINMONTH(r->year, r->mon)))
+        tempdays = MAX_DAYINMONTH(r->year, r->mon);
+    else if (d->day < 1)
+        tempdays = 1;
+    else
+        tempdays = d->day;
+
+    tempdays += u->day + carry;
+
+    while (1) {
+        if (tempdays < 1) {
+            long tmon = MODULO_RANGE(r->mon-1, 1, 13);
+            long tyr  = r->year + FQUOTIENT_RANGE(r->mon-1, 1, 13);
+            if (tyr == 0)
+                tyr--;
+            tempdays += MAX_DAYINMONTH(tyr, tmon);
+            carry = -1;
+        } else if (tempdays > MAX_DAYINMONTH(r->year, r->mon)) {
+            tempdays = tempdays - MAX_DAYINMONTH(r->year, r->mon);
+            carry = 1;
+        } else
+            break;
+
+        temp = r->mon + carry;
+        r->mon = MODULO_RANGE(temp, 1, 13);
+        r->year = r->year + FQUOTIENT_RANGE(temp, 1, 13);
+        if (r->year == 0) {
+            if (temp < 1)
+                r->year--;
+            else
+                r->year++;
+	}
+    }
+    
+    r->day = tempdays;
+
+    /*
+     * adjust the date/time type to the date values
+     */
+    if (ret->type != XML_SCHEMAS_DATETIME) {
+        if ((r->hour) || (r->min) || (r->sec))
+            ret->type = XML_SCHEMAS_DATETIME;
+        else if (ret->type != XML_SCHEMAS_DATE) {
+            if ((r->mon != 1) && (r->day != 1))
+                ret->type = XML_SCHEMAS_DATE;
+            else if ((ret->type != XML_SCHEMAS_GYEARMONTH) && (r->mon != 1))
+                ret->type = XML_SCHEMAS_GYEARMONTH;
+        }
+    }
+
+    return ret;
+}
+
+/**
+ * xmlSchemaDupVal:
+ * @v: value to duplicate
+ *
+ * returns a duplicated value.
+ */
+static xmlSchemaValPtr
+xmlSchemaDupVal (xmlSchemaValPtr v)
+{
+    xmlSchemaValPtr ret = xmlSchemaNewValue(v->type);
+    if (ret == NULL)
+        return ret;
+    
+    memcpy(ret, v, sizeof(xmlSchemaVal));
+    return ret;
+}
+
+/**
+ * xmlSchemaDateNormalize:
+ * @dt: an #xmlSchemaValPtr
+ *
+ * Normalize @dt to GMT time.
+ *
+ */
+static xmlSchemaValPtr
+xmlSchemaDateNormalize (xmlSchemaValPtr dt, double offset)
+{
+    xmlSchemaValPtr dur, ret;
+
+    if (dt == NULL)
+        return NULL;
+
+    if (((dt->type != XML_SCHEMAS_TIME) &&
+         (dt->type != XML_SCHEMAS_DATETIME)) || (dt->value.date.tzo == 0))
+        return xmlSchemaDupVal(dt);
+
+    dur = xmlSchemaNewValue(XML_SCHEMAS_DURATION);
+    if (dur == NULL)
+        return NULL;
+
+    dur->value.date.sec -= offset;
+
+    ret = _xmlSchemaDateAdd(dt, dur);
+    if (ret == NULL)
+        return NULL;
+
+    xmlSchemaFreeValue(dur);
+
+    /* ret->value.date.tzo = 0; */
+    return ret;
+}
+
+/**
+ * _xmlSchemaDateCastYMToDays:
+ * @dt: an #xmlSchemaValPtr
+ *
+ * Convert mon and year of @dt to total number of days. Take the 
+ * number of years since (or before) 1 AD and add the number of leap
+ * years. This is a function  because negative
+ * years must be handled a little differently and there is no zero year.
+ *
+ * Returns number of days.
+ */
+static long
+_xmlSchemaDateCastYMToDays (const xmlSchemaValPtr dt)
+{
+    long ret;
+
+    if (dt->value.date.year < 0)
+        ret = (dt->value.date.year * 365) +
+              (((dt->value.date.year+1)/4)-((dt->value.date.year+1)/100)+
+               ((dt->value.date.year+1)/400)) +
+              DAY_IN_YEAR(0, dt->value.date.mon, dt->value.date.year);
+    else
+        ret = ((dt->value.date.year-1) * 365) +
+              (((dt->value.date.year-1)/4)-((dt->value.date.year-1)/100)+
+               ((dt->value.date.year-1)/400)) +
+              DAY_IN_YEAR(0, dt->value.date.mon, dt->value.date.year);
+
+    return ret;
+}
+
+/**
+ * TIME_TO_NUMBER:
+ * @dt:  an #xmlSchemaValPtr
+ *
+ * Calculates the number of seconds in the time portion of @dt.
+ *
+ * Returns seconds.
+ */
+#define TIME_TO_NUMBER(dt)                              \
+    ((double)((dt->value.date.hour * SECS_PER_HOUR) +   \
+              (dt->value.date.min * SECS_PER_MIN)) + dt->value.date.sec)
+
+/**
+ * xmlSchemaCompareDates:
+ * @x:  a first date/time value
+ * @y:  a second date/time value
+ *
+ * Compare 2 date/times
+ *
+ * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
+ * case of error
+ */
+static int
+xmlSchemaCompareDates (xmlSchemaValPtr x, xmlSchemaValPtr y)
+{
+    unsigned char xmask, ymask, xor_mask, and_mask;
+    xmlSchemaValPtr p1, p2, q1, q2;
+    long p1d, p2d, q1d, q2d;
+
+    if ((x == NULL) || (y == NULL))
+        return -2;
+
+    if (x->value.date.tz_flag) {
+
+        if (!y->value.date.tz_flag) {
+            p1 = xmlSchemaDateNormalize(x, 0);
+            p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
+            /* normalize y + 14:00 */
+            q1 = xmlSchemaDateNormalize(y, (14 * SECS_PER_HOUR));
+
+            q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
+            if (p1d < q1d)
+                return -1;
+            else if (p1d == q1d) {
+                double sec;
+
+                sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
+                if (sec < 0.0)
+                    return -1;
+                else {
+                    /* normalize y - 14:00 */
+                    q2 = xmlSchemaDateNormalize(y, -(14 * SECS_PER_HOUR));
+                    q2d = _xmlSchemaDateCastYMToDays(q2) + q2->value.date.day;
+                    if (p1d > q2d)
+                        return 1;
+                    else if (p1d == q2d) {
+                        sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q2);
+                        if (sec > 0.0)
+                            return 1;
+                        else
+                            return 2; /* indeterminate */
+                    }
+                }
+            }
+        }
+    } else if (y->value.date.tz_flag) {
+        q1 = xmlSchemaDateNormalize(y, 0);
+        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
+
+        /* normalize x - 14:00 */
+        p1 = xmlSchemaDateNormalize(x, -(14 * SECS_PER_HOUR));
+        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
+
+        if (p1d < q1d)
+            return -1;
+        else if (p1d == q1d) {
+            double sec;
+
+            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
+            if (sec < 0.0)
+                return -1;
+            else {
+                /* normalize x + 14:00 */
+                p2 = xmlSchemaDateNormalize(x, (14 * SECS_PER_HOUR));
+                p2d = _xmlSchemaDateCastYMToDays(p2) + p2->value.date.day;
+
+                if (p2d > q1d)
+                    return 1;
+                else if (p2d == q1d) {
+                    sec = TIME_TO_NUMBER(p2) - TIME_TO_NUMBER(q1);
+                    if (sec > 0.0)
+                        return 1;
+                    else
+                        return 2; /* indeterminate */
+                }
+            }
+        }
+    }
+
+    /*
+     * if the same type then calculate the difference
+     */
+    if (x->type == y->type) {
+        q1 = xmlSchemaDateNormalize(y, 0);
+        q1d = _xmlSchemaDateCastYMToDays(q1) + q1->value.date.day;
+
+        p1 = xmlSchemaDateNormalize(x, 0);
+        p1d = _xmlSchemaDateCastYMToDays(p1) + p1->value.date.day;
+
+        if (p1d < q1d)
+            return -1;
+        else if (p1d > q1d)
+            return 1;
+        else {
+            double sec;
+
+            sec = TIME_TO_NUMBER(p1) - TIME_TO_NUMBER(q1);
+            if (sec < 0.0)
+                return -1;
+            else if (sec > 0.0)
+                return 1;
+            
+        }
+        return 0;
+    }
+
+    switch (x->type) {
+        case XML_SCHEMAS_DATETIME:
+            xmask = 0xf;
+            break;
+        case XML_SCHEMAS_DATE:
+            xmask = 0x7;
+            break;
+        case XML_SCHEMAS_GYEAR:
+            xmask = 0x1;
+            break;
+        case XML_SCHEMAS_GMONTH:
+            xmask = 0x2;
+            break;
+        case XML_SCHEMAS_GDAY:
+            xmask = 0x3;
+            break;
+        case XML_SCHEMAS_GYEARMONTH:
+            xmask = 0x3;
+            break;
+        case XML_SCHEMAS_GMONTHDAY:
+            xmask = 0x6;
+            break;
+        case XML_SCHEMAS_TIME:
+            xmask = 0x8;
+            break;
+        default:
+            xmask = 0;
+            break;
+    }
+
+    switch (y->type) {
+        case XML_SCHEMAS_DATETIME:
+            ymask = 0xf;
+            break;
+        case XML_SCHEMAS_DATE:
+            ymask = 0x7;
+            break;
+        case XML_SCHEMAS_GYEAR:
+            ymask = 0x1;
+            break;
+        case XML_SCHEMAS_GMONTH:
+            ymask = 0x2;
+            break;
+        case XML_SCHEMAS_GDAY:
+            ymask = 0x3;
+            break;
+        case XML_SCHEMAS_GYEARMONTH:
+            ymask = 0x3;
+            break;
+        case XML_SCHEMAS_GMONTHDAY:
+            ymask = 0x6;
+            break;
+        case XML_SCHEMAS_TIME:
+            ymask = 0x8;
+            break;
+        default:
+            ymask = 0;
+            break;
+    }
+
+    xor_mask = xmask ^ ymask;           /* mark type differences */
+    and_mask = xmask & ymask;           /* mark field specification */
+
+    /* year */
+    if (xor_mask & 1)
+        return 2; /* indeterminate */
+    else if (and_mask & 1) {
+        if (x->value.date.year < y->value.date.year)
+            return -1;
+        else if (x->value.date.year > y->value.date.year)
+            return 1;
+    }
+
+    /* month */
+    if (xor_mask & 2)
+        return 2; /* indeterminate */
+    else if (and_mask & 2) {
+        if (x->value.date.mon < y->value.date.mon)
+            return -1;
+        else if (x->value.date.mon > y->value.date.mon)
+            return 1;
+    }
+
+    /* day */
+    if (xor_mask & 4)
+        return 2; /* indeterminate */
+    else if (and_mask & 4) {
+        if (x->value.date.day < y->value.date.day)
+            return -1;
+        else if (x->value.date.day > y->value.date.day)
+            return 1;
+    }
+
+    /* time */
+    if (xor_mask & 8)
+        return 2; /* indeterminate */
+    else if (and_mask & 8) {
+        if (x->value.date.hour < y->value.date.hour)
+            return -1;
+        else if (x->value.date.hour > y->value.date.hour)
+            return 1;
+        else if (x->value.date.min < y->value.date.min)
+            return -1;
+        else if (x->value.date.min > y->value.date.min)
+            return 1;
+        else if (x->value.date.sec < y->value.date.sec)
+            return -1;
+        else if (x->value.date.sec > y->value.date.sec)
+            return 1;
+    }
+
     return 0;
 }
 
@@ -1169,7 +1669,8 @@
  *
  * Compare 2 values
  *
- * Returns -1 if x < y, 0 if x == y, 1 if x > y and -2 in case of error
+ * Returns -1 if x < y, 0 if x == y, 1 if x > y, 2 if x <> y, and -2 in
+ * case of error
  */
 static int
 xmlSchemaCompareValues(xmlSchemaValPtr x, xmlSchemaValPtr y) {
@@ -1182,16 +1683,34 @@
 	case XML_SCHEMAS_DECIMAL:
 	    if (y->type == XML_SCHEMAS_DECIMAL)
 		return(xmlSchemaCompareDecimals(x, y));
-	    else
-		return(-2);
+	    return(-2);
         case XML_SCHEMAS_DURATION:
 	    if (y->type == XML_SCHEMAS_DURATION)
                 return(xmlSchemaCompareDurations(x, y));
-            else
-                return(-2);
+            return(-2);
+        case XML_SCHEMAS_TIME:
+        case XML_SCHEMAS_GDAY:
+        case XML_SCHEMAS_GMONTH:
+        case XML_SCHEMAS_GMONTHDAY:
+        case XML_SCHEMAS_GYEAR:
+        case XML_SCHEMAS_GYEARMONTH:
+        case XML_SCHEMAS_DATE:
+        case XML_SCHEMAS_DATETIME:
+            if ((y->type == XML_SCHEMAS_DATETIME)  ||
+                (y->type == XML_SCHEMAS_TIME)      ||
+                (y->type == XML_SCHEMAS_GDAY)      ||
+                (y->type == XML_SCHEMAS_GMONTH)    ||
+                (y->type == XML_SCHEMAS_GMONTHDAY) ||
+                (y->type == XML_SCHEMAS_GYEAR)     ||
+                (y->type == XML_SCHEMAS_DATE)      ||
+                (y->type == XML_SCHEMAS_GYEARMONTH))
+                return (xmlSchemaCompareDates(x, y));
+
+            return (-2);
 	default:
 	    TODO
     }
+    return -2;
 }
 
 /**
@@ -1230,7 +1749,7 @@
 	    }
 	    if (ret == -1)
 		return(0);
-	    TODO /* error code */
+	    /* error code */
 	    return(1);
 	case XML_SCHEMA_FACET_MAXINCLUSIVE:
 	    ret = xmlSchemaCompareValues(val, facet->val);
@@ -1240,7 +1759,7 @@
 	    }
 	    if ((ret == -1) || (ret == 0))
 		return(0);
-	    TODO /* error code */
+	    /* error code */
 	    return(1);
 	case XML_SCHEMA_FACET_MINEXCLUSIVE:
 	    ret = xmlSchemaCompareValues(val, facet->val);
@@ -1250,7 +1769,7 @@
 	    }
 	    if (ret == 1)
 		return(0);
-	    TODO /* error code */
+	    /* error code */
 	    return(1);
 	case XML_SCHEMA_FACET_MININCLUSIVE:
 	    ret = xmlSchemaCompareValues(val, facet->val);
@@ -1260,7 +1779,7 @@
 	    }
 	    if ((ret == 1) || (ret == 0))
 		return(0);
-	    TODO /* error code */
+	    /* error code */
 	    return(1);
 	case XML_SCHEMA_FACET_WHITESPACE:
 	    TODO /* whitespaces */