<?php
	# MantisConnect - A webservice interface to Mantis Bug Tracker
	# Copyright (C) 2004-2007  Victor Boctor - vboctor@users.sourceforge.net
	# This program is distributed under dual licensing.  These include
	# GPL and a commercial licenses.  Victor Boctor reserves the right to
	# change the license of future releases.
	# See docs/ folder for more details

	# --------------------------------------------------------
	# $Id: mantisconnect.php,v 1.1 2007-07-18 06:52:47 vboctor Exp $
	# --------------------------------------------------------

	$t_current_dir = dirname( __FILE__ ) . DIRECTORY_SEPARATOR;
	$t_nusoap_dir  = $t_current_dir . 'nusoap';

	# includes nusoap classes
	chdir( $t_nusoap_dir );
	require_once( 'nusoap.php' );
	chdir( $t_current_dir );

	# create server
	$l_oServer = new soap_server();

	# namespace
	$t_namespace = 'http://futureware.biz/mantisconnect';

	# wsdl generation
	$l_oServer->debug_flag = false;
	$l_oServer->configureWSDL( 'MantisConnect', $t_namespace );
	$l_oServer->wsdl->schemaTargetNamespace = $t_namespace;
	// The following will make the default encoding UTF-8 instead of ISO-8859-1
	// WS-I Basic Profile requires UTF-8 or UTF-16 as the encoding for interoperabilty
	// reasons.  This will correctly handle a large number of languages besides English.
	$l_oServer->xml_encoding = "UTF-8";
	$l_oServer->soap_defencoding = "UTF-8";
	$l_oServer->decode_utf8 = false;
	
	


	###
	###  PUBLIC TYPES
	###

	### StringArray
	$l_oServer->wsdl->addComplexType(
		'StringArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'xsd:string[]'
		)),
		'xsd:string'
	);


	### ObjectRef
	$l_oServer->wsdl->addComplexType(
		'ObjectRef',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'id'	=>	array( 'name' => 'id',		'type' => 'xsd:integer', 	'minOccurs' => '0'),
			'name'	=>	array( 'name' => 'name',	'type' => 'xsd:string', 	'minOccurs' => '0')
		)
	);

	### ObjectRefArray
	$l_oServer->wsdl->addComplexType(
		'ObjectRefArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:ObjectRef[]'
		)),
		'tns:ObjectRef'
	);


	### AccountData
	$l_oServer->wsdl->addComplexType(
		'AccountData',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'id'		=>	array( 'name' => 'id',			'type' => 'xsd:integer',	'minOccurs' => '0'),
			'name'		=>	array( 'name' => 'name',		'type' => 'xsd:string',	'minOccurs' => '0'),
			'real_name'	=>	array( 'name' => 'real_name',	'type' => 'xsd:string',	'minOccurs' => '0'),
			'email'		=>	array( 'name' => 'email',		'type' => 'xsd:string',	'minOccurs' => '0')
		)
	);

	### AccountDataArray
	$l_oServer->wsdl->addComplexType(
		'AccountDataArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:AccountData[]'
		)),
		'tns:AccountData'
	);


	### AttachmentData
	$l_oServer->wsdl->addComplexType(
		'AttachmentData',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'id'				=>	array( 'name' => 'id',				'type' => 'xsd:integer', 	'minOccurs' => '0'),
			'filename'			=>	array( 'name' => 'filename',		'type' => 'xsd:string', 	'minOccurs' => '0'),
			'size'				=>	array( 'name' => 'size',			'type' => 'xsd:integer', 	'minOccurs' => '0'),
			'content_type'		=>	array( 'name' => 'content_type',	'type' => 'xsd:string', 	'minOccurs' => '0'),
			'date_submitted'	=>	array( 'name' => 'date_submitted',	'type' => 'xsd:dateTime', 	'minOccurs' => '0'),
			'download_url'		=>	array( 'name' => 'download_url',	'type' => 'xsd:anyURI', 	'minOccurs' => '0')
		)
	);


	### AttachmentDataArray
	$l_oServer->wsdl->addComplexType(
		'AttachmentDataArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:AttachmentData[]'
		)),
		'tns:AttachmentData'
	);


	### ProjectAttachmentData
	$l_oServer->wsdl->addComplexType(
		'ProjectAttachmentData',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'id'				=>	array( 'name' => 'id',				'type' => 'xsd:integer', 	'minOccurs' => '0'),
			'filename'			=>	array( 'name' => 'filename',		'type' => 'xsd:string', 	'minOccurs' => '0'),
			'title'				=>	array( 'name' => 'title',			'type' => 'xsd:string', 	'minOccurs' => '0'),
			'description'		=>	array( 'name' => 'description',		'type' => 'xsd:string', 	'minOccurs' => '0'),
			'size'				=>	array( 'name' => 'size',			'type' => 'xsd:integer', 	'minOccurs' => '0'),
			'content_type'		=>	array( 'name' => 'content_type',	'type' => 'xsd:string', 	'minOccurs' => '0'),
			'date_submitted'	=>	array( 'name' => 'date_submitted',	'type' => 'xsd:dateTime', 	'minOccurs' => '0'),
			'download_url'		=>	array( 'name' => 'download_url',	'type' => 'xsd:anyURI', 	'minOccurs' => '0')
		)
	);


	### ProjectAttachmentDataArray
	$l_oServer->wsdl->addComplexType(
		'ProjectAttachmentDataArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:ProjectAttachmentData[]'
		)),
		'tns:ProjectAttachmentData'
	);


	### RelationshipData
	$l_oServer->wsdl->addComplexType(
		'RelationshipData',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'id'		=>	array( 'name' => 'id',			'type' => 'xsd:integer',	'minOccurs' => '0'),
			'type'		=>	array( 'name' => 'type',		'type' => 'tns:ObjectRef', 	'minOccurs' => '0'),
			'target_id'	=>	array( 'name' => 'target_id',	'type' => 'xsd:integer', 	'minOccurs' => '0')
		)
	);

	### RelationshipDataArray
	$l_oServer->wsdl->addComplexType(
		'RelationshipDataArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:RelationshipData[]'
		)),
		'tns:RelationshipData'
	);


	### IssueNoteData
	$l_oServer->wsdl->addComplexType(
		'IssueNoteData',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'id'				=>	array( 'name' => 'id',				'type' => 'xsd:integer', 'minOccurs' => '0'),
			'reporter'			=>	array( 'name' => 'reporter',		'type' => 'tns:AccountData', 'minOccurs' => '0'),
			'text'				=>	array( 'name' => 'text',			'type' => 'xsd:string', 'minOccurs' => '0'),
			'view_state'		=>	array( 'name' => 'view_state',		'type' => 'tns:ObjectRef', 'minOccurs' => '0'),
			'date_submitted'	=>	array( 'name' => 'date_submitted',	'type' => 'xsd:dateTime', 'minOccurs' => '0'),
			'last_modified'		=>	array( 'name' => 'last_modified',	'type' => 'xsd:dateTime', 'minOccurs' => '0')
		)
	);


	### IssueNoteDataArray
	$l_oServer->wsdl->addComplexType(
		'IssueNoteDataArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:IssueNoteData[]'
		)),
		'tns:IssueNoteData'
	);


	### IssueData
	$l_oServer->wsdl->addComplexType(
		'IssueData',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'id'			=>	array( 'name' => 'id',				'type' => 'xsd:integer', 	'minOccurs' => '0' ),
			'view_state'	=>	array( 'name' => 'view_state',		'type' => 'tns:ObjectRef', 	'minOccurs' => '0' ),
			'last_updated'	=>	array( 'name' => 'last_updated',	'type' => 'xsd:dateTime', 	'minOccurs' => '0' ),

			'project'	=>	array( 'name' => 'project',		'type' => 'tns:ObjectRef', 	'minOccurs' => '0' ),
			'category'	=>	array( 'name' => 'category',	'type' => 'xsd:string', 	'minOccurs' => '0' ),
			'priority'	=>	array( 'name' => 'priority',	'type' => 'tns:ObjectRef', 	'minOccurs' => '0' ),
			'severity'	=>	array( 'name' => 'severity',	'type' => 'tns:ObjectRef', 	'minOccurs' => '0' ),
			'status'	=>	array( 'name' => 'status',		'type' => 'tns:ObjectRef',	'minOccurs' => '0' ),

			'reporter'			=>	array( 'name' => 'reporter',		'type' => 'tns:AccountData',	'minOccurs' => '0' ),
			'summary'			=>	array( 'name' => 'summary',			'type' => 'xsd:string', 	'minOccurs' => '0' ),
			'version'			=>	array( 'name' => 'version',			'type' => 'xsd:string', 	'minOccurs' => '0' ),
			'build'				=>	array( 'name' => 'build',			'type' => 'xsd:string', 	'minOccurs' => '0' ),
			'platform'			=>	array( 'name' => 'platform',		'type' => 'xsd:string', 	'minOccurs' => '0' ),
			'os'				=>	array( 'name' => 'os',				'type' => 'xsd:string', 	'minOccurs' => '0' ),
			'os_build'			=>	array( 'name' => 'os_build',		'type' => 'xsd:string', 	'minOccurs' => '0' ),
			'reproducibility'	=>	array( 'name' => 'reproducibility', 'type' => 'tns:ObjectRef', 	'minOccurs' => '0' ),
			'date_submitted'	=>	array( 'name' => 'date_submitted',	'type' => 'xsd:dateTime', 	'minOccurs' => '0' ),

			'sponsorship_total' =>	array( 'name' => 'sponsorship_total',	'type' => 'xsd:integer', 	'minOccurs' => '0' ),

			'handler'		=>	array( 'name' => 'handler',		'type' => 'tns:AccountData', 	'minOccurs' => '0' ),
			'projection'	=>	array( 'name' => 'projection',	'type' => 'tns:ObjectRef', 	'minOccurs' => '0' ),
			'eta'			=>	array( 'name' => 'eta',			'type' => 'tns:ObjectRef', 	'minOccurs' => '0' ),

			'resolution'		=>	array( 'name' => 'resolution',		'type' => 'tns:ObjectRef', 	'minOccurs' => '0' ),
			'fixed_in_version'	=>	array( 'name'=>'fixed_in_version',	'type' => 'xsd:string', 	'minOccurs' => '0' ),

			'description'				=>	array( 'name' => 'description',				'type' => 'xsd:string', 	'minOccurs' => '0' ),
			'steps_to_reproduce'		=>	array( 'name' => 'steps_to_reproduce',		'type' => 'xsd:string', 	'minOccurs' => '0' ),
			'additional_information'	=>	array( 'name' => 'additional_information',	'type' => 'xsd:string', 	'minOccurs' => '0' ),

			'attachments'				=>	array( 'name' => 'attachments', 			'type' => 'tns:AttachmentDataArray', 	'minOccurs' => '0' ),
			'relationships'				=>	array( 'name' => 'relationships',			'type' => 'tns:RelationshipDataArray', 	'minOccurs' => '0' ),
			'notes'						=>	array( 'name' => 'notes',					'type' => 'tns:IssueNoteDataArray', 	'minOccurs' => '0' ),
			'custom_fields'				=>  array( 'name' => 'custom_fields',			'type' => 'tns:CustomFieldValueForIssueDataArray', 	'minOccurs' => '0' )
		)
	);

	### IssueDataArray
	$l_oServer->wsdl->addComplexType(
		'IssueDataArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:IssueData[]'
		)),
		'tns:IssueData'
	);
	
	
	### IssueHeaderData
	$l_oServer->wsdl->addComplexType(
		'IssueHeaderData',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'id'			=>	array( 'name' => 'id',				'type' => 'xsd:integer' ),
			'view_state'	=>	array( 'name' => 'view_state',		'type' => 'xsd:integer' ),
			'last_updated'	=>	array( 'name' => 'last_updated',	'type' => 'xsd:dateTime' ),

			'project'	=>	array( 'name' => 'project',		'type' => 'xsd:integer' ),
			'category'	=>	array( 'name' => 'category',	'type' => 'xsd:string' ),
			'priority'	=>	array( 'name' => 'priority',	'type' => 'xsd:integer' ),
			'severity'	=>	array( 'name' => 'severity',	'type' => 'xsd:integer' ),
			'status'	=>	array( 'name' => 'status',		'type' => 'xsd:integer' ),

			'reporter'			=>	array( 'name' => 'reporter',		'type' => 'xsd:integer' ),
			'summary'			=>	array( 'name' => 'summary',			'type' => 'xsd:string' ),
			'handler'		=>	array( 'name' => 'handler',		'type' => 'xsd:integer' ),
			'resolution'		=>	array( 'name' => 'resolution',		'type' => 'xsd:integer' ),
			
			'attachments_count'	=>	array( 'name' => 'attachments_count', 	'type' => 'xsd:integer' ),
			'notes_count'	=>	array( 'name' => 'notes_count', 	'type' => 'xsd:integer' ),
		)
	);

	### IssueHeaderDataArray
	$l_oServer->wsdl->addComplexType(
		'IssueHeaderDataArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:IssueHeaderData[]'
		)),
		'tns:IssueHeaderData'
	);


	### ProjectData
	$l_oServer->wsdl->addComplexType(
		'ProjectData',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'id'			=>	array( 'name' => 'id',			'type' => 'xsd:integer',	'minOccurs' => '0' ),
			'name'			=>	array( 'name' => 'name',		'type' => 'xsd:string',	'minOccurs' => '0' ),
			'status'		=>	array( 'name' => 'status',		'type' => 'tns:ObjectRef',	'minOccurs' => '0' ),
			'enabled'		=>	array( 'name' => 'enabled',		'type' => 'xsd:boolean',	'minOccurs' => '0' ),
			'view_state'	=>	array( 'name' => 'view_state',	'type' => 'tns:ObjectRef',	'minOccurs' => '0' ),
			'access_min'	=>	array( 'name' => 'access_min',	'type' => 'tns:ObjectRef',	'minOccurs' => '0' ),
			'file_path'		=>	array( 'name' => 'file_path',	'type' => 'xsd:string',	'minOccurs' => '0' ),
			'description'	=>	array( 'name' => 'description',	'type' => 'xsd:string',	'minOccurs' => '0' ),
			'subprojects'	=>	array( 'name' => 'subprojects',	'type' => 'tns:ProjectDataArray', 'minOccurs' => '0' )
		)
	);

	### ProjectDataArray
	$l_oServer->wsdl->addComplexType(
		'ProjectDataArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:ProjectData[]'
		)),
		'tns:ProjectData'
	);


	### ProjectVersionData
	$l_oServer->wsdl->addComplexType(
		'ProjectVersionData',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'id'			=>	array( 'name' => 'id',			'type' => 'xsd:integer', 	'minOccurs' => '0' ),
			'name'			=>	array( 'name' => 'name',		'type' => 'xsd:string', 	'minOccurs' => '0' ),
			'project_id'	=>	array( 'name' => 'project_id',	'type' => 'xsd:integer', 	'minOccurs' => '0' ),
			'date_order'	=>	array( 'name' => 'date_order',	'type' => 'xsd:dateTime', 	'minOccurs' => '0' ),
			'description'	=>	array( 'name' => 'description',	'type' => 'xsd:string', 	'minOccurs' => '0' ),
			'released'		=>	array( 'name' => 'released',	'type' => 'xsd:boolean', 	'minOccurs' => '0' )
		)
	);

	### ProjectVersionDataArray
	$l_oServer->wsdl->addComplexType(
		'ProjectVersionDataArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:ProjectVersionData[]'
		)),
		'tns:ProjectVersionData'
	);


	### FilterData
	$l_oServer->wsdl->addComplexType(
		'FilterData',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'id'			=>	array( 'name' => 'id',				'type' => 'xsd:integer', 	'minOccurs' => '0' ),
			'owner'			=>	array( 'name' => 'owner',			'type' => 'tns:AccountData', 	'minOccurs' => '0' ),
			'project_id'	=>	array( 'name' => 'project_id',		'type' => 'xsd:integer', 	'minOccurs' => '0' ),
			'is_public'		=>	array( 'name' => 'is_public',		'type' => 'xsd:boolean', 	'minOccurs' => '0' ),
			'name'			=>	array( 'name' => 'name',			'type' => 'xsd:string', 	'minOccurs' => '0' ),
			'filter_string'	=>	array( 'name' => 'filter_string',	'type' => 'xsd:string', 	'minOccurs' => '0' )
		)
	);

	### FilterDataArray
	$l_oServer->wsdl->addComplexType(
		'FilterDataArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:FilterData[]'
		)),
		'tns:FilterData'
	);

	### CustomFieldDefinitionData
	$l_oServer->wsdl->addComplexType(
		'CustomFieldDefinitionData',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'field'				=>	array( 'name' => 'field',			'type' => 'tns:ObjectRef', 	'minOccurs' => '0'),
			'type'				=>	array( 'name' => 'type',			'type' => 'xsd:integer', 	'minOccurs' => '0'),
			'possible_values'	=>	array( 'name' => 'possible_values',	'type' => 'xsd:string', 	'minOccurs' => '0'),
			'default_value'		=>	array( 'name' => 'default_value',	'type' => 'xsd:string', 	'minOccurs' => '0'),
			'valid_regexp'		=>	array( 'name' => 'valid_regexp',	'type' => 'xsd:string', 	'minOccurs' => '0'),
			'access_level_r'	=>	array( 'name' => 'access_level_r',	'type' => 'xsd:integer', 	'minOccurs' => '0'),
			'access_level_rw'	=>	array( 'name' => 'access_level_rw',	'type' => 'xsd:integer', 	'minOccurs' => '0'),
			'length_min'		=>	array( 'name' => 'length_min',		'type' => 'xsd:integer', 	'minOccurs' => '0'),
			'length_max'		=>	array( 'name' => 'length_max',		'type' => 'xsd:integer', 	'minOccurs' => '0'),
			'advanced'			=>	array( 'name' => 'advanced',		'type' => 'xsd:boolean', 	'minOccurs' => '0'),
			'display_report'	=>	array( 'name' => 'display_report',	'type' => 'xsd:boolean', 	'minOccurs' => '0'),
			'display_update'	=>	array( 'name' => 'display_update',	'type' => 'xsd:boolean', 	'minOccurs' => '0'),
			'display_resolved'	=>	array( 'name' => 'display_resolved','type' => 'xsd:boolean', 	'minOccurs' => '0'),
			'display_closed'	=>	array( 'name' => 'display_closed',	'type' => 'xsd:boolean', 	'minOccurs' => '0'),
			'require_report'	=>	array( 'name' => 'require_report',	'type' => 'xsd:boolean', 	'minOccurs' => '0'),
			'require_update'	=>	array( 'name' => 'require_update',	'type' => 'xsd:boolean', 	'minOccurs' => '0'),
			'require_resolved'	=>	array( 'name' => 'require_resolved','type' => 'xsd:boolean', 	'minOccurs' => '0'),
			'require_closed'	=>	array( 'name' => 'require_closed',	'type' => 'xsd:boolean', 	'minOccurs' => '0')
		)
	);


	### CustomFieldDefinitionDataArray
	$l_oServer->wsdl->addComplexType(
		'CustomFieldDefinitionDataArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:CustomFieldDefinitionData[]'
		)),
		'tns:CustomFieldDefinitionData'
	);


	### CustomFieldLinkForProjectData
	$l_oServer->wsdl->addComplexType(
		'CustomFieldLinkForProjectData',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'field'				=>	array( 'name' => 'field',			'type' => 'tns:ObjectRef', 	'minOccurs' => '0'),
			'sequence'			=>	array( 'name' => 'sequence',		'type' => 'xsd:byte', 	'minOccurs' => '0')
		)
	);


	### CustomFieldLinkForProjectDataArray
	$l_oServer->wsdl->addComplexType(
		'CustomFieldLinkForProjectDataArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:CustomFieldLinkForProjectData[]'
		)),
		'tns:CustomFieldLinkForProjectData'
	);


	### CustomFieldValueForIssueData
	$l_oServer->wsdl->addComplexType(
		'CustomFieldValueForIssueData',
		'complexType',
		'struct',
		'all',
		'',
		array(
			'field'				=>	array( 'name' => 'field',			'type' => 'tns:ObjectRef', 	'minOccurs' => '0'),
			'value'				=>	array( 'name' => 'value',			'type' => 'xsd:string', 	'minOccurs' => '0')
		)
	);


	### CustomFieldValueForIssueDataArray
	$l_oServer->wsdl->addComplexType(
		'CustomFieldValueForIssueDataArray',
		'complexType',
		'array',
		'',
		'SOAP-ENC:Array',
		array(),
		array(array(
			'ref'				=> 'SOAP-ENC:arrayType',
			'wsdl:arrayType'	=> 'tns:CustomFieldValueForIssueData[]'
		)),
		'tns:CustomFieldValueForIssueData'
	);


	###
	###  PUBLIC METHODS
	###

	### mc_version
	$l_oServer->register( 'mc_version',
		array(),
		array(
			'return'	=>	'xsd:string'
		),
		$t_namespace
	);

	###
	###  PUBLIC METHODS (defined in mc_enum_api.php)
	###

	### mc_enum_status
	$l_oServer->register( 'mc_enum_status',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string'
		),
		array(
			'return'	=>	'tns:ObjectRefArray'
		),
		$t_namespace,
		false, false, false,
		'Get the enumeration for statuses.'
	);

	### mc_enum_priorities
	$l_oServer->register( 'mc_enum_priorities',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string'
		),
		array(
			'return'	=>	'tns:ObjectRefArray'
		),
		$t_namespace,
		false, false, false,
		'Get the enumeration for priorities.'
	);

	### mc_enum_severities
	$l_oServer->register( 'mc_enum_severities',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string'
		),
		array(
			'return'	=>	'tns:ObjectRefArray'
		),
		$t_namespace,
		false, false, false,
		'Get the enumeration for severities.'
	);

	### mc_enum_reproducibilities
	$l_oServer->register( 'mc_enum_reproducibilities',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string'
		),
		array(
			'return'	=>	'tns:ObjectRefArray'
		),
		$t_namespace,
		false, false, false,
		'Get the enumeration for reproducibilities.'
	);

	### mc_enum_projections
	$l_oServer->register( 'mc_enum_projections',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string'
		),
		array(
			'return'	=>	'tns:ObjectRefArray'
		),
		$t_namespace,
		false, false, false,
		'Get the enumeration for projections.'
	);

	### mc_enum_etas
	$l_oServer->register( 'mc_enum_etas',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string'
		),
		array(
			'return'	=>	'tns:ObjectRefArray'
		),
		$t_namespace,
		false, false, false,
		'Get the enumeration for ETAs.'
	);

	### mc_enum_resolutions
	$l_oServer->register( 'mc_enum_resolutions',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string'
		),
		array(
			'return'	=>	'tns:ObjectRefArray'
		),
		$t_namespace,
		false, false, false,
		'Get the enumeration for resolutions.'
	);

	### mc_enum_access_levels
	$l_oServer->register( 'mc_enum_access_levels',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string'
		),
		array(
			'return'	=>	'tns:ObjectRefArray'
		),
		$t_namespace,
		false, false, false,
		'Get the enumeration for access levels.'
	);

	### mc_enum_project_status
	$l_oServer->register( 'mc_enum_project_status',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string'
		),
		array(
			'return'	=>	'tns:ObjectRefArray'
		),
		$t_namespace,
		false, false, false,
		'Get the enumeration for project statuses.'
	);

	### mc_enum_project_view_states
	$l_oServer->register( 'mc_enum_project_view_states',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string'
		),
		array(
			'return'	=>	'tns:ObjectRefArray'
		),
		$t_namespace,
		false, false, false,
		'Get the enumeration for project view states.'
	);

	### mc_enum_view_states
	$l_oServer->register( 'mc_enum_view_states',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string'
		),
		array(
			'return'	=>	'tns:ObjectRefArray'
		),
		$t_namespace,
		false, false, false,
		'Get the enumeration for view states.'
	);

	### mc_enum_custom_field_types
	$l_oServer->register( 'mc_enum_custom_field_types',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string'
		),
		array(
			'return'	=>	'tns:ObjectRefArray'
		),
		$t_namespace,
		false, false, false,
		'Get the enumeration for custom field types.'
	);

	### mc_enum_get (should vanish as it has been replaced by more-high level versions)
	$l_oServer->register( 'mc_enum_get',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'enumeration'	=>	'xsd:string'
		),
		array(
			'return'	=>	'xsd:string'
		),
		$t_namespace,
		false, false, false,
		'Get the enumeration for the specified enumeration type.'
	);


	###
	###  PUBLIC METHODS (defined in mc_issue_api.php)
	###

	### mc_issue_exists
	$l_oServer->register( 'mc_issue_exists',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string',
			'issue_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'xsd:boolean'
		),
		$t_namespace,
		false, false, false,
		'Check there exists an issue with the specified id.'
	);

	### mc_issue_get
	$l_oServer->register( 'mc_issue_get',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string',
			'issue_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'tns:IssueData'
		),
		$t_namespace,
		false, false, false,
		'Get the issue with the specified id.'
	);

	### mc_issue_get_biggest_id
	$l_oServer->register( 'mc_issue_get_biggest_id',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string',
			'project_id'=>	'xsd:integer'
		),
		array(
			'return'	=>	'xsd:integer'
		),
		$t_namespace,
		false, false, false,
		'Get the latest submitted issue in the specified project.'
	);

	### mc_issue_get_id_from_summary (should be replaced with a more general search that returns matching issues directly)
	$l_oServer->register( 'mc_issue_get_id_from_summary',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string',
			'summary'	=>	'xsd:string'
		),
		array(
			'return'	=>	'xsd:integer'
		),
		$t_namespace,
		false, false, false,
		'Get the id of the issue with the specified summary.'
	);

	### mc_issue_add
	$l_oServer->register( 'mc_issue_add',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string',
			'issue'		=>	'tns:IssueData'
		),
		array(
			'return'	=>	'xsd:integer'
		),
		$t_namespace,
		false, false, false,
		'Submit the specified issue details.'
	);

    ### mc_issue_update
    $l_oServer->register( 'mc_issue_update',
        array(
            'username' => 'xsd:string',
            'password' => 'xsd:string',
            'issueId' => 'xsd:integer',
            'issue' => 'tns:IssueData'
             ),
        array(
            'return' => 'xsd:boolean'
        ),
        $t_namespace,
        false, false, false,
        'Update Issue method.'
    );

    ### mc_issue_delete
	$l_oServer->register( 'mc_issue_delete',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string',
			'issue_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'xsd:boolean'
		),
		$t_namespace,
		false, false, false,
		'Delete the issue with the specified id.'
	);

	### mc_issue_note_add
 	$l_oServer->register( 'mc_issue_note_add',
 		array(
			'username'	=>	'xsd:string',
 			'password'	=>	'xsd:string',
 			'issue_id'	=>	'xsd:integer',
 			'note' 		=>	'tns:IssueNoteData'
 		),
 		array(
			'return'	=>	'xsd:integer'
		),
 		$t_namespace,
		false, false, false,
		'Submit a new note.'
 	);

	### mc_issue_note_delete
	$l_oServer->register( 'mc_issue_note_delete',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string',
			'issue_note_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'xsd:boolean'
		),
		$t_namespace,
		false, false, false,
		'Delete the note with the specified id.'
	);
	
	### mc_issue_relationship_add
 	$l_oServer->register( 'mc_issue_relationship_add',
 		array(
			'username'		=>	'xsd:string',
 			'password'		=>	'xsd:string',
 			'issue_id'		=>	'xsd:integer',
 			'relationship'	=>	'tns:RelationshipData'
 		),
 		array(
			'return'	=>	'xsd:integer'
		),
 		$t_namespace,
		false, false, false,
		'Submit a new relationship.'
 	);

	### mc_issue_relationship_delete
	$l_oServer->register( 'mc_issue_relationship_delete',
		array(
			'username'			=>	'xsd:string',
			'password'			=>	'xsd:string',
			'issue_id'			=>	'xsd:integer',
			'relationship_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'xsd:boolean'
		),
		$t_namespace,
		false, false, false,
		'Delete the relationship for the specified issue.'
	);
	
	### mc_issue_attachment_add
 	$l_oServer->register( 'mc_issue_attachment_add',
 		array(
			'username'	=>	'xsd:string',
 			'password'	=>	'xsd:string',
 			'issue_id'	=>	'xsd:integer',
 			'name'		=>	'xsd:string',
 			'file_type'	=>	'xsd:string',
 			'content'	=>	'xsd:base64Binary'
 		),
 		array(
			'return'	=>	'xsd:integer'
		),
 		$t_namespace,
		false, false, false,
		'Submit a new issue attachment.'
 	);

 	### mc_issue_attachment_delete
	$l_oServer->register( 'mc_issue_attachment_delete',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string',
			'issue_attachment_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'xsd:boolean'
		),
		$t_namespace,
		false, false, false,
		'Delete the issue attachment with the specified id.'
	);

	### mc_attachment_get
	$l_oServer->register( 'mc_issue_attachment_get',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'issue_attachment_id'			=>	'xsd:integer'
		),
		array(
			'return'	=>	'xsd:base64Binary'
		),
		$t_namespace,
		false, false, false,
		'Get the data for the specified issue attachment.'
	);


	###
	###  PUBLIC METHODS (defined in mc_project_api.php)
	###
	
	### mc_project_add
	$l_oServer->register( 'mc_project_add',
		array( 
			'username' => 'xsd:string',
			'password' => 'xsd:string',
			'project' => 'tns:ProjectData'
		),
		array(
			'return' => 'xsd:integer'
		),
		$t_namespace,
		false, false, false,
		'Add a new project to the tracker (must have admin privileges)'
	);
	
	### mc_project_delete
	$l_oServer->register( 'mc_project_delete',
		array( 
			'username' => 'xsd:string',
			'password' => 'xsd:string',
			'project_id' => 'xsd:integer'
		),
		array(
			'return' => 'xsd:boolean'
		),
		$t_namespace,
		false, false, false,
		'Add a new project to the tracker (must have admin privileges)'
	);
	
	
	### mc_project_get_issues
	$l_oServer->register( 'mc_project_get_issues',
		array( 
			'username' => 'xsd:string',
			'password' => 'xsd:string',
			'project_id' => 'xsd:integer',
			'page_number' => 'xsd:integer',
			'per_page' => 'xsd:integer'
		),
		array(
			'return' => 'tns:IssueDataArray'
		),
		$t_namespace,
		false, false, false,
		'Get the issues that match the specified project id and paging details.'
	);
	
	### mc_project_get_issue_headers
	$l_oServer->register( 'mc_project_get_issue_headers',
		array( 
			'username' => 'xsd:string',
			'password' => 'xsd:string',
			'project_id' => 'xsd:integer',
			'page_number' => 'xsd:integer',
			'per_page' => 'xsd:integer'
		),
		array(
			'return' => 'tns:IssueHeaderDataArray'
		),
		$t_namespace,
		false, false, false,
		'Get the issue headers that match the specified project id and paging details.'
	);
	
	### mc_project_get_users
	$l_oServer->register( 'mc_project_get_users',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string',
			'project_id'	=>	'xsd:integer',
			'access'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'tns:AccountDataArray'
		),
		$t_namespace,
		false, false, false,
		'Get appropriate users assigned to a project by access level.'
	);	

	### mc_projects_get_user_accessible
	$l_oServer->register( 'mc_projects_get_user_accessible',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string'
		),
		array(
			'return'	=>	'tns:ProjectDataArray'
		),
		$t_namespace,
		false, false, false,
		'Get the list of projects that are accessible to the logged in user.'
	);

	### mc_project_get_categories
	$l_oServer->register( 'mc_project_get_categories',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'project_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'tns:StringArray'
		),
		$t_namespace,
		false, false, false,
		'Get the categories belonging to the specified project.'
	);

	### mc_project_get_versions
	$l_oServer->register( 'mc_project_get_versions',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'project_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'tns:ProjectVersionDataArray'
		),
		$t_namespace,
		false, false, false,
		'Get the versions belonging to the specified project.'
	);
	
	### mc_project_version_add
	$l_oServer->register( 'mc_project_version_add',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'version'		=>	'tns:ProjectVersionData'
		),
		array(
			'return'	=>	'xsd:integer'
		),
		$t_namespace,
		false, false, false,
		'Submit the specified version details.'
	);
	
	### mc_project_version_update
	$l_oServer->register( 'mc_project_version_update',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'version_id'	=>	'xsd:integer',
			'version'		=>	'tns:ProjectVersionData'
		),
		array(
			'return'	=>	'xsd:boolean'
		),
		$t_namespace,
		false, false, false,
		'Update version method.'
	);
	
    ### mc_project_version_delete
	$l_oServer->register( 'mc_project_version_delete',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'version_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'xsd:boolean'
		),
		$t_namespace,
		false, false, false,
		'Delete the version with the specified id.'
	);

	### mc_project_get_released_versions
	$l_oServer->register( 'mc_project_get_released_versions',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'project_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'tns:ProjectVersionDataArray'
		),
		$t_namespace,
		false, false, false,
		'Get the released versions that belong to the specified project.'
	);

	### mc_project_get_unreleased_versions
	$l_oServer->register( 'mc_project_get_unreleased_versions',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'project_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'tns:ProjectVersionDataArray'
		),
		$t_namespace,
		false, false, false,
		'Get the unreleased version that belong to the specified project.'
	);
	
	### mc_project_get_unreleased_versions
	$l_oServer->register( 'mc_project_get_attachments',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'project_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'tns:ProjectAttachmentDataArray'
		),
		$t_namespace,
		false, false, false,
		'Get the attachments that belong to the specified project.'
	);
	
	## mc_project_get_custom_fields
	### mc_project_get_unreleased_versions
	$l_oServer->register( 'mc_project_get_custom_fields',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'project_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'tns:CustomFieldDefinitionDataArray'
		),
		$t_namespace,
		false, false, false,
		'Get the custom fields that belong to the specified project.'
	);	
	
	### mc_project_attachment_get
	$l_oServer->register( 'mc_project_attachment_get',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'project_attachment_id'			=>	'xsd:integer'
		),
		array(
			'return'	=>	'xsd:base64Binary'
		),
		$t_namespace,
		false, false, false,
		'Get the data for the specified project attachment.'
	);
	
	### mc_issue_attachment_add
 	$l_oServer->register( 'mc_project_attachment_add',
 		array(
			'username'		=>	'xsd:string',
 			'password'		=>	'xsd:string',
 			'project_id'	=>	'xsd:integer',
 			'name'			=>	'xsd:string',
 			'title'			=>	'xsd:string',
 			'description'	=>	'xsd:string',
 			'file_type'		=>	'xsd:string',
 			'content'		=>	'xsd:base64Binary'
 		),
 		array(
			'return'	=>	'xsd:integer'
		),
 		$t_namespace,
		false, false, false,
		'Submit a new project attachment.'
 	);
 	
  	### mc_project_attachment_delete
	$l_oServer->register( 'mc_project_attachment_delete',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string',
			'project_attachment_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'xsd:boolean'
		),
		$t_namespace,
		false, false, false,
		'Delete the project attachment with the specified id.'
	);


	###
	###  PUBLIC METHODS (defined in mc_filter_api.php)
	###

	### mc_filter_get
	$l_oServer->register( 'mc_filter_get',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'project_id'	=>	'xsd:integer'
		),
		array(
			'return'	=>	'tns:FilterDataArray'
		),
		$t_namespace,
		false, false, false,
		'Get the filters defined for the specified project.'
	);

	### mc_filter_get_issues
	$l_oServer->register( 'mc_filter_get_issues',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'project_id'	=>	'xsd:integer',
			'filter_id'		=>	'xsd:integer',
			'page_number'	=>	'xsd:integer',
			'per_page'		=>	'xsd:integer'
		),
		array(
			'return'	=>	'tns:IssueDataArray'
		),
		$t_namespace,
		false, false, false,
		'Get the issues that match the specified filter and paging details.'
	);
	
	### mc_filter_get_issue_headers
	$l_oServer->register( 'mc_filter_get_issue_headers',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'project_id'	=>	'xsd:integer',
			'filter_id'		=>	'xsd:integer',
			'page_number'	=>	'xsd:integer',
			'per_page'		=>	'xsd:integer'
		),
		array(
			'return' => 'tns:IssueHeaderDataArray'
		),
		$t_namespace,
		false, false, false,
		'Get the issue headers that match the specified filter and paging details.'
	);


	### mc_config_get_string
	$l_oServer->register( 'mc_config_get_string',
		array(
			'username'		=>	'xsd:string',
			'password'		=>	'xsd:string',
			'config_var'	=>	'xsd:string'
		),
		array(
			'return'	=>	'xsd:string'
		),
		$t_namespace,
		false, false, false,
		'Get the value for the specified configuration variable.'
	);

	### mc_issue_checkin
	$l_oServer->register( 'mc_issue_checkin',
		array(
			'username'	=>	'xsd:string',
			'password'	=>	'xsd:string',
			'issue_id'	=>	'xsd:integer',
			'comment'	=>	'xsd:string',
			'fixed'		=>	'xsd:boolean'
		),
		array(
			'return'	=>	'xsd:boolean'
		),
		$t_namespace,
		false, false, false,
		'Notifies Mantis of a check-in for the issue with the specified id.'
	);

	###
	###  IMPLEMENTATION
	###

	/**
	 * Checks if the request for the webservice is a documentation request (eg:
	 * WSDL) or an actual webservice call.
	 *
	 * The implementation of this method is based on soap_server::service().
	 *
	 * @param $p_service    The webservice class instance.
	 * @param $p_data       The input that is based on the post data.
	 */
	function mci_is_webservice_call( $p_service, $p_data )
	{
		global $QUERY_STRING;
		global $_SERVER;

		if ( isset( $_SERVER['QUERY_STRING'] ) ) {
			$t_qs = $_SERVER['QUERY_STRING'];
		} elseif( isset( $GLOBALS['QUERY_STRING'] ) ) {
			$t_qs = $GLOBALS['QUERY_STRING'];
		} elseif( isset( $QUERY_STRING ) && $QUERY_STRING != '' ) {
			$t_qs = $QUERY_STRING;
		}

		if ( isset( $t_qs ) && ereg( 'wsdl', $t_qs ) ){
			return false;
		} elseif ( $p_data == '' && $p_service->wsdl ) {
			return false;
		} else {
			return true;
		}
 	}

	# pass incoming (posted) data
	if ( isset( $HTTP_RAW_POST_DATA ) ) {
		$t_input = $HTTP_RAW_POST_DATA;
	} else {
		$t_input = implode( "\r\n", file( 'php://input' ) );
	}

	# only include the Mantis / MantisConnect related files, if the current
 	# request is a webservice call (rather than webservice documentation request,
 	# eg: WSDL).
	if ( mci_is_webservice_call( $l_oServer, $t_input ) ) {
		require_once( $t_current_dir . 'mc_core.php' );
	}

	# Execute whatever is requested from the webservice.
	$l_oServer->service( $t_input );
?>
