﻿<?xml version="1.0" encoding="utf-8" ?>
<xs:schema xmlns:manifest="http://wiki.titaniumcms.com/manifest.xsd" elementFormDefault="qualified" targetNamespace="http://wiki.titaniumcms.com/manifest.xsd" version="3.0" id="Manifest" xmlns:xs="http://www.w3.org/2001/XMLSchema">
	<xs:simpleType name="NotNullString">
		<xs:annotation>
			<xs:documentation>- A string that can not be null.</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:minLength value="1" />
			<xs:whiteSpace value="collapse" />
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="Boolean">
		<xs:restriction base="xs:string">
			<xs:enumeration value="true" />
			<xs:enumeration value="false" />
			<xs:whiteSpace value="collapse" />
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="MenuPermission">
		<xs:annotation>
			<xs:documentation>The permission required to see this menu button/item.</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:enumeration value="IsAdminAccessAllowed" />
			<xs:enumeration value="IsEditAllowed" />
			<xs:whiteSpace value="collapse" />
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="EmbeddedViewTitle">
		<xs:annotation>
			<xs:documentation>The optionally overrideable embedded views.</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:enumeration value="Shopping Cart - Address" />
			<xs:enumeration value="Shopping Cart - Address List" />
			<xs:enumeration value="Shopping Cart - Card List" />
			<xs:enumeration value="Shopping Cart - Cart Preview" />
			<xs:enumeration value="Shopping Cart - Cart User - Order Detail" />
			<xs:enumeration value="Shopping Cart - Checkout" />
			<xs:enumeration value="Shopping Cart - Offer Account" />
			<xs:enumeration value="Shopping Cart - Orders - Details" />
			<xs:enumeration value="Shopping Cart - Orders - Index" />
			<xs:enumeration value="Shopping Cart - Orders - Invoice" />
			<xs:enumeration value="Gateway - Invoice - View" />
			<xs:enumeration value="Titanium Core - Logon" />
			<xs:enumeration value="Titanium Core - UserList" />
			<xs:enumeration value="Titanium Core - ContentPageEditMenu" />
			<xs:whiteSpace value="collapse" />
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="Type">
		<xs:annotation>
			<xs:documentation>Requires the string to start with: "TitaniumCore." or "TitaniumModules." - Example: TitaniumCore.Models.ContentPage</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:whiteSpace value="collapse" />
			<xs:pattern value="Titanium(Core|Modules)\.+.*" />
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="Path">
		<xs:annotation>
			<xs:documentation>Requires the string to start with: "~/" - Example: ~/Views/PageTypes/ContentPage/home.aspx</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:whiteSpace value="collapse" />
			<xs:pattern value="~/.*" />
		</xs:restriction>
	</xs:simpleType>
	<xs:simpleType name="FilePath">
		<xs:annotation>
			<xs:documentation>Requires the string to start with: "~/" or "http" - Example: ~/Views/PageTypes/ContentPage/home.aspx</xs:documentation>
		</xs:annotation>
		<xs:restriction base="xs:string">
			<xs:whiteSpace value="collapse" />
			<xs:pattern value="(~\/|http).*" />
		</xs:restriction>
	</xs:simpleType>
	<xs:element name="Manifest">
		<xs:annotation>
			<xs:documentation>The root node for a manifest file.</xs:documentation>
		</xs:annotation>
		<xs:complexType>
			<xs:all>
				<xs:element name="Remove" minOccurs="0">
					<xs:annotation>
						<xs:documentation>The section of a manifest that removes existing items from the registry. Should only be used in the Ti website manifest. And only as the first element under Manifest.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:all>
							<xs:element name="PageTypeViews" minOccurs="0">
								<xs:annotation>
									<xs:documentation>The views to hide that are linked to page types.</xs:documentation>
								</xs:annotation>
								<xs:complexType>
									<xs:sequence>
										<xs:element name="View" maxOccurs="unbounded">
											<xs:complexType>
												<xs:all>
													<xs:element name="Type" type="manifest:Type" />
													<xs:element name="Path" type="manifest:Path" />
												</xs:all>
											</xs:complexType>
										</xs:element>
									</xs:sequence>
								</xs:complexType>
							</xs:element>
							<xs:element name="ModuleTypeViews" minOccurs="0">
								<xs:annotation>
									<xs:documentation>The views to hide that are linked to module types.</xs:documentation>
								</xs:annotation>
								<xs:complexType>
									<xs:sequence>
										<xs:element name="View" maxOccurs="unbounded">
											<xs:complexType>
												<xs:all>
													<xs:element name="Type" type="manifest:Type" />
													<xs:element name="Path" type="manifest:Path" />
												</xs:all>
											</xs:complexType>
										</xs:element>
									</xs:sequence>
								</xs:complexType>
							</xs:element>
							<xs:element name="AuthTypes" minOccurs="0">
								<xs:annotation>
									<xs:documentation>The Authentication Types to hide.</xs:documentation>
								</xs:annotation>
								<xs:complexType>
									<xs:sequence>
										<xs:element name="AuthType" maxOccurs="unbounded">
											<xs:complexType>
												<xs:all>
													<xs:element name="Type" type="manifest:Type" />
												</xs:all>
											</xs:complexType>
										</xs:element>
									</xs:sequence>
								</xs:complexType>
							</xs:element>
							<xs:element name="GroupTypes" minOccurs="0">
								<xs:annotation>
									<xs:documentation>The Group Types to hide.</xs:documentation>
								</xs:annotation>
								<xs:complexType>
									<xs:sequence>
										<xs:element name="GroupType" maxOccurs="unbounded">
											<xs:complexType>
												<xs:all>
													<xs:element name="Type" type="manifest:NotNullString" />
												</xs:all>
											</xs:complexType>
										</xs:element>
									</xs:sequence>
								</xs:complexType>
							</xs:element>
							<xs:element name="MenuButtons" minOccurs="0">
								<xs:annotation>
									<xs:documentation>The Menu Buttons to hide.</xs:documentation>
								</xs:annotation>
								<xs:complexType>
									<xs:sequence>
										<xs:element name="Button" maxOccurs="unbounded">
											<xs:complexType>
												<xs:all>
													<xs:element name="Alt" type="manifest:NotNullString" />
													<xs:element name="Action" type="manifest:NotNullString" minOccurs="0">
														<xs:annotation>
															<xs:documentation>(Optional)</xs:documentation>
														</xs:annotation>
													</xs:element>
													<xs:element name="Controller" type="manifest:NotNullString" minOccurs="0">
														<xs:annotation>
															<xs:documentation>(Optional)</xs:documentation>
														</xs:annotation>
													</xs:element>
												</xs:all>
											</xs:complexType>
										</xs:element>
									</xs:sequence>
								</xs:complexType>
							</xs:element>
							<xs:element name="EmbeddedViews" minOccurs="0">
								<xs:annotation>
									<xs:documentation>The views to hide that are compiled into DLLs.</xs:documentation>
								</xs:annotation>
								<xs:complexType>
									<xs:sequence>
										<xs:element name="View" maxOccurs="unbounded">
											<xs:complexType>
												<xs:all>
													<xs:element name="Title" type="manifest:EmbeddedViewTitle" />
												</xs:all>
											</xs:complexType>
										</xs:element>
									</xs:sequence>
								</xs:complexType>
							</xs:element>
						</xs:all>
					</xs:complexType>
				</xs:element>
				<xs:element name="MenuButtons" minOccurs="0">
					<xs:annotation>
						<xs:documentation>The section of a manifest that adds menu buttons to the admin menu.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence>
							<xs:element name="Button" minOccurs="1" maxOccurs="unbounded">
								<xs:complexType>
									<xs:all>
										<xs:element name="Permission" type="manifest:MenuPermission" />
										<xs:element name="Icon" type="manifest:Path" />
										<xs:element name="Alt" type="manifest:NotNullString">
											<xs:annotation>
												<xs:documentation>Alternative text for the icon image.</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="Rank" type="xs:positiveInteger">
											<xs:annotation>
												<xs:documentation>Used to put the menu buttons in order.</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="OpenEditor" type="manifest:Boolean">
											<xs:annotation>
												<xs:documentation>Boolean: to open the editor dialog.</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="MenuItems" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional) A list of menu items to appear under the menu button.</xs:documentation>
											</xs:annotation>
											<xs:complexType>
												<xs:sequence>
													<xs:element name="Item" maxOccurs="unbounded">
														<xs:complexType>
															<xs:all>
																<xs:element name="Permission" type="manifest:MenuPermission" />
																<xs:element name="Text" type="manifest:NotNullString">
																	<xs:annotation>
																		<xs:documentation>The text for the menu item.</xs:documentation>
																	</xs:annotation>
																</xs:element>
																<xs:element name="Rank" type="xs:positiveInteger">
																	<xs:annotation>
																		<xs:documentation>Used to put the menu buttons in order.</xs:documentation>
																	</xs:annotation>
																</xs:element>
																<xs:element name="OpenEditor" type="manifest:Boolean">
																	<xs:annotation>
																		<xs:documentation>Boolean: to open the editor dialog.</xs:documentation>
																	</xs:annotation>
																</xs:element>
																<xs:element name="Action" type="manifest:NotNullString">
																	<xs:annotation>
																		<xs:documentation>The MVC action to use.</xs:documentation>
																	</xs:annotation>
																</xs:element>
																<xs:element name="Controller" type="manifest:NotNullString">
																	<xs:annotation>
																		<xs:documentation>The MVC controller to use.</xs:documentation>
																	</xs:annotation>
																</xs:element>
																<xs:element name="QueryStrings" minOccurs="0">
																	<xs:annotation>
																		<xs:documentation>(Optional) A list of query strings to be added to the url.</xs:documentation>
																	</xs:annotation>
																	<xs:complexType>
																		<xs:sequence>
																			<xs:element name="QueryString" maxOccurs="unbounded">
																				<xs:complexType>
																					<xs:all>
																						<xs:element name="Name" type="manifest:NotNullString" />
																						<xs:element name="Value" type="manifest:NotNullString" />
																					</xs:all>
																				</xs:complexType>
																			</xs:element>
																		</xs:sequence>
																	</xs:complexType>
																</xs:element>
															</xs:all>
														</xs:complexType>
													</xs:element>
												</xs:sequence>
											</xs:complexType>
										</xs:element>
										<xs:element name="Action" type="manifest:NotNullString" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional) The MVC action to use.</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="Controller" type="manifest:NotNullString" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional) The MVC controller to use.</xs:documentation>
											</xs:annotation>
										</xs:element>
									</xs:all>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="EmbeddedViews" minOccurs="0">
					<xs:annotation>
						<xs:documentation>The section of a manifest that allows a slicer to change a compiled view for a custom view.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence>
							<xs:element name="View" minOccurs="1" maxOccurs="unbounded">
								<xs:complexType>
									<xs:all>
										<xs:element name="Title" type="manifest:EmbeddedViewTitle" />
										<xs:element name="Path" type="manifest:Path" />
									</xs:all>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="ModuleTypes" minOccurs="0">
					<xs:annotation>
						<xs:documentation>The section of a manifest that allows a slicer to change a the icons used for a module, by adding in an entry here.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence>
							<xs:element name="Type" minOccurs="1" maxOccurs="unbounded">
								<xs:complexType>
									<xs:all>
										<xs:element name="Type" type="manifest:Type" />
										<xs:element name="Icon" type="manifest:Path" />
									</xs:all>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="PageTypeViews" minOccurs="0">
					<xs:annotation>
						<xs:documentation>The section of a manifest that adds a view relating to a page type.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence>
							<xs:element name="View" maxOccurs="unbounded">
								<xs:complexType>
									<xs:all>
										<xs:element name="Type" type="manifest:Type" />
										<xs:element name="Title" type="manifest:NotNullString" />
										<xs:element name="Icon" type="manifest:Path" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="Path" type="manifest:Path" />
										<xs:element name="Regions" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
											<xs:complexType>
												<xs:sequence>
													<xs:element name="Region" type="manifest:NotNullString" minOccurs="1" maxOccurs="unbounded" />
												</xs:sequence>
											</xs:complexType>
										</xs:element>
									</xs:all>
									<xs:attribute name="Default" type="manifest:Boolean">
										<xs:annotation>
											<xs:documentation>(Optional)</xs:documentation>
										</xs:annotation>
									</xs:attribute>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="ModuleTypeViews" minOccurs="0">
					<xs:annotation>
						<xs:documentation>The section of a manifest that adds a view relating to a module type.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence>
							<xs:element name="View" minOccurs="1" maxOccurs="unbounded">
								<xs:complexType>
									<xs:all>
										<xs:element name="Type" type="manifest:Type" />
										<xs:element name="Title" type="manifest:NotNullString" />
										<xs:element name="Path" type="manifest:Path" />
										<xs:element name="Icon" type="manifest:Path" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="Files" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
											<xs:complexType>
												<xs:sequence>
													<xs:element name="Path" maxOccurs="unbounded" type="manifest:FilePath" />
												</xs:sequence>
											</xs:complexType>
										</xs:element>
										<xs:element name="Settings" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
											<xs:complexType>
												<xs:sequence>
													<xs:element name="Setting" minOccurs="1" maxOccurs="unbounded">
														<xs:complexType>
															<xs:all>
																<xs:element name="Key" type="manifest:NotNullString" />
																<xs:element name="Default" type="manifest:NotNullString" />
																<xs:element name="ControlType">
																	<xs:simpleType>
																		<xs:restriction base="xs:string">
																			<xs:enumeration value="textbox" />
																			<xs:enumeration value="colorpick" />
																			<xs:enumeration value="boolean" />
																			<xs:enumeration value="dropdown" />
																			<xs:enumeration value="textarea" />
																		</xs:restriction>
																	</xs:simpleType>
																</xs:element>
																<xs:element name="ControlOptions" minOccurs="0">
																	<xs:annotation>
																		<xs:documentation>(Optional - Only used for dropdown)</xs:documentation>
																	</xs:annotation>
																	<xs:complexType>
																		<xs:sequence>
																			<xs:element name="Option" minOccurs="1" maxOccurs="unbounded" type="manifest:NotNullString" />
																		</xs:sequence>
																	</xs:complexType>
																</xs:element>
																<xs:element name="Validation" type="manifest:NotNullString" minOccurs="0">
																	<xs:annotation>
																		<xs:documentation>(Optional)</xs:documentation>
																	</xs:annotation>
																</xs:element>
															</xs:all>
														</xs:complexType>
													</xs:element>
												</xs:sequence>
											</xs:complexType>
										</xs:element>
									</xs:all>
									<xs:attribute name="Default" type="manifest:Boolean" use="optional">
										<xs:annotation>
											<xs:documentation>(Optional)</xs:documentation>
										</xs:annotation>
									</xs:attribute>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="GroupTypes" minOccurs="0">
					<xs:annotation>
						<xs:documentation>The section of a manifest that adds a group type.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence>
							<xs:element name="GroupType" minOccurs="1" maxOccurs="unbounded">
								<xs:complexType>
									<xs:all>
										<xs:element name="Title" type="manifest:NotNullString" />
										<xs:element name="Type" type="manifest:NotNullString" />
										<xs:element name="Rank" type="xs:positiveInteger" />
										<xs:element name="Profiles" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
											<xs:complexType>
												<xs:sequence>
													<xs:element name="Profile" minOccurs="1" maxOccurs="unbounded">
														<xs:complexType>
															<xs:all>
																<xs:element name="Title" type="manifest:NotNullString" />
																<xs:element name="Type" type="manifest:Type" />
																<xs:element name="Path" type="manifest:Path" />
																<xs:element name="Rank" type="xs:positiveInteger" />
															</xs:all>
														</xs:complexType>
													</xs:element>
												</xs:sequence>
											</xs:complexType>
										</xs:element>
									</xs:all>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="VariantTypes" minOccurs="0">
					<xs:annotation>
						<xs:documentation>The section of a manifest that adds a variant type.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence>
							<xs:element name="VariantType" minOccurs="1" maxOccurs="unbounded">
								<xs:complexType>
									<xs:all>
										<xs:element name="Type" type="manifest:Type" />
										<xs:element name="Title" type="manifest:NotNullString" />
										<xs:element name="SingleView" type="manifest:Path" />
										<xs:element name="MultipleView" type="manifest:Path" />
										<xs:element name="jsFile" type="manifest:Path" />
										<xs:element name="jsClassName" type="manifest:NotNullString" />
									</xs:all>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="IgnoreRoutes" minOccurs="0">
					<xs:annotation>
						<xs:documentation>The section of a manifest that adds ignore routes. This section should only be used in the Titanium website's manifest file.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence>
							<xs:element name="Route" minOccurs="1" maxOccurs="unbounded">
								<xs:complexType>
									<xs:all>
										<xs:element name="URL" type="manifest:NotNullString" />
										<xs:element name="Constraints" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
											<xs:complexType>
												<xs:sequence>
													<xs:element name="Constraint" minOccurs="1" maxOccurs="unbounded">
														<xs:complexType>
															<xs:all>
																<xs:element name="Key" type="manifest:NotNullString" />
																<xs:element name="Value" type="manifest:NotNullString" />
															</xs:all>
														</xs:complexType>
													</xs:element>
												</xs:sequence>
											</xs:complexType>
										</xs:element>
									</xs:all>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
				<xs:element name="AuthTypes" minOccurs="0">
					<xs:annotation>
						<xs:documentation>The section of a manifest that adds an Authentication type.</xs:documentation>
					</xs:annotation>
					<xs:complexType>
						<xs:sequence>
							<xs:element name="AuthType" minOccurs="1" maxOccurs="unbounded">
								<xs:complexType>
									<xs:all>
										<xs:element name="Title" type="manifest:NotNullString" />
										<xs:element name="Type" type="manifest:Type" />
										<xs:element name="Rank" type="xs:positiveInteger" />
										<xs:element name="Controller" type="manifest:NotNullString" />
										<xs:element name="CanUseModuleStore" type="manifest:Boolean" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="CanChangePassword" type="manifest:Boolean" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="CanChangeEmail" type="manifest:Boolean" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="CanResetPassword" type="manifest:Boolean" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="CanRegister" type="manifest:Boolean" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="CanDelete" type="manifest:Boolean" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="CanCreateUser" type="manifest:Boolean" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="CanChangeUserStatus" type="manifest:Boolean" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
										</xs:element>
										<xs:element name="Groups" minOccurs="0">
											<xs:annotation>
												<xs:documentation>(Optional)</xs:documentation>
											</xs:annotation>
											<xs:complexType>
												<xs:sequence>
													<xs:element name="Group" type="manifest:NotNullString" minOccurs="1" maxOccurs="unbounded" />
												</xs:sequence>
											</xs:complexType>
										</xs:element>
									</xs:all>
								</xs:complexType>
							</xs:element>
						</xs:sequence>
					</xs:complexType>
				</xs:element>
			</xs:all>
		</xs:complexType>
	</xs:element>
</xs:schema>