<!DOCTYPE html>
<!--
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
 distributed with this work for additional information
 regarding copyright ownership.  The ASF licenses this file
 to you under the Apache License, Version 2.0 (the
 "License"); you may not use this file except in compliance
 with the License.  You may obtain a copy of the License at

 http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing,
 software distributed under the License is distributed on an
 "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
-->
<html>
<head>
<meta charset="UTF-8">
<title>OpenCMIS Browser Binding</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="stylesheet" type="text/css" href="../css/opencmis.css"/>
<script src="../browser?login=script" type="text/javascript"></script>
<script type="text/javascript">
var repositoryUrl;
var rootFolderUrl;
var rootFolderId;
var rootFolder = "/";
var lastToken;
var currentFolderId;

// login and logout

function login() {
	cmisLogin(function(success) {
		if (success) {
			cmisNextToken(function(token) {
				var script0 = document.createElement('script');
				script0.setAttribute('src', cmisServiceURL() + '?callback=printRepositoryInfos&token=' + token);
				script0.setAttribute('type', 'text/javascript');
				document.body.appendChild(script0);
			});
		}
	});
}

function logout() {
	cmisLogout(function(success) {
		if (success) {
			// login again
			login();
		}
	});
}

// helpers

function performJsonpRequest(url, callback, params) {
	var callUrl = url;

	if (params) {
		for (var key in params) {
			callUrl = callUrl + '&' + key + '=' + encodeURIComponent(params[key]);
		}
	}

	cmisNextToken(function(token) {
		callUrl = callUrl + 
		'&callback=' + callback + 
		'&token=' + encodeURIComponent(token) +
		'&suppressResponseCodes=true'

		var script = document.createElement('script');
		script.setAttribute('src', callUrl);
		script.setAttribute('type', 'text/javascript');
		document.body.appendChild(script);
	});
}

function loadCmisDataById(id, selector, callback, params) {
	performJsonpRequest(rootFolderUrl + '?cmisselector=' + selector + '&objectId=' + encodeURIComponent(id), callback, params);
}

function loadCmisDataByPath(path, selector, callback, params) {
	performJsonpRequest(rootFolderUrl + path + '?cmisselector=' + selector, callback, params);
}

function loadCmisRepositoryData(selector, callback, params) {
	performJsonpRequest(repositoryUrl + '?cmisselector=' + selector, callback, params);
}

function loadCmisLastResult(token, callback) {
	var url = repositoryUrl + '?cmisselector=lastResult' +
	'&callback=' + callback +
	'&token=' + encodeURIComponent(token);

	var script = document.createElement('script');
	script.setAttribute('src', url);
	script.setAttribute('type', 'text/javascript');
	document.body.appendChild(script);
}

function openContentInNewWindow(id) {
	cmisNextToken(function(token) {
		var url = rootFolderUrl + 
		'?cmisselector=content' +
		'&objectId=' + encodeURIComponent(id) + 
		'&token=' + encodeURIComponent(token);
		window.open(url, '_blank');
	});
}

function createAndSubmitDeleteForm(rootFolderUrl, id, cmisaction, callback) {
	cmisNextToken(function(token) {
		var targetFrame = document.createElement('iframe');
		targetFrame.style.display = 'none';
		targetFrame.name = 'cmis-frame-' + cmisaction + '-' + id;
		document.body.appendChild(targetFrame);

		targetFrame.addEventListener('load',
		function() {
			callback();
			document.body.removeChild(targetFrame);
		},
		false);

		var frameBody = targetFrame.contentWindow.document.createElement('body');
		targetFrame.appendChild(frameBody);

		var cmisForm = targetFrame.contentWindow.document.createElement('form');
		cmisForm.action = rootFolderUrl + '?objectId=' + encodeURIComponent(id);
		cmisForm.method = 'POST';
		cmisForm.target = targetFrame.name;
		frameBody.appendChild(cmisForm);

		var cmisActionInput = targetFrame.contentWindow.document.createElement('input');
		cmisActionInput.name = 'cmisaction';
		cmisActionInput.type = 'text';
		cmisActionInput.value = cmisaction;
		cmisForm.appendChild(cmisActionInput);

		var cmisAllVersionsInput = targetFrame.contentWindow.document.createElement('input');
		cmisAllVersionsInput.name = 'allVersions';
		cmisAllVersionsInput.type = 'text';
		cmisAllVersionsInput.value = 'true';
		cmisForm.appendChild(cmisAllVersionsInput);

		var cmisTokenInput = targetFrame.contentWindow.document.createElement('input');
		cmisTokenInput.name = 'token';
		cmisTokenInput.type = 'text';
		cmisTokenInput.value = token;
		cmisForm.appendChild(cmisTokenInput);

		cmisForm.submit();
	});
}

// print callbacks

function printRepositoryInfos(infos) {
	for(repId in infos) {
		var ri = infos[repId];		
		document.getElementById('repositoryInfo').innerHTML =
			'<h2>Repsository "' + ri.repositoryName + '" (' + ri.repositoryId + ')</h2>' +
			'<table>' +
			'<tr><td>Id:</td><td>' + ri.repositoryId + '</td></tr>' +
			'<tr><td>Name:</td><td>' + ri.repositoryName + '</td></tr>' +
			'<tr><td>Description:</td><td>' + ri.repositoryDescription + '</td></tr>' +
			'<tr><td>Product:</td><td>' + ri.vendorName + ' ' + ri.productName + ' ' + ri.productVersion + '</td></tr>' +
			'<tr><td>Root folder id:</td><td>' + ri.rootFolderId + '</td></tr>' +
			'<tr><td>Repository URL:</td><td>' + ri.repositoryUrl + '</td></tr>' +
			'<tr><td>Root folder URL:</td><td>' + ri.rootFolderUrl + '</td></tr>' +
			'</table>';

		// the InMemory repository has only one repository
		repositoryUrl = ri.repositoryUrl;
		rootFolderUrl = ri.rootFolderUrl;
		rootFolderId = ri.rootFolderId;
	}

	currentFolderId = rootFolderId;

	loadCmisDataByPath(rootFolder, 'object', 'printObject', {});
	reloadChildren();
	loadCmisRepositoryData('typeChildren', 'printTypes', {});
}

function printObject(obj) {
	var id = obj.properties["cmis:objectId"].value;
	var name = obj.properties["cmis:name"].value;

	var s = '<h2>Object "' + name + '" (' + id + ')</h2>';

	s = s + '<h3>Properties</h3>';
	s = s + '<table>';

	for(propertyId in obj.properties) {
		var property = obj.properties[propertyId];
		s = s + '<tr><td>' + propertyId + '</td>';
		s = s + '<td>' + property.displayName + '</td>';
		s = s + '<td>' + property.type + '</td>';
		s = s + '<td>' + property.cardinality + '</td>';

		if(property.type == 'datetime') {
			s = s + '<td>' + (new Date(property.value)) + '</td></tr>';
		} else {
			s = s + '<td>' + property.value + '</td></tr>';
		}
	}

	s = s + '</table>';

	document.getElementById('objectInfo').innerHTML = s;
}

function printChildren(children) {
	var s = '<h2>Children</h2>';

	s = s + '<h3>Properties</h3>';

	s = s + '<input type="button" value="Reload folder" onClick="reloadChildren()">';

	s = s + '<table><tr><th>Name</th><th>Type</th><th>MIME Type</th><th>Size</th>' +
	'<th>Created By</th><th>Created At</th><th>Id</th><th></th></tr>';

	for(var index in children.objects) {
		var object = children.objects[index].object;

		var name = object.properties["cmis:name"].value;
		var type = object.properties["cmis:objectTypeId"].value;
		var mimetype = "";
		var size = "";
		var createdBy = object.properties["cmis:createdBy"].value;
		var creationDate = new Date(object.properties["cmis:creationDate"].value);
		var id = object.properties["cmis:objectId"].value;
		var link = 0; // 0 - no link, 1 - content link, 2 - folder link
		var deleteLink = "deleteObject('" + id + "')";

		if(object.properties["cmis:baseTypeId"].value == "cmis:folder") {
			deleteLink = "deleteFolder('" + id + "')";
			link = 2;
		}

		if(object.properties["cmis:baseTypeId"].value == "cmis:document") {
			if(object.properties["cmis:contentStreamLength"]) {
				size = object.properties["cmis:contentStreamLength"].value;
			} else {
				size = "";
			}

			if(object.properties["cmis:contentStreamMimeType"]) {
				mimetype = object.properties["cmis:contentStreamMimeType"].value;
				link = 1;
			} else {
				mimetype = "";
				link = "";
			}
		}

		s = s + '<tr><td>';
		if(link == 1) {
			s = s + "<a href=\"javascript:openContentInNewWindow('" + id + "')\">" + name + "</a>";
		} else if(link == 2) {
			s = s + "<a href=\"javascript:navigateDown('" + id + "')\">" + name + "</a>";
		} else {
			s = s + name;
		}

		s = s + '</td><td>' + type + '</td><td>' + mimetype + '</td><td style="rext-align:right">' + size +
		'</td><td>' + createdBy + '</td><td>' + creationDate + '</td><td>' + id + '</td><td><button onClick="' + deleteLink + '">delete</button></td></tr>';
	}

	s = s + '</table>';

	document.getElementById('folderInfo').innerHTML = s;
}

function printTypes(types) {
	var s = '<h2>Base Types</h2>';

	for(var index in types.types) {
		var type = types.types[index];

		s = s + '<h3>' + type.id + '</h3>';
		s = s + '<ul>';

		for(var propId in type.propertyDefinitions) {
			var propType = type.propertyDefinitions[propId];
			s = s + '<li>' + propType.id + '</li>';
		}

		s = s + '</ul>';
	}

	document.getElementById('typeInfo').innerHTML = s;
}

// navigate

function reloadChildren() {
	var params = {};

	params.filter = 'cmis:name,cmis:objectId,cmis:objectTypeId,cmis:baseTypeId,' +
	'cmis:contentStreamMimeType,cmis:contentStreamLength,' + 
	'cmis:creationDate,cmis:createdBy'
	params.includeAllowableActions = 'false';	
	params.includeRelationships = 'none';	
	params.renditionFilter = 'cmis:none';
	params.maxItems = '100';	
	params.orderBy = 'cmis:name';

	loadCmisDataById(currentFolderId, 'children', 'printChildren', params);
}

function navigateDown(folderId) {
	currentFolderId = folderId;
	loadCmisDataById(currentFolderId, 'children', 'printChildren', {});
}

// delete

function deleteObject(id) {
	createAndSubmitDeleteForm(rootFolderUrl, id, 'delete', reloadChildren);
}

function deleteFolder(id) {
	createAndSubmitDeleteForm(rootFolderUrl, id, 'deleteTree', reloadChildren);
}


// query

function querySubmit() {
	var queryForm = document.getElementById('queryForm');	
	queryForm.action = repositoryUrl;

	var queryParams = {};
	queryParams.q = queryForm.q.value;
	queryParams.maxItems = queryForm.maxItems.value;
	queryParams.skipCount = queryForm.skipCount.value;

	loadCmisRepositoryData('query', 'queryCallback', queryParams);
}

function queryCallback(result) {
	if (!(typeof result.exception === 'undefined')) {
		alert('Exception: ' + result.exception + '\n\nError:\n' + result.message);
		return;
	}

	var cols = {};
	var colCount = 0;
	var table = [];

	for(var i = 0; i < result.results.length; i++) {
		var props = result.results[i].properties;
		var row = [];
		for(var queryName in props) {
			var pos;
			if (typeof cols[queryName] === 'undefined') {
				pos = cols[queryName] = colCount++;
			} else {
				pos = cols[queryName];
			}

			while(row.length < pos - 1) {
				row.push('');
			}

			if(props[queryName].type == 'datetime') {
				row[pos] = new Date(props[queryName].value);
			} else {
				row[pos] = props[queryName].value;
			}
		}
		table.push(row);
	}

	var s = '<h3>Query Results</h3>';

	s = s + '<table><tr>';
	for(var i = 0; i < colCount; i++) {
		for(var colName in cols) {
			if(cols[colName] == i) {
				s = s + '<th>' + colName + '</th>';
				break;
			}
		}
	}
	s = s + '</tr>';

	for(var rowIndex = 0; rowIndex < table.length; rowIndex++) {
		s = s + '<tr>';
		for(var colIndex = 0; colIndex < colCount; colIndex++) {
			s = s + '<td>';
			if(colIndex < table[rowIndex].length) {
				s = s + table[rowIndex][colIndex];
			}
			s = s + '</td>';
		}
		s = s + '</tr>';
	}

	s = s + '</table>';

	document.getElementById('queryResult').innerHTML = s;
}

// create Folder

function createFolderSubmit() {
	var createForm = document.getElementById('createFolderForm');
	createForm.action = rootFolderUrl + createForm.folder.value;

	cmisNextToken(function(token) {
		lastToken = token;
		createForm.token.value = token;
		createForm.submit();
	});
}

// create document

function createDocumentSubmit() {
	var createForm = document.getElementById('createDocumentForm');
	createForm.action = rootFolderUrl + createForm.folder.value;

	cmisNextToken(function(token) {
		lastToken = token;
		createForm.token.value = token;
		createForm.submit();
	});
}

// create helpers

function createCallback() {
	if(lastToken) {
		loadCmisLastResult(lastToken, 'showNewId');
	}
}

function showNewId(result) {
	if(result.objectId) {
		alert('New object id: ' + result.objectId + '\n\nCode: ' + result.code);
	} else {
		alert('Exception: ' + result.exception + '\n\nError:\n' + result.message + '\n\nCode: ' + result.code);
	}
}
</script>
</head>
<body onLoad="login()">

<h1>OpenCMIS Web Interface</h1>

<input type="button" value="Logout" onClick="logout()">

<br />
<div id="repositoryInfo" class="box">repositoryInfo</div>
<br />
<div id="objectInfo" class="box">objectInfo</div>
<br />
<div id="folderInfo" class="box">folderInfo</div>
<br />
<div id="typeInfo" class="box">typeInfo</div>
<br />

<div id="query" class="box">
<h2>Query</h2>
<form id="queryForm" action="" method="GET" target="_blank">
	<input name="cmisaction" type="hidden" value="query" />
	<input name="token" type="hidden" value="" />
	<table>
		<tr><td>Query:</td><td><input name="q" type="text" size="100" maxlength="1000" value="SELECT * FROM cmis:document"></td></tr>
		<tr><td>Max Items:</td><td><input name="maxItems" type="text" size="4" maxlength="8" value="100"></td></tr>
		<tr><td>Skip Count:</td><td><input name="skipCount" type="text" size="4" maxlength="8" value="0"></td></tr>
		<tr><td></td><td><input type="button" value="Go" onClick="querySubmit()"/></td></tr>
	</table>
</form>
</div>
<div id="queryResult" class="box"></div>
<br />

<div id="folder" class="box">
<h2>Create Folder</h2>
<form id="createFolderForm" action="" method="POST" target="createResult">
	<input name="_charset_" type="hidden" />
	<input name="cmisaction" type="hidden" value="createFolder" />
	<input name="token" type="hidden" value="" />
	<table>
	<tr>
		<td>Parent Folder:</td>
		<td><input name="folder" type="text" size="100" maxlength="1000" value="/"></td>
	</tr>
	<tr>
		<td>Folder Name:</td>
		<td><input id="docname" name="propertyValue[0]" type="text" size="100" maxlength="100" value="folder"><input name="propertyId[0]" type="hidden" value="cmis:name" /></td>
	</tr>
	<tr>
		<td>Object Type:</td>
		<td><input name="propertyValue[1]" type="text" size="100" maxlength="100" value="cmis:folder"><input name="propertyId[1]" type="hidden" value="cmis:objectTypeId" /></td>
	</tr>
	<tr>
		<td></td>
		<td><input type="button" value="Create" onClick="createFolderSubmit()"/></td>
	</tr>
	</table>
</form>
</div>
<br />

<div id="document" class="box">
<h2>Create Document</h2>



<form id="createDocumentForm" action="" method="POST" target="createResult" enctype="multipart/form-data">
	<input name="_charset_" type="hidden" />
	<input name="cmisaction" type="hidden" value="createDocument" />
	<input name="token" type="hidden" value="" />
	<table>
	<tr>
		<td>Parent Folder:</td>
		<td><input name="folder" type="text" size="100" maxlength="1000" value="/"></td>
	</tr>
	<tr>
		<td>Document Name:</td>
		<td><input id="docname" name="propertyValue[0]" type="text" size="100" maxlength="100" value="document"><input name="propertyId[0]" type="hidden" value="cmis:name" /></td>
	</tr>
	<tr>
		<td>Object Type:</td>
		<td><input name="propertyValue[1]" type="text" size="100" maxlength="100" value="cmis:document"><input name="propertyId[1]" type="hidden" value="cmis:objectTypeId" /></td>  
	</tr>
	<tr>
		<td>File name:</td>
		<td><input name="filename" type="text" size="30" maxlength="30" value=""> (if left blank, the original file name is used)</td>
	</tr>
	<tr>
		<td>Content type:</td>
		<td><input name="contentType" type="text" size="30" maxlength="30" value=""> (if left blank, the content type is determined by the browser)</td>
	</tr>
	<tr>
		<td>File:</td>
		<td><input name="content" type="file"></td>
	</tr>
	<tr>
		<td></td>
		<td><input type="button" value="Create" onClick="createDocumentSubmit()"/></td>
	</tr>
	</table>
</form>

</div>
<br />

<iframe name="createResult" style="display:none;" onload="createCallback()"></iframe>

</body>
</html>