
/**
 * Confluence Remote API
 */
var Confluence = function() {
	this.initialize.apply(this, arguments);
}

Confluence.prototype = {

	/**
	 * 初期化処理
	 * @param url Confluence URL
	 */
	initialize : function(url) {
		this.url = url;
	},

	/**
	 * ログインを実行する。
	 *  String login(String username, String password)
	 *
	 * @param username ユーザー名
	 * @param password パスワード
	 * @return String トークン
	 *
	 * 例)
	 * var confluence = new Confluence('XXXX');
	 * var token = confluence.login('XXXX', 'XXXX');
	 * console.log(token);
	 *
	 */
	login : function() {
		var xml = [];
		xml.push('<?xml version="1.0"?>');
		xml.push('<methodCall>');
		xml.push('<methodName>confluence1.login</methodName>');
		xml.push('<params>');
		for(var i = 0; i < arguments.length; i++) {
			xml.push('<param><value><string><![CDATA['+arguments[i]+']]></string></value></param>');
		}
		xml.push('</params>');
		xml.push('</methodCall>');
		var json = this._get(xml);
		return json.params.param.value;
	},

	/**
	 * ログアウトを実行する。
	 *  boolean logout(String token)
	 *
	 * @param token token文字列(loginメソッドの戻り値)
	 * @return boolean 成功可否
	 *
	 * 例)
	 * var confluence = new Confluence('XXXX');
	 * var flg = confluence.logout('XXXX');
	 * console.log(flg);
	 *
	 */
	logout : function() {
		var xml = [];
		xml.push('<?xml version="1.0"?>');
		xml.push('<methodCall>');
		xml.push('<methodName>confluence1.logout</methodName>');
		xml.push('<params>');
		for(var i = 0; i < arguments.length; i++) {
			xml.push('<param><value><string><![CDATA['+arguments[i]+']]></string></value></param>');
		}
		xml.push('</params>');
		xml.push('</methodCall>');
		var json = this._get(xml);
		return json.params.param.value;
	},

	/**
	 * スペース情報を取得する。
	 *  Space getSpace(String token, String spaceKey)
	 *
	 * @param token token文字列(loginメソッドの戻り値)
	 * @param spaceKey スペースキー
	 * @return Object スペース情報
	 *
	 * 例)
	 * var confluence = new Confluence('XXXX');
	 * var space = confluence.getSpace('XXXX', 'XXXX');
	 * console.log(space.key);
	 * console.log(space.name);
	 * console.log(space.type);
	 * console.log(space.url);
	 *
	 */
	getSpace : function() {
		var xml = [];
		xml.push('<?xml version="1.0"?>');
		xml.push('<methodCall>');
		xml.push('<methodName>confluence1.getSpace</methodName>');
		xml.push('<params>');
		for(var i = 0; i < arguments.length; i++) {
			xml.push('<param><value><string><![CDATA['+arguments[i]+']]></string></value></param>');
		}
		xml.push('</params>');
		xml.push('</methodCall>');
		var json = this._get(xml);
		var space = {};
		var members = json.params.param.value.struct.member;
		for(var i = 0; i < members.length; i++) {
			space[members[i].name] = members[i].value;
		}
		return space;
	},

	/**
	 * スペース情報を取得する。
	 *  Vector getSpaces(String token)
	 *
	 * @param token token文字列(loginメソッドの戻り値)
	 * @return Array スペース情報配列
	 *
	 * 例)
	 * var confluence = new Confluence('XXXX');
	 * var spaces = confluence.getSpaces('XXXX');
	 * for(var i = 0; i < spaces.length; i++) {
	 * 		var space = spaces[i];
	 * 		console.log(space.key);
	 * 		console.log(space.name);
	 * 		console.log(space.type);
	 * 		console.log(space.url);
	 * }
	 *
	 */
	getSpaces : function() {
		var xml = [];
		xml.push('<?xml version="1.0"?>');
		xml.push('<methodCall>');
		xml.push('<methodName>confluence1.getSpaces</methodName>');
		xml.push('<params>');
		for(var i = 0; i < arguments.length; i++) {
			xml.push('<param><value><string><![CDATA['+arguments[i]+']]></string></value></param>');
		}
		xml.push('</params>');
		xml.push('</methodCall>');
		var json = this._get(xml);
		var spaces = [];
		var values = json.params.param.value.array.data.value;
		for(var i = 0; i < values.length; i++) {
			var space = {};
			var members = values[i].struct.member;
			for(var a = 0; a < members.length; a++) {
				space[members[a].name] = members[a].value;
			}
			spaces.push(space);
		}
		return spaces;
	},

	/**
	 * ページ情報を取得する。
	 *  Page getPage(String token, String pageId)
	 *  Page getPage(String token, String spaceKey, String pageTitle)
	 *
	 * @param token token文字列(loginメソッドの戻り値)
	 * @param spaceKey スペースキー
	 * @param pageTitle ページタイトル
	 * @return Object ページ情報
	 *
	 * 例)
	 * var confluence = new Confluence('XXXX');
	 * var page = confluence.getPage('XXXX', 'XXXX', 'XXXX');
	 * console.log(page.id);
	 * console.log(page.parentId);
	 * console.log(page.space);
	 * console.log(page.content);
	 * console.log(page.title);
	 * console.log(page.url);
	 * console.log(page.creator);
	 * console.log(page.modifier);
	 * console.log(page.current);
	 * console.log(page.contentStatus);
	 * console.log(page.modified.dateTime.iso8601);
	 * console.log(page.created.dateTime.iso8601);
	 * console.log(page.permissions);
	 * console.log(page.homePage);
	 *
	 */
	getPage : function() {
		var xml = [];
		xml.push('<?xml version="1.0"?>');
		xml.push('<methodCall>');
		xml.push('<methodName>confluence1.getPage</methodName>');
		xml.push('<params>');
		for(var i = 0; i < arguments.length; i++) {
			xml.push('<param><value><string><![CDATA['+arguments[i]+']]></string></value></param>');
		}
		xml.push('</params>');
		xml.push('</methodCall>');
		var json = this._get(xml);
		var page = {};
		var members = json.params.param.value.struct.member;
		for(var i = 0; i < members.length; i++) {
			page[members[i].name] = members[i].value;
		}
		return page;
	},

	/**
	 * ページ情報を取得する。
	 *  Vector getPages(String token, String spaceKey)
	 *
	 * @param token token文字列(loginメソッドの戻り値)
	 * @param spaceKey スペースキー
	 * @return Array ページ情報配列
	 *
	 * 例)
	 * var confluence = new Confluence('XXXX');
	 * var pages = confluence.getPages('XXXX', 'XXXX');
	 * for(var i = 0; i < pages.length; i++) {
	 * 		var page = pages[i];
	 *      console.log(page.id);
	 * 		console.log(page.parentId);
	 * 		console.log(page.space);
	 * 		console.log(page.content);
	 * 		console.log(page.title);
	 * 		console.log(page.url);
	 * 		console.log(page.creator);
	 * 		console.log(page.modifier);
	 * 		console.log(page.current);
	 * 		console.log(page.contentStatus);
	 * 		console.log(page.modified.dateTime.iso8601);
	 * 		console.log(page.created.dateTime.iso8601);
	 * 		console.log(page.permissions);
	 * 		console.log(page.homePage);
	 * }
	 *
	 */
	getPages : function() {
		var xml = [];
		xml.push('<?xml version="1.0"?>');
		xml.push('<methodCall>');
		xml.push('<methodName>confluence1.getPages</methodName>');
		xml.push('<params>');
		for(var i = 0; i < arguments.length; i++) {
			xml.push('<param><value><string><![CDATA['+arguments[i]+']]></string></value></param>');
		}
		xml.push('</params>');
		xml.push('</methodCall>');
		var json = this._get(xml);
		var pages = [];
		var values = json.params.param.value.array.data.value;
		for(var i = 0; i < values.length; i++) {
			var page = {};
			var members = values[i].struct.member;
			for(var a = 0; a < members.length; a++) {
				page[members[a].name] = members[a].value;
			}
			pages.push(space);
		}
		return pages;
	},

	/**
	 * レンダリングコンテンツを取得する。
	 *  String renderContent(String token, String spaceKey, String pageId, String content)
	 *
	 * @param token token文字列(loginメソッドの戻り値)
	 * @param spaceKey スペースキー
	 * @param pageId ページID
	 * @param content コンテンツ
	 * @return String divなどのsingle
	 *
	 * 例)
	 * var confluence = new Confluence('XXXX');
	 * var content = confluence.renderContent('XXXX', 'XXXX', 'XXXX', 'XXXX');
	 * console.log(content);
	 *
	 */
	renderContent : function() {
		var xml = [];
		xml.push('<?xml version="1.0"?>');
		xml.push('<methodCall>');
		xml.push('<methodName>confluence1.renderContent</methodName>');
		xml.push('<params>');
		for(var i = 0; i < arguments.length; i++) {
			xml.push('<param><value><string><![CDATA['+arguments[i]+']]></string></value></param>');
		}
		xml.push('<param><value><struct><member><name>style</name><value>clean</value></member></struct></value></param>');
		xml.push('</params>');
		xml.push('</methodCall>');
		var json = this._get(xml);
		return json.params.param.value;
	},

	_get : function(xml) {
		return jQuery.xml2json(jQuery.ajax({
			url: this.url,
			type: "POST",
			dataType: "xml",
			contentType: 'text/xml',
			async: false,
			processData: false,
			data: xml.join('')
		}).responseXML);
	}

}