Author: jens
Date: Thu Mar 1 07:05:25 2012
New Revision: 1295437
URL: http://svn.apache.org/viewvc?rev=1295437&view=rev
Log:
Add a simple Javascript application using the CMIS Browser Binding
Added:
chemistry/playground/chemistry-opencmis-javascript-client/
chemistry/playground/chemistry-opencmis-javascript-client/pom.xml
chemistry/playground/chemistry-opencmis-javascript-client/src/
chemistry/playground/chemistry-opencmis-javascript-client/src/main/
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/WEB-INF/
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/WEB-INF/web.xml
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/cmislib.js
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/index.html
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/jquery-1.7.1.js
chemistry/playground/chemistry-opencmis-javascript-client/src/test/
chemistry/playground/chemistry-opencmis-javascript-client/src/test/resources/
chemistry/playground/chemistry-opencmis-javascript-client/src/test/resources/qunit.css
chemistry/playground/chemistry-opencmis-javascript-client/src/test/resources/qunit.js
chemistry/playground/chemistry-opencmis-javascript-client/src/test/resources/test.html
chemistry/playground/chemistry-opencmis-javascript-client/src/test/resources/testcmislib.js
Added: chemistry/playground/chemistry-opencmis-javascript-client/pom.xml
URL:
http://svn.apache.org/viewvc/chemistry/playground/chemistry-opencmis-javascript-client/pom.xml?rev=1295437&view=auto
==============================================================================
--- chemistry/playground/chemistry-opencmis-javascript-client/pom.xml (added)
+++ chemistry/playground/chemistry-opencmis-javascript-client/pom.xml Thu Mar
1 07:05:25 2012
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- Licensed 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. -->
+
+<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/maven-v4_0_0.xsd">
+
+ <modelVersion>4.0.0</modelVersion>
+
+ <parent>
+ <groupId>org.apache.chemistry.opencmis</groupId>
+ <artifactId>chemistry-opencmis</artifactId>
+ <version>0.7.0-SNAPSHOT</version>
+ <relativePath>../../pom.xml</relativePath>
+ </parent>
+
+ <artifactId>chemistry-opencmis-javascript-client</artifactId>
+ <name>OpenCMIS Javacript Sample Application</name>
+ <packaging>war</packaging>
+
+ <properties>
+ <parentBasedir>../../</parentBasedir>
+ </properties>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-war-plugin</artifactId>
+ <configuration>
+ <archive>
+ <manifestEntries>
+
<Bundle-Name>org.apache.chemistry.opencmis.client.javascript</Bundle-Name>
+
<Bundle-SymbolicName>org.apache.chemistry.opencmis.client.javascript</Bundle-SymbolicName>
+
<Bundle-Version>0.0.1</Bundle-Version>
+
<Import-Package></Import-Package>
+
<Bundle-Classpath>.</Bundle-Classpath>
+
<Web-ContextPath>jsclient</Web-ContextPath>
+ </manifestEntries>
+ </archive>
+ </configuration>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-eclipse-plugin</artifactId>
+ <version>2.9</version>
+ <configuration>
+ <wtpversion>2.0</wtpversion>
+
<wtpContextName>jsclient</wtpContextName>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ </dependencies>
+
+</project>
Added:
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/WEB-INF/web.xml
URL:
http://svn.apache.org/viewvc/chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/WEB-INF/web.xml?rev=1295437&view=auto
==============================================================================
---
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/WEB-INF/web.xml
(added)
+++
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/WEB-INF/web.xml
Thu Mar 1 07:05:25 2012
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_5.xsd"
+ version="2.5">
+</web-app>
\ No newline at end of file
Added:
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/cmislib.js
URL:
http://svn.apache.org/viewvc/chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/cmislib.js?rev=1295437&view=auto
==============================================================================
---
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/cmislib.js
(added)
+++
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/cmislib.js
Thu Mar 1 07:05:25 2012
@@ -0,0 +1,216 @@
+/*
+ * 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.
+ */
+
+function OperationContext() {
+
+ this.propertyFilter = "*";
+ this.maxItemsPerPage = 25;
+ this.skipCount = 0;
+ this.includeAcls = false;
+ this.includeAllowableActions = false;
+ this.includePolicies = false;
+ this.includeRelationships = "none";
+ this.renditionFilter = null;
+ this.includePathSegments = false;
+ this.orderBy = null;
+
+}
+
+
+function CmisSessionFactory (parameters) {
+ var PARAM_URL = "url";
+ var PARAM_REPOSITORY_ID = "repositoryId";
+
+ this.params = parameters;
+
+ this.createSession = function() {
+ return new CmisSession(this.params[PARAM_URL],
this.params[PARAM_REPOSITORY_ID]);
+ };
+
+ this.getRepositories = function(cbFct) {
+ console.log("getRepositories() for URL: " + this.params[PARAM_URL]);
+ $.ajax( {
+ url:this.params[PARAM_URL],
+ dataType: "jsonp",
+ success: cbFct
+ });
+ };
+};
+
+function CmisError (httpCode, message, cmisException, stackTrace) {
+ this.httpCode = httpCode;
+ this.message = message;
+ this.cmisException = cmisException;
+ this.stackTrace = stackTrace;
+
+ console.log(this.toString());
+};
+
+CmisError.prototype.toString = function() {
+ return "Error in CMIS call! http-code: " + this.httpCode + ", CMIS
Exception: " + this.cmisException +
+ ", message: " + this.message;
+};
+
+
+function CmisSession(urlPrefix, repositoryId) {
+ this.repId = repositoryId;;
+ this.urlPrefix = urlPrefix; // "/inmemory/browser/" + repId
+ this.rootUrl = null;
+ this.opCtx = new OperationContext();
+ this.rootFolderId; // just use a place to store the id, must be filled by
user of a CmisSession
+
+ this.getUrl = function() {
+ return this.urlPrefix + "/" + this.repId;
+ };
+
+ this.getRootUrl = function() {
+ return this.rootUrl;
+ };
+
+ this.setRootUrl = function(url) {
+ this.rootUrl = url;
+ };
+
+ this.createErrorFromErrorResponse = function(jsonObj) {
+ return new CmisError(0, jsonObj.message, jsonObj.exception,
+ jsonObj.stacktrace);
+ };
+
+ this.getRepositoryInfo = function(cbFct) {
+ var url = this.getUrl();
+ var data = {
+ cmisSelector: "repositoryInfo"
+ };
+
+ console.log("getRepositoryInfo(): " + url);
+ this.doJson(url, data, cbFct);
+ };
+
+ this.getDocument = function(id, cbFct) {
+ var url = this.getRootUrl();
+ var data = {
+ objectId: id,
+ cmisSelector: "object",
+ filter: this.opCtx.filter,
+ includeAllowableActions: this.opCtx.includeAllowableActions,
+ includeRelationships: this.opCtx.includeRelationships,
+ includePolicyIds: this.opCtx.includePolicies,
+ includeACL: this.opCtx.includeAcls,
+ suppressResponseCodes: true
+ };
+
+ console.log("getDocument(): " + url);
+ this.doJson(url, data, cbFct);
+ };
+
+ this.getChildren = function(id, cbFct) {
+ var url = this.getRootUrl();
+ var data = {
+ objectId: id,
+ cmisSelector: "children",
+ filter: this.opCtx.filter,
+ includeAllowableActions: this.opCtx.includeAllowableActions,
+ includeRelationships: this.opCtx.includeRelationships,
+ includePolicyIds: this.opCtx.includePolicies,
+ includeACL: this.opCtx.includeAcls,
+ includePathSegment: this.opCtx.includePathSegments,
+ skipCount: this.opCtx.skipCount,
+ maxItemsPerPage: this.opCtx.maxItemsPerPage,
+ suppressResponseCodes: true
+ };
+
+ console.log("getDocument(): " + url);
+ this.doJson(url, data, cbFct);
+ };
+
+ this.deleteDocument = function(objectId, cbFct) {
+ var url = this.getRootUrl();
+
+ var properties = {
+ cmisaction: "delete",
+ objectId: objectId,
+ suppressResponseCodes: true
+ };
+
+ console.log("deleteDocument(): " + url);
+ $.ajax( {
+ url: url,
+ data: properties,
+ type: "POST",
+ success: cbFct
+ });
+ };
+
+ this.createDocument = function(name, typeId, folderId, cbFct) {
+ var url = this.getRootUrl();
+
+ var properties = {
+ cmisaction: "createDocument",
+ objectId: folderId,
+ "propertyId[0]": "cmis:name",
+ "propertyValue[0]": name,
+ "propertyId[1]": "cmis:objectTypeId",
+ "propertyValue[1]": typeId
+ };
+
+ console.log("createDocument(): " + url);
+ $.ajax( {
+ url: url,
+ data: properties,
+ type: "POST",
+ success: cbFct
+ });
+ };
+
+ this.doJson = function(urlPrefix, params, cbFct) {
+ $.ajax( {
+ url: urlPrefix,
+ data: params,
+ dataType: "jsonp",
+ success: cbFct
+ });
+ };
+
+
+};
+
+CmisSession.defaultErrorHandler = function (event, jqXHR, settings, excep) {
+ var cmisError;
+
+ if (null == jqXHR || null == jqXHR.responseText)
+ cmisError = CmisError(null == jqXHR ? 0 : jqXHR.status, "Unknown
error", "Unknown CMIS exception",
+ "<no stacktrace available>");
+ else {
+ try {
+ var cmisErr = jQuery.parseJSON(jqXHR.responseText);
+ if (null == cmisErr)
+ cmisError = CmisError(jqXHR.status, "Unknown error, unparsable
response", "Unknown CMIS exception",
+ "<no stacktrace available>");
+ else
+ cmisError = new CmisError(jqXHR.status, cmisErr.message,
cmisErr.exception,
+ cmisErr.stacktrace);
+ } catch (exc) {
+ console.log("Failed to parse Error as JSON: " +
jqXHR.responseText);
+ cmisError = jqXHR.responseText;
+ }
+ }
+
+ return cmisError;
+};
+
Added:
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/index.html
URL:
http://svn.apache.org/viewvc/chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/index.html?rev=1295437&view=auto
==============================================================================
---
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/index.html
(added)
+++
chemistry/playground/chemistry-opencmis-javascript-client/src/main/webapp/index.html
Thu Mar 1 07:05:25 2012
@@ -0,0 +1,315 @@
+<!--
+ * 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.
+-->
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>Browser Binding Client</title>
+</head>
+ <head>
+ <title>CMIS Test Page</title>
+ </head>
+ <body>
+ <script type="text/javascript" src="jquery-1.7.1.js"></script>
+ <script type="text/javascript" src="cmislib.js"></script>
+ <!-- Enable the following to get debugging information:
+ <script type="text/javascript"
src="https://getfirebug.com/firebug-lite.js"></script>
+ -->
+ <script type="text/javascript">
+
+ var session = null;
+
+ function init1(connectionUrl, cbFct) {
+ var factory = new CmisSessionFactory({
+ url : connectionUrl,
+ });
+ factory.getRepositories(cbFct);
+ }
+
+ function init2(connectionUrl, repoId) {
+ console.log("Initialzing session to " + connectionUrl);
+ var factory = new CmisSessionFactory({
+ url : connectionUrl,
+ repositoryId : repoId
+ });
+
+ session = factory.createSession();
+ session.getRepositoryInfo(function(repoInfos) {
+ console.log("init(): getRepositoryInfo()");
+ for (var repoInfo in repoInfos) {
+ session.rootFolderId =
repoInfos[repoInfo].rootFolderId;
+ session.rootUrl =
repoInfos[repoInfo].rootFolderUrl;
+ break;
+ }
+ });
+ }
+
+ function createTable(children, baseType) {
+ var row;
+ var tbody;
+ var tbl = $('<table>').attr('id', 'childrenTable').attr('border', 1);
+
+ tbl.append($('<thead>').append(row = $('<tr>')));
+ for (var child in children.objects) {
+ if (baseType ===
children.objects[child].object.properties["cmis:baseTypeId"].value) {
+ for (var prop in
children.objects[child].object.properties) {
+
row.append($('<td>').text(children.objects[child].object.properties[prop].id));
+ }
+ break;
+ }
+ }
+
+ tbl.append(tbody = $('<tbody>'));
+ for (var child in children.objects) {
+ if (baseType ===
children.objects[child].object.properties["cmis:baseTypeId"].value) {
+ tbody.append(row = $('<tr>'));
+ for (var prop in children.objects[child].object.properties) {
+ var text =
children.objects[child].object.properties[prop].value;
+ if (text == null)
+ text = "n/a";
+ row.append($('<td>').text(text));
+ }
+ }
+ }
+
+ return tbl;
+ }
+
+ function checkSession() {
+ if (null == session)
+ displayError("No session! Please connect first...");
+ }
+
+ function displayError(cmisError) {
+ $("#errorsection *").remove();
+
$("#errorsection").append($("<p>").text(cmisError.toString()).css("color",
"red"));
+ }
+
+ function checkError(jsonObj) {
+ if (jsonObj != null && jsonObj.exception != null) {
+ var cmisError = session.createErrorFromErrorResponse(jsonObj);
+ displayError(cmisError);
+ return cmisError;
+ } else
+ return null;
+ }
+
+ $(document).ready(function() {
+
+ $(document).ajaxError(function(event, request, settings, excep){
+ var cmisError = CmisSession.defaultErrorHandler(event, request,
settings, excep);
+ displayError(cmisError);
+ });
+
+ $('#repositories').click(function() {
+ var firstRepoId;
+ init1($("#reposfield").val(), function(repoInfos) {
+ console.log("getRepositories()");
+ var row;
+ var tbl =
$('<table>').append($('<tr>').append($('<td>').text("Found repositories:")))
+ .append(row = $('<tr>'));
+ for (var repoInfo in repoInfos) {
+
row.append($('<td>').text(repoInfos[repoInfo].repositoryId));
+ if (null == firstRepoId)
+ firstRepoId = repoInfos[repoInfo].repositoryId;
+ }
+ $("#repositoriessection *").remove();
+ $("#repositoriessection").append(tbl);
+ $("#repoidfield").attr('value', firstRepoId);
+ init2($("#reposfield").val(), "A1");
+ });
+ });
+
+ $('#repositoryInfo').click(function() {
+ checkSession();
+ session.getRepositoryInfo(function(repoInfos) {
+ console.log("getRepositoryInfo()");
+ for (var repoInfo in repoInfos) {
+ var text = "Found Repository with id: " +
repoInfos[repoInfo].repositoryId +
+ ", vendor: " + repoInfos[repoInfo].vendorName +
+ ", description: " +
repoInfos[repoInfo].repositoryDescription +
+ ", root url: " + repoInfos[repoInfo].rootFolderUrl;
+ $("#repoinfosection").html(text);
+ session.rootFolderId = repoInfos[repoInfo].rootFolderId;
+ session.rootUrl = repoInfos[repoInfo].rootFolderUrl;
+ break;
+ }
+ });
+ });
+
+ $('#getbutton').click(function() {
+ checkSession();
+ session.getDocument($('#docidfield').val(), function(doc) {
+ if (!checkError(doc)) {
+ console.log("getObject cmis:name= " +
doc.properties["cmis:name"].value);
+ var text = "Retrieved document with cmis:name= " +
doc.properties["cmis:name"].value;
+ $("#documentsection").html(text)
+ }
+ });
+ });
+
+ $('#deletebutton').click(function() {
+ checkSession();
+ session.deleteDocument($('#docidfield').val(), function(doc) {
+ if (!checkError(doc)) {
+ console.log("Deleted document with id: " +
$('#docidfield').val());
+ $("#documentsection").html("Deleted document with id: "
+ $('#docidfield').val());
+ }
+ });
+ });
+
+ $('#cmischildren').click(function() {
+ checkSession();
+ var rootFolderId = session.rootFolderId == null ?
session.rootFolderId : 100;
+
+ session.getChildren($('#folderidfield').val(), function(children) {
+ if (!checkError(children)) {
+ var tbl1 = createTable(children, "cmis:folder");
+ var tbl2 = createTable(children, "cmis:document");
+ $("#childrensection *").remove();
+ $("#childrensection").append($('<h2>').text("Children
of Root Folder")).
+
append($('<h3>').text("Folders")).append(tbl1).append($('<br>')).
+ append($('<h3>').text("Documents")).append(tbl2);
+ }
+ });
+ });
+
+ $('#createdoc').click(function() {
+ checkSession();
+ session.createDocument($('#name').val(), $('#typeId').val(),
$('#folderId').val(), function(data) {
+ var text = "Document successfully created with
id: " + data.properties["cmis:objectId"].value;
+ $("#createdocsection").html(text);
+ });
+ });
+
+ });
+ </script>
+
+ <div id="errorsection"> </div>
+ <h3>CMIS in Javascript</h3>
+ <p> A simple test page how to use the browser binding in Javascript in a
browser. </p>
+ <form >
+ <table>
+ <tr>
+ <td><label for="reposfield">URL:</label></td>
+ <td><input type="text" id="reposfield"
value="/inmemory/browser"/></td>
+ </tr>
+ </table>
+ </form>
+ <button id="repositories">Connect!</button> <br/>
+ <div id="repositoriessection">
+ </div>
+ <hr/>
+ <form >
+ <table>
+ <tr>
+ <td><label for="repoidfield">Repository-Id:</label></td>
+ <td><input type="text" id="repoidfield" value="?"/></td>
+ </tr>
+ </table>
+ </form>
+ <button id="repositoryInfo">Get RepositoryInfo!</button> <br/>
+ <div id="repoinfosection">
+ </div>
+ <hr/>
+ <form >
+ <table>
+ <tr>
+ <td><label for="docidfield">Doc-Id:</label></td>
+ <td><input type="text" id="docidfield" value="133"/></td>
+ </tr>
+ </table>
+ </form>
+
+ <button id="getbutton">Get Document!</button> <br/>
+ <button id="deletebutton">Delete Document!</button> <br/>
+ <div id="documentsection">
+ </div>
+ <hr/>
+ <form >
+ <table>
+ <tr>
+ <td><label for="folderidfield">Folder-Id:</label></td>
+ <td><input type="text" id="folderidfield" value="100"/></td>
+ </tr>
+ </table>
+ </form>
+ <button id="cmischildren">Get Children!</button> <br/>
+ <div id="childrensection">
+ </div>
+ <br/>
+ <hr/>
+ <h3> Create Document With Ajax: </h3>
+ <form >
+ <fieldset>
+ <legend>Create document Ajax</legend>
+ <table>
+ <tr>
+ <td><label for="name">Name:</label></td>
+ <td><input type="text" id="name" name="Name" value="My
document"/></td>
+ </tr>
+ <tr>
+ <td><label for="typeId">Type-Id:</label></td>
+ <td><input type="text" id="typeId" name="Type"
value="cmis:document"/></td>
+ </tr>
+ <tr>
+ <td><label for="folderId">Folder-Id:</label></td>
+ <td><input type="text" id="folderId" name="Folder Id"
value="100"/></td>
+ </tr>
+ </table>
+ </fieldset>
+ </form>
+ <button id="createdoc">Create Doc!</button> <br/>
+ <div id="createdocsection">
+ </div>
+ <h3> Create a document from an HTML form: </h3>
+ <form action="/inmemory/browser/A1/root" enctype="multipart/form-data"
method="post">
+ <fieldset>
+ <legend>Create document HTML</legend>
+ <table>
+ <tr>
+ <td><label for="name">Name:</label></td>
+ <td><input name="propertyValue[0]" type="text" id="name"
value="My Document"/></td>
+ </tr>
+ <tr>
+ <td><label for="typeId">Type-Id:</label></td>
+ <td><input name="propertyValue[1]" type="text" id="typeId"
value="cmis:document"/></td>
+ </tr>
+ <tr>
+ <td><label for="folderId">Folder-Id:</label></td>
+ <td><input type="text" id="folderId" name="objectId"
value="100"/></td>
+ </tr>
+ <tr>
+ <td><label for="contentId">Content:</label></td>
+ <td><input id="contentId" name="Browse..." type="file"
size="50"/></td>
+ </tr>
+ <tr>
+ <td><input id="createdochtml" type="submit" value="Create
Doc!"/></td>
+ <td></td>
+ </tr>
+ </table>
+ </fieldset>
+ <input name="propertyId[0]" type="hidden" value="cmis:name" />
+ <input name="propertyId[1]" type="hidden" value="cmis:objectTypeId" />
+ <input name="cmisaction" type="hidden" value="createDocument" />
+ </form>
+ <div id="createdochtmlsection">
+ </div>
+ </body>
+</html>
\ No newline at end of file