* HtmlAnchor.cs: Do not render empty name, target or title attribute.
[mono.git] / mcs / class / System.XML / System.Xml.Schema / BuiltInDatatype.cs
index 7f27047ddc9980524ef1428cc0bb86591778adcc..054fd030792829e9637cbc0434feac445932c80c 100644 (file)
@@ -1,11 +1,11 @@
-//\r
-// System.Xml.Schema.XmlSchemaDatatype.cs\r
-//\r
-// Author:\r
-//     Atsushi Enomoto\r
-//\r
-// (C)2003 Atsushi Enomoto\r
-//\r
+//
+// System.Xml.Schema.XmlSchemaDatatype.cs
+//
+// Author:
+//     Atsushi Enomoto
+//
+// (C)2003 Atsushi Enomoto
+//
 
 //
 // Permission is hereby granted, free of charge, to any person obtaining
 // OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
-using System;\r
-using System.Collections;\r
-using System.Text;\r
-using System.Xml;\r
-using System.Xml.Schema;\r
-using System.Globalization;\r
-using System.Security.Cryptography;\r
-\r
-#if NET_2_0\r
-using NSResolver = System.Xml.IXmlNamespaceResolver;\r
-#else\r
-using NSResolver = System.Xml.XmlNamespaceManager;\r
-#endif\r
-\r
-\r
-namespace Mono.Xml.Schema\r
-{\r
-       internal enum XsdWhitespaceFacet\r
-       {\r
-               Preserve,\r
-               Replace,\r
-               Collapse\r
-       }\r
-\r
-       internal enum XsdOrderedFacet\r
-       {\r
-               False,\r
-               Partial,\r
-               Total\r
-       }\r
-\r
-       internal enum XsdOrdering \r
-       {\r
-               LessThan = -1,\r
-               Equal = 0,\r
-               GreaterThan = 1,\r
-               Indeterminate = 2\r
-       }\r
-       \r
-       internal class XsdAnySimpleType : XmlSchemaDatatype\r
-       {\r
-               static XsdAnySimpleType instance;\r
-               static XsdAnySimpleType ()\r
-               {\r
-                       instance = new XsdAnySimpleType ();\r
-               }\r
-\r
-               public static XsdAnySimpleType Instance {\r
-                       get { return instance; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.AnyAtomicType; }\r
-               }\r
-#endif\r
-\r
-               static readonly char [] whitespaceArray = new char [] {' '};\r
-\r
-               // Fundamental Facets\r
-               public virtual bool Bounded {\r
-                       get { return false; }\r
-               }\r
-\r
-               public virtual bool Finite {\r
-                       get { return false; }\r
-               }\r
-\r
-               public virtual bool Numeric { \r
-                       get { return false; }\r
-               }\r
-\r
-               public virtual XsdOrderedFacet Ordered { \r
-                       get { return XsdOrderedFacet.False; }\r
-               }\r
-\r
-               public override Type ValueType {\r
-#if BUGGY_MS_COMPLIANT\r
-                       get { return typeof (string); }\r
-#else\r
-                       get { return typeof (object); }\r
-#endif\r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get {\r
-                               return XmlTokenizedType.None;\r
-                       }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return Normalize (s);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return new StringValueType (Normalize (s));\r
-               }\r
-\r
-               internal string [] ParseListValue (string s, XmlNameTable nameTable)\r
-               {\r
-                       return this.Normalize (s, XsdWhitespaceFacet.Collapse).Split (whitespaceArray);\r
-               }\r
-               \r
-       \r
-\r
-                       // Can you even use XsdAnySimpleType in a schema?\r
-                       // -> Yes. See E1-22 of http://www.w3.org/2001/05/xmlschema-errata#Errata1 (somewhat paranoid ;-)\r
-               \r
-               internal bool AllowsFacet(XmlSchemaFacet xsf) {\r
-                       return (AllowedFacets & xsf.ThisFacet)!=0;\r
-               }\r
-\r
-\r
-\r
-               internal virtual XsdOrdering Compare(object x, object y) {\r
-                       return XsdOrdering.Indeterminate;\r
-                       }\r
-       \r
-               internal virtual int Length(string s) {\r
-                       return s.Length;\r
-               }\r
-\r
-               \r
-               // anySimpleType allows any facet\r
-               internal virtual XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return XmlSchemaFacet.AllFacets ;}\r
-               }\r
-\r
-               /* Matches facets allowed on boolean type\r
-                */\r
-               internal static readonly XmlSchemaFacet.Facet booleanAllowedFacets = \r
-                                        XmlSchemaFacet.Facet.pattern | XmlSchemaFacet.Facet.whiteSpace;\r
-\r
-               /* Matches facets allowed on decimal type. \r
-                */\r
-               internal static readonly XmlSchemaFacet.Facet decimalAllowedFacets = \r
-                                                       XmlSchemaFacet.Facet.pattern | XmlSchemaFacet.Facet.enumeration | \r
-                                                       XmlSchemaFacet.Facet.whiteSpace | XmlSchemaFacet.Facet.maxInclusive | \r
-                                                       XmlSchemaFacet.Facet.minInclusive | XmlSchemaFacet.Facet.maxExclusive | \r
-                                                       XmlSchemaFacet.Facet.minExclusive | XmlSchemaFacet.Facet.fractionDigits | \r
-                                                       XmlSchemaFacet.Facet.totalDigits ;\r
-\r
-               /* Matches facets allowed on float, double, duration, dateTime, time, date,\r
-                * gYearMonth, gYear, gMonthDay, gMonth, and gDay types\r
-                */\r
-\r
-               internal static readonly XmlSchemaFacet.Facet durationAllowedFacets = \r
-                                                       XmlSchemaFacet.Facet.pattern | XmlSchemaFacet.Facet.enumeration | \r
-                                                       XmlSchemaFacet.Facet.whiteSpace | XmlSchemaFacet.Facet.maxInclusive |\r
-                                                       XmlSchemaFacet.Facet.minInclusive | XmlSchemaFacet.Facet.maxExclusive |\r
-                                                       XmlSchemaFacet.Facet.minExclusive ;\r
-\r
-               /* Matches facet allowed on string, hexBinary, base64Binary,\r
-                * anyURI, QName and NOTATION types \r
-                *\r
-                * Also used on list types\r
-                */\r
-\r
-               internal static readonly XmlSchemaFacet.Facet stringAllowedFacets = \r
-                                                XmlSchemaFacet.Facet.length | XmlSchemaFacet.Facet.minLength |\r
-                                                XmlSchemaFacet.Facet.maxLength | XmlSchemaFacet.Facet.pattern | \r
-                                                XmlSchemaFacet.Facet.enumeration | XmlSchemaFacet.Facet.whiteSpace; \r
-       }\r
-\r
-#if NET_2_0\r
-       internal class XdtAnyAtomicType : XsdAnySimpleType\r
-       {\r
-               internal XdtAnyAtomicType ()\r
-               {\r
-               }\r
-\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.AnyAtomicType; }\r
-               }\r
-       }\r
-\r
-       internal class XdtUntypedAtomic : XdtAnyAtomicType\r
-       {\r
-               internal XdtUntypedAtomic ()\r
-               {\r
-               }\r
-\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.UntypedAtomic; }\r
-               }\r
-       }\r
-#endif\r
-\r
-       // xs:string\r
-       internal class XsdString : XsdAnySimpleType\r
-       {\r
-               internal XsdString ()\r
-               {\r
-               }\r
-\r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return stringAllowedFacets; } \r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.CDATA; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.String; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string); }\r
-               }\r
-\r
-               // Fundamental Facets\r
-               public override bool Bounded {\r
-                       get { return false; }\r
-               }\r
-               public override bool Finite {\r
-                       get { return false; }\r
-               }\r
-               public override bool Numeric {\r
-                       get { return false; }\r
-               }\r
-               public override XsdOrderedFacet Ordered {\r
-                       get { return XsdOrderedFacet.False; }\r
-               }\r
-\r
-       }\r
-\r
-       // xs:normalizedString\r
-       internal class XsdNormalizedString : XsdString\r
-       {\r
-               internal XsdNormalizedString ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Replace;\r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-\r
-                       get { return XmlTokenizedType.CDATA; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.NormalizedString; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string); }\r
-               }\r
-\r
-               // ParseValue () method is as same as that of xs:string\r
-       }\r
-\r
-       // xs:token\r
-       internal class XsdToken : XsdNormalizedString\r
-       {\r
-               internal XsdToken ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.CDATA; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Token; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string); }\r
-               }\r
-\r
-               // ParseValue () method is as same as that of xs:string\r
-       }\r
-\r
-       // xs:language\r
-       internal class XsdLanguage : XsdToken\r
-       {\r
-               internal XsdLanguage ()\r
-               {\r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.CDATA; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Language; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string); }\r
-               }\r
-\r
-               // ParseValue () method is as same as that of xs:string\r
-       }\r
-\r
-       // xs;NMTOKEN\r
-       internal class XsdNMToken : XsdToken\r
-       {\r
-               internal XsdNMToken ()\r
-               {\r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.NMTOKEN; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.NmToken; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       if (!XmlChar.IsNmToken (s))\r
-                               throw new ArgumentException ("'" + s + "' is an invalid NMTOKEN.");\r
-                       return s;\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);\r
-               }\r
-       }\r
-\r
-       // xs:NMTOKENS\r
-       internal class XsdNMTokens : XsdNMToken\r
-       {\r
-               internal XsdNMTokens ()\r
-               {\r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.NMTOKENS; }\r
-               }\r
-\r
-#if NET_2_0\r
-               [MonoTODO]\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Item; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string []); }\r
-               }\r
-\r
-               public override object ParseValue (string value, XmlNameTable nt, NSResolver nsmgr)\r
-               {\r
-                       return GetValidatedArray (value, nt);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return new StringArrayValueType (GetValidatedArray (s, nameTable));\r
-               }\r
-\r
-               private string [] GetValidatedArray (string value, XmlNameTable nt)\r
-               {\r
-                       string [] nmtokens = ParseListValue (value, nt);\r
-                       for (int i = 0; i < nmtokens.Length; i++)\r
-                               if (!XmlChar.IsNmToken (nmtokens [i]))\r
-                                       throw new ArgumentException ("Invalid name token.");\r
-                       return nmtokens;\r
-               }\r
-       }\r
-\r
-       // xs:Name\r
-       internal class XsdName : XsdToken\r
-       {\r
-               internal XsdName ()\r
-               {\r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.CDATA; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Name; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       if (!XmlChar.IsName (s))\r
-                               throw new ArgumentException ("'" + s + "' is an invalid name.");\r
-                       return s;\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);\r
-               }\r
-       }\r
-\r
-       // xs:NCName\r
-       internal class XsdNCName : XsdName\r
-       {\r
-               internal XsdNCName ()\r
-               {\r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.NCName; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.NCName; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       if (!XmlChar.IsNCName (s))\r
-                               throw new ArgumentException ("'" + s + "' is an invalid NCName.");\r
-                       return s;\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);\r
-               }\r
-       }\r
-\r
-       // xs:ID\r
-       internal class XsdID : XsdName\r
-       {\r
-               internal XsdID ()\r
-               {\r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.ID; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Id; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string); }\r
-               }\r
-\r
-               public override object ParseValue (string s, XmlNameTable nt, NSResolver nsmgr)\r
-               {\r
-                       if (!XmlChar.IsNCName (s))\r
-                               throw new ArgumentException ("'" + s + "' is an invalid NCName.");\r
-                       return s;\r
-               }\r
-       }\r
-\r
-       // xs:IDREF\r
-       internal class XsdIDRef : XsdName\r
-       {\r
-               internal XsdIDRef ()\r
-               {\r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.IDREF; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Idref; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string); }\r
-               }\r
-\r
-               public override object ParseValue (string s, XmlNameTable nt, NSResolver nsmgr)\r
-               {\r
-                       if (!XmlChar.IsNCName (s))\r
-                               throw new ArgumentException ("'" + s + "' is an invalid NCName.");\r
-                       return s;\r
-               }\r
-       }\r
-\r
-       // xs:IDREFS\r
-       internal class XsdIDRefs : XsdName\r
-       {\r
-               internal XsdIDRefs ()\r
-               {\r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.IDREFS; }\r
-               }\r
-\r
-#if NET_2_0\r
-               [MonoTODO]\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Item; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string []); }\r
-               }\r
-\r
-               public override object ParseValue (string value, XmlNameTable nt, NSResolver nsmgr)\r
-               {\r
-                       return GetValidatedArray (value, nt);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return new StringArrayValueType (GetValidatedArray (s, nameTable));\r
-               }\r
-\r
-               private string [] GetValidatedArray (string value, XmlNameTable nt)\r
-               {\r
-                       string [] idrefs = ParseListValue (value, nt);\r
-                       for (int i = 0; i < idrefs.Length; i++)\r
-                               XmlConvert.VerifyNCName (idrefs [i]);\r
-                       return idrefs;\r
-               }\r
-       }\r
-\r
-       // xs:ENTITY\r
-       internal class XsdEntity : XsdName\r
-       {\r
-               internal XsdEntity ()\r
-               {\r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.ENTITY; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Entity; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string); }\r
-               }\r
-\r
-\r
-       }\r
-\r
-\r
-       // xs:ENTITIES\r
-       internal class XsdEntities : XsdName\r
-       {\r
-               internal XsdEntities ()\r
-               {\r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.ENTITIES; }\r
-               }\r
-\r
-#if NET_2_0\r
-               [MonoTODO]\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Item; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string []); }\r
-               }\r
-\r
-               public override object ParseValue (string value, XmlNameTable nt, NSResolver nsmgr)\r
-               {\r
-                       return GetValidatedArray (value, nt);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return new StringArrayValueType (GetValidatedArray (s, nameTable));\r
-               }\r
-\r
-               private string [] GetValidatedArray (string value, XmlNameTable nt)\r
-               {\r
-                       string [] entities = ParseListValue (value, nt);\r
-                       for (int i = 0; i < entities.Length; i++)\r
-                               if (!XmlChar.IsName (entities [i]))\r
-                                       throw new ArgumentException ("Invalid entitiy name.");\r
-                       return entities;\r
-               }\r
-       }\r
-\r
-       // xs:NOTATION\r
-       internal class XsdNotation : XsdAnySimpleType\r
-       {\r
-               internal XsdNotation ()\r
-               {\r
-               }\r
-\r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return stringAllowedFacets; } \r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.NOTATION; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Notation; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (string); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return Normalize (s);\r
-               }\r
-\r
-               // Fundamental Facets\r
-               public override bool Bounded {\r
-                       get { return false; }\r
-               }\r
-               public override bool Finite {\r
-                       get { return false; }\r
-               }\r
-               public override bool Numeric {\r
-                       get { return false; }\r
-               }\r
-               public override XsdOrderedFacet Ordered {\r
-                       get { return XsdOrderedFacet.False; }\r
-               }\r
-\r
-       }\r
-\r
-       // xs:decimal\r
-       internal class XsdDecimal : XsdAnySimpleType\r
-       {\r
-               internal XsdDecimal ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-\r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return decimalAllowedFacets; } \r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.None; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Decimal; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (decimal); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToDecimal (this.Normalize (s));\r
-               }\r
-        \r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       if ((x is Decimal) && (y is Decimal)) {\r
-                               int ret = Decimal.Compare((Decimal)x, (Decimal)y);\r
-                               if (ret < 0) { \r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else if (ret > 0) {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-               \r
-               // Fundamental Facets\r
-               public override bool Bounded {\r
-                       get { return false; }\r
-               }\r
-               public override bool Finite {\r
-                       get { return false; }\r
-               }\r
-               public override bool Numeric {\r
-                       get { return true; }\r
-               }\r
-               public override XsdOrderedFacet Ordered {\r
-                       get { return XsdOrderedFacet.Total; }\r
-               }\r
-\r
-       }\r
-\r
-       // xs:integer\r
-       internal class XsdInteger : XsdDecimal\r
-       {\r
-               public XsdInteger ()\r
-               {\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Integer; }\r
-               }\r
-#endif\r
-\r
-               // Here it may be bigger than int's (or long's) MaxValue.\r
-               public override Type ValueType {\r
-                       get { return typeof (decimal); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       decimal d = XmlConvert.ToDecimal (Normalize (s));\r
-                       if (Decimal.Floor (d) != d)\r
-                               throw new FormatException ("Integer contains point number.");\r
-                       return d;\r
-               }\r
-        \r
-               \r
-       \r
-       }\r
-\r
-       // xs:Long\r
-       internal class XsdLong : XsdInteger\r
-       {\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Long; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (long); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToInt64 (Normalize (s));\r
-               }\r
-               \r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       if ((x is long) && (y is long)) {\r
-                               if ((long)x==(long)y) {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                               else if ((long)x<(long)y) {\r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-       }\r
-\r
-       // xs:Int\r
-       internal class XsdInt : XsdLong\r
-       {\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Int; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (int); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToInt32 (Normalize (s));\r
-               }\r
-\r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       if ((x is int) && (y is int)) {\r
-                               if ((int)x==(int)y) {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                               else if ((int)x<(int)y) {\r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-       }\r
-\r
-\r
-       // xs:Short\r
-       internal class XsdShort : XsdInt\r
-       {\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Short; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (short); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToInt16 (Normalize (s));\r
-               }\r
-\r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       if ((x is short) && (y is short)) {\r
-                               if ((short)x==(short)y) {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                               else if ((short)x<(short)y) {\r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-       }\r
-\r
-       // xs:Byte\r
-       internal class XsdByte : XsdShort\r
-       {\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Byte; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (sbyte); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToSByte (Normalize (s));\r
-               }\r
-\r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       if ((x is sbyte) && (y is sbyte)) {\r
-                               if ((sbyte)x==(sbyte)y) {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                               else if ((sbyte)x<(sbyte)y) {\r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-       }\r
-\r
-       // xs:nonNegativeInteger\r
-//     [CLSCompliant (false)]\r
-       internal class XsdNonNegativeInteger : XsdInteger\r
-       {\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.NonNegativeInteger; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (decimal); }\r
-               }\r
-\r
-//             [CLSCompliant (false)]\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToDecimal (Normalize (s));\r
-               }\r
-       }\r
-\r
-       // xs:unsignedLong\r
-//     [CLSCompliant (false)]\r
-       internal class XsdUnsignedLong : XsdNonNegativeInteger\r
-       {\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.UnsignedLong; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (ulong); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToUInt64 (Normalize (s));\r
-               }\r
-\r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       if ((x is ulong) && (y is ulong)) {\r
-                               if ((ulong)x==(ulong)y) {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                               else if ((ulong)x<(ulong)y) {\r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-       }\r
-\r
-       // xs:unsignedInt\r
-//     [CLSCompliant (false)]\r
-       internal class XsdUnsignedInt : XsdUnsignedLong\r
-       {\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.UnsignedInt; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (uint); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToUInt32 (Normalize (s));\r
-               }\r
-\r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       if ((x is uint) && (y is uint)) {\r
-                               if ((uint)x==(uint)y) {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                               else if ((uint)x<(uint)y) {\r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-       }\r
-\r
-\r
-       // xs:unsignedShort\r
-//     [CLSCompliant (false)]\r
-       internal class XsdUnsignedShort : XsdUnsignedInt\r
-       {\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.UnsignedShort; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (ushort); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToUInt16 (Normalize (s));\r
-               }\r
-\r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       if ((x is ushort) && (y is ushort)) {\r
-                               if ((ushort)x==(ushort)y) {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                               else if ((ushort)x<(ushort)y) {\r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-       }\r
-\r
-       // xs:unsignedByte\r
-//     [CLSCompliant (false)]\r
-       internal class XsdUnsignedByte : XsdUnsignedShort\r
-       {\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.UnsignedByte; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (byte); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToByte(Normalize (s));\r
-               }\r
-\r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       if ((x is byte) && (y is byte)) {\r
-                               if ((byte)x==(byte)y) {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                               else if ((byte)x<(byte)y) {\r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-       }\r
-\r
-\r
-       // xs:positiveInteger\r
-//     [CLSCompliant (false)]\r
-       internal class XsdPositiveInteger : XsdNonNegativeInteger\r
-       {\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.PositiveInteger; }\r
-               }\r
-#endif\r
-\r
-               // It returns decimal, instead of int or long.\r
-               // Maybe MS developers thought about big integer...\r
-               public override Type ValueType {\r
-                       get { return typeof (decimal); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToDecimal (Normalize (s));\r
-               }\r
-       }\r
-\r
-       // xs:nonPositiveInteger\r
-       internal class XsdNonPositiveInteger : XsdInteger\r
-       {\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.NonPositiveInteger; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (decimal); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToDecimal (Normalize (s));\r
-               }\r
-       }\r
-\r
-       // xs:negativeInteger\r
-       internal class XsdNegativeInteger : XsdNonPositiveInteger\r
-       {\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.NegativeInteger; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-\r
-                       get { return typeof (decimal); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToDecimal (Normalize (s));\r
-               }\r
-       }\r
-\r
-       // xs:float\r
-       internal class XsdFloat : XsdAnySimpleType\r
-       {\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Float; }\r
-               }\r
-#endif\r
-\r
-               internal XsdFloat ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-    \r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return durationAllowedFacets; } \r
-               }\r
-               \r
-               // Fundamental Facets\r
-               public override bool Bounded {\r
-                       get { return true; }\r
-               }\r
-               public override bool Finite {\r
-                       get { return true; }\r
-               }\r
-               public override bool Numeric {\r
-                       get { return true; }\r
-               }\r
-               public override XsdOrderedFacet Ordered {\r
-                       get { return XsdOrderedFacet.Total; }\r
-               }\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (float); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToSingle (Normalize (s));\r
-               }\r
-\r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       if ((x is float) && (y is float)) {\r
-                               if ((float)x==(float)y) {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                               else if ((float)x<(float)y) {\r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-               }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-               \r
-       }\r
-\r
-       // xs:double\r
-       internal class XsdDouble : XsdAnySimpleType\r
-       {\r
-               internal XsdDouble ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-    \r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return durationAllowedFacets; } \r
-               }\r
-               \r
-               // Fundamental Facets\r
-               public override bool Bounded {\r
-                       get { return true; }\r
-               }\r
-               public override bool Finite {\r
-                       get { return true; }\r
-               }\r
-               public override bool Numeric {\r
-                       get { return true; }\r
-               }\r
-               public override XsdOrderedFacet Ordered {\r
-                       get { return XsdOrderedFacet.Total; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Double; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (double); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToDouble (Normalize (s));\r
-               }\r
-\r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       if ((x is double) && (y is double)) {\r
-                               if ((double)x==(double)y) {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                               else if ((double)x<(double)y) {\r
-                                       return XsdOrdering.LessThan;\r
-               }\r
-                               else {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-               \r
-       }\r
-\r
-       // xs:base64Binary\r
-       internal class XsdBase64Binary : XsdString\r
-       {\r
-               internal XsdBase64Binary ()\r
-               {\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Base64Binary; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (byte[]); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       // If it isnt ASCII it isnt valid base64 data\r
-                       byte[] inArr = new System.Text.ASCIIEncoding().GetBytes(s);\r
-                       FromBase64Transform t = new FromBase64Transform();\r
-                       return t.TransformFinalBlock(inArr, 0, inArr.Length);\r
-               }\r
-\r
-\r
-               internal override int Length(string s) {\r
-                       int length = 0;\r
-                       int pad = 0;\r
-                       int end = s.Length;\r
-                       for (int i = 0; i < end; i++) {\r
-                         char c = s[i];\r
-                               if (!Char.IsWhiteSpace(c)) {\r
-                                       if (isData(c))\r
-                                               length ++;\r
-                                       else if (isPad(c)) \r
-                                               pad++;                                  \r
-                                       else \r
-                                         return -1;   // Invalid characters\r
-                               }       \r
-                       }\r
-                       if (pad > 2) \r
-                         return -1; // Max 2 padding at the end.\r
-                       if (pad > 0) \r
-                         pad = 3-pad;                          \r
-                       \r
-                 return ((length/4)*3)+pad;\r
-               }       \r
-\r
-/* TODO: Use the Base64Table and similar code when it makes it \r
- * out of System.Security.Cryptography (currently internal so I \r
- * don't think we can use it).\r
- * \r
- */\r
-                       private static string ALPHABET =\r
-                               "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";\r
-\r
-                       private static byte[] decodeTable;\r
-                       static XsdBase64Binary ()\r
-                       {\r
-                               int len = ALPHABET.Length;\r
-\r
-                               decodeTable = new byte [1 + (int)'z'];\r
-\r
-                               for (int i=0; i < decodeTable.Length; i++) {\r
-                                       decodeTable [i] = Byte.MaxValue;\r
-                               }\r
-\r
-                               for (int i=0; i < len; i++) {\r
-                                       char ch = ALPHABET [i];\r
-                                       decodeTable [(int)ch] = (byte) i;\r
-                               }\r
-                       }\r
-       \r
-               protected static bool isPad(char octect) {\r
-                       return (octect == '=');\r
-               }\r
-                                                                                       \r
-               protected static bool isData(char octect) {\r
-                       return ((octect <= 'z') && (decodeTable[octect] != Byte.MaxValue));\r
-               }\r
-\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);\r
-               }\r
-       }\r
-\r
-       \r
-       // xs:hexBinary\r
-       internal class XsdHexBinary : XsdAnySimpleType\r
-       {\r
-               internal XsdHexBinary ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-\r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return stringAllowedFacets; } \r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.HexBinary; }\r
-               }\r
-#endif\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.None; }\r
-               }\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (byte []); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return XmlConvert.FromBinHexString (Normalize (s));\r
-               }\r
-               \r
-               internal override int Length(string s) {\r
-                 return s.Length / 2 + s.Length % 2 ;   // Not sure if odd lengths are even allowed\r
-    }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);\r
-               }\r
-\r
-               // Fundamental Facets ... no need to override\r
-       }\r
-\r
-       // xs:QName\r
-       internal class XsdQName : XsdName\r
-       {\r
-               internal XsdQName ()\r
-               {\r
-               }\r
-\r
-               // Fundamental facets are the same as anySimpleType.\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.QName; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.QName; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (XmlQualifiedName); }\r
-               }\r
-\r
-               // ParseValue () method is as same as that of xs:string\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       if (nameTable == null)\r
-                               throw new ArgumentNullException ("name table");\r
-                       if (nsmgr == null)\r
-                               throw new ArgumentNullException ("namespace manager");\r
-                       XmlQualifiedName name = XmlQualifiedName.Parse (s, nsmgr);\r
-                       nameTable.Add (name.Name);\r
-                       nameTable.Add (name.Namespace);\r
-                       return name;\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return new QNameValueType (ParseValue (s, nameTable, nsmgr) as XmlQualifiedName);\r
-               }\r
-       }\r
-\r
-       // xs:boolean\r
-       internal class XsdBoolean : XsdAnySimpleType\r
-       {\r
-               internal XsdBoolean ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-\r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return booleanAllowedFacets; } \r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-#if BUGGY_MS_COMPLIANT\r
-                       get { return XmlTokenizedType.None; }\r
-#else\r
-                       get { return XmlTokenizedType.CDATA; }\r
-#endif\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Boolean; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (bool); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToBoolean (this.Normalize (s));\r
-               }\r
-\r
-               // Fundamental Facets\r
-               public override bool Bounded {\r
-                       get { return false; }\r
-               }\r
-               public override bool Finite {\r
-                       get { return true; }\r
-               }\r
-               public override bool Numeric {\r
-                       get { return false; }\r
-               }\r
-               public override XsdOrderedFacet Ordered {\r
-                       get { return XsdOrderedFacet.Total; }\r
-               }\r
-               \r
-               \r
-       }\r
-\r
-       // xs:anyURI\r
-       internal class XsdAnyURI : XsdString\r
-       {\r
-               public override XmlTokenizedType TokenizedType {\r
-\r
-                       get { return XmlTokenizedType.CDATA; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.AnyUri; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (Uri); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return new XmlSchemaUri (Normalize (s));\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return new UriValueType ((XmlSchemaUri) ParseValue (s, nameTable, nsmgr));\r
-               }\r
-       }\r
-\r
-       internal class XmlSchemaUri : Uri\r
-       {\r
-               public string value;\r
-\r
-               static bool HasValidScheme (string src)\r
-               {\r
-                       int idx = src.IndexOf (':');\r
-                       if (idx < 0)\r
-                               return false;\r
-                       for (int i = 0; i < idx; i++) {\r
-                               switch (src [i]) {\r
-                               case '+':\r
-                               case '-':\r
-                               case '.':\r
-                                       continue;\r
-                               default:\r
-                                       if (Char.IsLetterOrDigit (src [i]))\r
-                                               continue;\r
-                                       return false;\r
-                               }\r
-                       }\r
-                       return true;\r
-               }\r
-\r
-               // MS BUG: Some strings that contain ':' might result in \r
-               // exception (MS.NET looks implemented as such).\r
-               public XmlSchemaUri (string src)\r
-                       : this (src, HasValidScheme (src))\r
-               {\r
-               }\r
-\r
-               private XmlSchemaUri (string src, bool formal)\r
-                       : base (formal ? src : "anyuri:" + src, !formal)\r
-               {\r
-                       value = src;\r
-               }\r
-\r
-               public static bool operator == (XmlSchemaUri v1, XmlSchemaUri v2)\r
-               {\r
-                       return v1.value == v2.value;\r
-               }\r
-\r
-               public static bool operator != (XmlSchemaUri v1, XmlSchemaUri v2)\r
-               {\r
-                       return v1.value != v2.value;\r
-               }\r
-\r
-               public override bool Equals (object obj)\r
-               {\r
-                       if (obj is XmlSchemaUri)\r
-                               return (XmlSchemaUri) obj == this;\r
-                       else\r
-                               return false;\r
-               }\r
-\r
-               public override int GetHashCode () \r
-               {\r
-                       return value.GetHashCode ();\r
-               }\r
-\r
-               public override string ToString ()\r
-               {\r
-                       return value;\r
-               }\r
-       }\r
-\r
-       // xs:duration\r
-       internal class XsdDuration : XsdAnySimpleType\r
-       {\r
-               internal XsdDuration ()\r
-               {\r
-      this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-\r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return durationAllowedFacets; } \r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.CDATA; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Duration; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (TimeSpan); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToTimeSpan (Normalize (s));\r
-               }\r
-\r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       /* FIXME: This is really simple so far \r
-                        *\r
-                        * In fact in order to do this correctly in XmlSchema, we cannot use TimeSpan as the base type\r
-                        * Though it turns out that MS .NET is a little broken in this regard too. Not doing comparisons \r
-                        * correctly.\r
-                        */\r
-                       if ((x is TimeSpan) && (y is TimeSpan)) {\r
-                               int ret = TimeSpan.Compare((TimeSpan)x, (TimeSpan)y);\r
-                               if (ret < 0) { \r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else if (ret > 0) {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-\r
-               \r
-               // Fundamental Facets\r
-               public override bool Bounded {\r
-                       get { return false; }\r
-               }\r
-               public override bool Finite {\r
-                       get { return false; }\r
-               }\r
-               public override bool Numeric {\r
-                       get { return false; }\r
-               }\r
-               public override XsdOrderedFacet Ordered {\r
-                       get { return XsdOrderedFacet.Partial; }\r
-        \r
-               }\r
-       }\r
-\r
-#if NET_2_0\r
-       // xdt:dayTimeDuration\r
-       internal class XdtDayTimeDuration : XsdDuration\r
-       {\r
-               internal XdtDayTimeDuration ()\r
-               {\r
-               }\r
-\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.DayTimeDuration; }\r
-               }\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (TimeSpan); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToTimeSpan (Normalize (s));\r
-               }\r
-\r
-               // FIXME: Fundamental Facets\r
-               public override bool Bounded {\r
-                       get { return false; }\r
-               }\r
-               public override bool Finite {\r
-                       get { return false; }\r
-               }\r
-               public override bool Numeric {\r
-                       get { return false; }\r
-               }\r
-               public override XsdOrderedFacet Ordered {\r
-                       get { return XsdOrderedFacet.Partial; }\r
-        \r
-               }\r
-       }\r
-\r
-       // xdt:yearMonthDuration\r
-       internal class XdtYearMonthDuration : XsdDuration\r
-       {\r
-               internal XdtYearMonthDuration ()\r
-               {\r
-               }\r
-\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.YearMonthDuration; }\r
-               }\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (TimeSpan); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToTimeSpan (Normalize (s));\r
-               }\r
-\r
-               // FIXME: Fundamental Facets\r
-               public override bool Bounded {\r
-                       get { return false; }\r
-               }\r
-               public override bool Finite {\r
-                       get { return false; }\r
-               }\r
-               public override bool Numeric {\r
-                       get { return false; }\r
-               }\r
-               public override XsdOrderedFacet Ordered {\r
-                       get { return XsdOrderedFacet.Partial; }\r
-        \r
-               }\r
-       }\r
-#endif\r
-\r
-       // xs:dateTime\r
-       internal class XsdDateTime : XsdAnySimpleType\r
-       {\r
-               internal XsdDateTime ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-\r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return durationAllowedFacets; } \r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.CDATA; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.DateTime; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (DateTime); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return XmlConvert.ToDateTime (Normalize (s));\r
-               }\r
-\r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       /* Really simple so far */\r
-                       if ((x is DateTime) && (y is DateTime)) {\r
-                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);\r
-                               if (ret < 0) { \r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else if (ret > 0) {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-\r
-               // Fundamental Facets\r
-               public override bool Bounded {\r
-                       get { return false; }\r
-               }\r
-               public override bool Finite {\r
-                       get { return false; }\r
-               }\r
-               public override bool Numeric {\r
-                       get { return false; }\r
-               }\r
-               public override XsdOrderedFacet Ordered {\r
-                       get { return XsdOrderedFacet.Partial; }\r
-               }\r
-               \r
-       }\r
-\r
-       // xs:date\r
-       internal class XsdDate : XsdAnySimpleType\r
-       {\r
-               internal XsdDate ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-    \r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return durationAllowedFacets; } \r
-               }\r
-               \r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.CDATA; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Date; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (DateTime); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return DateTime.ParseExact (Normalize (s), "yyyy-MM-dd", null);\r
-               }\r
-\r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       /* Really simple so far */\r
-                       if ((x is DateTime) && (y is DateTime)) {\r
-                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);\r
-                               if (ret < 0) { \r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else if (ret > 0) {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-               // Fundamental Facets ... no need to override except for Ordered.\r
-               public override XsdOrderedFacet Ordered {\r
-                       get { return XsdOrderedFacet.Partial; }\r
-               }\r
-               \r
-       }\r
-\r
-       // xs:time\r
-       internal class XsdTime : XsdAnySimpleType\r
-       {\r
-               static string [] timeFormats = new string [] {\r
-                         // copied from XmlConvert.\r
-                         "HH:mm:ss",\r
-                         "HH:mm:ss.f",\r
-                         "HH:mm:ss.ff",\r
-                         "HH:mm:ss.fff",\r
-                         "HH:mm:ss.ffff",\r
-                         "HH:mm:ss.fffff",\r
-                         "HH:mm:ss.ffffff",\r
-                         "HH:mm:ss.fffffff",\r
-                         "HH:mm:sszzz",\r
-                         "HH:mm:ss.fzzz",\r
-                         "HH:mm:ss.ffzzz",\r
-                         "HH:mm:ss.fffzzz",\r
-                         "HH:mm:ss.ffffzzz",\r
-                         "HH:mm:ss.fffffzzz",\r
-                         "HH:mm:ss.ffffffzzz",\r
-                         "HH:mm:ss.fffffffzzz",\r
-                         "HH:mm:ssZ",\r
-                         "HH:mm:ss.fZ",\r
-                         "HH:mm:ss.ffZ",\r
-                         "HH:mm:ss.fffZ",\r
-                         "HH:mm:ss.ffffZ",\r
-                         "HH:mm:ss.fffffZ",\r
-                         "HH:mm:ss.ffffffZ",\r
-                         "HH:mm:ss.fffffffZ"};\r
-\r
-               internal XsdTime ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-\r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return durationAllowedFacets; } \r
-               }\r
-\r
-               public override XmlTokenizedType TokenizedType {\r
-                       get { return XmlTokenizedType.CDATA; }\r
-               }\r
-\r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.Time; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (DateTime); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return DateTime.ParseExact (Normalize (s), timeFormats, null, DateTimeStyles.None);\r
-               }\r
-\r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       /* Really simple so far */\r
-                       if ((x is DateTime) && (y is DateTime)) {\r
-                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);\r
-                               if (ret < 0) { \r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else if (ret > 0) {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-               // Fundamental Facets ... no need to override except for Ordered.\r
-               public override XsdOrderedFacet Ordered {\r
-                       get { return XsdOrderedFacet.Partial; }\r
-               }\r
-               \r
-       }\r
-\r
-       // xs:gYearMonth\r
-       internal class XsdGYearMonth : XsdAnySimpleType\r
-       {\r
-               internal XsdGYearMonth ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-    \r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return durationAllowedFacets; } \r
-               }\r
-               \r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.GYearMonth; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (DateTime); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return DateTime.ParseExact (Normalize (s), "yyyy-MM", null);\r
-               }\r
-               \r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       /* Really simple so far */\r
-                       if ((x is DateTime) && (y is DateTime)) {\r
-                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);\r
-                               if (ret < 0) { \r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else if (ret > 0) {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-       }\r
-\r
-       // xs:gMonthDay\r
-       internal class XsdGMonthDay : XsdAnySimpleType\r
-       {\r
-               internal XsdGMonthDay ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-    \r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return durationAllowedFacets; } \r
-               }\r
-               \r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.GMonthDay; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (DateTime); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return DateTime.ParseExact (Normalize (s), "--MM-dd", null);\r
-               }\r
-               \r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       /* Really simple so far */\r
-                       if ((x is DateTime) && (y is DateTime)) {\r
-                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);\r
-                               if (ret < 0) { \r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else if (ret > 0) {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-       }\r
-\r
-       // xs:gYear\r
-       internal class XsdGYear : XsdAnySimpleType\r
-       {\r
-               internal XsdGYear ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-               \r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return durationAllowedFacets; } \r
-               }\r
-               \r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.GYear; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (DateTime); }\r
-               }\r
-\r
-               // LAMESPEC: XML Schema Datatypes allows leading '-' to identify B.C. years,\r
-               // but CLR DateTime does not allow such expression.\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return DateTime.ParseExact (Normalize(s), "yyyy", null);\r
-               }\r
-               \r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       /* Really simple so far */\r
-                       if ((x is DateTime) && (y is DateTime)) {\r
-                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);\r
-                               if (ret < 0) { \r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else if (ret > 0) {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-       }\r
-\r
-       // xs:gMonth\r
-       internal class XsdGMonth : XsdAnySimpleType\r
-       {\r
-               internal XsdGMonth ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-               \r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return durationAllowedFacets; } \r
-               }\r
-               \r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.GMonth; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (DateTime); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return DateTime.ParseExact (Normalize(s), "--MM--", null);\r
-               }\r
-               \r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       /* Really simple so far */\r
-                       if ((x is DateTime) && (y is DateTime)) {\r
-                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);\r
-                               if (ret < 0) { \r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else if (ret > 0) {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-       }\r
-\r
-       // xs:gDay\r
-       internal class XsdGDay : XsdAnySimpleType\r
-       {\r
-               internal XsdGDay ()\r
-               {\r
-                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;\r
-               }\r
-               \r
-               internal override XmlSchemaFacet.Facet AllowedFacets {\r
-                       get { return durationAllowedFacets; } \r
-               }\r
-               \r
-#if NET_2_0\r
-               public override XmlTypeCode TypeCode {\r
-                       get { return XmlTypeCode.GDay; }\r
-               }\r
-#endif\r
-\r
-               public override Type ValueType {\r
-                       get { return typeof (DateTime); }\r
-               }\r
-\r
-               public override object ParseValue (string s,\r
-                       XmlNameTable nameTable, NSResolver nsmgr)\r
-               {\r
-                       return ParseValueType (s, nameTable, nsmgr);\r
-               }\r
-\r
-               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) \r
-               {\r
-                       return DateTime.ParseExact (Normalize(s), "---dd", null);\r
-               }\r
-               \r
-               internal override XsdOrdering Compare(object x, object y) {\r
-                       /* Really simple so far */\r
-                       if ((x is DateTime) && (y is DateTime)) {\r
-                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);\r
-                               if (ret < 0) { \r
-                                       return XsdOrdering.LessThan;\r
-                               }\r
-                               else if (ret > 0) {\r
-                                       return XsdOrdering.GreaterThan;\r
-                               }\r
-                               else {\r
-                                       return XsdOrdering.Equal;\r
-                               }\r
-                       }\r
-                       return XsdOrdering.Indeterminate;\r
-               }\r
-       }\r
-\r
-}\r
+using System;
+using System.Collections;
+using System.Text;
+using System.Xml;
+using System.Xml.Schema;
+using System.Globalization;
+using System.Security.Cryptography;
+
+#if NET_2_0
+using NSResolver = System.Xml.IXmlNamespaceResolver;
+#else
+using NSResolver = System.Xml.XmlNamespaceManager;
+#endif
+
+
+namespace Mono.Xml.Schema
+{
+       internal enum XsdWhitespaceFacet
+       {
+               Preserve,
+               Replace,
+               Collapse
+       }
+
+       internal enum XsdOrderedFacet
+       {
+               False,
+               Partial,
+               Total
+       }
+
+       internal enum XsdOrdering 
+       {
+               LessThan = -1,
+               Equal = 0,
+               GreaterThan = 1,
+               Indeterminate = 2
+       }
+       
+       internal class XsdAnySimpleType : XmlSchemaDatatype
+       {
+               static XsdAnySimpleType instance;
+               static XsdAnySimpleType ()
+               {
+                       instance = new XsdAnySimpleType ();
+               }
+
+               public static XsdAnySimpleType Instance {
+                       get { return instance; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.AnyAtomicType; }
+               }
+#endif
+
+               static readonly char [] whitespaceArray = new char [] {' '};
+
+               // Fundamental Facets
+               public virtual bool Bounded {
+                       get { return false; }
+               }
+
+               public virtual bool Finite {
+                       get { return false; }
+               }
+
+               public virtual bool Numeric { 
+                       get { return false; }
+               }
+
+               public virtual XsdOrderedFacet Ordered { 
+                       get { return XsdOrderedFacet.False; }
+               }
+
+               public override Type ValueType {
+#if BUGGY_MS_COMPLIANT
+                       get { return typeof (string); }
+#else
+                       get { return typeof (object); }
+#endif
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get {
+                               return XmlTokenizedType.None;
+                       }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return Normalize (s);
+               }
+
+               internal override ValueType ParseValueType (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return new StringValueType (Normalize (s));
+               }
+
+               internal string [] ParseListValue (string s, XmlNameTable nameTable)
+               {
+                       return this.Normalize (s, XsdWhitespaceFacet.Collapse).Split (whitespaceArray);
+               }
+               
+       
+
+                       // Can you even use XsdAnySimpleType in a schema?
+                       // -> Yes. See E1-22 of http://www.w3.org/2001/05/xmlschema-errata#Errata1 (somewhat paranoid ;-)
+               
+               internal bool AllowsFacet(XmlSchemaFacet xsf) {
+                       return (AllowedFacets & xsf.ThisFacet)!=0;
+               }
+
+
+
+               internal virtual XsdOrdering Compare(object x, object y) {
+                       return XsdOrdering.Indeterminate;
+                       }
+       
+               internal virtual int Length(string s) {
+                       return s.Length;
+               }
+
+               
+               // anySimpleType allows any facet
+               internal virtual XmlSchemaFacet.Facet AllowedFacets {
+                       get { return XmlSchemaFacet.AllFacets ;}
+               }
+
+               /* Matches facets allowed on boolean type
+                */
+               internal static readonly XmlSchemaFacet.Facet booleanAllowedFacets = 
+                                        XmlSchemaFacet.Facet.pattern | XmlSchemaFacet.Facet.whiteSpace;
+
+               /* Matches facets allowed on decimal type. 
+                */
+               internal static readonly XmlSchemaFacet.Facet decimalAllowedFacets = 
+                                                       XmlSchemaFacet.Facet.pattern | XmlSchemaFacet.Facet.enumeration | 
+                                                       XmlSchemaFacet.Facet.whiteSpace | XmlSchemaFacet.Facet.maxInclusive | 
+                                                       XmlSchemaFacet.Facet.minInclusive | XmlSchemaFacet.Facet.maxExclusive | 
+                                                       XmlSchemaFacet.Facet.minExclusive | XmlSchemaFacet.Facet.fractionDigits | 
+                                                       XmlSchemaFacet.Facet.totalDigits ;
+
+               /* Matches facets allowed on float, double, duration, dateTime, time, date,
+                * gYearMonth, gYear, gMonthDay, gMonth, and gDay types
+                */
+
+               internal static readonly XmlSchemaFacet.Facet durationAllowedFacets = 
+                                                       XmlSchemaFacet.Facet.pattern | XmlSchemaFacet.Facet.enumeration | 
+                                                       XmlSchemaFacet.Facet.whiteSpace | XmlSchemaFacet.Facet.maxInclusive |
+                                                       XmlSchemaFacet.Facet.minInclusive | XmlSchemaFacet.Facet.maxExclusive |
+                                                       XmlSchemaFacet.Facet.minExclusive ;
+
+               /* Matches facet allowed on string, hexBinary, base64Binary,
+                * anyURI, QName and NOTATION types 
+                *
+                * Also used on list types
+                */
+
+               internal static readonly XmlSchemaFacet.Facet stringAllowedFacets = 
+                                                XmlSchemaFacet.Facet.length | XmlSchemaFacet.Facet.minLength |
+                                                XmlSchemaFacet.Facet.maxLength | XmlSchemaFacet.Facet.pattern | 
+                                                XmlSchemaFacet.Facet.enumeration | XmlSchemaFacet.Facet.whiteSpace; 
+       }
+
+#if NET_2_0
+       internal class XdtAnyAtomicType : XsdAnySimpleType
+       {
+               internal XdtAnyAtomicType ()
+               {
+               }
+
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.AnyAtomicType; }
+               }
+       }
+
+       internal class XdtUntypedAtomic : XdtAnyAtomicType
+       {
+               internal XdtUntypedAtomic ()
+               {
+               }
+
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.UntypedAtomic; }
+               }
+       }
+#endif
+
+       // xs:string
+       internal class XsdString : XsdAnySimpleType
+       {
+               internal XsdString ()
+               {
+               }
+
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return stringAllowedFacets; } 
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.CDATA; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.String; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string); }
+               }
+
+               // Fundamental Facets
+               public override bool Bounded {
+                       get { return false; }
+               }
+               public override bool Finite {
+                       get { return false; }
+               }
+               public override bool Numeric {
+                       get { return false; }
+               }
+               public override XsdOrderedFacet Ordered {
+                       get { return XsdOrderedFacet.False; }
+               }
+
+       }
+
+       // xs:normalizedString
+       internal class XsdNormalizedString : XsdString
+       {
+               internal XsdNormalizedString ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Replace;
+               }
+
+               public override XmlTokenizedType TokenizedType {
+
+                       get { return XmlTokenizedType.CDATA; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.NormalizedString; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string); }
+               }
+
+               // ParseValue () method is as same as that of xs:string
+       }
+
+       // xs:token
+       internal class XsdToken : XsdNormalizedString
+       {
+               internal XsdToken ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.CDATA; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Token; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string); }
+               }
+
+               // ParseValue () method is as same as that of xs:string
+       }
+
+       // xs:language
+       internal class XsdLanguage : XsdToken
+       {
+               internal XsdLanguage ()
+               {
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.CDATA; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Language; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string); }
+               }
+
+               // ParseValue () method is as same as that of xs:string
+       }
+
+       // xs;NMTOKEN
+       internal class XsdNMToken : XsdToken
+       {
+               internal XsdNMToken ()
+               {
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.NMTOKEN; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.NmToken; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       if (!XmlChar.IsNmToken (s))
+                               throw new ArgumentException ("'" + s + "' is an invalid NMTOKEN.");
+                       return s;
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
+               }
+       }
+
+       // xs:NMTOKENS
+       internal class XsdNMTokens : XsdNMToken
+       {
+               internal XsdNMTokens ()
+               {
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.NMTOKENS; }
+               }
+
+#if NET_2_0
+               [MonoTODO]
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Item; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string []); }
+               }
+
+               public override object ParseValue (string value, XmlNameTable nt, NSResolver nsmgr)
+               {
+                       return GetValidatedArray (value, nt);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return new StringArrayValueType (GetValidatedArray (s, nameTable));
+               }
+
+               private string [] GetValidatedArray (string value, XmlNameTable nt)
+               {
+                       string [] nmtokens = ParseListValue (value, nt);
+                       for (int i = 0; i < nmtokens.Length; i++)
+                               if (!XmlChar.IsNmToken (nmtokens [i]))
+                                       throw new ArgumentException ("Invalid name token.");
+                       return nmtokens;
+               }
+       }
+
+       // xs:Name
+       internal class XsdName : XsdToken
+       {
+               internal XsdName ()
+               {
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.CDATA; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Name; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       if (!XmlChar.IsName (s))
+                               throw new ArgumentException ("'" + s + "' is an invalid name.");
+                       return s;
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
+               }
+       }
+
+       // xs:NCName
+       internal class XsdNCName : XsdName
+       {
+               internal XsdNCName ()
+               {
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.NCName; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.NCName; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       if (!XmlChar.IsNCName (s))
+                               throw new ArgumentException ("'" + s + "' is an invalid NCName.");
+                       return s;
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
+               }
+       }
+
+       // xs:ID
+       internal class XsdID : XsdName
+       {
+               internal XsdID ()
+               {
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.ID; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Id; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string); }
+               }
+
+               public override object ParseValue (string s, XmlNameTable nt, NSResolver nsmgr)
+               {
+                       if (!XmlChar.IsNCName (s))
+                               throw new ArgumentException ("'" + s + "' is an invalid NCName.");
+                       return s;
+               }
+       }
+
+       // xs:IDREF
+       internal class XsdIDRef : XsdName
+       {
+               internal XsdIDRef ()
+               {
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.IDREF; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Idref; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string); }
+               }
+
+               public override object ParseValue (string s, XmlNameTable nt, NSResolver nsmgr)
+               {
+                       if (!XmlChar.IsNCName (s))
+                               throw new ArgumentException ("'" + s + "' is an invalid NCName.");
+                       return s;
+               }
+       }
+
+       // xs:IDREFS
+       internal class XsdIDRefs : XsdName
+       {
+               internal XsdIDRefs ()
+               {
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.IDREFS; }
+               }
+
+#if NET_2_0
+               [MonoTODO]
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Item; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string []); }
+               }
+
+               public override object ParseValue (string value, XmlNameTable nt, NSResolver nsmgr)
+               {
+                       return GetValidatedArray (value, nt);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return new StringArrayValueType (GetValidatedArray (s, nameTable));
+               }
+
+               private string [] GetValidatedArray (string value, XmlNameTable nt)
+               {
+                       string [] idrefs = ParseListValue (value, nt);
+                       for (int i = 0; i < idrefs.Length; i++)
+                               XmlConvert.VerifyNCName (idrefs [i]);
+                       return idrefs;
+               }
+       }
+
+       // xs:ENTITY
+       internal class XsdEntity : XsdName
+       {
+               internal XsdEntity ()
+               {
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.ENTITY; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Entity; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string); }
+               }
+
+
+       }
+
+
+       // xs:ENTITIES
+       internal class XsdEntities : XsdName
+       {
+               internal XsdEntities ()
+               {
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.ENTITIES; }
+               }
+
+#if NET_2_0
+               [MonoTODO]
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Item; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string []); }
+               }
+
+               public override object ParseValue (string value, XmlNameTable nt, NSResolver nsmgr)
+               {
+                       return GetValidatedArray (value, nt);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return new StringArrayValueType (GetValidatedArray (s, nameTable));
+               }
+
+               private string [] GetValidatedArray (string value, XmlNameTable nt)
+               {
+                       string [] entities = ParseListValue (value, nt);
+                       for (int i = 0; i < entities.Length; i++)
+                               if (!XmlChar.IsName (entities [i]))
+                                       throw new ArgumentException ("Invalid entitiy name.");
+                       return entities;
+               }
+       }
+
+       // xs:NOTATION
+       internal class XsdNotation : XsdAnySimpleType
+       {
+               internal XsdNotation ()
+               {
+               }
+
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return stringAllowedFacets; } 
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.NOTATION; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Notation; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (string); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return Normalize (s);
+               }
+
+               // Fundamental Facets
+               public override bool Bounded {
+                       get { return false; }
+               }
+               public override bool Finite {
+                       get { return false; }
+               }
+               public override bool Numeric {
+                       get { return false; }
+               }
+               public override XsdOrderedFacet Ordered {
+                       get { return XsdOrderedFacet.False; }
+               }
+
+       }
+
+       // xs:decimal
+       internal class XsdDecimal : XsdAnySimpleType
+       {
+               internal XsdDecimal ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return decimalAllowedFacets; } 
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.None; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Decimal; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (decimal); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToDecimal (this.Normalize (s));
+               }
+        
+               internal override XsdOrdering Compare(object x, object y) {
+                       if ((x is Decimal) && (y is Decimal)) {
+                               int ret = Decimal.Compare((Decimal)x, (Decimal)y);
+                               if (ret < 0) { 
+                                       return XsdOrdering.LessThan;
+                               }
+                               else if (ret > 0) {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                               else {
+                                       return XsdOrdering.Equal;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+               
+               // Fundamental Facets
+               public override bool Bounded {
+                       get { return false; }
+               }
+               public override bool Finite {
+                       get { return false; }
+               }
+               public override bool Numeric {
+                       get { return true; }
+               }
+               public override XsdOrderedFacet Ordered {
+                       get { return XsdOrderedFacet.Total; }
+               }
+
+       }
+
+       // xs:integer
+       internal class XsdInteger : XsdDecimal
+       {
+               public XsdInteger ()
+               {
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Integer; }
+               }
+#endif
+
+               // Here it may be bigger than int's (or long's) MaxValue.
+               public override Type ValueType {
+                       get { return typeof (decimal); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       decimal d = XmlConvert.ToDecimal (Normalize (s));
+                       if (Decimal.Floor (d) != d)
+                               throw new FormatException ("Integer contains point number.");
+                       return d;
+               }
+        
+               
+       
+       }
+
+       // xs:Long
+       internal class XsdLong : XsdInteger
+       {
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Long; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (long); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToInt64 (Normalize (s));
+               }
+               
+               internal override XsdOrdering Compare(object x, object y) {
+                       if ((x is long) && (y is long)) {
+                               if ((long)x==(long)y) {
+                                       return XsdOrdering.Equal;
+                               }
+                               else if ((long)x<(long)y) {
+                                       return XsdOrdering.LessThan;
+                               }
+                               else {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+       }
+
+       // xs:Int
+       internal class XsdInt : XsdLong
+       {
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Int; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (int); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToInt32 (Normalize (s));
+               }
+
+               internal override XsdOrdering Compare(object x, object y) {
+                       if ((x is int) && (y is int)) {
+                               if ((int)x==(int)y) {
+                                       return XsdOrdering.Equal;
+                               }
+                               else if ((int)x<(int)y) {
+                                       return XsdOrdering.LessThan;
+                               }
+                               else {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+       }
+
+
+       // xs:Short
+       internal class XsdShort : XsdInt
+       {
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Short; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (short); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToInt16 (Normalize (s));
+               }
+
+               internal override XsdOrdering Compare(object x, object y) {
+                       if ((x is short) && (y is short)) {
+                               if ((short)x==(short)y) {
+                                       return XsdOrdering.Equal;
+                               }
+                               else if ((short)x<(short)y) {
+                                       return XsdOrdering.LessThan;
+                               }
+                               else {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+       }
+
+       // xs:Byte
+       internal class XsdByte : XsdShort
+       {
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Byte; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (sbyte); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToSByte (Normalize (s));
+               }
+
+               internal override XsdOrdering Compare(object x, object y) {
+                       if ((x is sbyte) && (y is sbyte)) {
+                               if ((sbyte)x==(sbyte)y) {
+                                       return XsdOrdering.Equal;
+                               }
+                               else if ((sbyte)x<(sbyte)y) {
+                                       return XsdOrdering.LessThan;
+                               }
+                               else {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+       }
+
+       // xs:nonNegativeInteger
+//     [CLSCompliant (false)]
+       internal class XsdNonNegativeInteger : XsdInteger
+       {
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.NonNegativeInteger; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (decimal); }
+               }
+
+//             [CLSCompliant (false)]
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToDecimal (Normalize (s));
+               }
+       }
+
+       // xs:unsignedLong
+//     [CLSCompliant (false)]
+       internal class XsdUnsignedLong : XsdNonNegativeInteger
+       {
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.UnsignedLong; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (ulong); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToUInt64 (Normalize (s));
+               }
+
+               internal override XsdOrdering Compare(object x, object y) {
+                       if ((x is ulong) && (y is ulong)) {
+                               if ((ulong)x==(ulong)y) {
+                                       return XsdOrdering.Equal;
+                               }
+                               else if ((ulong)x<(ulong)y) {
+                                       return XsdOrdering.LessThan;
+                               }
+                               else {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+       }
+
+       // xs:unsignedInt
+//     [CLSCompliant (false)]
+       internal class XsdUnsignedInt : XsdUnsignedLong
+       {
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.UnsignedInt; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (uint); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToUInt32 (Normalize (s));
+               }
+
+               internal override XsdOrdering Compare(object x, object y) {
+                       if ((x is uint) && (y is uint)) {
+                               if ((uint)x==(uint)y) {
+                                       return XsdOrdering.Equal;
+                               }
+                               else if ((uint)x<(uint)y) {
+                                       return XsdOrdering.LessThan;
+                               }
+                               else {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+       }
+
+
+       // xs:unsignedShort
+//     [CLSCompliant (false)]
+       internal class XsdUnsignedShort : XsdUnsignedInt
+       {
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.UnsignedShort; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (ushort); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToUInt16 (Normalize (s));
+               }
+
+               internal override XsdOrdering Compare(object x, object y) {
+                       if ((x is ushort) && (y is ushort)) {
+                               if ((ushort)x==(ushort)y) {
+                                       return XsdOrdering.Equal;
+                               }
+                               else if ((ushort)x<(ushort)y) {
+                                       return XsdOrdering.LessThan;
+                               }
+                               else {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+       }
+
+       // xs:unsignedByte
+//     [CLSCompliant (false)]
+       internal class XsdUnsignedByte : XsdUnsignedShort
+       {
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.UnsignedByte; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (byte); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToByte(Normalize (s));
+               }
+
+               internal override XsdOrdering Compare(object x, object y) {
+                       if ((x is byte) && (y is byte)) {
+                               if ((byte)x==(byte)y) {
+                                       return XsdOrdering.Equal;
+                               }
+                               else if ((byte)x<(byte)y) {
+                                       return XsdOrdering.LessThan;
+                               }
+                               else {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+       }
+
+
+       // xs:positiveInteger
+//     [CLSCompliant (false)]
+       internal class XsdPositiveInteger : XsdNonNegativeInteger
+       {
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.PositiveInteger; }
+               }
+#endif
+
+               // It returns decimal, instead of int or long.
+               // Maybe MS developers thought about big integer...
+               public override Type ValueType {
+                       get { return typeof (decimal); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToDecimal (Normalize (s));
+               }
+       }
+
+       // xs:nonPositiveInteger
+       internal class XsdNonPositiveInteger : XsdInteger
+       {
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.NonPositiveInteger; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (decimal); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToDecimal (Normalize (s));
+               }
+       }
+
+       // xs:negativeInteger
+       internal class XsdNegativeInteger : XsdNonPositiveInteger
+       {
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.NegativeInteger; }
+               }
+#endif
+
+               public override Type ValueType {
+
+                       get { return typeof (decimal); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToDecimal (Normalize (s));
+               }
+       }
+
+       // xs:float
+       internal class XsdFloat : XsdAnySimpleType
+       {
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Float; }
+               }
+#endif
+
+               internal XsdFloat ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+    
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return durationAllowedFacets; } 
+               }
+               
+               // Fundamental Facets
+               public override bool Bounded {
+                       get { return true; }
+               }
+               public override bool Finite {
+                       get { return true; }
+               }
+               public override bool Numeric {
+                       get { return true; }
+               }
+               public override XsdOrderedFacet Ordered {
+                       get { return XsdOrderedFacet.Total; }
+               }
+
+               public override Type ValueType {
+                       get { return typeof (float); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToSingle (Normalize (s));
+               }
+
+               internal override XsdOrdering Compare(object x, object y) {
+                       if ((x is float) && (y is float)) {
+                               if ((float)x==(float)y) {
+                                       return XsdOrdering.Equal;
+                               }
+                               else if ((float)x<(float)y) {
+                                       return XsdOrdering.LessThan;
+                               }
+                               else {
+                                       return XsdOrdering.GreaterThan;
+                               }
+               }
+                       return XsdOrdering.Indeterminate;
+               }
+               
+       }
+
+       // xs:double
+       internal class XsdDouble : XsdAnySimpleType
+       {
+               internal XsdDouble ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+    
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return durationAllowedFacets; } 
+               }
+               
+               // Fundamental Facets
+               public override bool Bounded {
+                       get { return true; }
+               }
+               public override bool Finite {
+                       get { return true; }
+               }
+               public override bool Numeric {
+                       get { return true; }
+               }
+               public override XsdOrderedFacet Ordered {
+                       get { return XsdOrderedFacet.Total; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Double; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (double); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToDouble (Normalize (s));
+               }
+
+               internal override XsdOrdering Compare(object x, object y) {
+                       if ((x is double) && (y is double)) {
+                               if ((double)x==(double)y) {
+                                       return XsdOrdering.Equal;
+                               }
+                               else if ((double)x<(double)y) {
+                                       return XsdOrdering.LessThan;
+               }
+                               else {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+               
+       }
+
+       // xs:base64Binary
+       internal class XsdBase64Binary : XsdString
+       {
+               internal XsdBase64Binary ()
+               {
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Base64Binary; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (byte[]); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       // If it isnt ASCII it isnt valid base64 data
+                       byte[] inArr = new System.Text.ASCIIEncoding().GetBytes(s);
+                       FromBase64Transform t = new FromBase64Transform();
+                       return t.TransformFinalBlock(inArr, 0, inArr.Length);
+               }
+
+
+               internal override int Length(string s) {
+                       int length = 0;
+                       int pad = 0;
+                       int end = s.Length;
+                       for (int i = 0; i < end; i++) {
+                         char c = s[i];
+                               if (!Char.IsWhiteSpace(c)) {
+                                       if (isData(c))
+                                               length ++;
+                                       else if (isPad(c)) 
+                                               pad++;                                  
+                                       else 
+                                         return -1;   // Invalid characters
+                               }       
+                       }
+                       if (pad > 2) 
+                         return -1; // Max 2 padding at the end.
+                       if (pad > 0) 
+                         pad = 3-pad;                          
+                       
+                 return ((length/4)*3)+pad;
+               }       
+
+/* TODO: Use the Base64Table and similar code when it makes it 
+ * out of System.Security.Cryptography (currently internal so I 
+ * don't think we can use it).
+ * 
+ */
+                       private static string ALPHABET =
+                               "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+                       private static byte[] decodeTable;
+                       static XsdBase64Binary ()
+                       {
+                               int len = ALPHABET.Length;
+
+                               decodeTable = new byte [1 + (int)'z'];
+
+                               for (int i=0; i < decodeTable.Length; i++) {
+                                       decodeTable [i] = Byte.MaxValue;
+                               }
+
+                               for (int i=0; i < len; i++) {
+                                       char ch = ALPHABET [i];
+                                       decodeTable [(int)ch] = (byte) i;
+                               }
+                       }
+       
+               protected static bool isPad(char octect) {
+                       return (octect == '=');
+               }
+                                                                                       
+               protected static bool isData(char octect) {
+                       return ((octect <= 'z') && (decodeTable[octect] != Byte.MaxValue));
+               }
+
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
+               }
+       }
+
+       
+       // xs:hexBinary
+       internal class XsdHexBinary : XsdAnySimpleType
+       {
+               internal XsdHexBinary ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return stringAllowedFacets; } 
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.HexBinary; }
+               }
+#endif
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.None; }
+               }
+
+               public override Type ValueType {
+                       get { return typeof (byte []); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return XmlConvert.FromBinHexString (Normalize (s));
+               }
+               
+               internal override int Length(string s) {
+                 return s.Length / 2 + s.Length % 2 ;   // Not sure if odd lengths are even allowed
+    }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return new StringValueType (ParseValue (s, nameTable, nsmgr) as string);
+               }
+
+               // Fundamental Facets ... no need to override
+       }
+
+       // xs:QName
+       internal class XsdQName : XsdName
+       {
+               internal XsdQName ()
+               {
+               }
+
+               // Fundamental facets are the same as anySimpleType.
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.QName; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.QName; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (XmlQualifiedName); }
+               }
+
+               // ParseValue () method is as same as that of xs:string
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       if (nameTable == null)
+                               throw new ArgumentNullException ("name table");
+                       if (nsmgr == null)
+                               throw new ArgumentNullException ("namespace manager");
+                       XmlQualifiedName name = XmlQualifiedName.Parse (s, nsmgr);
+                       nameTable.Add (name.Name);
+                       nameTable.Add (name.Namespace);
+                       return name;
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return new QNameValueType (ParseValue (s, nameTable, nsmgr) as XmlQualifiedName);
+               }
+       }
+
+       // xs:boolean
+       internal class XsdBoolean : XsdAnySimpleType
+       {
+               internal XsdBoolean ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return booleanAllowedFacets; } 
+               }
+
+               public override XmlTokenizedType TokenizedType {
+#if BUGGY_MS_COMPLIANT
+                       get { return XmlTokenizedType.None; }
+#else
+                       get { return XmlTokenizedType.CDATA; }
+#endif
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Boolean; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (bool); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToBoolean (this.Normalize (s));
+               }
+
+               // Fundamental Facets
+               public override bool Bounded {
+                       get { return false; }
+               }
+               public override bool Finite {
+                       get { return true; }
+               }
+               public override bool Numeric {
+                       get { return false; }
+               }
+               public override XsdOrderedFacet Ordered {
+                       get { return XsdOrderedFacet.Total; }
+               }
+               
+               
+       }
+
+       // xs:anyURI
+       internal class XsdAnyURI : XsdString
+       {
+               public override XmlTokenizedType TokenizedType {
+
+                       get { return XmlTokenizedType.CDATA; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.AnyUri; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (Uri); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return new XmlSchemaUri (Normalize (s));
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return new UriValueType ((XmlSchemaUri) ParseValue (s, nameTable, nsmgr));
+               }
+       }
+
+       internal class XmlSchemaUri : Uri
+       {
+               public string value;
+
+               static bool HasValidScheme (string src)
+               {
+                       int idx = src.IndexOf (':');
+                       if (idx < 0)
+                               return false;
+                       for (int i = 0; i < idx; i++) {
+                               switch (src [i]) {
+                               case '+':
+                               case '-':
+                               case '.':
+                                       continue;
+                               default:
+                                       if (Char.IsLetterOrDigit (src [i]))
+                                               continue;
+                                       return false;
+                               }
+                       }
+                       return true;
+               }
+
+               // MS BUG: Some strings that contain ':' might result in 
+               // exception (MS.NET looks implemented as such).
+               public XmlSchemaUri (string src)
+                       : this (src, HasValidScheme (src))
+               {
+               }
+
+               private XmlSchemaUri (string src, bool formal)
+                       : base (formal ? src : "anyuri:" + src, !formal)
+               {
+                       value = src;
+               }
+
+               public static bool operator == (XmlSchemaUri v1, XmlSchemaUri v2)
+               {
+                       return v1.value == v2.value;
+               }
+
+               public static bool operator != (XmlSchemaUri v1, XmlSchemaUri v2)
+               {
+                       return v1.value != v2.value;
+               }
+
+               public override bool Equals (object obj)
+               {
+                       if (obj is XmlSchemaUri)
+                               return (XmlSchemaUri) obj == this;
+                       else
+                               return false;
+               }
+
+               public override int GetHashCode () 
+               {
+                       return value.GetHashCode ();
+               }
+
+               public override string ToString ()
+               {
+                       return value;
+               }
+       }
+
+       // xs:duration
+       internal class XsdDuration : XsdAnySimpleType
+       {
+               internal XsdDuration ()
+               {
+      this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return durationAllowedFacets; } 
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.CDATA; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Duration; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (TimeSpan); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToTimeSpan (Normalize (s));
+               }
+
+               internal override XsdOrdering Compare(object x, object y) {
+                       /* FIXME: This is really simple so far 
+                        *
+                        * In fact in order to do this correctly in XmlSchema, we cannot use TimeSpan as the base type
+                        * Though it turns out that MS .NET is a little broken in this regard too. Not doing comparisons 
+                        * correctly.
+                        */
+                       if ((x is TimeSpan) && (y is TimeSpan)) {
+                               int ret = TimeSpan.Compare((TimeSpan)x, (TimeSpan)y);
+                               if (ret < 0) { 
+                                       return XsdOrdering.LessThan;
+                               }
+                               else if (ret > 0) {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                               else {
+                                       return XsdOrdering.Equal;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+
+               
+               // Fundamental Facets
+               public override bool Bounded {
+                       get { return false; }
+               }
+               public override bool Finite {
+                       get { return false; }
+               }
+               public override bool Numeric {
+                       get { return false; }
+               }
+               public override XsdOrderedFacet Ordered {
+                       get { return XsdOrderedFacet.Partial; }
+        
+               }
+       }
+
+#if NET_2_0
+       // xdt:dayTimeDuration
+       internal class XdtDayTimeDuration : XsdDuration
+       {
+               internal XdtDayTimeDuration ()
+               {
+               }
+
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.DayTimeDuration; }
+               }
+
+               public override Type ValueType {
+                       get { return typeof (TimeSpan); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToTimeSpan (Normalize (s));
+               }
+
+               // FIXME: Fundamental Facets
+               public override bool Bounded {
+                       get { return false; }
+               }
+               public override bool Finite {
+                       get { return false; }
+               }
+               public override bool Numeric {
+                       get { return false; }
+               }
+               public override XsdOrderedFacet Ordered {
+                       get { return XsdOrderedFacet.Partial; }
+        
+               }
+       }
+
+       // xdt:yearMonthDuration
+       internal class XdtYearMonthDuration : XsdDuration
+       {
+               internal XdtYearMonthDuration ()
+               {
+               }
+
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.YearMonthDuration; }
+               }
+
+               public override Type ValueType {
+                       get { return typeof (TimeSpan); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToTimeSpan (Normalize (s));
+               }
+
+               // FIXME: Fundamental Facets
+               public override bool Bounded {
+                       get { return false; }
+               }
+               public override bool Finite {
+                       get { return false; }
+               }
+               public override bool Numeric {
+                       get { return false; }
+               }
+               public override XsdOrderedFacet Ordered {
+                       get { return XsdOrderedFacet.Partial; }
+        
+               }
+       }
+#endif
+
+       // xs:dateTime
+       internal class XsdDateTime : XsdAnySimpleType
+       {
+               internal XsdDateTime ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return durationAllowedFacets; } 
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.CDATA; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.DateTime; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (DateTime); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return XmlConvert.ToDateTime (Normalize (s));
+               }
+
+               internal override XsdOrdering Compare(object x, object y) {
+                       /* Really simple so far */
+                       if ((x is DateTime) && (y is DateTime)) {
+                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);
+                               if (ret < 0) { 
+                                       return XsdOrdering.LessThan;
+                               }
+                               else if (ret > 0) {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                               else {
+                                       return XsdOrdering.Equal;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+
+               // Fundamental Facets
+               public override bool Bounded {
+                       get { return false; }
+               }
+               public override bool Finite {
+                       get { return false; }
+               }
+               public override bool Numeric {
+                       get { return false; }
+               }
+               public override XsdOrderedFacet Ordered {
+                       get { return XsdOrderedFacet.Partial; }
+               }
+               
+       }
+
+       // xs:date
+       internal class XsdDate : XsdAnySimpleType
+       {
+               internal XsdDate ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+    
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return durationAllowedFacets; } 
+               }
+               
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.CDATA; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Date; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (DateTime); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return DateTime.ParseExact (Normalize (s), "yyyy-MM-dd", null);
+               }
+
+               internal override XsdOrdering Compare(object x, object y) {
+                       /* Really simple so far */
+                       if ((x is DateTime) && (y is DateTime)) {
+                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);
+                               if (ret < 0) { 
+                                       return XsdOrdering.LessThan;
+                               }
+                               else if (ret > 0) {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                               else {
+                                       return XsdOrdering.Equal;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+               // Fundamental Facets ... no need to override except for Ordered.
+               public override XsdOrderedFacet Ordered {
+                       get { return XsdOrderedFacet.Partial; }
+               }
+               
+       }
+
+       // xs:time
+       internal class XsdTime : XsdAnySimpleType
+       {
+               static string [] timeFormats = new string [] {
+                         // copied from XmlConvert.
+                         "HH:mm:ss",
+                         "HH:mm:ss.f",
+                         "HH:mm:ss.ff",
+                         "HH:mm:ss.fff",
+                         "HH:mm:ss.ffff",
+                         "HH:mm:ss.fffff",
+                         "HH:mm:ss.ffffff",
+                         "HH:mm:ss.fffffff",
+                         "HH:mm:sszzz",
+                         "HH:mm:ss.fzzz",
+                         "HH:mm:ss.ffzzz",
+                         "HH:mm:ss.fffzzz",
+                         "HH:mm:ss.ffffzzz",
+                         "HH:mm:ss.fffffzzz",
+                         "HH:mm:ss.ffffffzzz",
+                         "HH:mm:ss.fffffffzzz",
+                         "HH:mm:ssZ",
+                         "HH:mm:ss.fZ",
+                         "HH:mm:ss.ffZ",
+                         "HH:mm:ss.fffZ",
+                         "HH:mm:ss.ffffZ",
+                         "HH:mm:ss.fffffZ",
+                         "HH:mm:ss.ffffffZ",
+                         "HH:mm:ss.fffffffZ"};
+
+               internal XsdTime ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return durationAllowedFacets; } 
+               }
+
+               public override XmlTokenizedType TokenizedType {
+                       get { return XmlTokenizedType.CDATA; }
+               }
+
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.Time; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (DateTime); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return DateTime.ParseExact (Normalize (s), timeFormats, null, DateTimeStyles.None);
+               }
+
+               internal override XsdOrdering Compare(object x, object y) {
+                       /* Really simple so far */
+                       if ((x is DateTime) && (y is DateTime)) {
+                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);
+                               if (ret < 0) { 
+                                       return XsdOrdering.LessThan;
+                               }
+                               else if (ret > 0) {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                               else {
+                                       return XsdOrdering.Equal;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+               // Fundamental Facets ... no need to override except for Ordered.
+               public override XsdOrderedFacet Ordered {
+                       get { return XsdOrderedFacet.Partial; }
+               }
+               
+       }
+
+       // xs:gYearMonth
+       internal class XsdGYearMonth : XsdAnySimpleType
+       {
+               internal XsdGYearMonth ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+    
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return durationAllowedFacets; } 
+               }
+               
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.GYearMonth; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (DateTime); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return DateTime.ParseExact (Normalize (s), "yyyy-MM", null);
+               }
+               
+               internal override XsdOrdering Compare(object x, object y) {
+                       /* Really simple so far */
+                       if ((x is DateTime) && (y is DateTime)) {
+                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);
+                               if (ret < 0) { 
+                                       return XsdOrdering.LessThan;
+                               }
+                               else if (ret > 0) {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                               else {
+                                       return XsdOrdering.Equal;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+       }
+
+       // xs:gMonthDay
+       internal class XsdGMonthDay : XsdAnySimpleType
+       {
+               internal XsdGMonthDay ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+    
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return durationAllowedFacets; } 
+               }
+               
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.GMonthDay; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (DateTime); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return DateTime.ParseExact (Normalize (s), "--MM-dd", null);
+               }
+               
+               internal override XsdOrdering Compare(object x, object y) {
+                       /* Really simple so far */
+                       if ((x is DateTime) && (y is DateTime)) {
+                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);
+                               if (ret < 0) { 
+                                       return XsdOrdering.LessThan;
+                               }
+                               else if (ret > 0) {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                               else {
+                                       return XsdOrdering.Equal;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+       }
+
+       // xs:gYear
+       internal class XsdGYear : XsdAnySimpleType
+       {
+               internal XsdGYear ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+               
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return durationAllowedFacets; } 
+               }
+               
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.GYear; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (DateTime); }
+               }
+
+               // LAMESPEC: XML Schema Datatypes allows leading '-' to identify B.C. years,
+               // but CLR DateTime does not allow such expression.
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return DateTime.ParseExact (Normalize(s), "yyyy", null);
+               }
+               
+               internal override XsdOrdering Compare(object x, object y) {
+                       /* Really simple so far */
+                       if ((x is DateTime) && (y is DateTime)) {
+                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);
+                               if (ret < 0) { 
+                                       return XsdOrdering.LessThan;
+                               }
+                               else if (ret > 0) {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                               else {
+                                       return XsdOrdering.Equal;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+       }
+
+       // xs:gMonth
+       internal class XsdGMonth : XsdAnySimpleType
+       {
+               internal XsdGMonth ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+               
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return durationAllowedFacets; } 
+               }
+               
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.GMonth; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (DateTime); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return DateTime.ParseExact (Normalize(s), "--MM--", null);
+               }
+               
+               internal override XsdOrdering Compare(object x, object y) {
+                       /* Really simple so far */
+                       if ((x is DateTime) && (y is DateTime)) {
+                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);
+                               if (ret < 0) { 
+                                       return XsdOrdering.LessThan;
+                               }
+                               else if (ret > 0) {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                               else {
+                                       return XsdOrdering.Equal;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+       }
+
+       // xs:gDay
+       internal class XsdGDay : XsdAnySimpleType
+       {
+               internal XsdGDay ()
+               {
+                       this.WhitespaceValue = XsdWhitespaceFacet.Collapse;
+               }
+               
+               internal override XmlSchemaFacet.Facet AllowedFacets {
+                       get { return durationAllowedFacets; } 
+               }
+               
+#if NET_2_0
+               public override XmlTypeCode TypeCode {
+                       get { return XmlTypeCode.GDay; }
+               }
+#endif
+
+               public override Type ValueType {
+                       get { return typeof (DateTime); }
+               }
+
+               public override object ParseValue (string s,
+                       XmlNameTable nameTable, NSResolver nsmgr)
+               {
+                       return ParseValueType (s, nameTable, nsmgr);
+               }
+
+               internal override ValueType ParseValueType (string s, XmlNameTable nameTable, NSResolver nsmgr) 
+               {
+                       return DateTime.ParseExact (Normalize(s), "---dd", null);
+               }
+               
+               internal override XsdOrdering Compare(object x, object y) {
+                       /* Really simple so far */
+                       if ((x is DateTime) && (y is DateTime)) {
+                               int ret = DateTime.Compare((DateTime)x, (DateTime)y);
+                               if (ret < 0) { 
+                                       return XsdOrdering.LessThan;
+                               }
+                               else if (ret > 0) {
+                                       return XsdOrdering.GreaterThan;
+                               }
+                               else {
+                                       return XsdOrdering.Equal;
+                               }
+                       }
+                       return XsdOrdering.Indeterminate;
+               }
+       }
+
+}